답변

2

많은 언어에서 함수를 인라인하면 프로그램의 컴파일 된 크기와 실행 시간에 영향을 줄 수 있지만 관찰 가능한 의미 론적 효과는 없습니다. 그러나 호출 스택 및/또는 로컬 변수 바인딩이 표시되는 언어에서는 그렇지 않습니다.

간단한 예로 Javscript의 로컬 변수 arguments은 항상 현재 함수 호출에 대한 인수를 포함하는 배열과 유사한 객체를 참조합니다. 분명히, 그것이 발생한 함수가 인라인 되었다면, 그 의미가 바뀔 것이다. 인라이너는 본체가 arguments을 참조하는 함수를 인라인하는 것을 거절하거나, 다른 이름으로 다른 로컬 변수를 만들고 참조를 대체하여 의미를 보존하는 방식으로 코드를 수정해야합니다.

또 다른 예는 eval의 (권장되지 않는) 사용입니다. eval에 전달 된 문자열의 이름 조회는 eval을 호출하는 함수의 범위 내에서 수행됩니다. 예를 들어

inner = function(s) { var x = 4; return eval(s); } 
outer = function(s) { var x = 3; return inner(s); } 
outer("x+1") 

여기 outer 의해 반환 된 값이 5이다. inner이 인라인 된 경우 이름 충돌을 피하기 위해 로컬 변수 x의 이름을 변경해야하므로 4이 반환됩니다. (모두 innerouter가 인라인 된 경우, 값은 아마 다른 다시 뭔가 될 것입니다.) 일반적으로

의 내용을 알 수있는 쉬운 방법이 없기 때문에이 eval를 호출하는 함수를 인라인 매우 어려울 것 인수는 eval입니다.