문제

선택한 대답에서 블루 루비에 대한이 질문, 척이 말한다 :

현재의 모든 루비 구현은 바이트 코드로 컴파일됩니다. Ruby 1.9와 같이 SAP의 주장과는 달리 MRI 자체에는 바이트 코드 컴파일러가 포함되지만, 컴파일 된 바이트 코드를 디스크로 저장하는 기능은 YARV 가상 머신을 병합하는 과정에서 사라졌습니다. Jruby는 Java .class 파일로 컴파일됩니다. 나는 Maglev에 대한 세부 정보가 많지 않지만 그 길도 걸릴 것이라고 말하는 것이 안전 해 보입니다.

루비와 관련 하여이 편집/해석 문제에 대해 혼란스러워합니다.

루비는 해석 된 언어라는 것을 알게 되었기 때문에 루비 파일에 변경 사항을 저장할 때 프로젝트를 다시 빌드 할 필요가 없습니다.

그러나 현재 루비 구현이 이제 컴파일된다면 루비가 해석 된 언어라고 말하는 것이 여전히 공평합니까? 아니면 내가 뭔가 오해하고 있습니까?

도움이 되었습니까?

해결책

그렇습니다. 루비는 여전히 해석 된 언어, 또는 더 정확하게는 Matz 's Ruby 통역사 (MRI)는 사람들이 일반적으로 Ruby에 대해 이야기 할 때 이야기하는 것입니다. 컴파일 단계는 단순히 동일한 코드를 해석하고 재 해석하는 것보다 실행하기가 더 빠른 코드로 코드를 줄이기 위해 단순히 있습니다.

다른 팁

바이트 코드를 컴파일되는 것으로 계산하면 거의 모든 언어가 "컴파일"됩니다. EMACS LISP조차도 편집되었습니다. 루비는 최근까지는 특별한 경우였습니다. 그렇지 않았습니다 바이트 코드로 컴파일되었습니다.

언어를 "편집"대 "해석"으로 특성화하는 유용성에 의문을 제기하는 것이 옳다고 생각합니다. 그러나 유용한 차이점 중 하나는 언어가 사용자 코드에서 직접 기계 코드 (예 : x86 어셈블러)를 생성하는지 여부입니다. C, C ++, 많은 LISP 및 JIT가있는 Java는 활성화되었지만 Ruby, Python 및 Perl은 그렇지 않습니다.

더 잘 모르는 사람들은 별도의 수동 편집 단계가 "컴파일 된"언어와 "해석되지 않은"언어를 부를 것입니다.

실제로 미묘한 질문은 ... "해석 된"언어가 구문 분석되어 중간 형태로 변형되었지만 실행하기가 더 빠르지 않았지만이를 실행하는 "기계"는 언어 별 프로그램이었습니다. "컴파일 된"언어는 대신 실행중인 컴퓨터가 지원하는 기계 코드 지침으로 번역되었습니다. 초기 구별은 매우 기본적이었습니다-Static과 Dynamic Scope. 정적으로 입력 한 언어에서, 가변 참조는 몇 가지 기계 지침으로 메모리 주소로 거의 해결 될 수 있습니다. 동적으로 입력 한 언어에서는 참조를 위해 (A- 목록 또는 호출 프레임 위로) 검색해야했습니다. 객체 지향 프로그래밍의 출현으로, 참조의 비 임시 특성은 클래스 (유형), 방법 (기능), 심지어 구문 적 해석 (Regex와 같은 내장 DSL) 등 많은 개념으로 확장되었습니다.

실제로 70 년대 후반으로 돌아가는 구별은 편집자와 해석 사이에 그리 많지 않았습니다. 언어, 그러나 그들이 편집 된 환경에서 운영되었는지 여부. 예를 들어, Pascal (내가 공부 한 최초의 고급 언어)은 UC Berkeley에서 Bill Joy 's에서 처음으로 달렸습니다. PXP 통역사, 그리고 나중에 그가 쓴 컴파일러에서 PCC. 컴파일 된 환경 및 해석 된 환경 모두에서 사용할 수있는 동일한 언어.

일부 언어는 다른 언어보다 더 역동적이며, 유형, 방법, 변수의 의미는 런타임 환경에 따라 다릅니다. 이는 컴파일되었는지 아닌지 프로그램 실행과 관련된 실질적인 런타임 메커니즘이 있음을 의미합니다. Smalltalk, News, LISP는 모두 이것의 예였습니다. 처음에,이 언어들은 해석에 자연 스러웠던 (c 또는 fortran) 실행하기 위해 너무 많은 메커니즘이 필요했습니다.

