Compilador fonte-a-fonte - Source-to-source compiler

Um tradutor fonte-to-source , compilador fonte-to-source ( compilador S2S ), transcompiler , ou transpiler é um tipo de tradutor que leva o código-fonte de um programa escrito em uma linguagem de programação como sua entrada e produz um código fonte equivalente na mesma linguagem de programação ou em uma linguagem de programação diferente. Um tradutor de fonte para fonte converte entre linguagens de programação que operam aproximadamente no mesmo nível de abstração , enquanto um compilador tradicional traduz de uma linguagem de programação de nível superior para uma linguagem de programação de nível inferior . Por exemplo, um tradutor de fonte para fonte pode realizar uma tradução de um programa de Python para JavaScript , enquanto um compilador tradicional traduz de uma linguagem como C para assembler ou Java para bytecode . Um compilador automático de paralelização freqüentemente tomará um programa de linguagem de alto nível como entrada e então transformará o código e fará anotações nele com anotações de código paralelas (por exemplo, OpenMP ) ou construções de linguagem (por exemplo , declarações de Fortranforall ).

Outro propósito da compilação de origem para origem é traduzir o código legado para usar a próxima versão da linguagem de programação subjacente ou uma API que quebra a compatibilidade com versões anteriores. Ele executará a refatoração automática de código, útil quando os programas a serem refatorados estiverem fora do controle do implementador original (por exemplo, converter programas de Python 2 em Python 3 ou converter programas de uma API antiga para a nova API) ou quando o o tamanho do programa torna impraticável ou demorado refatorá-lo manualmente.

Os transcompiladores podem manter a estrutura do código traduzido o mais próximo possível do código-fonte para facilitar o desenvolvimento e depuração do código-fonte original, ou podem alterar a estrutura do código original tanto que o código traduzido não se parece com o código-fonte. Existem também utilitários de depuração que mapeiam o código-fonte transcompilado de volta ao código original; por exemplo, o padrão JavaScript Source Map permite o mapeamento do código JavaScript executado por um navegador da web de volta à fonte original quando o código JavaScript foi, por exemplo, reduzido ou produzido por uma linguagem transcompilada para JavaScript.

Os exemplos incluem Closure Compiler , CoffeeScript , Dart , Haxe , TypeScript e Emscripten .

Tradutores da linguagem assembly

Intel CONV86

A Intel comercializou seu processador 8086 de 16 bits para ser compatível com o 8080 , um processador de 8 bits. Para oferecer suporte a isso, a Intel tinha um tradutor baseado em ISIS-II do código-fonte 8080 para 8086 chamado CONV86 (também conhecido como CONV-86 e CONVERT 86) disponível para clientes OEM desde 1978, possivelmente o primeiro programa desse tipo. Suportava vários níveis de tradução e funcionava a 2 MHz em um Sistema de Desenvolvimento de Microprocessador Intel MDS-800 com unidades de disquete de 8 polegadas . De acordo com relatos de usuários, ele não funcionou de forma muito confiável.

SCP TRANS86

A Seattle Computer Products (SCP) ofereceu o TRANS86.COM, escrito por Tim Paterson em 1980, enquanto desenvolvia o 86-DOS . O utilitário poderia traduzir o código-fonte do assembly Intel 8080 e Zilog Z80 (com mnemônicos Zilog / Mostek ) em código-fonte .ASM para o Intel 8086 (em um formato compatível apenas com o cross-assembler ASM86 do SCP para CP / M-80 ), mas com suporte apenas um subconjunto de opcodes , registradores e modos, e muitas vezes ainda exigia correção manual significativa e retrabalho posteriormente. Além disso, realizando apenas uma mera transliteração , o tradutor de passagem única de força bruta não realizou nenhuma otimização de registro e salto. Demorou cerca de 24 KB de RAM. O SCP versão 1 do TRANS86.COM foi executado em sistemas baseados em Z80. Assim que o 86-DOS estava rodando, Paterson utilizou o TRANS86 para se converter em um programa rodando no 86-DOS. Versão 2 numerada, foi nomeado TRANS.COM em vez disso. Mais tarde, em 1982, o tradutor aparentemente também foi disponibilizado pela Microsoft .

Sorcim TRANS86

Também chamado de TRANS86, Sorcim ofereceu também um tradutor de 8080 a 8086 desde dezembro de 1980. Como o programa SCP, ele foi projetado para portar código de aplicativo CP / M-80 (em formato ASM, MAC, RMAC ou ACT80 assembly) para MS-DOS (em um formato compatível com ACT86). No formato ACT80, ele também suportava alguns mnemônicos Z80. A tradução ocorreu instrução por instrução com alguma otimização aplicada a saltos condicionais. O programa rodou em CP / M-80, MP / M-80 e Cromemco DOS com um mínimo de 24 KB de RAM, e não teve restrições quanto ao tamanho do arquivo fonte.

Digital Research XLT86

