2009-05-19 3 views

답변

29

Ruby에 대한 이식 가능한 바이트 코드 사양이 없으므로 미리 컴파일 된 바이트 코드 아카이브를로드하는 표준 방법도 없습니다. 그러나 거의 모든 Ruby 구현은 바이트 코드 또는 intcode 형식을 사용하며, 그 중 일부는 바이트 코드 아카이브를 덤프하고 다시로드 할 수 있습니다.

YARV은 항상 코드를 실행하기 전에 바이트 코드로 컴파일되지만 일반적으로 메모리에서만 수행됩니다.바이트 코드를 디스크로 덤프하는 방법이 있습니다. 그러나 At the moment, there is no way to read it back in. YARV에 대한 바이트 코드 검증기에서 작업이 진행 중이며 일단 완료되면 바이트 코드가 손상 될 염려없이 VM에 안전하게로드 될 수 있습니다. 또한 JRuby 개발자는 YARV 바이트 코드 형식과 검증자가 안정화되면 YARV VM emulator inside JRuby을 구현하고자하며 YARV 바이트 코드를 JRuby로로드 할 수 있다고 밝혔습니다.

Rubinius는 항상 바이트 코드로 컴파일 (.이 버전은 obsolete 유의), 그리고 (JVM에 .class 파일을 유사 .rbc 파일)을 format for compiled files을 가지고 있으며, 바이트 코드 아카이브 형식에 대한 이야기 ​​(.rba 파일로, 유사있다 JVM .jar 파일). YARV 바이트 코드가 인기있게됨에 따라 앱을 배포하는 경우 Rubinius가 YARV 에뮬레이터를 구현할 가능성이 있습니다. 또한 JRuby 개발자는 Rubinius 바이트 코드가 Ruby 앱을 배포하는 데 널리 사용되는 방법이되면 Rubinius bytecode emulator inside JRuby을 구현할 의사가 있음을 나타냅니다. (이 버전은 obsolete입니다.)

XRuby은 순수한 컴파일러이므로 Ruby 소스 코드를 JVM 바이트 코드 (.class 개 파일)로 직접 컴파일합니다. 다른 Java 응용 프로그램과 마찬가지로 이러한 .class 파일을 배포 할 수 있습니다.

JRuby 통역으로 시작하지만, JVM 바이트 코드 (.class 파일)에 루비의 소스 코드를 컴파일 할 수있는 JIT 컴파일러와 AOT compiler (jrubyc) 모두 있습니다. 또한 실제로는 Java 클래스처럼 보이며 장벽없이 Java 코드에서 사용할 수있는 new compiler that can compile (type-annotated) Ruby code to JVM bytecode을 만드는 작업이 진행 중입니다.

Ruby.NET은 루비 소스 코드를 CIL 바이트 코드 (PE .dll 또는 .exe 개 파일)로 컴파일하는 순수 컴파일러입니다. 다른 CLI 응용 프로그램과 마찬가지로 배포 할 수 있습니다.

IronRuby도 CIL 바이트 코드로 컴파일되지만 일반적으로이 메모리 내에서 수행됩니다. 그러나 commandline switches to it을 전달할 수 있으므로 .dll.exe 파일을 디스크에 덤프합니다. 일단 이러한 기능을 사용하면 정상적으로 배포 할 수 있습니다.

BlueRuby은 Ruby 소스 코드를 기본적으로 직렬화 된 parsetree 인 BRIL (BlueRuby Intermediate Language)으로 자동으로 사전 파싱합니다. Parrot 바이트 코드 아카이브를 덤프 Cardinal을 얻을 수있는 방법이 있다는 것을 나는 생각

. (자세한 내용은) Blue Ruby - A Ruby VM in SAP ABAP (PDF 참조) (그러나 나는 확실히 확실하지 않다). (사실, 추기경은 과거로 컴파일 한 다음 앵무새는 점거, 그래서 덤프 및로드 바이트 코드 보관하는 앵무새의 일이 될 것입니다.) 여기

+0

PAST 란 Parrot 어셈블리 언어 인 PASM을 의미합니까? –

+0

아니요, AFAICS Parrot은 PASM이 아닌 PAST로 컴파일됩니다. Parrot은 PASM과 PIR을 컴파일러에서 PAST로 작성해야합니다. –

+0

루비의 컴파일 된 버전이 상당한 성능 향상을 가져야하는 것처럼 보이지만, 벤치마킹에서 사실 인 것처럼 보이지 않습니다 (또는 내가 생각한 것만 큼). 그게 사실인가요? 그렇다면 왜 그런지 압니까? 감사! –

6

대부분의 PHP 설정에는 컴파일 된 바이트 코드가 캐시되어 다음에 스크립트가 실행될 때 Bytecode Cache이 포함되어 있지만 컴파일 된 버전이 실행됩니다. 이것은 실행을 상당히 빠르게합니다.

실제로 명령 행을 통해 바이트 코드를 얻는 방법을 알 수는 없습니다.