Java 이전에도 트릭, 스레드 컴파일이 된 기술, 정시 컴파일 등으로 복잡하고 역동적 인 언어의 실행 속도를 높이려는 시도가있었습니다.

그러나 나는 그것이 Java라고 생각합니다. 그것은 컴파일러/통역사 격차를 실제로 진흙 투성이 한 최초의 넓은 언어였으며, 아이러니하게도 더 빨리 실행되지는 않지만 어디에서나 실행될 수 있도록 아이러니하게도 비웃음을 나타냅니다. Java Bytecode 및 VM을 자체 기계 언어와 "기계"를 정의함으로써 Java는 기본 머신과 가까운 것으로 편집 된 언어가되었지만 실제로는 실제 기계가 아닙니다.

현대 언어는 이러한 모든 혁신과 결혼합니다. 일부는 전통적인 "해석 된 언어 (Ruby, Lisp, Smalltalk, Python, Perl (!))의 untime의 특성을 가지고있는 역동적이고 개방적이며, 당신이 알지 못하는 것입니다. 전통적인 컴파일 된 언어 (Java, Scala)의 깊은 유형 기반 정적 오류 감지를 허용하는 사양의 엄격함이 있어야합니다. 모든 시스템 독립적 표현 (JVM)으로 컴파일하여 Semantics를 한 번 쓸 수 있습니다.

그래서 컴파일 대 해석? 두 가지 중 최고라고 말하고 싶습니다. 모든 코드가 소스 (문서 포함) 주변의 주변에있는 모든 것을 변경하고 효과가 즉각적이고 간단한 작업이 하드웨어가 수행 할 수있는만큼 빠르게 실행되며 복잡한 제품이 지원되고 충분히 빠르며 하드웨어 및 메모리 모델이 플랫폼에서 일관됩니다.

오늘날 언어의 더 큰 논쟁은 아마도 정적으로 또는 동적으로 입력되었는지 여부 일 것입니다. 즉, 얼마나 빨리 실행 될지는 아니지만, 미리 컴파일러가 오류를 찾을 수있을 것입니다 (프로그래머가 매우 복잡한 타이핑을 지정 해야하는 비용으로. 정보) 또는 테스트 및 생산에서 오류가 나타납니다.

Ruby 프로그램을 대화식으로 사용하여 실행할 수 있습니다 irb, 대화식 루비 쉘. 중간 바이트 코드를 생성 할 수 있지만 전통적인 의미에서는 "컴파일러"가 아닙니다.

컴파일 된 언어는 일반적으로 바이트 코드와 달리 기계 코드로 컴파일됩니다. 일부 바이트 코드 생성기는 실제로 바이트 코드를 기계 코드로 더 컴파일 할 수 있습니다.

바이트 코드 자체는 사용자가 작성한 문자 코드와 가상 시스템 사이의 중간 단계 일 뿐이므로 가상 컴퓨터에서 해석해야합니다 (Opcode 캐시가있는 JVM 및 PHP에서 Java로 수행).

이것은 아마도 약간의 주제이지만 ...

아이언 루비 Ruby의 .NET 기반 구현이므로 일반적으로 바이트 코드로 컴파일 된 다음 JIT는 런타임에 머신 언어로 컴파일됩니다 (즉, 해석되지 않음). 또한 (적어도 다른 .NET 언어를 사용하므로 루비로 생각합니다) ngen 컴파일 된 네이티브 바이너리를 미리 생성하는 데 사용할 수 있으므로 효과적으로 루비 코드의 기계 코드 컴파일 버전입니다.

상하이의 Rubyconf 2011에서 얻은 정보에 관해서, Matz는 임베디드 장치에서 실행되는 타겟팅에 이르기까지 'Mruby'(Matz의 Ruby의 약자)를 개발하고 있습니다. Matz는 Mruby는 루비 코드를 기계 코드로 컴파일하여 속도를 높이고 내장 장치에서 (제한된) 리소스의 사용을 줄이는 능력을 제공 할 것이라고 말했다. 따라서 다양한 종류의 루비 구현이 있으며 런타임 중에 모든 것이 해석되는 것은 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top