컴파일 된 언어와 해석 된 언어의 차이점은 무엇입니까?


118

이 주제에 대한 몇 가지 자료를 읽은 후에도 컴파일 된 언어와 해석 된 언어의 차이점이 무엇인지 잘 모르겠습니다. 이것이 Java와 JavaScript의 차이점 중 하나라고 들었습니다. 누군가가 그것을 이해하도록 도와 주시겠습니까?

답변:


165

컴파일 된 언어와 해석 된 언어의 차이점은 무엇입니까?

차이점은 언어 가 아닙니다 . 그것은 구현에 있습니다.

내 시스템에서 얻은 결과는 다음과 같습니다.

  • 컴파일 된 구현에서 원래 프로그램은 하드웨어에 의해 직접 실행되는 원시 기계 명령어로 변환됩니다.

  • 해석 된 구현에서 원래 프로그램은 다른 것으로 번역됩니다. "인터프리터"라고하는 다른 프로그램은 "다른 것"을 검사하고 요청 된 작업을 수행합니다. 언어와 구현에 따라 "다른 것"의 다양한 형태가 있습니다. 더 인기있는 것부터 덜 인기있는 것까지 "다른 것"은

    • Lua, Python, Ruby, Smalltalk 및 기타 여러 시스템에서 수행되는 것처럼 종종 bytecode 라고하는 가상 머신에 대한 이진 명령어 (이 접근 방식은 1970 년대 UCSD P 시스템 및 UCSD Pascal에 의해 대중화되었습니다)

    • 많은 프로토 타입 또는 교육용 인터프리터를 위해 수행되는 추상 구문 트리와 같은 원래 프로그램의 트리 형 표현

    • Tcl과 유사한 소스 프로그램의 토큰 화 된 표현

    • MINT 및 TRAC에서 수행 한 소스 프로그램의 특성

문제를 복잡하게 만드는 한 가지는 바이트 코드를 네이티브 머신 명령어로 변환 (컴파일) 할 수 있다는 것입니다 . 따라서 성공적인 해석 구현은 결국 컴파일러를 획득 할 수 있습니다. 컴파일러가 백그라운드에서 동적으로 실행되는 경우 종종 Just-in-time 컴파일러 또는 JIT 컴파일러라고합니다. JIT는 Java, JavaScript, Lua 용으로 개발되었으며 다른 많은 언어를 감히 생각합니다. 이 시점에서 일부 코드가 해석되고 일부 코드가 컴파일되는 하이브리드 구현을 가질 수 있습니다.


7
선생님, 다음 질문이 있습니다. 1. "다른 것"이 어떤 언어로 작성 되었습니까? 2. JavaScript의 맥락에서 "다른 것"이 브라우저마다 다른가요? 3. 내 스크립트가 Google 크롬과 Internet Explorer에서 실행되고 있는데 두 브라우저에서 동일하게 해석됩니까?
JavaHopper

@Norman은 멋진 설명이었습니다. 그러나 여기에 제가 여전히 가지고있는 몇 가지 혼란이 있습니다. 컴파일 된 구현에서 원래 프로그램은 원시 기계 명령어로 변환됩니다. 어째서? 예를 들어, 컴파일 후 C가 어셈블리 코드를 생성 할 것이라고 생각했습니다. 어쨌든 네이티브 어셈블러에 의해 기본 머신의 머신 코드로 어셈블되어야합니다. 그렇다면 해석 된 언어의 경우 동일한 작업을 수행하는 VM (python 또는 JVM 등)과 어떻게 다른가요?
qre0ct

58

자바와 자바 스크립트는 둘 다 해석 된 언어이기 때문에이 차이를 보여주는 상당히 나쁜 예 입니다. Java (해석 됨) 및 C (또는 C ++) (컴파일 됨) 가 더 나은 예일 수 있습니다.

왜 취소 선이 그어진 텍스트입니까? 이 답변이 제대로 지적하지 언어에 대해, 언어의 구체적인 구현에 대해 컴파일 /되어 해석 그 자체 . "C는 컴파일 된 언어입니다"와 같은 문장은 일반적으로 사실이지만, 누군가가 C 언어 인터프리터를 작성하는 것을 막을 수는 없습니다. 실제로 C에 대한 인터프리터가 존재합니다 .

기본적으로 컴파일 된 코드는 컴퓨터의 CPU에서 직접 실행할 수 있습니다. 즉, 실행 코드는 CPU의 "기본"언어 ( 어셈블리 언어 )로 지정됩니다.

그러나 해석 된 언어의 코드는 런타임시 모든 형식에서 CPU 기계 명령어로 변환되어야합니다. 이 번역은 통역사가합니다.

또 다른 방법은 해석 된 언어는 프로그램이 실행되는 동안 단계별로 기계 명령어 코드가 번역되는 반면 , 컴파일 된 언어는 프로그램 실행 전에 코드가 번역 된다는 것 입니다.


8
Java가 해석됩니까? 위키 백과에서 : "Java 애플리케이션은 일반적으로 컴퓨터 아키텍처에 관계없이 모든 JVM (Java Virtual Machine)에서 실행할 수있는 바이트 코드 (클래스 파일)로 컴파일됩니다."
Personman