Muito mais sofisticado e o primeiro a introduzir tecnologias de otimização do compilador no processo de tradução de origem foi o XLT86 1.0 da Digital Research em setembro de 1981. O XLT86 1.1 estava disponível em abril de 1982. O programa foi escrito por Gary Kildall e traduzido o código-fonte .ASM para o Processador Intel 8080 (em um formato compatível com assemblers ASM, MAC ou RMAC) em código-fonte .A86 para o 8086 (compatível com ASM86). Usando a análise de fluxo de dados global no uso de registro 8080, o tradutor multi-passagem de cinco fases também otimizaria a saída para o tamanho do código e cuidaria das convenções de chamada (chamadas CP / M-80 BDOS foram mapeadas em chamadas BDOS para CP / M- 86 ), de modo que os programas CP / M-80 e MP / M-80 pudessem ser transferidos para as plataformas CP / M-86 e MP / M-86 automaticamente. O próprio XLT86.COM foi escrito em PL / I-80 para plataformas CP / M-80. O programa ocupou 30 KB de RAM para si mesmo, mais memória adicional para o gráfico do programa . Em um sistema de memória de 64 KB, o tamanho máximo do arquivo de origem suportado era de cerca de 6 KB, de modo que arquivos maiores tinham que ser divididos de acordo antes da tradução. Como alternativa, XLT86 também estava disponível para DEC VAX / VMS (para VAX 11/750 ou 11/780 ). Embora a entrada e a saída do XLT86 funcionem no nível do código-fonte, a representação do programa na memória do tradutor e as tecnologias de otimização de código aplicadas definem a base para a recompilação binária .

Outros

2500 AD Software ofereceu um tradutor de código-fonte de 8080 a 8086 como parte de seu pacote XASM para máquinas CP / M-80 com Z80, bem como para sistemas Zilog ZEUS e Olivetti PCOS .

Desde 1979, a Zilog ofereceu um tradutor de Z80 para Z8000 como parte de seu sistema de desenvolvimento PDS 8000. Microcomputadores avançados (AMC) e 2500 AD Software também ofereceram tradutores de Z80 a Z8000. Este último foi denominado TRANS e estava disponível para Z80 CP / M, CP / M-86, MS-DOS e PCOS.

Implementações de linguagem de programação

As primeiras implementações de algumas linguagens de programação começaram como transcompiladores, e a implementação padrão para algumas dessas linguagens ainda são transcompiladores. Além da tabela abaixo, um mantenedor do CoffeeScript fornece uma lista de linguagens que compilam para JavaScript.

Lista de transcompiladores
Nome Idioma de origem Idioma de destino
Cfront C ++ C
HipHop para PHP (HPHPc) PHP C ++
Babel ES6 + ( JS ) ES5
ClojureScript Clojure JavaScript
JSweet Java TypeScript
Swiftify Objective-C Rápido
J2ObjC Java Objective-C
Haxe Haxe ActionScript 3 , JavaScript , Java , C ++ , C # , PHP , Python , Lua
Maia Maia Verilog
Cerberus X Cerberus JavaScript , Java , C ++ , C #

Portando uma base de código

Quando os desenvolvedores desejam mudar para um idioma diferente, mantendo a maior parte de uma base de código existente, pode ser melhor usar um transcompilador em vez de reescrever todo o software manualmente. Dependendo da qualidade do transcompiler, o código pode ou não precisar de intervenção manual para funcionar corretamente. Isso é diferente de "linguagens transcompiladas" em que as especificações exigem que o código-fonte de saída sempre funcione sem modificação. Todos os transcompiladores usados ​​para portar uma base de código esperarão um ajuste manual do código-fonte de saída se houver necessidade de atingir a qualidade máxima do código em termos de legibilidade e convenção de plataforma.

Pipelines de transcompilador

Um pipeline de transcompilador é o que resulta da transcompilação recursiva . Ao unir várias camadas de tecnologia, com uma etapa de transcompilação entre cada camada, a tecnologia pode ser transformada repetidamente, criando efetivamente uma especificação distribuída independente da linguagem .

XSLT é uma ferramenta de transformação de propósito geral que pode ser usada entre muitas tecnologias diferentes, para criar um pipeline de código derivado .

Transcompilação recursiva

Transcompilação recursiva (ou transcompilação recursiva ) é o processo de aplicar a noção de transpilação recursivamente, para criar um pipeline de transformações (geralmente começando de uma única fonte de verdade ) que transformam repetidamente uma tecnologia em outra.

Repetindo este processo, pode-se transformar A → B → C → D → E → F e então voltar para A (v2). Algumas informações serão preservadas por meio desse pipeline, de A → A (v2), e essas informações (em um nível abstrato) demonstram o que cada um dos componentes A – F concorda.

Em cada uma das diferentes versões que o pipeline do transcompilador produz, essa informação é preservada. Pode assumir muitas formas e tamanhos diferentes, mas quando volta para A (v2), tendo sido transcompilado seis vezes no pipeline acima, a informação retorna ao seu estado original.

Esta informação que sobrevive à transformação através de cada formato, de A – F – A (v2), é (por definição) conteúdo derivado ou código derivado .

A transpilação recursiva aproveita o fato de que os transpiladores podem manter o código traduzido o mais próximo possível do código-fonte para facilitar o desenvolvimento e a depuração do código-fonte original, ou podem alterar tanto a estrutura do código original, que o o código não se parece com o código-fonte. Existem também utilitários de depuração que mapeiam o código-fonte transpilado de volta ao código original; por exemplo, os mapas de origem JavaScript permitem o mapeamento do código JavaScript executado por um navegador da web de volta à fonte original em uma linguagem transpilada para JavaScript.

Veja também

Notas

Referências

Leitura adicional

links externos