동적 언어는 항상 해석됩니까?


18

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


4
동적 언어를 정의하십시오. 동적으로 입력 되었습니까?
BenjaminB

3
Objective-C는 많은 "동적"속성을 나타냅니다.
Edward Strange

4
@Job, 수십 년 동안 Lisp과 함께 할 수 있습니다. 그리고 컴파일되고 동적으로 유형이 지정됩니다. 따라서 컴파일과 해석 사이에 정확한 경계선은 없었습니다.
SK-logic

2
@Darien 런타임에 컴파일하고 나중에 코드를 실행할 수 있습니다. 엄밀히 말하면 해석이 아닙니다.
xmm0

3
@Darien Nothing은 컴파일러가 심볼 테이블 정보를 컴파일 된 바이너리에 저장하고 런타임에 액세스 할 수있는 코드를 생성하지 못하게합니다. 일부 언어는 컴파일 이상의 해석에 적합하다는 것이 사실이지만, 요점은 해당 언어에 대한 컴파일러를 가질 있다는 것입니다. 주목해야 할 또 다른 중요한 점은 일부 사람들은 컴파일러가 일종의 기계 코드를 생성해야한다고 가정한다는 것입니다. 실제로 두 언어 (또는 일부 Javascript 축소 기와 같은 동일한 언어)에서 소스 레벨 변환을 수행하는 컴파일러가 있습니다.
xmm0

답변:


33

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

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

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

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


19
파이썬이 구문 적으로 유효하려면 화이트 보드에서 들여 쓰기와 일치하는 정밀도는 무엇입니까? ;)
edA-qa mort-ora-y

1
파이썬을 컴파일 할 수 없습니다. PYC는 모듈의로드 만 가속화합니다. py2exe는 소스 파일을 사용하여 인터프리터를 exe에 간단히 포함시킵니다.
BenjaminB

8
@ Ubiquité : .pyc파일은 바이트 코드입니다. 파이썬 소스 코드는 파싱, 최적화 및 컴파일 되어 만들어졌습니다. 바이트 코드 명령어는 상대적으로 높은 수준이며 가장 널리 사용되는 구현은 일반 인터프리터입니다 (반면, 런타임시 바이트 코드를 매우 영리한 기계 코드로 JIT 컴파일하는 PyPy를 참조하십시오).하지만 Python은 Java보다 덜 컴파일되지 않습니다. 씨#. 파이썬은 "컴파일"이 네이티브 사전 컴파일로 제한되어있을 경우에만 "컴파일되지"않습니다 .

4
@ Ubiquité : 네, 맞습니다. 그러나 "Python을 컴파일 할 수 없다"는 주장이나 Python을 컴파일 할 수 있는지 여부와 는 아무 상관이 없습니다 . 가장 먼저, 당신은 혼합 Python하고 CPython, 후자는 전자의 구현이므로 PyPy.
phant0m

2
@ClemC 언어의 모든 속성은 컴파일러 나 인터프리터에 내장되어 있으며, 그렇지 않으면 인터프리터 나 컴파일러는 다른 언어를위한 것입니다.
피터 B

15

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

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


12

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


4

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


3

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

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

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

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

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

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


2

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

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


... GOTO를 사용할 때만 가능합니다. (물론 그들이 BASIC에서 개발하고 있다면 꽤 흔했습니다. AHA! 그 설명입니다!)
Mason Wheeler

디자인 타임의 베이직은 컴파일 된 언어였습니다.
AProgrammer

2

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


2

실제로 소위 "해석 된"언어의 대부분은 적시에 컴파일되어 더 빨리 실행되도록합니다. 그리고 일부는 바이트 코드로 컴파일해야 실행할 수 있습니다.

사실 역동적이고 해석적인 것은 완전히 다른 두 가지 아이디어이지만 상관 관계가 있습니다. 동적 타이핑을 느끼는 사람이 작업을 더 쉽고 빠르게 할 수 있기 때문에 코드를 조금 느리게 이식 할 수는 없습니다.


1

Chrome, IE9 및 Firefox 3.1 이상은 모두 JavaScript를 기본 바이너리로 컴파일하며 JavaScript는 동적으로 입력됩니다.

동적 언어가 역사적으로 해석되는 경향이있는 이유는 동적 타이핑 및 해석 (또는보다 구체적으로 컴파일 부족)이 모두 언어 스크립팅 및 스크립팅 작업에 유용한 기능이기 때문입니다.

이러한 언어로 작성된 프로그램의 종류에 대해서도 성능에 큰 관심이 없었으므로 동적 타이핑 및 해석의 오버 헤드는 언어에서와 같이 크게 문제가되지 않았습니다. 그 가치 성능.


1

파이썬은 일반적으로 컴파일됩니다. 바이트 코드로 컴파일 된 후 해석됩니다.

펄은 비슷한 방식으로 작동합니다.

Common Lisp은 일반적으로 네이티브 또는 바이트 코드 중 하나로 컴파일됩니다. 이것은 구현마다 다릅니다 (다양한 최적화 설정에 따라 구현 내에서 어느 정도).


-5

예. 모든 동적 언어는 해석되는 언어입니다 (그러나 해석 된 언어는 비 동적 일 수 있음).

이유는 간단합니다. 동적 인 경우 이진 컴파일 수준에서 역 동성을 수행하려면 인터프리터가 필요합니다.

전의. : PHP 변수에 데이터를 넣은 후 나중에 다른 유형의 다른 변수를 넣을 때 각 유형마다 고유 한 이진 표현 형식이 있으므로 프로그램이 이진 코드로 컴파일 할 수 없습니다. 인터프리터는 이진 레벨에서 시프트를 동적으로 관리합니다.


2
잘못된. 동적 언어를 컴파일 할 수 있습니다 (예를 들어 JIT 및 적응 컴파일 기법을 사용하여 매우 효율적)
Basile Starynkevitch

"거의 JIT 컴파일은 컴파일 된 코드의 속도와 해석의 유연성, 인터프리터의 오버 헤드를 결합합니다 ..." en.wikipedia.org/wiki/Just-in-time_compilation 프로그램이 컴파일하지 않습니다. 당신을위한 통역
ClearMind


확실한. "Self의 특징 중 하나는 이전 Smalltalk 시스템과 동일한 종류의 가상 머신 시스템을 기반으로한다는 것입니다. 즉, 프로그램은 C와 같은 언어의 독립형 엔터티가 아니지만 실행하기 위해 전체 메모리 환경. " 독립 실행 형 아님 = 이진 컴파일 안 됨 가상 머신이 이진 컴파일을 수행하는 데 필요
ClearMind

1
컴파일러 정의 가 너무 제한적입니다. 모든 컴파일러가 이진 실행 파일을 생성하는 것은 아닙니다. 최근의 반대 사례 에 대해서는 SBCL 구현을 연구하십시오 . 최신 드래곤 북 읽기 및 작은 조각 속 Lisp
Basile Starynkevitch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.