Pergunta

Para Python, ele pode criar um pré-compilado versão file.pyc para que o programa pode ser executado sem interpretado novamente. Can Ruby, PHP, Perl e fazer o mesmo na linha de comando?

Foi útil?

Solução

Não há especificação de bytecode portátil para Ruby, e forma assim também nenhum padrão para arquivos bytecode de carga pré-compilados. No entanto, quase todas as implementações Ruby usam algum tipo de bytecode ou formato intcode, e vários deles pode despejar e arquivos de recarga de bytecode.

YARV sempre compila para bytecode antes de executar o código, no entanto, que geralmente é feito somente na memória. Há maneiras de despejar o bytecode para o disco. No momento, não há nenhuma maneira de lê-lo de volta em , no entanto. Isto irá mudar no futuro: o trabalho está em andamento em um bytecode verificador para YARV, e uma vez que é feito, bytecode pode seguramente ser carregado para o VM, sem medo de corrupção. Além disso, os desenvolvedores do JRuby indicaram que eles estão dispostos a implementar um YARV VM emulador dentro JRuby , uma vez que o formato YARV bytecode e verificador são estabilizadas, de modo que você pode carregar YARV bytecode em JRuby. (Note-se que esta versão é obsoleto.)

Rubinius também sempre compila para bytecode, e tem uma formato para arquivos compilados (arquivos .rbc, análogo aos arquivos .class JVM) e não há conversa sobre um formato de arquivo de bytecode (arquivos .rba, análogas à JVM .jar arquivos). Há uma chance de que Rubinius pode implementar um emulador YARV, se a implantação de aplicativos como YARV bytecode nunca se torna popular. Além disso, os desenvolvedores do JRuby indicaram que eles estão dispostos a implementar um Rubinius bytecode emulador dentro JRuby , se Rubinius bytecode torna-se uma maneira popular de implantação de aplicações Ruby. (Note-se que esta versão é obsoleto.)

XRuby é um compilador puro, ele compila Rubi Sourcecode direto para JVM bytecode (arquivos .class). Você pode implantar esses arquivos .class como qualquer outro aplicativo Java.

JRuby começou como um intérprete, mas tem tanto um compilador JIT e um AOT compilador (jrubyc) que pode compilar o ruby ??sourcecode a JVM bytecode (arquivos .class) . Além disso, o trabalho está em andamento para criar uma new compilador que pode compilar o código ruby ??(anotada-type) para JVM bytecode que realmente se parece com uma classe Java e pode ser usado a partir do código Java sem barreiras.

Ruby.NET é um compilador puro que compila Rubi código fonte para bytecode CIL (.dll PE ou arquivos .exe) . Você pode implantar estes apenas como qualquer outro aplicativo CLI.

IronRuby também compila para bytecode CIL, mas normalmente faz isso em memória. No entanto, você pode passar comando switches para ele , por isso despeja os arquivos .dll e .exe para o disco. Uma vez que você tem aqueles, eles podem ser implantados normalmente.

BlueRuby automaticamente pré-analisa o Ruby sourcecode em BRIL (BlueRuby Intermediário Language), que é basicamente uma ParseTree serializados. (Veja < em> azul ruby ??- Um rubi VM em SAP ABAP (PDF) para detalhes)

.

I pensar (mas eu não sou definitivamente certeza) de que há uma maneira de obter Cardinal para despejar Parrot bytecode arquivos. (Na verdade, o cardeal única compila ao passado, e depois Parrot assume, por isso seria trabalho de Parrot para despejar e arquivos de carga de bytecode).

Outras dicas

Perl 5 podem despejar os bytecodes para o disco, mas é buggy e desagradável. Perl 6 tem um método muito limpo de criar executáveis ??bytecode que Parrot pode ser executado.

compilação just-in-time do Perl é rápido o suficiente para que isso não importa, na maioria das circunstâncias. Um lugar onde ela faz questão está em um ambiente CGI que é o que mod_perl é para.

Para passas histéricas, Perl 5 looks para .pmc arquivos antes de arquivos .pm ao procurar por módulo. Estes arquivos podem conter bytecode, embora Perl faz bytecode não escrita por padrão (ao contrário de Python).

Module :: Compilar (ou: o que é isso PMC coisinha) entra em mais alguma profundidade sobre esta característica obscura. Eles não são usados ??com freqüência, mas ...

As pessoas inteligentes que escreveram Module :: Compilar Aproveite a isso, a pré-compilar o código Perl em ... bem, ainda é Perl, mas é pré-processado.

Entre outros benefícios, Isto acelera o tempo de carregamento e torna a depuração mais fácil quando se utiliza filtros de código (código Perl modificar o código fonte Perl antes de ser carregado pelo intérprete).

Não para PHP, embora a maioria PHP configurações incorporar uma Bytecode Cache que irá armazenar em cache a compilado bytecode para que da próxima vez que o script é executado, a versão compilada é executado. Isso acelera a execução consideravelmente.

Não há nenhuma maneira que eu estou ciente de começar realmente no bytecode, através da linha de comando.

Para Perl você pode tentar usar B :: Bytecode e perlcc . No entanto, ambos estes são altamente experimental. E Perl 6 está saindo em breve (teoricamente) e estará em Parrot e vai usar um bytecode diferente e então tudo isso vai ser um pouco discutível então.

Aqui estão algumas palavras exemplo mágicas para a linha de comando

perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm"

De acordo com a terceira edição do programação Perl , é possível aproximar esta em alguns aspectos experimentais.

Se você usar Zend Guard em seus scripts PHP, é essencialmente pré-compila o scripts para byte-code, que pode então ser executado pelo motor de PHP se a extensão Zend Optimizer é carregado.

Então, sim, Zend Guard / Optimizer permite scripts PHP pré-compilados para ser usado.

Para o PHP, o href="http://www.php-compiler.net/doku.php?id=core:features" rel="nofollow noreferrer"> Phalanger Projeto

Alguém já pensou em usar bytecode do LLVM, em vez de um ainda-mais-custom-bytecode?

Ruby 1.8 não realmente usar bytecode em tudo (mesmo internamente), então não há nenhuma etapa de pré-compilação.

scroll top