Compilar vs Transpilar

96

Ao pesquisar sobre a diferença, encontrei estas definições:

Compilar é o termo geral para pegar o código-fonte escrito em uma linguagem e transformá-lo em outra.

Transpilar é um termo específico para pegar o código-fonte escrito em uma linguagem e transformá-lo em outra linguagem que tenha um nível de abstração semelhante.

Eu entendo o que é Abstração.

Mas o que significa "nível semelhante de abstração" na definição acima? E como encontramos o nível de abstração em uma linguagem?

Nishi Mahto
fonte
Possível duplicata de O que é abstração?
GrumpyCrouton

Respostas:

149

A definição que você citou acima é muito geral para um iniciante entender completamente, então deixe-me simplificá-la para algo que vemos na prática.

Compilador: é um termo abrangente para descrever um programa que pega o código-fonte escrito em uma linguagem e produz um (ou vários) arquivo de saída em alguma outra linguagem. Na prática, usamos esse termo principalmente para descrever um compilador como o gcc, que recebe o código C como entrada e produz um executável binário (código de máquina) como saída.

Os transpiladores também são conhecidos como compiladores fonte-a-fonte. Então, em essência, eles são um subconjunto de compiladores que pegam um arquivo de código-fonte e o convertem em outro arquivo de código-fonte em alguma outra linguagem ou em uma versão diferente da mesma linguagem. A saída é geralmente compreensível por um ser humano. Essa saída ainda precisa passar por um compilador ou interpretador para poder ser executada na máquina.

Alguns exemplos de transpiladores:

  1. Emscripten : Transpiles C / C ++ para JavaScript
  2. Babel : Transpila o código ES6 + para ES5 (ES6 e ES5 são versões ou gerações diferentes da linguagem JavaScript)

Agora, o que eles querem dizer com "nível semelhante de abstração": como eu disse que compila / transpila para um arquivo de origem, pode-se argumentar que a linguagem assembly também é um arquivo de origem e, portanto, o gcc também é um transpilador. Então, esse argumento é o que esse nível semelhante de vazios de abstração.

A noção de categorizar as linguagens em níveis inferior, médio e superior é baseada no nível de abstração que fornecem a partir do funcionamento real da máquina / arquitetura.

Linguagens de nível inferior como assembly são muito próximas da arquitetura do processador, ou seja, têm instruções diferentes para processadores diferentes. Enquanto C / C ++ / Java / JavaScript, abstraia tudo isso fornecendo mais abstração.

Portanto, um transpiler compila para uma linguagem que está mais próxima da linguagem com a qual você começou nos termos dessa abstração (ou está mais perto do nível dessa linguagem na escada de linguagem de nível inferior-médio-superior).

Espero que isto ajude!

