Idiomas transcompilados: projetos de conversão de código em código


Fonte: Ward Cunningham

Transpilação é a conversão de código de um idioma para outro. Usando um transpiler especial (transcompiler), uma linguagem de programação de uso geral pode ser transferida para qualquer outra linguagem de programação de uso geral.

Se você precisar mudar para outro idioma, os transpilers ajudarão os desenvolvedores a salvar a maior parte do código existente sem reescrever manualmente o código inteiro. Por exemplo, ao converter programas de Python 2 para Python 3 ou ao mover software da API antiga para a nova.

Os termos transpiler e transcompiler são frequentemente usados ​​de forma intercambiável, mas ainda se acredita que haja diferenças. Por exemplo, para converter o código C ++ em C, você precisa de um transpiler e, para converter Python-Ruby, precisa de um transcompiler. O Babel para JavaScript é um transpilador e o TypeScript é uma linguagem de transcompilador.

Às vezes, após a conversão pelo transportador, para a operação correta do código, é necessária a configuração manual, enquanto nos idiomas transcompilados o código deve funcionar sem alterações. Hoje falaremos sobre esses e outros, mas o mais importante, falaremos sobre projetos trans populares que os desenvolvedores podem usar em seu trabalho diário.

Transpilação frontal


A conversão é uma parte importante do desenvolvimento do front-end: à medida que novos recursos aparecem lentamente nos navegadores, foram criados idiomas com recursos experimentais que se traduzem em idiomas compatíveis com o navegador.

Os desenvolvedores de navegadores que usam seu próprio mecanismo JavaScript em cada projeto também são responsáveis ​​pelas trans-linguagens em expansão do JavaScript. Como resultado, os navegadores têm desempenho diferente, implementam seu próprio conjunto de funções JavaScript e aproximam-se totalmente da conformidade com as especificações em diferentes velocidades.



Sass , Less e Stylus facilitam a criação de código CSS. Portanto, o Sass possui uma sintaxe flexível, lógica (@if, cada), matemática (você pode adicionar números, linhas e cores), devido à qual toda a riqueza do código é transformada em um programa ruby ​​CSS comum.

Menos (folhas de estilo mais enxutas) parece o mesmo que CSS, mas possui adições convenientes: variáveis, mixins, operações aritméticas (como Sass), etc.

A caneta stylus é escrita em Node.js e difere de Sass e Less em uma sintaxe mais limpa. Mas, na verdade, esses três idiomas são muito parecidos entre si, portanto, você não se enganará se selecionar um deles.



Diga "Olá, mundo!" No CoffeeScript - o que poderia ser mais simples:

alert "Hello, World!" 

O CoffeeScript tem sido o projeto JavaScript mais popular . Isso não é surpreendente: combinando acessibilidade (a documentação cabe em uma página), recursos funcionais (colchetes, recuo etc.) e sintaxe pura de Ruby, essa linguagem oferece aos desenvolvedores muitos graus de liberdade e permite que o JS seja mais expressivo.



Master TypeScript:

 let message:string = "Hello World" console.log(message) 

O TypeScript é um projeto concorrente para JavaScript, uma linguagem de script com a adição de digitação estática opcional. Permite descrever mais completamente as propriedades e métodos de objetos e classes, diferentemente do JS, eliminando a necessidade de verificar todos os argumentos incluídos em um método ou função.

Há uma opinião de que o JavaScript é uma linguagem com falhas fundamentais. Caso contrário, é difícil explicar a popularidade das linguagens trans que trabalham especificamente para corrigir suas deficiências. Além dos projetos acima, há também uma linguagem de programação da Web flexível Dart , um compilador JavaScript no JavaScript Closure Compiler e muitas outras soluções, sobre as quais você pode descobrir a página " Lista de idiomas que compilam em JS ".

Converta em C




Em 2006, o projeto Vala apareceu, consistindo em dois idiomas: Vala e Genie, que traduzem o código C mais comum, que por sua vez é compilado em um arquivo ou biblioteca executável.

A sintaxe Vala é muito semelhante ao C #, mas adaptada para melhor compatibilidade com os sistemas GObject, enquanto o Genie tem muito em comum com o Python. O primeiro idioma agora é mais comum que o Genie, então vamos dar uma olhada mais de perto.

Por que você precisou desse projeto? Muitos desenvolvedores queriam escrever aplicativos e bibliotecas para o GNOME em linguagens de alto nível, mas por vários motivos não podiam ou não queriam usar C # ou Java. O Vala permite criar rapidamente códigos complexos e orientados a objetos, suportando API C padrão e ABI com baixos requisitos de memória.

