문제

해석 된 언어의 장단점에 대해 읽고 있었는데 가장 일반적인 단점 중 하나는 속도가 느려지지만 해석 된 언어로 된 프로그램이 왜 느려지 는가?

도움이 되었습니까?

해결책

기본 프로그램은 실행되는 프로세서에 작성된 지침을 사용하여 실행됩니다.

해석 된 언어는 "해석 된"것입니다. 다른 형태의 명령어는 런타임으로 읽고 해석되며, 이는 기본 기계 지침을 실행합니다.

이런 식으로 생각하십시오. 당신이 당신의 모국어로 누군가에게 이야기 할 수 있다면, 그것은 일반적으로 청취자가 이해할 수 있도록 다른 언어로 언어를 다른 언어로 번역하는 것보다 더 빨리 작동합니다.

위에서 설명한 것은 통역사에서 언어가 실행될 때입니다. 많은 언어에 대한 통역사가 있습니다. 기본 기계 지침에 대한 기본 링커도 있습니다. 속도 감소 (그 크기는)는 해석 된 컨텍스트에만 적용됩니다.

따라서 언어 느리게 진행되는 것은 느리게 달리는 맥락입니다.

C#은 해석 된 언어가 아니지만 중간 언어 (IL)를 사용하더라도, 이는 실행되기 전에 기본 지침에 따라야하므로 약간 동일한 속도 감소는 전부는 아니지만 C# 또는 C ++에 대한 완전한 신생 통역사를 구축하면 느리게 실행될 것이라고 확신합니다.

그리고 내가 "느린"말을 할 때, 그것은 물론 상대적인 용어입니다.

다른 팁

모든 대답은 여기서 중요한 중요한 점을 놓치는 것 같습니다. "해석 된"코드가 어떻게 구현되는지 세부 사항입니다.

해석 된 스크립트 언어는 메소드, 객체 및 글로벌 변수 공간 모델이 동적이기 때문에 느리게 진행됩니다. 제 생각에는 이것은 스크립트 언어의 실제 정의는 해석 된 사실이 아닙니다. 이를 위해서는 변수 또는 메소드 호출에 대한 각 액세스에 많은 추가 해시 테이블 조회가 필요합니다. 그리고 그것들이 멀티 스레딩과 길을 사용하는 데 끔찍한 주된 이유입니다 (글로벌 통역사 잠금). 이 조회는 대부분의 시간이 소비되는 곳입니다. L1/L2 캐시 미스를 얻을 때 실제로 아프게됩니다.

Google의 JavaScript Core8은 매우 빠르며 간단한 최적화를 위해 거의 C 속도를 타겟팅합니다. 객체 데이터 모델을 고정하여 내부 코드를 작성하여 기본 컴파일 된 프로그램의 데이터 구조와 같이 액세스 할 수 있습니다. 새 변수 또는 메소드가 추가되거나 제거되면 전체 컴파일 된 코드가 폐기되어 다시 컴파일됩니다.

이 기술은 Deutsch/Schiffman Paper "SmallTalk-80 시스템의 효율적인 구현"에 잘 설명되어 있습니다.

PHP, Python 및 Ruby 가이 작업을 수행하지 않는 이유는 대답하기가 매우 간단합니다.이 기술은 구현하기가 매우 복잡합니다.

패스트 브라우저 기반 JavaScript 통역사는 10 억 달러 비즈니스 모델의 근본적인 요구이기 때문에 Google만이 JavaScript 비용을 지불 할 돈이 있습니다.

인터페서를 가질 수없는 기계의 에뮬레이터로 생각하십시오.

짧은 대답은 컴파일 된 언어가 기계 지침에 의해 실행되는 반면 해석 된 언어는 소스 또는 바이트 코드를 읽는 프로그램 (컴파일 된 언어로 작성된)에 의해 실행 된 다음 본질적으로 가상 시스템을 모방합니다. ~일 것이다 기계가 존재하는 경우 프로그램을 직접 실행했습니다.

해석 된 런타임을 현재는 실제로 가지고 있지 않은 기계의 에뮬레이터로 생각하십시오.

이것은 Java, C#및 기타 사람들이 가지고있는 JIT (Just in Time) 컴파일러에 의해 분명히 복잡합니다. 이론적으로, 그것들은 "AOT"( "한 번에") 컴파일러만큼 우수하지만 실제로 해당 언어는 느리게 실행되며 프로그램 런타임에서 UP 메모리와 시간을 사용하여 컴파일러를 갖추어야함으로써 장애가 있습니다. 그러나 당신이 여기에 그 중 하나라고 말하면 JIT와 AOT 사이에 이론적 인 차이가 없다고 주장하는 RADID JIT 수비수를 유치 할 준비를하십시오. Java와 C#이 C 및 C ++만큼 빠른지 물어 보면 변명과 약간의 진정을 시작합니다. :-)