12

Perl 5는 바이트 코드를 디스크에 덤프 할 수 있지만 버그가 있고 불쾌합니다. Perl 6에는 Parrot이 실행할 수있는 바이트 코드 실행 파일을 만드는 매우 깨끗한 방법이 있습니다.

Perl의 JIT (Just-In-Time) 컴파일은 빠르지 만 대부분의 상황에서는 문제가되지 않습니다. 문제가되는 한 곳은 CGI 환경에 있습니다. 이는 mod_perl을위한 것입니다.

+0

바이트 코드가 5.10에서 깨지거나 제거 된 것 같습니다. 6 –

+0

및 s/mod_perl/fastcgi/imho를 기다리는 중입니다. –

+0

앵무새가 황금 시간대를 기다릴 수 없습니다! – Copas

4

Perl의 경우 B::Bytecodeperlcc을 사용해보세요. 그러나 둘 다 매우 실험적입니다. 그리고 Perl 6은 곧 (이론적으로) 나오고 Parrot에있을 것이고 다른 바이트 코드를 사용할 것이므로이 모든 것이 다소 논란의 여지가 될 것입니다.

+0

Perl 6이 크리스마스 전에 나오고 있지만 래리는 어느 해를 말하지 않았습니다. 그것은 당신이 Rakudo (Perl 6 구현의 현재 선두 주자)와 함께 시작할 수 있다고 말했습니다 : http://rakudo.org/ –

+0

Silly Larry. Perl 6이 곧 나오길 바랄 것입니다.나는 현재 git이 설치되어있는 맨 페이지를 얻으려고 머리를 찢어 버리고 있지만 일단 퍼블릭 6 구현을 조사 할 수있게되면 그걸 알아낼 수있다. 하스켈을 배우기 시작할 때 멋진 장소가 될 수 있기 때문에 나는 Pugs와 함께 할 것입니다. –

1

Programming Perl의 제 3 판에 따르면, 일부 실험적 방법으로 이것을 근사 할 수 있습니다.

-1

Ruby 1.8은 실제로 (심지어 내부적으로) 바이트 코드를 전혀 사용하지 않으므로 사전 컴파일 단계가 없습니다.

+0

하지만 현재 버전은 않습니다. – Chuck

+1

이것은 단순히 사실이 아닙니다. Ruby 1.8의 거의 모든 구현 (단 하나의 예외 만 제외)은 바이트 코드로 컴파일 할 수 있습니다. 사실, 몇몇 구현은 컴파일 만 할 수 있고, 인터프리터를 가지고 있지도 않습니다. –

+1

@ Jörg : 제대로 구현 된 구현은 "Ruby 1.8"이라고하며, Matz이 작성한 Ruby 인터프리터 버전 1.8입니다. 다른 것들은 Jruby, Rubinius 등입니다. – Chuck

1

PHP 스크립트에서 Zend Guard을 사용하면 기본적으로 스크립트가 미리 컴파일되어 바이트 코드로 만들어지며, Zend Optimizer 확장이로드 된 경우 PHP 엔진에서 스크립트를 실행할 수 있습니다.

그래, Zend Guard/Optimizer는 사전 컴파일 된 PHP 스크립트를 사용할 수 있도록 허용합니다.

1

PHP의 경우 Phalanger Project은 닷넷 어셈블리로 컴파일됩니다. 당신이 찾고있는 것이 맞는지 확실하지 않습니다.

9

히스테릭 건포도의 경우 Perl 5는 모듈을 검색 할 때 .pmc 파일보다 .pm 개 파일을 먼저 찾습니다. 이 파일들은 바이트 코드를 포함 할 수 있지만, Perl은 기본적으로 바이트 코드를 작성하지 않습니다 (파이썬과 달리).

Module::Compile (or: what's this PMC thingy?)은이 모호한 기능에 대해 좀 더 자세히 설명합니다. 그들은 자주 사용되지는 않지만 ...

Module::Compile을 작성한 영리한 사람들은 Perl 코드를 미리 컴파일하기 위해 이것을 활용합니다 ... 여전히 Perl이지만 아직 처리가 진행 중입니다.

다른 장점 중 하나는 소스 필터 (인터프리터에서로드되기 전에 Perl 소스 코드를 수정하는 Perl 코드)를 사용하면 로딩 시간이 빨라지고 디버깅이 쉬워집니다.

+1

"히스테릭 건포도"? –

+3

@Lars : "히스테리 성 건포도"eq "역사적인 이유". Perl 5는 .pmc 파일을 매우 초기부터 지원했지만 일부 Perl 6 구현 자에 의해 재발견 될 때까지 수 년 동안 사용되지 않았습니다. – ephemient

+0

"역사적인 이유". 그것은 인기있는 말장난입니다. –

3

명령 줄

perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm" 
1
을위한 마법의 단어 몇 가지 예입니다

아직 다른 맞춤형 바이트 코드 대신 LLVM의 바이트 코드 사용을 고려한 사람이 있습니까?