2012-08-10 2 views
3

Rhino, Google V8, Python 등과 같은 스크립트 인터프리터는 스크립팅 언어 문자열 만 있으면 기본 원시 메소드를 결정하는 일반적인 방법이 있습니까?스크립팅 언어 인터프리터는 기본 기능을 어떻게 참조합니까?

어느 시점에서 이러한 해석기는 키 문자열에 해시 맵을 사용합니까? 또는 문자열 비교 테스트와 분기가 많이 있습니까?

+0

V8은 몇 가지 주요 최적화를 수행하고 중간 형식을 건너 뛰고 저수준 실행으로 바로 이동한다는 점에서 일반적인 해석기가 아닙니다. 파이썬 인터프리터는 당신이 이것에 대해 배우고 싶다면 더 나은 후보자 일 수 있습니다. – voithos

+1

Ralph, "네이티브 메소드를 가져 오는 것"이 ​​무엇을 의미하는지 명확하게 설명해 주시겠습니까? – Malvolio

+0

"가져 오기"를 "결정"으로 변경했습니다. V8을 사용해도 스크립트의 문자열 (메소드 이름 등)은 해시 코드 알고리즘을 거치거나 다른 문자열에 대해 테스트하여 수행 할 작업을 결정해야합니다. 이 올바른지? –

답변

1

일반적으로 문자열 키가있는 해시 맵을 사용하지만 기능 조회의 결과는 보통 몇 나노초 후에 다시 동일한 검색을 수행하지 않아도되도록 캐시됩니다.

프로그램이 기능을 할당하거나 삭제하는 것처럼 뭔가 미친 일이 발생하면 캐시를 지워야합니다.

JIT 컴파일러는 inline caching을 사용하여 캐시가 채워지면 예측 가능한 함수 호출을 매우 빠르게 실행할 수 있습니다.

컴파일러는 기본 함수를 직접 호출하는 컴퓨터 코드를 출력 할 수도 있습니다. 다시 프로그램이 해당 함수를 대체하거나 삭제하면 컴파일 된 코드가 유효하지 않게됩니다. 따라서 통역사는 그 상황을 감지하고 유효하지 않은 JIT 코드를 업데이트하거나 버릴 수있는 방법을 가져야합니다.

1

CPython은 함수/메소드 디스패치에 대해 네임 스페이스를 광범위하게 사용합니다. 이는 해시 유형, 일명 "사전"을 의미합니다.

Pypy, Jython, IronPython 등은 최선의 방법에 대한 생각이있을 수 있습니다. 파이썬! = CPython.

+0

CPython에는 메서드 조회 결과가 저장되는 메서드 캐시가 있으므로 반복적으로 긴밀한 루프에서 동일한 조회를 반복하지 않아야합니다. (캐싱 메서드는 JS보다 Python에서 더 쉽습니다. –

1

파이썬의 경우, 소스 코드가 파이썬에 의해 처리 될 때 클래스와 그 메소드, 일반 함수 등 모든 정의가 컴파일됩니다. 코드 부분을 컴파일 한 결과는 코드를 캡처하는 객체로 저장됩니다. 이름은 내부 검사 용으로 만 저장됩니다. 사용자 관점에서 볼 때 개체의 이름은 지정되지 않습니다. 그러나 이름 (함수의 클래스)은 내부 해시 맵 (Python의 사전이라고 함)에 키로 저장됩니다. 값은 이름이없는 오브젝트에 대한 참조입니다.

Python의 모든 변수는 형식화되지 않은 참조 (키, 해시 맵의 값)에 바인딩 된 이름입니다. 파이썬에 이름이 나타날 때마다 참조 변수로 작업하고 있습니다. 언급 된 해시 맵 (사전)을 검색하면 자동으로 참조 해제됩니다.

사용자는 사전에 액세스 할 수도 있습니다. 이렇게하면이 방법으로 작동하도록 시도 할 수 있습니다. 그런 다음 함수 이름을 다른 변수에 간단히 할당하여 함수에 다른 이름 (예 : 더 짧은 이름)을 쉽게 지정할 수도 있습니다. 할당은 항상 참조 값을 지정하는 것을 의미합니다.

관련 문제