따라서 C ++는 사용 가능한 최대 컴퓨팅 양을 항상 사용할 수있는 게임에서 완전히 규칙을 지정합니다.

데스크탑 및 웹에서 정보 지향 작업은 종종 컴퓨터가 매우 빠르고 문제가 계산 집약적이지 않기 때문에 더 많은 추상화 또는 최소한 컴파일이있는 언어로 수행됩니다. -마켓, 프로그래머 생산성, 안정적인 메모리-안전 환경, 동적 모듈성 및 기타 강력한 도구.

이것은 좋은 질문이지만, 예를 들어, "해석 된 언어가 편집 된 언어보다 느리게하는 이유는 무엇입니까?"

해석 된 언어가 속도가 느리다는 것은 일반적인 오해라고 생각합니다. 해석 된 언어입니다 느리지 않습니다, 그러나 사용 사례에 따라 느리게 컴파일 된 버전보다. 대부분의 경우 해석 된 언어는 실제로입니다 충분히 빠릅니다!

"충분히", Python과 같은 언어를 사용하여 생산성이 증가하는 것과 같이 C는 해석 된 언어를 고려할만큼 충분히 정당화되어야합니다. 또한 속도가 필요한 경우 해석 된 프로그램의 특정 부분을 빠른 C 구현으로 항상 교체 할 수 있습니다. 그러나 다시 먼저 측정하고 속도가 실제로 문제인지 확인한 다음 최적화하십시오.

루프 A 100 회, 루프의 내용은 100 배 낮은 레벨 코드로 해석됩니다.

캐시되지 않고 재사용되지 않으며 최적화되지 않았습니다.

간단히 말하면 컴파일러는 한 번 저 레벨 코드로 해석합니다.

댓글 후 편집 :

  • jit입니다 편집 암호, 해석되지 않습니다. 그것은 단지 선불로 구성되지 않은 나중에 편집되었습니다
  • 나는 현대적인 실제 구현이 아니라 고전적인 정의를 언급합니다.

다른 답변 외에도 최적화가 있습니다. 프로그램을 컴파일 할 때 일반적으로 컴파일하는 데 걸리는 시간은 신경 쓰지 않습니다. 컴파일러는 코드를 최적화 할 시간이 많습니다. 코드를 해석 할 때는 매우 빨리 수행해야하므로 더 영리한 최적화가 만들어지지 않을 수 있습니다.

간단한 대답이없는 간단한 질문. 결론은 모든 컴퓨터가 실제로 "이해"한다는 것입니다. 이진 지침은 C와 같은 "빠른"언어가 컴파일되는 것입니다.

그런 다음 다른 바이너리 지침 (Java 및 .NET 등)을 이해하는 가상 머신이 있지만 JIT (Just-in-Compiler)에 의해 기계 지침으로 즉시 번역되어야합니다. JIT는 코드 사용 방법에 대한 정적 컴파일러보다 더 많은 정보를 가지고 있기 때문에 거의 빠릅니다 (일부 특정 경우에는 더 빠릅니다.)

그런 다음 일반적으로 고유 한 중간 바이너리 지침이있는 해석 된 언어가 있지만 통역사는 모든 명령에 대한 사례가있는 큰 스위치 명령문이있는 루프와 같은 기능과 실행 방법과 매우 유사합니다. 기본 기계 코드에 대한이 추상화 수준은 느립니다. 통역사에는 간단한 일을하기 위해 더 많은 지침이 관련되어 있으며, 메모리와 캐시가 결과적으로 효과적으로 사용되지 않는다고 주장 할 수 있습니다.

그러나 해석 된 언어는 종종 그들이 사용하는 목적을 위해 충분히 빠릅니다. 웹 애플리케이션은 IO (일반적으로 데이터베이스 액세스)에 의해 항상 통역사보다 느린 순서입니다.

해석 된 언어와 같은 것은 없습니다. 모든 언어는 통역사 또는 컴파일러에 의해 구현 될 수 있습니다. 요즘 대부분의 언어에는 컴파일러를 사용하여 구현이 있습니다.

즉, 통역사는 일반적으로 런타임에 언어 또는 다소 가까운 언어를 처리하고 기계 지침으로 번역해야하기 때문에 일반적으로 느리게됩니다. 컴파일러는이 번역을 기계 지침으로 한 번만 수행 한 후 직접 실행됩니다.

에서 about.com:

