태그 보관물: programming-languages

programming-languages

동적 언어는 항상 해석됩니까? 틀린 점 있으면

대부분의 동적 언어 (예 : Python, PHP, Perl 및 Ruby)를 보면 모두 해석됩니다. 틀린 점 있으면 지적 해주세요. 컴파일 단계를 거치는 동적 언어의 예가 있습니까? 동적 언어는 해석 된 언어와 동일합니까?



답변

대부분의 동적 언어 (예 : Python, PHP, Perl 및 Ruby)를 살펴보면 모두 해석됩니다.

사실이 아니다. 파이썬 소스를 컴파일 할 수 있습니다. 이것이 실존 증명 중 하나입니다.

정적 형식 언어에 대한 해석기와 동적 형식 언어에 대한 컴파일러가 있습니다. 두 가지 개념은 직교입니다.

참고 : 일반적으로 언어는 의미 체계를 표현하기위한 일련의 구문 구조가있는 언어입니다. 화이트 보드에 Python을 작성하면 여전히 Python이라고합니다. 그것은의 구현 통역 또는 컴파일러가 될 수 있습니다. 정적 유형 또는 동적 유형 (두 유형의 하이브리드 유형)은 언어의 속성 인 반면, 해석 또는 컴파일을 통해 프로그램을 실행하는 것은 구현의 속성입니다.


답변

Common Lisp는 동적이고 강력하게 형식화되며 보통 컴파일 됩니다.

이러한 동적 성은 런타임에 달성되므로 소스 코드에서 컴파일러가 생성 된 코드를 최적화하고 성능을 향상시킬 수 있도록 심볼이 특정 종류의 값만 보유하도록 컴파일러에 보장 할 수있는 지시문이 있습니다.


답변

C # 4.0은 동적 형식 (late-binding)을 지원하며 컴파일됩니다.


답변

node.js는 Google의 V8 자바 스크립트 엔진을 기반으로합니다. V8은 런타임 컴파일을 수행합니다. V8은 그 사실을 감안할 때 맹목적으로 빠릅니다. 그냥 체크 아웃 http://shootout.alioth.debian.org을 하고 위의 해석 언어의 대 V8을 비교합니다.


답변

아니요-동적 언어를 컴파일 할 수 있습니다.

디자인에 의해 항상 컴파일되는 동적 언어도 있습니다 (예 : Clojure).

그러나 문제는 중요한 관련 요점을 다룹니다. 동적 언어는 컴파일 할 수 있지만 정적 언어와 같은 코드로 동적 언어 를 컴파일 할 수없는 경우가 종종 있습니다 . 동적 언어에는 정적으로 컴파일 된 언어에서 필요하지 않은 런타임 검사가 필요한 고유 한 기능이 있기 때문입니다.

예 : 객체 (예 : Ruby)의 런타임 패치를 허용하는 언어는 종종 객체에서 메소드를 호출 할 때마다 객체를 검사해야합니다 (해시 테이블 조회 또는 이와 유사한 방식으로). 이것이 컴파일 되더라도 컴파일러는 런타임에 메소드 조회를 수행하기위한 코드를 생성해야합니다. 어느 정도까지이 방법 조회는 통역사가해야 할 것과 비슷하지 않습니다.

이는 Java와 같은 언어의 메소드 호출과 비교할 때 클래스 오버 헤드에서 올바른 메소드를 정적으로 판별하고 기본 코드의 간단한 함수 호출로 줄일 수있는 상당한 오버 헤드를 추가합니다.

나는 이것이 정적 컴파일 된 언어보다 동적 언어의 평균 성능이 느려지는 결과가 다른 무엇보다이 효과라고 생각합니다. 결함이있는 벤치 마크 에서 볼 수 있듯이 정적 유형 언어 (C, Java, Fortran 등)는 순위가 가장 낮은 동적 언어 (Perl, Python, Ruby, PHP 등)에서 가장 빠른 경향이 있습니다.


답변

옛날 옛적에 BASIC이 해석되었습니다. 그리고 BASIC의 일부 변형에는 동적 타이핑이있었습니다. 또한 컴파일러도 얻을 수 있습니다.

(이것은 공룡이 지구를 돌아 다니며 아침 식사로 의심하지 않는 소프트웨어 개발자를 먹었을 때 100K 플로피 드라이브 시대로 돌아 왔습니다.)


답변

다른 스몰 토크 구현은이를 다르게 처리하지만 그 중 일부는 고성능 VM에서 실행되는 바이트 코드로 컴파일됩니다.