tapananand
fonte
12
"Alguns exemplos de transpiladores:" --- babel se autodenomina compilador. A separação entre transpiladores e compiladores é realmente artificial.
zerkms
16
@zerkms Como eu disse, os transpiladores são um subconjunto dos compiladores.
tapanan e
1
Eu gostaria de acrescentar uma coisa, estamos falando sobre linguagem natural aqui. Portanto, definições fuzzy são esperadas. Eu esperaria que a "facilidade de leitura" da saída de um transpilador fosse semelhante ao que era antes, enquanto um compilador torna as coisas mais difíceis de ler. Portanto, Webpack / npm é um compilador, você não quer ler sua saída. (Pelo menos quando você adiciona os "Carregadores" para, por exemplo, arquivos .vue.
Samuel Åslund
2
Opinião: Afirmo que as definições devem ser: Compilação: linguagem -> linguagem de nível inferior. Transpilação: idioma -> idioma do mesmo nível.
Deji
3
@Deji Não necessariamente o mesmo nível de linguagem, mas uma linguagem em um nível semelhante de abstração.
tapanan e
35

Esta é uma forma descritiva de responder

Se você pensar em camadas de abstração como este exemplo:

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

Um compilador vai para um nível inferior (número inferior). Um transpiler muda de um idioma (ou versão de um idioma) para outro no mesmo número.

Araymer
fonte
1
Curioso, de onde veio essa lista de "níveis de abstração"?
zerkms
Apenas exemplos ilustrativos aleatórios, eu sei que os dois primeiros são meio piegas, mas eu queria uma lista mais longa: P
Araymer
2
Eu gosto e seria muito legal se fosse uma classificação "oficial" como essa. Já que sem ele é difícil colocar uma ferramenta (um tradutor) em uma ou outra categoria. Ex: é javaccompilador ou não.
zerkms
2

Eu concordo principalmente com tapananand resposta, mas ...


definição

As palavras são "feitas", por isso têm um propósito. E isso também muda com o tempo.

Agora tendemos a usar o transpilador para especificar um compilador que traduz o código em algum outro código "mais semelhante" ao código-fonte, o que um compilador pode fazer. E é usado para diferenciar ambos principalmente quando ambos são mencionados no mesmo contexto (mais uma vez, implicando principalmente que uma linguagem transpilar terá que ser compilada pelo menos mais uma vez)


exemplos

Então, tudo é muito subjetivo. No momento da redação deste artigo:

  • Vindo do mundo Java, eu poderia chamar os transpiladores CoffeeScript / TypeScript para descrever que o código resultante não é mais eficiente do que o original.
  • A documentação do CoffeScript diz que é um compilador e o babel é um transpilador. Quero dizer que CoffeeScript, embora muito semelhante, não é Javascript. Pelo menos não uma versão dela, pois é isso que babel produz.
  • O Babel se autodenomina compilador.

fazit

Portanto, o transpile é atualmente muito raramente usado, e apenas para diferenciar dois compiladores.

Provavelmente desaparecerá como conceito, já que a compilação é muito mais complicada do que isso (mesmo / superior / inferior idioma, versão, etc), e a palavra não parece ser mais útil ("transpilers" agora são onipresentes)

Estani
fonte
2

Ex: TypeScript (um superconjunto da Microsoft de JavaScript com verificação de segurança de tipo) transpila para código JavaScript que pode ser executado em diferentes tipos de navegadores.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript é uma linguagem de programação de código aberto desenvolvida e mantida pela Microsoft. É um superconjunto sintático estrito de JavaScript e adiciona tipagem estática opcional à linguagem.

TypeScript é projetado para o desenvolvimento de grandes aplicativos e transcompilar para JavaScript. [5] Como TypeScript é um superconjunto de JavaScript, os programas JavaScript existentes também são programas TypeScript válidos. O TypeScript pode ser usado para desenvolver aplicativos JavaScript para execução no lado do cliente e no lado do servidor (Node.js). "

Burak
fonte
Existe a ferramenta "compilador typescript" (ou tsc), sua nomenclatura implica que o TypeScript é compilado e não transpilado ... ainda assim, a ferramenta converte TypeScript em Javascript, que estão no mesmo nível de abstração do hardware subjacente. O TypeScript é compilado ou transpilado?
Alex McMillan
@AlexMcMillan TypeScript é COMPILADO, porque é um superconjunto de javascript e, como tal, é compilado para javascript.
Araymer
@Araymer Você entende a diferença entre compilação e transpilação? Porque o TS não é compilado; nem JS.
Alex McMillan
Sim eu quero. E como TS é um superconjunto de JS, ele é considerado um nível superior de abstração e, portanto, é referido como "compilado". O JS compilado é então interpretado como normal. Portanto, se você procurar por TS, o tópico mais discutido é sua "compilação". Mas, a linha entre transpilação e compilação não tem uma definição quantitativa oficial. Ele fica muito piegas, então sua opinião sobre o que está compilado (diferindo dos criadores, como é) é apenas sua opinião.
Araymer de