해석 된 언어는 런타임에 처리됩니다. 모든 라인은 읽고 분석 및 실행됩니다. 루프에서 매번 줄을 재 처리 해야하는 것은 해석 된 언어를 너무 느리게 만드는 것입니다. 이 오버 헤드는 해석 된 코드가 컴파일 된 코드보다 5-10 배나 느리다는 것을 의미합니다. Basic 또는 JavaScript와 같은 해석 된 언어는 가장 느립니다. 그들의 장점은 변경 후 다시 컴파일 될 필요가 없으며 프로그램을 배우는 경우 편리합니다.

그러나 Java 및 C#과 같은 언어의 경우 5-10 배 느린 것이 반드시 사실은 아닙니다. 그들은 해석되지만 정시 컴파일러 일부 운영에 대한 기계 언어 지침을 생성 할 수 있으며 (때때로 컴파일 된 언어의 속도에 가까운) 속도를 높이십시오.

해석 된 언어는 실행 시간에 소스 코드를 읽고 해석해야합니다. 컴파일 된 코드를 사용하면 많은 해석이 미리 (컴파일 시간에) 수행됩니다.

현대적인 스크립팅 언어는 거의 없습니다 ~이다 요즘 "해석"; 일반적으로 가상 시스템에서 (보다 효율적으로) 실행되는 중간 바이트 코드 언어로 즉시 컴파일됩니다.

CPU가 "코드 라인"당 더 많은 지침을 실행하고 있기 때문에 속도가 느려집니다. 많은 지침이 라인의 의미론이 제안한 내용을 수행하기보다는 코드를 이해하는 데 소비되기 때문입니다!

이것을 읽으십시오 해석 된 언어의 장단점

이것은 해당 게시물의 문제에 대한 관련 아이디어입니다.

통역사에 의한 실행은 일반적으로 정기적 인 프로그램 실행보다 훨씬 덜 효율적입니다. 모든 명령어가 런타임 또는 최신 구현에서와 같이 해석을 통과해야하므로 모든 실행 전에 코드를 중간 표현으로 컴파일해야하기 때문입니다.

같은 이유로 모국어보다 번역기를 통해 대화하는 것이 느립니다. 또는 사전과 함께 읽습니다. 번역하는 데 시간이 걸립니다.

업데이트 : 아니요, 내 대답이 수용된 것과 동일하다는 것을 알지 못했습니다.

예, 해석 된 언어는 느립니다 ...

그러나 다음을 고려하십시오. 나는 해결해야 할 문제가 있었다. 파이썬에서 문제를 해결하는 데 4 분이 걸렸으며 프로그램은 0.15 초가 걸렸습니다. 그런 다음 C로 쓰려고했는데 0.12 초의 런타임을 얻었고 글을 쓰는 데 1 시간이 걸렸습니다. 문제의 문제를 해결하는 실질적인 방법은 해시블을 사용하는 것이었고 해시 테이블은 어쨌든 런타임을 지배하는 것이 었습니다.

Wikipedia는 말합니다,

해석 코드는 컴파일 된 코드를 실행하는 것보다 느립니다. 통역사는 프로그램이 실행될 때마다 프로그램의 각 문을 분석 한 다음 원하는 조치를 수행 해야하는 반면, 컴파일 된 코드는 컴파일에 의해 결정된 고정 컨텍스트 내에서 작업을 수행합니다.. 이 런타임 분석은 "해석 간접비"라고합니다. 스토리지 위치에 식별자를 매핑하는 것은 컴파일 시간이 아닌 런타임에 반복적으로 수행해야하기 때문에 변수에 대한 액세스가 느려집니다.

이것을 참조하십시오 IBM DOC,

해석 된 프로그램은 실행 될 때마다 번역되어야하며 오버 헤드가 더 높습니다. 따라서 해석 된 언어는 일반적으로 사전 정의 된 요청보다 임시 요청에 더 적합합니다.

자바에서는 해석 된 언어로 간주되지만 사용합니다. jit (JUST-IN-TIME) CACHING 기술을 사용하여 컴파일 된 바이트 코드를 캐시하여 위의 문제를 완화하는 컴파일.

JIT 컴파일러는 여러 섹션에서 바이트 코드를 읽고 (또는 거의 거의, 드물게) 기계 코드로 동적으로 컴파일하여 프로그램이 더 빨리 실행될 수 있습니다. 이것은 파일 별, 기능 당 또는 심지어 임의의 코드 조각에서 수행 될 수 있습니다. 코드는 실행하려고 할 때 (따라서 "정시"라는 이름) 코드를 컴파일 할 수 있으며, 나중에 다시 컴파일 할 필요없이 캐시하고 재사용 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top