3

다이나믹 특성을 잃지 않고 파이썬이나 루비 같은 동적 언어를 해석하는 대신 컴파일 할 수 없도록하는 몇 가지 이유가 있습니까?동적 특성을 잃지 않고 동적 언어 용 컴파일러를 만들 수 있습니까?

물론 가상 컴파일러에 대한 요구 사항 중 하나는 이러한 언어가 메타 프로그래밍, 객체 확장, 코드 추가 또는 런타임에 유형 시스템 수정과 같은 그의 특성을 잃지 않는다는 것입니다.

요약하면 동적 프로그래밍 언어로서 그의 특성을 잃지 않고 Ruby 또는 Python 컴파일러를 만들 수 있습니까?

+0

Python * is * compiled. 파이썬 바이트 코드로. –

+0

나에게있어서 파이썬은 해석된다. 바이트 코드를 컴파일하는 것은 원래의 코드를 단지 빠른 방식으로 해석하는 것일 뿐이다. 그러나 마지막으로 바이트 코드가 해석됩니다. – jfcalvo

+3

* 언어는 컴파일되지 않고 해석되지 않습니다. 언어의 ** 구현 **은 해석되거나 컴파일되며, 그 다음에도 명확한 구별이 없습니다. [타무라의 돌기]을 사용하여 실제로 (http://en.wikipedia.org/wiki/Partial_evaluation#Futamura_projections)는 그러므로 그것이 ** 것이 상당히 명백 통역자 지정해, * 자동 방식 컴파일러를 얻을 수있어 ** 파이썬/루비 컴파일러를 만들 수 있습니다. 진짜 질문은 : 더 빠를 것인가, 아니면 전혀 이점을 줄까요? – Bakuriu

답변

2

예, 동적 언어 용 컴파일러를 만드는 것은 가능합니다. 다음은 동적 언어 용 컴파일러의 예입니다.

  • CPython은 Python 컴파일러가있는 Python 프로그래밍 언어의 구현입니다.
  • PyPy는 Python 컴파일러가있는 Python 프로그래밍 언어의 구현입니다.
  • 자이 썬은 Python 컴파일러가있는 Python 프로그래밍 언어를 구현 한 것입니다.
  • IronPython은 Python 컴파일러가있는 Python 프로그래밍 언어의 구현입니다.
  • Pynie는 Python 컴파일러가있는 Python 프로그래밍 언어의 구현입니다.
  • YARV는 Ruby 컴파일러가있는 Ruby 프로그래밍 언어의 구현입니다.
  • Rubinius는 Ruby 컴파일러가있는 Ruby 프로그래밍 언어의 구현입니다.
  • MacRuby는 Ruby 컴파일러가있는 Ruby 프로그래밍 언어의 구현입니다.
  • JRuby는 Ruby 컴파일러가있는 Ruby 프로그래밍 언어의 구현입니다.
  • IronRuby는 Ruby 컴파일러가있는 Ruby 프로그래밍 언어의 구현입니다.
  • MagLev는 Ruby 컴파일러가있는 Ruby 프로그래밍 언어의 구현입니다.
  • Quercus는 PHP 컴파일러가있는 PHP 프로그래밍 언어의 구현체입니다.
  • P8은 PHP 컴파일러가있는 PHP 프로그래밍 언어의 구현입니다.
  • V8은 ECMAScript를 컴파일러가 ECMA 스크립트 프로그래밍 언어의 구현입니다.
모든 언어 컴파일러에 의해 구현 될 수있다 일반적으로

, 및 모든 언어 통역사에 의해 구현 될 수있다. 도 자동으로에서 인터프리터에서 컴파일러를 파생시킬 수 있으며 그 반대의 경우도 가능합니다.

대부분의 현대적인 언어 구현은 모두 해석과 편집, 때로는 여러 컴파일러를 사용합니다. Rubinius를 예로 들어 보겠습니다. 첫 번째 Ruby 코드는 Rubinius 바이트 코드로 컴파일됩니다. Rubinius 바이트 코드는 Rubinius VM에 의해 해석됩니다. 여러 번 해석 된 코드는 Rubinius 컴파일러 IR로 컴파일 된 다음 LLVM IR로 컴파일 된 다음 "네이티브 코드"(그게 무엇이든)로 컴파일됩니다. Rubinius에는 통역사와 컴파일러가 각각 하나씩 있습니다.

V8 다른 예이다. 그것은 실제로 인터프리터가 있지만, 두 개의 다른 컴파일러가 있습니다. 하나의 매우 빠르며, 매우 메모리 효율적인 컴파일러는 최적화되지 않았고 다소 느린 코드를 생성합니다. 여러 번 실행 된 코드는 버려지고 두 번째 컴파일러에서 다시 컴파일됩니다.이 코드는 적극적으로 최적화 된 코드를 생성하지만 컴파일하는 데 더 많은 시간과 메모리를 사용합니다.

그러나 결국 인터프리터없이 코드를 실행할 수 없습니다. 컴파일러는 코드를 실행할 수 없습니다. 컴파일러는 한 언어의 프로그램을 다른 언어로 번역합니다. 그게 전부 야. 결국 당신이 원하는 모든 것을 번역 할 수 있습니다. 뭔가은 코드를 실행해야하며, 그 것은 해석기입니다. 소프트웨어 또는 실리콘으로 구현 될 수도 있지만 여전히 통역사입니다.

+1

"컴파일러는 코드를 실행할 수 없습니다 "- 코드를 실행할 수는 있지만 최종 프로그램은 실행하지 않습니다. 예를 들어, C++ 템플릿은 명령형이 아닌 선언 형 언어로 작성된 코드를 실행하도록 컴파일러를 속이는 수단입니다. 컴파일러가 실행하는이 코드는 컴파일러가 출력하는 프로그램의 일부를 구성하는 컴파일 타임 엔티티 (클래스, 함수)입니다. –

+0

@SteveJessop : 예, 그게 무슨 뜻인지 알았습니다. 물론 컴파일러는 코드를 실행합니다. 최소한 컴파일을 수행하는 코드를 실행해야하며, C++ 템플릿, Scala의 Turing-complete 타입 시스템, C#의 오버로드 해상도 (튜링 완료가 아니지만 3-SAT 문제를 인코딩 할 수 있음)) 및 o f 코스 Lisp 매크로를 컴파일 할 때 컴파일러는 해당 언어에 대한 인터프리터를 임베드하거나 "main"프로그램을 컴파일하기 전에 컴파일해야합니다. –

+0

''인터프리터없이 코드를 실행할 수 없다 '면, 인터프리터는 어떻게 동작하나요? – fotanus

1

"컴파일"은 "네이티브 컴퓨터 코드로 컴파일"을 의미하며 다른 사람들이이 매우 좁은 정의에 도전하도록 남겨 두었습니다. 대답은 입니다. 사실, 사람들은 지금이 권리를하고있다 :

  • Nuitka
  • Cython (실제로는하지 파이썬,하지만 매우 가까이 전체 파이썬을 지원하기 위해 만들어 질 수있다).
  • 기술적으로는 바이트 코드와 바이트 코드 인터프리터 만 하나의 바이너리로 패키징하지만 다양한 "고정"도구입니다.

그러나, 컴파일러는 많은을 수행 할 수 없습니다 최적화 (I 효과적으로 제로라고 말하고 싶지만), 그래서 결과 코드는 간단한 생각을 가진 통역 할 것이며, 당신은 단지 해석의 오버 헤드를 저장 것과 기본적으로 동일하다 (그리고 간결한 코드와 빠른 처리 시간을 포함하여 통역사의 좋은 속성을 잃게됩니다. 즉 : Dynamic, correct, fast - choose two (전체 공개 : 허용 된 대답은 내 것임)

관련 문제