6
@Personman은 JVM이 OS 자체가 아니라 코드를 실행하므로 기술적으로 "해석"됩니다. 현대 OS의 복잡성으로 인해 대부분의 상황에서 기본적으로 차이가 발생한다고 말할 수 있기 때문에 더 이상 의미 론적 차이입니다. 앱을 실행하는 OS와 코드를 실행하는 앱을 실행하는 OS의 차이점에 대해 이야기합니다.
GrayWizardx 2010

5
클래스 파일 자체가 Java VM에 의해 해석된다는 것을 의미한다고 가정합니다. 그것은 합리적이지만 Java 소스는 ​​실제로 Java VM 바이트 코드로 컴파일됩니다. VM이 다른 아키텍처의 기계 코드로 해석 할 필요가없는 물리적 Java 기계를 구축 할 수 있습니다. 따라서 Java가 컴파일되었다고 말하는 것이 더 정확 해 보입니다. 그러나 이것은 구별이 혼란스럽고 임의적 인 방식의 좋은 예입니다. 결국 컴파일 된 C는 CPU에 의해 해석됩니다.
Personman 2010

13
자바는 본질적으로 둘 다이기 때문에 컴파일되거나 해석 된 언어의 꽤 나쁜 예입니다. 비교를한다면 혼동을 피하기 위해 C와 Lisp를 사용하겠습니다.
Bill the Lizard

7
@stakx-실제로 Java 바이트 코드는 일반적으로 JIT 컴파일러에 의해 기본 코드로 컴파일됩니다. 순수한 인터프리터 동작을 얻는 유일한 방법은 JVM이 시작될 때 JIT 컴파일러를 명시 적으로 끄는 것입니다.
Stephen C

15

다음은 컴파일러와 인터프리터 언어의 기본적인 차이점입니다.

컴파일러 언어

  • 전체 프로그램을 단일 입력으로 받아 파일에 저장된 개체 코드로 변환합니다.
  • 중간 개체 코드가 생성됩니다.
  • 예 : C, C ++
  • 컴파일이 실행 전에 수행되기 때문에 컴파일 된 프로그램이 더 빠르게 실행됩니다.
  • 메모리 요구 사항은 개체 코드 생성으로 인한 것입니다.
  • 전체 프로그램이 컴파일 된 후 오류가 표시됩니다.
  • 소스 코드 --- 컴파일러 --- 기계 코드 --- 출력

통역 언어 :

  • 단일 명령어를 단일 입력으로 취하고 명령어를 실행합니다.
  • 중간 개체 코드가 생성되지 않습니다.
  • 예 : Perl, Python, Matlab
  • 해석 된 프로그램은 컴파일과 실행이 동시에 이루어 지므로 느리게 실행됩니다.
  • 메모리 요구 사항이 적습니다.
  • 모든 단일 명령에 대해 오류가 표시됩니다.
  • 소스 코드 --- 통역사 --- 출력

5

일반적으로 컴파일러는 더 높은 수준의 언어 컴퓨터 코드를 읽고이를 p- 코드 또는 원시 기계어 코드로 변환합니다. 인터프리터는 p 코드 또는 Basic 또는 Lisp와 같은 해석 된 코드에서 직접 실행됩니다. 일반적으로 컴파일 된 코드는 훨씬 더 빠르게 실행되고 더 간결하며 이미 모든 구문 오류와 많은 잘못된 참조 오류를 발견했습니다. 해석 된 코드는 응용 프로그램이 영향을받는 코드를 해석하려고 시도한 후에 만 ​​이러한 오류를 찾습니다. 해석 된 코드는 종종 한 번만 또는 최대 두 번만 사용되거나 프로토 타이핑에 사용되는 간단한 응용 프로그램에 유용합니다. 컴파일 된 코드는 심각한 애플리케이션에 더 좋습니다. 컴파일러는 먼저 전체 프로그램을 가져 와서 오류를 확인하고 컴파일 한 다음 실행합니다. 반면 인터프리터는 한 줄씩 수행하므로 한 줄을 사용하여 오류를 확인하고

더 많은 정보가 필요하면 Google에서 "컴파일러와 인터프리터의 차이점"을 확인하십시오.


3
음, 처음 두 문장을 넘어서이 중 일부를 어디서 얻었는지 확실하지 않습니다. 이것은 기술적으로 몇 세대 전에 많은 통역 언어로 사실 이었지만 플랫폼과 세부 사항에 대한 관심에 따라 특정 활동에 대해 컴파일 된 코드와 비슷하거나 컴파일 된 코드를 수행하는 해석 코드를 가질 수 있습니다.
GrayWizardx 2010

오늘날 전체 프로그래밍 세계에 거의 넘쳐나는 Java, C # 및 JavaScript와 같은 언어를 염두에두고 "컴파일 된 코드가 심각한 응용 프로그램에 더 적합하다"고 말하는 것은 불공평합니다.
Sisir

2

이것은 매우 모호한 구별이며 실제로 일반적으로 언어 자체의 속성이 아니라 해당 언어로 코드를 실행하는 데 사용하는 프로그램의 속성입니다.

