Compilador fonte-a-fonte - Source-to-source compiler
Execução do programa |
---|
Conceitos gerais |
Tipos de código |
Estratégias de compilação |
Tempos de execução notáveis |
|
Compiladores e conjuntos de ferramentas notáveis |
|
Transformação de dados |
---|
Conceitos |
Linguagens de transformação |
Técnicas e transformações |
Formulários |
Relacionado |
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.
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.
Ferramenta | Idioma de origem | Idioma de destino | Comentários |
---|---|---|---|
Script 2to3 | Python 2 | Python 3 | Embora o 2to3 faça o melhor para automatizar o processo de tradução, muitas vezes são necessárias outras correções manuais. |
Emscripten | Bytecode LLVM | JavaScript | Isso permite a execução de bases de código C / C ++ em um navegador, por exemplo |
c2go | C | Ir | Antes do lançamento 1.5, o compilador Go era escrito em C. Um tradutor automático foi desenvolvido para converter automaticamente a base de código do compilador de C para Go. Desde Go 1.5, o "compilador e tempo de execução agora são implementados em Go e assembler, sem C". |
C2Rust | C | Ferrugem | C2Rust pega o código C como entrada e produz o unsafe código Rust, focando em preservar a compatibilidade com a base de código original. Existem várias limitações documentadas para este processo. Converter o código resultante em código Rust seguro e idiomático é uma pós-tradução de esforço manual, embora exista uma ferramenta automatizada para facilitar essa tarefa.
|
Google Web Toolkit | Programa Java que usa uma API específica | JavaScript | O código Java é um pouco restrito em comparação com o código Java normal. |
Js_of_ocaml de Ocsigen | OCaml | JavaScript | |
J2Eif | Java | Eiffel | O código Eiffel resultante tem classes e estruturas semelhantes ao programa Java, mas seguindo a sintaxe e as convenções de Eiffel. |
C2Eif | C | Eiffel | O código de Eiffel resultante tem classes e estruturas que tentam ser o mais limpas possível. A ferramenta está completa e depende da incorporação do código C e do assembly se não puder traduzi-lo corretamente. |
Swiftify | Objective-C | Rápido | Swiftify é uma fonte online para ferramenta de conversão de fonte de Objective-C para Swift. Ele auxilia os desenvolvedores que estão migrando toda ou parte de sua base de código iOS para o Swift. A conversão visa principalmente converter a sintaxe entre Objective-C e Swift, e é ajudada porque a Apple se esforçou para garantir a compatibilidade entre os tempos de execução Swift e Objective-C. |
Conversor de tempo de execução | PHP | Java | O Runtime Converter é uma ferramenta automática que converte código-fonte PHP em código-fonte Java. Há uma biblioteca de tempo de execução Java para certos recursos da linguagem PHP, bem como a capacidade de chamar o próprio binário PHP usando JNI para chamadas de biblioteca padrão e de função de extensão de PHP. |
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
- Recompilador binário
- C para HDL
- Geração de código (compilador) - Processo pelo qual o gerador de código de um compilador converte alguma representação intermediária do código-fonte em uma forma que pode ser prontamente executada por uma máquina
- DMS Software Reengineering Toolkit - uma estrutura de compilador de origem a origem usando regras explícitas de reescrita direcionadas a padrões
- f2c - um compilador de fonte para fonte de Fortran 77 para C
- Honeywell Liberator (executando programas IBM 1401 na Honeywell H200 )
- Representação intermediária - estrutura de dados ou código usado internamente por um compilador ou máquina virtual para representar o código-fonte
- Vinculação de linguagem - Biblioteca de software que permite o uso de outra biblioteca codificada em outra linguagem de programação
- Especificação independente de linguagem - padrão de programação de computador destinado a ser interoperável entre linguagens de programação
- Interoperabilidade de linguagem
- Otimizador de código de objeto , também conhecido como otimização binária
- Pré - processador - Programa que processa a entrada para outro programa
- Transformação do programa
- Transcompilação recursiva
- ROSE (estrutura do compilador) - uma estrutura do compilador fonte-a-fonte
- Tradutor (computação) - programa de computador que traduz código de uma linguagem de programação para outra
- XSLT - Linguagem para transformar documentos XML
Notas
Referências
Leitura adicional
- "Programação de unidades Sycor facilitada com TAL II" . Computerworld - The Newsweekly for the Computer Community . IX (34). Ann Arbor, Michigan, EUA: Computerworld, Inc. 1975-08-20. p. 14. ISSN 0010-4841 . Arquivado do original em 01/02/2020 . Obtido em 2020-01-18 .
- Zerilli, Frank J .; Derouen, Craig (1986-12-11) [1985-08-15, 1984-12-20, 1984-11-20]. "Tradutor ASM 8080 para 8086, com fonte ASM" . SIMTEL . XLT86.COM 1.10. Arquivado do original em 01/02/2020 . Obtido em 2020-01-18 . 1984-11-11 versão 1.05 (NB. O executável DOS XLT86.COM [12 KB] traduz o código-fonte da linguagem assembly Intel 8080 para o código-fonte da linguagem assembly Intel 8086. Apesar de seu nome, esta implementação no assembly 8086 não está relacionada com a versão anterior da Digital Research e XLT86 muito mais sofisticado .)
-
Albo, Julián (24/04/2009). "Pasmo, ensamblador cruzado Z80 portátil / portátil Z80 cross assembler" (em espanhol e inglês). Arquivado do original em 2020-02-20 . Recuperado em 2020-02-20 .
[...] Pasmo é um cross assembler Z80 [...] que [...] pode gerar código objeto nos seguintes formatos: binário bruto, Intel HEX , PRL para CP / M Plus RSX , Plus3Dos ( disco Spectrum +3 ), TAP, TZX e CDT ( imagens de fita dos emuladores Spectrum e Amstrad CPC ), AmsDos (disco Amstrad CPC) e MSX (para uso com BLOAD do disco no Basic). A partir da versão 0.5.0 […] também pode gerar código 8086 a partir de fontes Z80, em formato binário para arquivos Ms-dos COM ou em formato CP / M 86 CMD . […]
[37] [38] -
Ciarcia, Steve (maio de 1984). "Trump Card - Parte 1: Hardware - Acelere seu IBM PC com potência de coprocessamento de 16 bits" (PDF) . BYTE - O pequeno diário de sistemas . Adega do Circuito de Ciarcia. Vol. 9 não. 5. McGraw-Hill, Inc. pp. 40–52, 54–55. ISSN 0360-5280 . Obtido em 2020-01-29 .
[...] Em vez disso, ele executa programas escritos em linguagens de alto nível, como BASIC e C (um compilador Pascal e um tradutor de 8088 para Z8000 estão em desenvolvimento. [...]
e Ciarcia, Steve (junho de 1984). "Trump Card - Parte 2: Software - Compiladores TBASIC e C e um assemble" (PDF) . BYTE - O pequeno diário de sistemas . Adega do Circuito de Ciarcia. Vol. 9 não. 6. McGraw-Hill, Inc. pp. 115-122. ISSN 0360-5280 . Obtido em 2020-01-29 .[...] Espero que os tradutores de código-objeto para conversões de Z80 para Z8000 e 8088 para Z8000 estejam disponíveis em breve [...]
, também disponível como Ciarcia, Steve (1990). "Trump Card - Parte 1: Hardware - Acelere seu IBM PC com potência de coprocessamento de 16 bits e Parte 2: Software - compiladores TBASIC e C e um assemble" . Em Gonneau, Daniel; Bernardi, Fred; Ausburn, Richard (eds.). Adega do Circuito de Ciarcia . 7 . McGraw-Hill Publishing Company . pp. 138–152, 153–160. ISBN 0-07-010969-9. Arquivado do original em 01/02/2020 . Obtido em 2020-01-29 . [39] - Equipe de aplicativos da divisão de microcontroladores (2000). "Traduzindo o código do conjunto de HC05 para ST7" (PDF) (nota de aplicação). STMicroelectronics . AN1106 / 0200 . Obtido em 2020-01-18 .(9 páginas) (NB. Este tradutor de software foi desenvolvido pela ST e traduz o código-fonte do assembly Motorola 6805 / HC05 no formato do software 2500AD para o código-fonte ST7 . O executável MIGR2ST7.EXE para Windows está disponível em "MCU ON CD".)
links externos
- Chaudry, Gabriele "Gaby" (11/07/2009). "Das Intel zu Zilog - Übersetzungsprojekt" . I2Z-Translator (em alemão). Arquivado do original em 11/09/2016 . Obtido em 2020-01-18 .
- "Tradução de PortAsm Assembler para Assembler" . MicroAPL Ltd. 2017 [1996]. Arquivado do original em 30/07/2019 . Obtido em 2020-01-18 .
- "Nossa metodologia - O processo de conversão de fonte em fonte" . Micro-Processor Services, Inc. (MPS). Arquivado do original em 12/05/2019 . Obtido em 2020-02-01 .