As bibliotecas C # e Java não podem ser usadas da mesma maneira que as bibliotecas GObject nativas do C e de outras linguagens, e não podem ser consideradas parte da plataforma GNOME. O Valac, o transcompilador Vala, cria arquivos C a partir dos arquivos de origem Vala como se você escrevesse sua biblioteca ou aplicativo diretamente no C. O uso da biblioteca Vala do aplicativo C não difere do uso de qualquer outra biblioteca baseada no GObject.

Lemos e escrevemos o arquivo para Vala:

 voidmain () { try { string filename = "data.txt"; // Writing string content = "hello, world"; FileUtils.set_contents (filename, content); // Reading string read; FileUtils.get_contents (filename, out read); stdout.printf ("The content of file '%s' is:\n%s\n", filename, read); } catch (FileErrore) { stderr.printf ("%s\n", e.message); } } 

Você pode se familiarizar com outros exemplos de código no site .

Do Flash à Multiplataforma




O Haxe foi criado ao mesmo tempo que o Vala, mas é destinado a transpilar em Flash, JavaScript e Neko. Com esse conjunto de habilidades, o idioma estava fadado à extinção, mas não apenas sobreviveu, mas também ganhou grande popularidade.

O segredo do sucesso é multiplataforma. Com o tempo, a Haxe se tornou um poderoso conjunto de ferramentas que suportam a transcompilação em várias linguagens e plataformas, incluindo JavaScript, C ++, C #, Java, JVM, Python, Lua, PHP e Flash.

Haxe é uma linguagem de programação moderna, de alto nível e fortemente tipada. Ao mesmo tempo, é bastante simples e prático, para que a compilação possa ser adaptada a várias plataformas de destino. Sua sintaxe é basicamente o padrão ECMAScript, mas é alterada, se necessário.

"Olá Mundo" no Haxe:

 class Main { static public function main():Void { trace("Hello World"); } } 

Em JavaScript, essas linhas de código terão a seguinte aparência:

 haxe -main HelloWorld -js HelloWorld.js 

E em Java assim:

 haxe -main HelloWorld -java path/to/java/out 

A maioria dos códigos Haxe é organizada em classes e funções, tornando-se uma linguagem OOP semelhante a Java, ActionScript 3 e C #. No entanto, o Haxe foi projetado com ênfase no pragmatismo e facilidade de sintaxe.

E sobre transpilers


  • C2Rust e Corrode são duas oportunidades sem pecado de migrar de C para Rust.
  • O VOC é um transportador do Python 3.4+ para Java que o ajudará a criar aplicativos Android baseados no código Python.
  • Lombok é uma solução interessante para quem não gosta de Java ou não gosta de nada além de Java. Este é um plug-in de compilador que adiciona novas “palavras-chave” ao Java e transforma anotações em código Java, reduzindo os esforços de desenvolvimento e fornecendo funcionalidade adicional. Por exemplo, permite o uso da palavra-chave val (um análogo de var do C #) no código Java comum.
  • O Bridge.NET permite que você use o desempenho C # em JavaScript, bem como as poderosas ferramentas VisualStudio IDE e .NET padrão (como msbuild, refatoração, teste de unidade, análise estática, visualização de código, FxCop).
  • Grumpy converte o código Python em uma representação Go e permite executar programas Python perfeitamente em ambientes de tempo de execução Go. O projeto elimina o problema do bloqueio global do intérprete, o que não permite a execução paralela de vários encadeamentos de código.

Claro, existem muitos outros transpilers. Tradicionalmente, você pode falar sobre suas ferramentas favoritas nos comentários.

Conclusão


Há um grande número de outros idiomas, portanto, para o seu projeto, você sempre pode escolher o mais adequado. Porém, situações em que a conversão de código para código é necessária não são incomuns, pois C ++ para C, PHP para C ++ e transpilações "qualquer coisa em JavaScript" ocorrem com bastante frequência.

Um "tradutor" de um idioma para outro é uma boa idéia, mas apenas enquanto o resultado puder ser claramente previsto e usado sem riscos. Portanto, a transição do COBOL para o Java foi difícil, porque no Java anterior ao JDK 1.4 não havia arquivos mapeados na memória . E o C2Rust e Corrode mencionados no artigo sobre a saída fornecem um código não idiomático, marcado como inseguro e preenchido com ponteiros brutos.

Source: https://habr.com/ru/post/pt480724/


All Articles