Compilación vs Transpilación

92

Mientras buscaba la diferencia, encontré estas definiciones:

Compilar es el término general para tomar el código fuente escrito en un idioma y transformarlo en otro.

Transpilar es un término específico para tomar el código fuente escrito en un idioma y transformarlo en otro idioma que tiene un nivel similar de abstracción.

Entiendo qué es la abstracción.

Pero, ¿qué significa "nivel similar de abstracción" en la definición anterior? ¿Y cómo encontramos el nivel de abstracción en un lenguaje?

Nishi Mahto
fuente
Posible duplicado de ¿Qué es la abstracción?
GrumpyCrouton

Respuestas:

142

La definición que ha citado anteriormente es demasiado general para que un principiante la entienda por completo, así que déjeme simplificarla a algo que vemos en la práctica.

Compilador: es un término general para describir un programa que toma el código fuente escrito en un idioma y produce un archivo de salida (o muchos) en otro idioma. En la práctica, usamos principalmente este término para describir un compilador como gcc que toma código C como entrada y produce un ejecutable binario (código máquina) como salida.

Los transpiladores también se conocen como compiladores de fuente a fuente. Entonces, en esencia, son un subconjunto de compiladores que toman un archivo de código fuente y lo convierten en otro archivo de código fuente en algún otro idioma o una versión diferente del mismo idioma. El resultado es generalmente comprensible para un humano. Esta salida aún tiene que pasar por un compilador o intérprete para poder ejecutarse en la máquina.

Algunos ejemplos de transpiladores:

  1. Emscripten : Transpiles C / C ++ a JavaScript
  2. Babel : transpila el código ES6 + a ES5 (ES6 y ES5 son versiones o generaciones diferentes del lenguaje JavaScript)

Ahora, ¿qué quieren decir con "nivel similar de abstracción"? Como dije que compila / transpila a un archivo fuente, se puede argumentar que el lenguaje ensamblador también es un archivo fuente y por lo tanto gcc también es un transpilador. Entonces, este argumento es lo que este nivel similar de abstracción anula.

La noción de categorizar los lenguajes en niveles bajo, medio y superior se basa en el nivel de abstracción que proporcionan del funcionamiento real de la máquina / arquitectura.

Los lenguajes de nivel inferior como el ensamblaje están muy cerca de la arquitectura del procesador, es decir, tienen diferentes instrucciones para diferentes procesadores. Mientras que C / C ++ / Java / JavaScript, abstrae todo esto proporcionando más abstracción.

Entonces, un transpilador compila en un idioma que está más cerca del idioma con el que comenzó en los términos de esta abstracción (o está más cerca del nivel de ese idioma en la escala de idiomas de nivel medio-bajo-alto).

¡Espero que esto ayude!