그러나 대부분의 언어는 주로 한 형식 또는 다른 형식으로 사용되며 예, Java는 기본적으로 항상 컴파일되는 반면 javascript는 기본적으로 항상 해석됩니다.

소스 코드를 컴파일하는 것은 실행시 소스에 의해 정의 된 동작을 갖는 바이너리 실행 파일을 생성하는 프로그램을 실행하는 것입니다. 예를 들어 javac는 사람이 읽을 수있는 .java 파일을 기계가 읽을 수있는 .class 파일로 컴파일합니다.

소스 코드를 해석하려면 중간 파일을 생성하지 않고 정의 된 동작을 즉시 생성하는 프로그램을 실행합니다. 예를 들어 웹 브라우저가 stackoverflow.com을로드 할 때 많은 자바 스크립트 (페이지 소스를보고 볼 수 있음)를 해석하고 이러한 페이지가 갖는 멋진 효과 (예 : upvoting 또는 작은 알림)를 생성합니다. 상단에 막대.


Java는 처음에는 바이트 코드로 변환되고 JVM이 실행되는 동안에 만 기계 코드로 변환됩니다. 컴파일되고 해석되지 않는다고 말하는 것이 맞습니까?
Sisir

1
Java 바이트 코드가 해석된다고 말할 수 있지만 아무도 Java 바이트 코드를 작성하지 않습니다. Java 자체는 일반적으로 바이트 코드로 컴파일됩니다.
Personman

2

해석 된 언어는 셸 스크립팅과 같은 명령에 따라 런타임에 실행되며 컴파일 된 언어는 컴파일 된 (CPU가 이해할 수있는 어셈블리 언어로 변경됨) 후 C ++에서와 같이 실행되는 언어입니다.


0

다른 사람들이 말했듯이 컴파일해석 은 프로그래밍 언어 의 구현 에 따라 다릅니다 . 그들은 언어에 내재되어 있지 않습니다 . 예를 들어, C 인터프리터가 있습니다.

그러나 우리는 가장 일반적인 (때로는 표준적인) 구현을 기반으로 프로그래밍 언어를 분류 할 수 있습니다 (실제로는 그렇게합니다). 예를 들어, C가 컴파일되었다고 말합니다.

먼저 모호한 인터프리터와 컴파일러없이 정의해야합니다.

언어 X인터프리터 는 모든 프로그램을 실행하는 프로그램 (또는 기계 또는 일반적인 메커니즘)입니다. (P) 언어로 작성된 X를 그 효과를 수행하고, 명세서에 의해 규정 된 결과를 평가하도록 X .

컴파일러 에서 XY는 임의의 프로그램으로 변환하는 프로그램 (또는 시스템, 또는 일반적으로기구의 단지 일종) 인 (P) 몇몇 언어에서 X를 의미 상 동등한 프로그램에 P ' 어떤 언어 Y 해석하는 방식으로 P ' Y 를위한 통역사와 함께 사용하면 동일한 결과가 나오고 X에 대한 인터프리터로 p 를 해석하는 것과 동일한 효과를 갖습니다 .

프로그래머의 관점에서 볼 때 CPU는 각각의 고유 기계 언어에 대한 기계 해석기입니다.

이제 가장 일반적인 구현에 따라 프로그래밍 언어를 3 가지 범주로 잠정적으로 분류 할 수 있습니다.

  • 하드 컴파일 된 언어 : 프로그램이 완전히 기계어로 컴파일 된 경우. 사용되는 유일한 인터프리터는 CPU입니다. 예 : 일반적으로 C로 프로그램을 실행하려면 소스 코드를 기계어로 컴파일 한 다음 CPU에 의해 실행합니다.
  • 해석 언어 : 원래 프로그램의 일부를 기계어로 컴파일하지 않은 경우. 즉, 새로운 기계어 코드가 생성되지 않습니다. 기존 기계 코드 만 실행됩니다. CPU 이외의 인터프리터도 사용해야합니다 (일반적으로 프로그램) 예 : Python의 표준 구현에서 소스 코드는 먼저 Python 바이트 코드로 컴파일 된 다음 해당 바이트 코드는 파이썬 바이트 .
  • 소프트 컴파일 된 언어 : CPU 이외의 인터프리터가 사용되지만 원본 프로그램의 일부가 기계어로 컴파일 될 수있는 경우. 이것은 소스 코드가 먼저 바이트 코드로 컴파일 된 다음 Java 인터프리터에 의해 해석되거나 JIT 컴파일러에 의해 추가로 컴파일되는 Java의 경우입니다.

때로는 소프트 및 하드 컴파일 된 언어가 단순히 컴파일 된 것으로 참조되기 때문에 C #, Java, C, C ++가 컴파일되었다고합니다.

이 범주에서 JavaScript는 통역 언어 였지만 수년 전의 일이었습니다. 요즘에는 대부분의 주요 JavaScript 구현에서 기본 기계 언어로 JIT 컴파일되므로 소프트 컴파일 된 언어에 속한다고 말하고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.