JavaScript 또는 Python과 같은 동적 언어에서 변수 유형은 런타임에 결정됩니다. 이것이 Java와 같은 유형의 언어보다 느린 이유 중 하나입니다.
유형 검사는 어떻게 수행됩니까? 이 과정이 느린 근본적인 이유는 무엇입니까?
JavaScript 또는 Python과 같은 동적 언어에서 변수 유형은 런타임에 결정됩니다. 이것이 Java와 같은 유형의 언어보다 느린 이유 중 하나입니다.
유형 검사는 어떻게 수행됩니까? 이 과정이 느린 근본적인 이유는 무엇입니까?
답변:
질문에 혼란이 있습니다.
타입 검사가 느리다는 가정이 있는데, 반드시 그런 것은 아닙니다.
이 질문은 또한 유형 디스패치 프로세스 와 유형 확인 프로세스를 혼동하는 것으로 보이며 , 두 가지가 다릅니다. 하나는 런타임에 수행되는 프로세스이고 다른 하나는 컴파일 타임에 수행되는 프로세스입니다. 질문이 실제로 유형 디스패치에 대해 묻는 것 같습니다.
계산시 런타임에 표시되는 값의 유형에 따라 수행 할 조치를 동적으로 결정하는 명령으로 시간을 소비하므로 런타임시 오버 헤드가 발생할 수있는 유형 디스패치입니다. 예를 들어 동적 언어에서 두 가지에 "+"를 적용하면 숫자 추가 또는 문자열 연결을 의미 할 수 있으므로 수행 할 작업을 결정하는 데 시간을 투자해야합니다. 동적 디스패치 비용을 줄일 수있는 평가 전략이 있습니다. (예 : JIT 추적)
JavaScript에서 유형 검사를 수행하는 방법에 대해서는 http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/를 참조 하십시오 . 타입 체커의 작동 방식에 대한보다 일반적인 개요를 위해 표준 프로그래밍 언어 교과서에서 알고리즘을 다룰 것입니다. 예를 들면 다음과 같습니다. http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/
기본적으로 형식화되지 않은 언어에서 모든 참조는 형식과 값을 모두 포함하는 개체를 가리 킵니다. 예를 들어 var a = 3
값 3과 int 유형을 포함하는 인스턴스를 가리키고, 작성하면 a = "bla"
문자열 "bla"및 유형 문자열을 포함하는 인스턴스로 참조가 업데이트되고 이전 오브젝트는 버려집니다.
a + b
이러한 기본 유형에서 조작 (예 :)을 수행 해야 할 때마다 런타임 은 먼저 오브젝트를 역 참조하고 해당 유형이 호환 가능한지 점검하고 조작을 수행하고 새 오브젝트를 작성 해야 하기 때문에 속도가 느립니다 .
반대로 a + b
C ++ 또는 Java에서 컴파일 시 유형이 유효하고 호환되는지 확인한 다음 a와 b는 즉시 값 (참조가 아님)으로 저장되며 추가는 이러한 값에 대한 간단한 프로세서 작업입니다.
물론 이것은 매우 이론적 인 것입니다. 실제로, 대부분의 오버 헤드를 피하기 위해이 프로세스에서 많은 최적화를 수행 할 수 있으며 동적으로 유형이 지정된 언어는 상당히 빨라질 수 있습니다.