2

이 내 프로그램입니다 말?대체 모델은 JavaScript가 순수 코드를 평가하는 방법을 근사치로 나타내는 좋은 방법입니까? 대체 모델은 JS 런타임이 실제로 매우 다른 평가 년대 방식으로이 코드를 평가, 또는 방법에 대한 좋은 정신 모델</p> <pre><code>let f = x => x * 2 let g = x => f(x) + 1 let h = x => g(x) > 3 h(2) </code></pre> <p>인가 :

https://en.wikipedia.org/wiki/Lambda_calculus#Substitution https://en.wikipedia.org/wiki/Referential_transparency

+0

* * * * JS 런타임에 따라 다릅니다. JIT가 함수 호출을 인라인하기로 결정했는지 여부에 달려 있습니다. 많은 것들에 달려 있습니다. 내 추측 *은 아니오 : 나는 시스템 프로그래머가 아니지만 정신적으로 기본적인 C++을 작성하는 방법을 통해 걷는다면 그 구현으로 이어지지 않는다. –

답변

3

평가 방법은 동일하지만 결과는 동일합니다. 구상 할 가장 관련성있는 순수 CS 모델은 environment model입니다. 간단히 말해서, 진술이 평가 될 때, 그것은 그 당시의 참조를 돌연변이시킬 수있다. 이러한 돌연변이는 JS의 스코프 체인을 통해 관리되지만, 이는 본질적으로 위의 환경에 대한 또 다른 이름입니다.

+0

답변 주셔서 감사합니다 - 이것은 내가 찾고있는 것입니다. JS가 환경 모델을 사용하여 평가한다고해도 대체 모델은 순수 함수에 대해 동일한 결과를 산출합니다. – bcherny

+1

@bcherny 대체 모델은 특정 평가 전략을 적용하지 않습니다 (또는 이에 한정됩니다). – naomik

2

은 대체 모델은 자바 스크립트가 순수 코드를 평가하는 방법에 근접하는 좋은 방법이 있나요?

물론!

let f = x => x * 2 
let g = x => f(x) + 1 
let h = x => g(x) > 3 

h(2) 
// = ... 
// substitute h with its definition 

(x => g(x) > 3) (2) 
// substitute x with 2 

g(2) > 3 
// substitute g with its definition 

(x => f(x) + 1) (2) > 3 
// substitute x with 2 

f(2) + 1 > 3 
// substitute f with its definition 

(x => x * 2) (2) + 1 > 3 
// substitute x with 2 

2 * 2 + 1 > 3 
// apply * to 2 and 2 

4 + 1 > 3 
// apply + to 4 and 1 

5 > 3 
// apply > to 5 and 3 

true 

는 내 코드에 대체 모델을 적용하는 방법을 이해 -이 JS 런타임 (등 V8은) 그것을 평가하는 방법을 실제 어떻게 다른지 내 질문입니다.

귀하의 질문은 사용하는 자바 스크립트 인 evaluation strategy입니다 - 자바 스크립트는 call by sharing 사용하지만, 물론 당신은 아직 평가 전략을 공유함으로써 호출을 사용하여 응답 에 도달하기 위해 대체 모델을 사용할 수 있습니다.

대체 모델은 한 전략을 다른 전략보다 강요하지 않습니다. 사실 (거의) 모든 경우에 순수한 함수를 사용하는 경우 평가 전략은 중요하지 않습니다. 대답은 동일합니다.

+1

내 코드에 대체 모델을 적용하는 방법 *을 이해합니다. 제 질문은 이것이 실제 JS 런타임 (V8 등)이 어떻게 평가하는지와 다릅니다. – bcherny

+1

@bcherny 실제 구현은 실행 가능한 코드로 함수를 컴파일하고 컴파일 된 코드 위치로 점프하여 함수 호출을 구현합니다. – Barmar

+0

답변 해 주셔서 감사합니다! – bcherny