Transpilador
Un traductor de fuente a fuente, compilador de fuente a fuente (compilador S2S), transcompilador o transpilador es un tipo de traductor que toma el código fuente de un programa escrito en un lenguaje de programación como su entrada y produce un código fuente equivalente en el mismo lenguaje de programación o en uno diferente. Un traductor de fuente a fuente convierte entre lenguajes de programación que operan aproximadamente en el mismo nivel de abstracción, mientras que un compilador tradicional traduce de un lenguaje de programación de nivel superior a un lenguaje de programación de nivel inferior. Por ejemplo, un traductor de fuente a fuente puede realizar una traducción de un programa de Python a JavaScript, mientras que un compilador tradicional traduce de un lenguaje como C a ensamblador o Java a código de bytes.Un compilador de paralelización automática con frecuencia tomará un programa de lenguaje de alto nivel como entrada y luego transformará el código y lo anotará con anotaciones de código paralelo (por ejemplo, OpenMP) o construcciones de lenguaje (por ejemplo, forall
declaraciones de Fortran).
Otro propósito de la compilación de fuente a fuente es traducir el código heredado para usar la próxima versión del lenguaje de programación subyacente o una API que rompa la compatibilidad con versiones anteriores. Realizará la refactorización automática del código, lo cual es útil cuando los programas a refactorizar están fuera del control del implementador original (por ejemplo, convertir programas de Python 2 a Python 3, o convertir programas de una API antigua a la nueva API) o cuando el El tamaño del programa hace que sea poco práctico o lento refactorizarlo a mano.
Los transcompiladores pueden mantener la estructura del código traducido lo más cerca posible del código fuente para facilitar el desarrollo y la depuración del código fuente original o pueden cambiar tanto la estructura del código original que el código traducido no se parece al código fuente. También hay utilidades de depuración que asignan el código fuente transcompilado al código original; por ejemplo, el estándar JavaScript Source Map permite mapear el código JavaScript ejecutado por un navegador web de vuelta a la fuente original cuando el código JavaScript fue, por ejemplo, minimizado o producido por un lenguaje transcompilado a JavaScript.
Los ejemplos incluyen Closure Compiler, CoffeeScript, Dart, Haxe, Opal, TypeScript y Emscripten.
Traductores de lenguaje ensamblador
Los llamados traductores de lenguaje ensamblador son una clase de traductores de fuente a fuente que convierten código de un lenguaje ensamblador a otro, incluidos (pero no limitados a) a través de diferentes familias de procesadores y plataformas de sistemas.
Intel CONV86
Intel comercializó su procesador 8086 de 16 bits para que fuera compatible con el 8080, un procesador de 8 bits. Para respaldar esto, Intel tenía un traductor basado en ISIS-II del código fuente 8080 a 8086 llamado CONV86 (también conocido como CONV-86 y CONVERT 86) disponible para clientes OEM desde 1978, posiblemente el primer programa de este tipo. Admitía varios niveles de traducción y funcionaba a 2 MHz en un sistema de desarrollo de microprocesador Intel MDS-800 con unidades de disquete de 8 pulgadas. Según los informes de los usuarios, no funcionó de manera muy confiable.
SCP TRANS86
Seattle Computer Products (SCP) ofreció TRANS86.COM, escrito por Tim Paterson en 1980 mientras desarrollaba 86-DOS. La utilidad podría traducir el código fuente de ensamblaje Intel 8080 y Zilog Z80 (con mnemónicos Zilog/Mostek) en código fuente.ASM para Intel 8086 (en un formato solo compatible con el ensamblador cruzado ASM86 de SCP para CP/M-80), pero compatible solo un subconjunto de códigos de operación, registros y modos, y, a menudo, aún requería una corrección manual significativa y una revisión posterior. Además, al realizar solo una mera transliteración, el traductor de un solo paso de fuerza bruta no llevó a cabo ninguna optimización de registro y salto. Tomó alrededor de 24 KB de RAM. La versión 1 de SCP de TRANS86.COM se ejecutó en sistemas basados en Z80.Una vez que se estaba ejecutando 86-DOS, Paterson, en un enfoque inspirado en el alojamiento propio, utilizó TRANS86 para convertirse en un programa que se ejecutaba en 86-DOS. Versión numerada 2, en su lugar se llamó TRANS.COM. Más tarde, en 1982, el traductor aparentemente también estaba disponible en Microsoft.
Sorcim TRANS86
También llamado TRANS86, Sorcim también ofreció un traductor 8080 a 8086 desde diciembre de 1980. Al igual que el programa de SCP, fue diseñado para portar el código de la aplicación CP/M-80 (en formato de ensamblaje ASM, MAC, RMAC o ACT80) a MS-DOS (en un formato compatible con ACT86). En formato ACT80 también admitía algunos mnemotécnicos Z80. La traducción se produjo instrucción por instrucción con alguna optimización aplicada a los saltos condicionales. El programa se ejecutó bajo CP/M-80, MP/M-80 y Cromemco DOS con un mínimo de 24 KB de RAM y no tenía restricciones en el tamaño del archivo de origen.
Investigación digital XLT86
Mucho más sofisticado y el primero en introducir tecnologías de compilación optimizadas en el proceso de traducción de fuentes fue XLT86 1.0 de Digital Research en septiembre de 1981. XLT86 1.1 estuvo disponible en abril de 1982. El programa fue escrito por Gary Kildall y tradujo el código fuente.ASM para Intel 8080. procesador (en un formato compatible con ensambladores ASM, MAC o RMAC) en código fuente.A86 para el 8086 (compatible con ASM86). Usando el análisis de flujo de datos global en el uso de registro 8080,el traductor de pasos múltiples de cinco fases también optimizaría la salida para el tamaño del código y se ocuparía de las convenciones de llamadas (las llamadas BDOS CP/M-80 se asignaron a llamadas BDOS para CP/M-86), de modo que CP/M-80 y los programas MP/M-80 podrían ser portados a las plataformas CP/M-86 y MP/M-86 automáticamente. XLT86.COM en sí fue escrito en PL/I-80 para plataformas CP/M-80. El programa ocupaba 30 KB de RAM para sí mismo más memoria adicional para el gráfico del programa. En un sistema de memoria de 64 KB, el tamaño máximo de archivo de origen admitido era de aproximadamente 6 KB, por lo que los archivos más grandes debían dividirse en consecuencia antes de la traducción. Alternativamente, XLT86 también estaba disponible para DEC VAX/VMS.Aunque la entrada y salida de XLT86 funcionaba a nivel de código fuente, la representación en memoria del programa del traductor y las tecnologías de optimización de código aplicadas sentaron las bases para la recompilación binaria.
Otros
2500 AD Software ofreció un traductor de código fuente 8080 a 8086 como parte de su suite XASM para máquinas CP/M-80 con Z80, así como para sistemas Zilog ZEUS y Olivetti PCOS.
Desde 1979, Zilog ofreció un traductor Z80 a Z8000 como parte de su sistema de desarrollo PDS 8000. Advanced Micro Computers (AMC) y 2500 AD Software también ofrecieron traductores Z80 a Z8000. Este último se llamó TRANS y estaba disponible para Z80 CP/M, CP/M-86, MS-DOS y PCOS.
El kit de desarrollo Z88DK proporciona un traductor de código fuente Z80 a i486 dirigido a nasm llamado "to86.awk", escrito en 2008 por Stefano Bodrato. A su vez, se basa en un convertidor de 8080 a Z80 escrito en 2003 por Douglas Beattie, Jr., llamado "toz80.awk".
En 2021, Brian Callahan escribió un traductor de código fuente 8080 CP / M 2.2 a MS-DOS dirigido a nasm llamado 8088ify.
Implementaciones de lenguajes de programación
Las primeras implementaciones de algunos lenguajes de programación comenzaron como transcompiladores y la implementación predeterminada para algunos de esos lenguajes sigue siendo transcompiladores. Además de la tabla a continuación, un mantenedor de CoffeeScript proporciona una lista de lenguajes que se compilan en JavaScript.
Nombre | Lenguaje fuente | Lengua de llegada | Comentarios |
---|---|---|---|
Babel | ES6+ (JS) | ES5 | |
Cerbero X | cerbero | JavaScript, Java, C++, C# | |
Frente | C++ | C | |
ClojureScript | clausura | JavaScript | |
Dardo | Dardo | JavaScript | |
h5 | C# | JavaScript | |
Haxé | Haxé | ActionScript 3, JavaScript, Java, C++, C#, PHP, Python, Lua | |
HipHop para PHP (HPHPc) | PHP | C++ | |
J2ObjC | Java | C objetivo | |
jdulce | Java | Mecanografiado | |
Maia | Maia | Verilog | |
NACA | COBOL, Java | COBOL, Java | |
mrustc | Óxido | C | Compilador experimental que puede arrancar el compilador oficial de óxido (rustc) |
Nim | Nim | C, C++, JavaScript | |
Rescripto | OCaml | JavaScript | |
Swiftificar | C objetivo | Rápido | |
valac | Vala | C |
Portar una base de código
Cuando los desarrolladores quieren cambiar a un idioma diferente y conservar la mayor parte de un código base existente, podría ser mejor usar un transcompilador en lugar de reescribir todo el software a mano. Dependiendo de la calidad del transcompilador, el código puede o no necesitar intervención manual para funcionar correctamente. Esto es diferente de los "lenguajes transcompilados", donde las especificaciones exigen que el código fuente de salida siempre funcione sin modificaciones. Todos los transcompiladores utilizados para portar una base de código esperarán un ajuste manual del código fuente de salida si es necesario lograr la máxima calidad de código en términos de legibilidad y convención de la plataforma.
ocultarHerramienta | Lenguaje fuente | Lengua de llegada | Comentarios |
---|---|---|---|
guión 2to3 | Pitón 2 | Pitón 3 | Aunque 2to3 hace todo lo posible para automatizar el proceso de traducción, a menudo se necesitan más correcciones manuales. |
Emscripten | código de bytes LLVM | JavaScript | Esto permite ejecutar bases de código C/C++ en un navegador, por ejemplo |
c2go | C | Vamos | Antes del lanzamiento de la versión 1.5, el compilador Go estaba escrito en C. Se desarrolló un traductor automático para convertir automáticamente el código base del compilador de C a Go. Desde Go 1.5, el "compilador y el tiempo de ejecución ahora se implementan en Go y ensamblador, sin C". |
C2Óxido | C | Óxido | C2Rust toma código C como entrada y genera unsafe código Rust, enfocándose en preservar la compatibilidad con el código base original. Existen varias limitaciones documentadas para este proceso. Convertir el código resultante en un código Rust seguro e idiomático es un esfuerzo manual posterior a la traducción, aunque existe una herramienta automatizada para facilitar esta tarea. |
Kit de herramientas web de Google | Programa Java que utiliza una API específica | JavaScript | El código Java está un poco limitado en comparación con el código Java normal. |
Js_of_ocaml de Ocsigen | OCaml | JavaScript | |
J2Eif | Java | eiffel | El código Eiffel resultante tiene classeRusts y estructuras similares al programa Java pero siguiendo la sintaxis y las convenciones de Eiffel. |
C2Eif | C | eiffel | El código Eiffel resultante tiene clases y estructuras que intentan ser lo más limpias posible. La herramienta está completa y se basa en incrustar el código C y ensamblador si no puede traducirlo correctamente. |
Swiftificar | C objetivo | Rápido | Swiftify es una herramienta de conversión de fuente a fuente en línea de Objective-C a Swift. Ayuda a los desarrolladores que están migrando todo o parte de su código base de iOS a Swift. La conversión tiene como objetivo principal convertir la sintaxis entre Objective-C y Swift, y se ayuda porque Apple se esforzó para garantizar la compatibilidad entre los tiempos de ejecución de Swift y Objective-C. |
Convertidor de tiempo de ejecución | PHP | Java | Runtime Converter es una herramienta automática que convierte código fuente PHP en código fuente Java. Hay una biblioteca de tiempo de ejecución de Java para ciertas características del lenguaje PHP, así como la capacidad de llamar al binario de PHP usando JNI para llamadas de función de extensión y biblioteca estándar de PHP. |
Canalizaciones del transcompilador
Una canalización de transcompilador es lo que resulta de la transcompilación recursiva. Al unir varias capas de tecnología, con un paso de transcompilación entre cada capa, la tecnología se puede transformar repetidamente, creando efectivamente una especificación independiente del lenguaje distribuido.
XSLT es una herramienta de transformación de uso general que se puede utilizar entre muchas tecnologías diferentes para crear una canalización de código derivado de este tipo.
Transcompilación recursiva
La transcompilación recursiva (o transpilación recursiva) es el proceso de aplicar la noción de transcompilación recursivamente, para crear una tubería de transformaciones (a menudo a partir de una única fuente de verdad) que convierte repetidamente una tecnología en otra.
Repitiendo este proceso, se puede convertir A → B → C → D → E → F y luego volver a A(v2). Parte de la información se conservará a través de esta canalización, desde A → A(v2), y esa información (en un nivel abstracto) demuestra en qué está de acuerdo cada uno de los componentes A–F.
En cada una de las diferentes versiones que produce la canalización del transcompilador, se conserva esa información. Puede adoptar muchas formas y tamaños diferentes, pero cuando vuelve a A (v2), después de haber sido transcompilado seis veces en la canalización anterior, la información vuelve a su estado original.
Esta información que sobrevive a la transformación a través de cada formato, desde A–F–A(v2), es (por definición) contenido derivado o código derivado.
La transcompilación recursiva aprovecha el hecho de que los transcompiladores pueden mantener el código traducido lo más cerca posible del código fuente para facilitar el desarrollo y la depuración del código fuente original, o pueden cambiar tanto la estructura del código original que el código traducido El código no se parece al código fuente. También hay utilidades de depuración que asignan el código fuente transcompilado al código original; por ejemplo, los mapas fuente de JavaScript permiten mapear el código JavaScript ejecutado por un navegador web de vuelta a la fuente original en un lenguaje transcompilado a JavaScript.
Contenido relacionado
Palabra reservada
Transformada bilineal
Red doméstica