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.