이 주제에 대한 몇 가지 자료를 읽은 후에도 컴파일 된 언어와 해석 된 언어의 차이점이 무엇인지 잘 모르겠습니다. 이것이 Java와 JavaScript의 차이점 중 하나라고 들었습니다. 누군가가 그것을 이해하도록 도와 주시겠습니까?
이 주제에 대한 몇 가지 자료를 읽은 후에도 컴파일 된 언어와 해석 된 언어의 차이점이 무엇인지 잘 모르겠습니다. 이것이 Java와 JavaScript의 차이점 중 하나라고 들었습니다. 누군가가 그것을 이해하도록 도와 주시겠습니까?
답변:
컴파일 된 언어와 해석 된 언어의 차이점은 무엇입니까?
차이점은 언어 가 아닙니다 . 그것은 구현에 있습니다.
내 시스템에서 얻은 결과는 다음과 같습니다.
컴파일 된 구현에서 원래 프로그램은 하드웨어에 의해 직접 실행되는 원시 기계 명령어로 변환됩니다.
해석 된 구현에서 원래 프로그램은 다른 것으로 번역됩니다. "인터프리터"라고하는 다른 프로그램은 "다른 것"을 검사하고 요청 된 작업을 수행합니다. 언어와 구현에 따라 "다른 것"의 다양한 형태가 있습니다. 더 인기있는 것부터 덜 인기있는 것까지 "다른 것"은
Lua, Python, Ruby, Smalltalk 및 기타 여러 시스템에서 수행되는 것처럼 종종 bytecode 라고하는 가상 머신에 대한 이진 명령어 (이 접근 방식은 1970 년대 UCSD P 시스템 및 UCSD Pascal에 의해 대중화되었습니다)
많은 프로토 타입 또는 교육용 인터프리터를 위해 수행되는 추상 구문 트리와 같은 원래 프로그램의 트리 형 표현
Tcl과 유사한 소스 프로그램의 토큰 화 된 표현
MINT 및 TRAC에서 수행 한 소스 프로그램의 특성
문제를 복잡하게 만드는 한 가지는 바이트 코드를 네이티브 머신 명령어로 변환 (컴파일) 할 수 있다는 것입니다 . 따라서 성공적인 해석 구현은 결국 컴파일러를 획득 할 수 있습니다. 컴파일러가 백그라운드에서 동적으로 실행되는 경우 종종 Just-in-time 컴파일러 또는 JIT 컴파일러라고합니다. JIT는 Java, JavaScript, Lua 용으로 개발되었으며 다른 많은 언어를 감히 생각합니다. 이 시점에서 일부 코드가 해석되고 일부 코드가 컴파일되는 하이브리드 구현을 가질 수 있습니다.
자바와 자바 스크립트는 둘 다 해석 된 언어이기 때문에이 차이를 보여주는 상당히 나쁜 예 입니다. Java (해석 됨) 및 C (또는 C ++) (컴파일 됨) 가 더 나은 예일 수 있습니다.
왜 취소 선이 그어진 텍스트입니까? 로 이 답변이 제대로 지적하지 언어에 대해, 언어의 구체적인 구현에 대해 컴파일 /되어 해석 그 자체 . "C는 컴파일 된 언어입니다"와 같은 문장은 일반적으로 사실이지만, 누군가가 C 언어 인터프리터를 작성하는 것을 막을 수는 없습니다. 실제로 C에 대한 인터프리터가 존재합니다 .
기본적으로 컴파일 된 코드는 컴퓨터의 CPU에서 직접 실행할 수 있습니다. 즉, 실행 코드는 CPU의 "기본"언어 ( 어셈블리 언어 )로 지정됩니다.
그러나 해석 된 언어의 코드는 런타임시 모든 형식에서 CPU 기계 명령어로 변환되어야합니다. 이 번역은 통역사가합니다.
또 다른 방법은 해석 된 언어는 프로그램이 실행되는 동안 단계별로 기계 명령어 로 코드가 번역되는 반면 , 컴파일 된 언어는 프로그램 실행 전에 코드가 번역 된다는 것 입니다.
다음은 컴파일러와 인터프리터 언어의 기본적인 차이점입니다.
컴파일러 언어
통역 언어 :
일반적으로 컴파일러는 더 높은 수준의 언어 컴퓨터 코드를 읽고이를 p- 코드 또는 원시 기계어 코드로 변환합니다. 인터프리터는 p 코드 또는 Basic 또는 Lisp와 같은 해석 된 코드에서 직접 실행됩니다. 일반적으로 컴파일 된 코드는 훨씬 더 빠르게 실행되고 더 간결하며 이미 모든 구문 오류와 많은 잘못된 참조 오류를 발견했습니다. 해석 된 코드는 응용 프로그램이 영향을받는 코드를 해석하려고 시도한 후에 만 이러한 오류를 찾습니다. 해석 된 코드는 종종 한 번만 또는 최대 두 번만 사용되거나 프로토 타이핑에 사용되는 간단한 응용 프로그램에 유용합니다. 컴파일 된 코드는 심각한 애플리케이션에 더 좋습니다. 컴파일러는 먼저 전체 프로그램을 가져 와서 오류를 확인하고 컴파일 한 다음 실행합니다. 반면 인터프리터는 한 줄씩 수행하므로 한 줄을 사용하여 오류를 확인하고
더 많은 정보가 필요하면 Google에서 "컴파일러와 인터프리터의 차이점"을 확인하십시오.
이것은 매우 모호한 구별이며 실제로 일반적으로 언어 자체의 속성이 아니라 해당 언어로 코드를 실행하는 데 사용하는 프로그램의 속성입니다.
그러나 대부분의 언어는 주로 한 형식 또는 다른 형식으로 사용되며 예, Java는 기본적으로 항상 컴파일되는 반면 javascript는 기본적으로 항상 해석됩니다.
소스 코드를 컴파일하는 것은 실행시 소스에 의해 정의 된 동작을 갖는 바이너리 실행 파일을 생성하는 프로그램을 실행하는 것입니다. 예를 들어 javac는 사람이 읽을 수있는 .java 파일을 기계가 읽을 수있는 .class 파일로 컴파일합니다.
소스 코드를 해석하려면 중간 파일을 생성하지 않고 정의 된 동작을 즉시 생성하는 프로그램을 실행합니다. 예를 들어 웹 브라우저가 stackoverflow.com을로드 할 때 많은 자바 스크립트 (페이지 소스를보고 볼 수 있음)를 해석하고 이러한 페이지가 갖는 멋진 효과 (예 : upvoting 또는 작은 알림)를 생성합니다. 상단에 막대.
다른 사람들이 말했듯이 컴파일 및 해석 은 프로그래밍 언어 의 구현 에 따라 다릅니다 . 그들은 언어에 내재되어 있지 않습니다 . 예를 들어, C 인터프리터가 있습니다.
그러나 우리는 가장 일반적인 (때로는 표준적인) 구현을 기반으로 프로그래밍 언어를 분류 할 수 있습니다 (실제로는 그렇게합니다). 예를 들어, C가 컴파일되었다고 말합니다.
먼저 모호한 인터프리터와 컴파일러없이 정의해야합니다.
언어 X 의 인터프리터 는 모든 프로그램을 실행하는 프로그램 (또는 기계 또는 일반적인 메커니즘)입니다. (P) 언어로 작성된 X를 그 효과를 수행하고, 명세서에 의해 규정 된 결과를 평가하도록 X .
컴파일러 에서 X 로 Y는 임의의 프로그램으로 변환하는 프로그램 (또는 시스템, 또는 일반적으로기구의 단지 일종) 인 (P) 몇몇 언어에서 X를 의미 상 동등한 프로그램에 P ' 어떤 언어 Y 해석하는 방식으로 P ' Y 를위한 통역사와 함께 사용하면 동일한 결과가 나오고 X에 대한 인터프리터로 p 를 해석하는 것과 동일한 효과를 갖습니다 .
프로그래머의 관점에서 볼 때 CPU는 각각의 고유 기계 언어에 대한 기계 해석기입니다.
이제 가장 일반적인 구현에 따라 프로그래밍 언어를 3 가지 범주로 잠정적으로 분류 할 수 있습니다.
때로는 소프트 및 하드 컴파일 된 언어가 단순히 컴파일 된 것으로 참조되기 때문에 C #, Java, C, C ++가 컴파일되었다고합니다.
이 범주에서 JavaScript는 통역 언어 였지만 수년 전의 일이었습니다. 요즘에는 대부분의 주요 JavaScript 구현에서 기본 기계 언어로 JIT 컴파일되므로 소프트 컴파일 된 언어에 속한다고 말하고 싶습니다.