tapananand
fuente
9
"Algunos ejemplos de transpiladores:" --- babel se llama a sí mismo un compilador. La separación entre transpiladores y compiladores es realmente artificial.
zerkms
13
@zerkms Como dije, los transpilers son un subconjunto de compiladores.
tapanannd
1
Me gustaría agregar una cosa, estamos hablando de lenguaje natural aquí. Por tanto, se esperan definiciones borrosas. Esperaría que la "facilidad de lectura" del resultado de un transpilador sea similar a lo que era antes, mientras que un compilador dificulta la lectura. Por lo tanto, Webpack / npm es un compilador, no desea leer su salida. (Al menos cuando agrega los "cargadores" para, por ejemplo, archivos .vue.
Samuel Åslund
1
Opinión: Postulo que las definiciones deberían ser: Compilación: idioma -> idioma de nivel inferior. Transpilación: idioma -> idioma del mismo nivel.
Deji
3
@Deji No es necesariamente el mismo nivel de lenguaje, pero es un lenguaje con un nivel similar de abstracción.
tapananand
33

Aquí hay una forma descriptiva de responder.

Si piensa en capas de abstracción como este ejemplo:

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

Un compilador pasa a un nivel inferior (número inferior). Un transpilador cambia de un idioma (o versión de un idioma) a otro en el mismo número.

Araymer
fuente
1
Curioso, ¿de dónde vino esa lista de "niveles de abstracción"?
zerkms
Solo ejemplos ilustrativos aleatorios, sé que los dos primeros son un poco blandos tbh, pero quería una lista más larga: P
Araymer
2
Me gusta y sería genial si fuera una clasificación "oficial" como esa. Ya que sin él es difícil poner una herramienta (un traductor) en una u otra categoría. Por ejemplo: es javacun compilador o no.
zerkms
2

Estoy mayormente de acuerdo con tapananand respuesta, pero ...


definición

Las palabras están "hechas", por lo que tienen un propósito. Y esto también cambia con el tiempo.

Ahora tendemos a usar el transpilador para especificar un compilador que traduzca el código en algún otro código "más similar" al de origen, que lo que podría hacer un compilador. Y se usa para diferenciar ambos principalmente cuando ambos se mencionan en el mismo contexto (nuevamente, lo que implica principalmente que un lenguaje transpile tendrá que compilarse al menos una vez más)


ejemplos

Entonces todo es muy subjetivo. En el momento de escribir este artículo:

  • Viniendo del mundo de Java, podría llamar transpilers CoffeeScript / TypeScript para representar que el código resultante no es más eficiente que el original.
  • La documentación de CoffeScript dice que es un compilador y babel es un transpilador. Quieren decir que CoffeeScript, aunque muy similar, no es Javascript. Al menos no una versión, ya que eso es lo que produce babel.
  • Babel se llama a sí mismo un compilador.

fazit

Por lo tanto, transpile en este momento ya se usa muy raramente, y solo para diferenciar dos compiladores.

Probablemente desaparecerá como concepto, ya que la compilación es mucho más complicada que eso (mismo / superior / inferior idioma, versión, etc.), y la palabra ya no parece ser útil ("transpilers" ahora son ubicuos)

estani
fuente
2

Ejemplo: TypeScript (un superconjunto de JavaScript de Microsoft con comprobación de seguridad de tipos) se transpila a código JavaScript que se puede ejecutar en diferentes tipos de navegadores.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript es un lenguaje de programación de código abierto desarrollado y mantenido por Microsoft. Es un superconjunto sintáctico estricto de JavaScript y agrega escritura estática opcional al lenguaje.

TypeScript está diseñado para el desarrollo de grandes aplicaciones y transcompila a JavaScript. [5] Como TypeScript es un superconjunto de JavaScript, los programas JavaScript existentes también son programas TypeScript válidos. TypeScript se puede utilizar para desarrollar aplicaciones JavaScript para la ejecución tanto del lado del cliente como del lado del servidor (Node.js) ".

Burak
fuente
Existe la herramienta "compilador de mecanografiado" (o tsc), su nombre implica que TypeScript se compila, no se transpila ... sin embargo, la herramienta convierte TypeScript a Javascript, que tiene el mismo nivel de abstracción que el hardware subyacente. ¿TypeScript está compilado o transpilado?
Alex McMillan
@AlexMcMillan TypeScript está COMPILADO, porque es un superconjunto de javascript y, como tal, se compila en javascript.
Araymer
@Araymer ¿Entiendes la diferencia entre compilación y transpilación? Porque TS no está compilado; tampoco JS.
Alex McMillan
Sí. Y debido a que TS es un superconjunto de JS, se considera un nivel más alto de abstracción y, por lo tanto, se denomina "compilado". El JS compilado luego se interpreta como normal. Por lo tanto, si busca TS, el tema más discutido es su "compilación". Pero, la línea entre transpilación y compilación no tiene una definición cuantitativa oficial. Se vuelve bastante blando, por lo que su opinión sobre lo que se compiló (a diferencia de los creadores, tal como está) es solo su opinión.
Araymer