JavaScript와 같은 동적 언어 인터프리터 / 컴파일러에서 유형을 어떻게 확인합니까?


11

JavaScript 또는 Python과 같은 동적 언어에서 변수 유형은 런타임에 결정됩니다. 이것이 Java와 같은 유형의 언어보다 느린 이유 중 하나입니다.

유형 검사는 어떻게 수행됩니까? 이 과정이 느린 근본적인 이유는 무엇입니까?


그들은 동적이기 때문에 느리지 않습니다. 더 빠르기 어렵 기 때문에 느립니다. JavaScript는 실제로 가장 최적화되어 있으며 매우 빠릅니다.
데릭 리츠

답변:


5

질문에 혼란이 있습니다.

타입 검사가 느리다는 가정이 있는데, 반드시 그런 것은 아닙니다.

이 질문은 또한 유형 디스패치 프로세스 와 유형 확인 프로세스를 혼동하는 것으로 보이며 , 두 가지가 다릅니다. 하나는 런타임에 수행되는 프로세스이고 다른 하나는 컴파일 타임에 수행되는 프로세스입니다. 질문이 실제로 유형 디스패치에 대해 묻는 것 같습니다.

계산시 런타임에 표시되는 값의 유형에 따라 수행 할 조치를 동적으로 결정하는 명령으로 시간을 소비하므로 런타임시 오버 헤드가 발생할 수있는 유형 디스패치입니다. 예를 들어 동적 언어에서 두 가지에 "+"를 적용하면 숫자 추가 또는 문자열 연결을 의미 할 수 있으므로 수행 할 작업을 결정하는 데 시간을 투자해야합니다. 동적 디스패치 비용을 줄일 수있는 평가 전략이 있습니다. (예 : JIT 추적)

JavaScript에서 유형 검사를 수행하는 방법에 대해서는 http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/를 참조 하십시오 . 타입 체커의 작동 방식에 대한보다 일반적인 개요를 위해 표준 프로그래밍 언어 교과서에서 알고리즘을 다룰 것입니다. 예를 들면 다음과 같습니다. http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/



Javascript 인터프리터는 유형 디스패치에 대한 각 값과 함께 태그 비트를 전달합니다. 이것에 대해 조금 자세히 설명해 주시겠습니까? 예를 들어, 태그 비트는 무엇을 사용합니까? 비트가 유형에 해당합니까?

유형의 개념이 항상 표현에 연결되는 것은 아닙니다. 예를 들어 '마일'유형과 '킬로미터'유형의 개념이있을 수 있으며 컴파일 타임에 계산이 유형을 엉망으로 만드는 값에 대한 연산을 부적절하게 적용하는지 여부를 정적으로 감지 할 수있는 언어를 갖는 것이 합리적입니다. . 그것들이 동일한 표현을 가지고 있다고 상상할 수도 있고, 컴파일러가 컴파일 타임에 결코 혼합되지 않을 것을 보장 할 수 있다면, 표현에서 값에 추가적인 라벨링이 필요한 이유는 없습니다.

1
계속 : 그러나 종종 동적 언어에서는 다른 유형의 값을 나타내려고합니다. 이 차별을하는 방법에는 여러 가지가 있습니다. 유형 태그는 일반적이지만 다른 기술이 있습니다. 예를 들어, 메모리의 차단 된 영역에 특정 유형을 배치 할 수 있습니다. "동적 유형 언어로 유형 정보 표현"을 참조하십시오. 표현 기술에 대한 포괄적 인 조사를위한 lambda-the-ultimate.org/node/3912

7

기본적으로 형식화되지 않은 언어에서 모든 참조는 형식과 값을 모두 포함하는 개체를 가리 킵니다. 예를 들어 var a = 3값 3과 int 유형을 포함하는 인스턴스를 가리키고, 작성하면 a = "bla"문자열 "bla"및 유형 문자열을 포함하는 인스턴스로 참조가 업데이트되고 이전 오브젝트는 버려집니다.

a + b이러한 기본 유형에서 조작 (예 :)을 수행 해야 할 때마다 런타임 은 먼저 오브젝트를 역 참조하고 해당 유형이 호환 가능한지 점검하고 조작을 수행하고 새 오브젝트를 작성 해야 하기 때문에 속도가 느립니다 .

반대로 a + bC ++ 또는 Java에서 컴파일 시 유형이 유효하고 호환되는지 확인한 다음 a와 b는 즉시 값 (참조가 아님)으로 저장되며 추가는 이러한 값에 대한 간단한 프로세서 작업입니다.

물론 이것은 매우 이론적 인 것입니다. 실제로, 대부분의 오버 헤드를 피하기 위해이 프로세스에서 많은 최적화를 수행 할 수 있으며 동적으로 유형이 지정된 언어는 상당히 빨라질 수 있습니다.


1
다형성 인라인 캐시와 같은 트릭은 성능을 크게 향상시킬 수 있습니다. David Ungar (Self)와 Eliot Miranda (Squeak, Visual Works Smalltalk 가상 머신)의 글은 동적 언어 성능과 관련하여 가장 유익합니다.
Frank Shearar

0

모든 값은 유형과 함께 저장되므로 먼저 검사해야합니다. 또한 문자열에서 숫자로의 변환은 검사를 통해 즉시 진행됩니다.


그렇습니다. 런타임 검사일뿐입니다.
anon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.