来源到源编译器
源代码转换器,源代码编译器( S2S编译器), Transcompiler或Transpiler是一种转换器,它采用以编程语言编写的程序的源代码作为输入,并产生等效的源代码用相同或不同的程式设计语言.源对源翻译器在以大致相同的抽象级别运行的编程语言之间进行了转换,而传统编译器则从较高级别的编程语言转换为较低级别的编程语言。例如,来源转换器可以执行从Python到JavaScript的程序的翻译,而传统的编译器则从C到Chandbler或Java等语言转换为bytecode 。自动平行编译器将经常作为输入使用高级语言程序,然后使用并行代码注释(例如, OpenMP )或语言构造(例如Fortran的forall
语句)进行转换并注释。
源代源编译的另一个目的是翻译旧版代码以使用基础编程语言的下一个版本或向后兼容的API。它将执行自动代码重构,当重构程序不在原始实施者的控制之外时(例如,将程序从Python 2转换为Python 3,或将程序从旧的API转换为新API)或当该程序的尺寸使其不切实际或耗时,可以手工重构。
提交者可以将翻译的代码结构尽可能地保持在源代码附近,以简化开发和调试原始源代码,或者可以更改原始代码的结构,以至于翻译的代码看起来不像源代码。还有一些调试实用程序将映射到原始代码的移动源代码映射到原始代码;例如, JavaScript源地图标准允许将Web浏览器执行的JavaScript代码映射回原始源,例如,JavaScript代码是由To-JavaScript语言缩小或制作的。
示例包括关闭编译器,咖啡本, Dart , Haxe ,Opal, Typescript和Emscripten 。
组装语言翻译人员
所谓的汇编语言翻译器是一类源代码转换器,将代码从一种汇编语言转换为另一种汇编语言,包括(但不限于)在不同的处理器家族和系统平台中。
英特尔conv86
英特尔将其16位处理器8086销售,与8080( 8位处理器)兼容。为了支持这一点,Intel拥有一个基于ISIS-II的翻译器,从8080到8086源代码,称为Conv86(也称为Conv-86和Convert 86),自1978年以来, OEM客户可用,这可能是此类最早的此类程序。它支持多个级别的翻译,并在具有8英寸软盘驱动器的Intel微处理器开发系统MDS-800上以2 MHz运行。根据用户报告,它的可靠性并非如此。
SCP Trans86
西雅图计算机产品(SCP)提供了Trans86.com,由蒂姆·帕特森(Tim Paterson)于1980年撰写,同时开发了86件。该实用程序可以将Intel 8080和Zilog Z80汇编源代码(带有Zilog/ Mostek Mnemonics )转换为Intel 8086的.ASM源代码(仅使用SCP的Cross-Assembler ASM86兼容CP/ M-80的格式),但支持了CP/ M-80 ),但只有一部分Opcodes ,寄存器和模式,并且通常仍需要进行重大的手动校正和重新工作。同样,蛮力单频道翻译器仅进行一次音译,没有进行任何寄存器和跳跃优化。大约花了24千万千万杆。 Trans86.com的SCP版本1在基于Z80的系统上运行。一旦86-DOS运行,Paterson以一种自我托管启发的方法利用Trans86将自身转换为在86多人下运行的程序。编号2,该版本为trans.com。 1982年晚些时候,Microsoft显然也可以从Microsoft获得翻译。
Sorcim Trans86
Sorcim也称为Trans86,也自1980年12月以来也提供了8080至8086的翻译器。与SCP的程序一样,它旨在将CP/M-80应用程序代码(在ASM,MAC,RMAC,RMAC或ACT80汇编格式)到MS-DOS (在与ACT86兼容的格式。在ACT80格式中,它还支持了一些Z80 Mnemonics。该翻译是根据指令进行的,并应用于有条件的跳跃,并进行了一些优化。该程序以CP/M-80, MP/M-80和Cromemco DOS运行,至少为24 kb的RAM,并且对源文件大小没有任何限制。
数字研究XLT86
更复杂的是,第一个将优化编译器技术引入源翻译过程的是数字研究的XLT86 1.0。英特尔8080处理器(与ASM,MAC或RMAC汇编器兼容的格式)中的.A86源代码(与ASM86兼容)。使用8080寄存器使用的全局数据流分析,五阶段的多通转换器还将优化代码大小的输出并处理呼叫约定(CP/M-80 BDOS调用被映射到BDOS呼叫中,以供CP/M-呼叫86 ),因此CP/M-80和MP/M-80程序可以自动移植到CP/M-86和MP/M-86平台。 XLT86.com本身是用PL/I-80编写的,用于CP/M-80平台。该程序本身占据了30 KB的RAM,并为程序图占据了其他内存。在64 KB内存系统上,支持的最大源文件大小约为6 kb,因此必须在翻译之前相应地分解较大的文件。另外,XLT86也可用于DEC VAX/VM 。尽管XLT86的输入和输出在源代码级别上起作用,但转换器的程序中的内存表示和应用的代码优化技术为二进制重新编译奠定了基础。
其他的
2500 AD软件提供了8080至8086的源代码转换器,作为其XASM套件的一部分,用于Z80的CP/M-80机器以及Zilog Zeus和Olivetti PCOS Systems。
自1979年以来,Zilog作为其PDS 8000开发系统的一部分提供了Z80至Z8000翻译器。高级微型计算机(AMC)和2500 AD软件也向Z80转换为Z8000转换器。后者命名为Trans,可用于Z80 CP/M,CP/M-86,MS-DOS和PCOS。
Z88DK开发套件提供了Z80至i486源代码转换器,其针对NASM的NASM ,名为“ To86.awk”,由Stefano Bodrato于2008年撰写。反过来,这是基于Douglas Beattie,Jr。在2003年撰写的8080至Z80转换器,名为“ Toz80.awk”。
在2021年,布莱恩·卡拉汉(Brian Callahan)为MS-DOS源代码转换器编写了8080 CP/M 2.2,定位NASM为8088ify。
编程语言实现
某些编程语言的首次实现始于以迁移器的形式,其中某些语言的默认实现仍然是traplosempilers。除下表外, CoffeeScript维护者还提供了编译为JavaScript的语言列表。
姓名 | 源语言 | 目标语言 | 评论 |
---|---|---|---|
别贝 | ES6+ ( JS ) | ES5 | |
Cerberus X | Cerberus | JavaScript , Java , C ++ , C# | |
Cfront | C ++ | C | |
clojurescript | 克洛杰尔 | JavaScript | |
达夫尼 | 达夫尼 | C#, JS , Java ,C ++, Go , Python | |
镖 | 镖 | JavaScript | |
H5 | C# | JavaScript | |
哈克斯 | 哈克斯 | ActionScript 3 ,JavaScript,Java,C ++,C#, PHP , Python , Lua | |
hiphop用于PHP(HPHPC) | php | C ++ | |
J2OBJC | 爪哇 | Objective-C | |
jsweet | 爪哇 | 打字稿 | |
迈娅 | 迈娅 | Verilog | |
NACA | Cobol ,Java | Cobol,Java | |
mrustc | 锈 | C | 能够引导官方生锈编译器(RUSTC)的实验编译器 |
尼姆 | 尼姆 | C,C ++,JavaScript | |
诏书 | OCAML | JavaScript | |
迅速 | Objective-C | 迅速 | |
瓦拉 | 瓦拉 | C | |
寓言 | F# | JavaScript | |
寓言python | F# | Python |
移植代码库
当开发人员想要在保留大多数现有代码库的同时切换到其他语言时,与手工重写整个软件相比,使用截止板可能会更好。根据提交器的质量,代码可能需要或不需要手动干预才能正常工作。这不同于“移植语言”,其中规格要求输出源代码始终在没有修改的情况下工作。如果需要在可读性和平台约定方面实现最大的代码质量,则所有用于移植代码库的移植器都将期望手动调整输出源代码。
工具 | 源语言 | 目标语言 | 评论 |
---|---|---|---|
2to3脚本 | Python 2 | Python 3 | 即使2to3在自动化翻译过程方面做得最好,但通常需要进一步的手动校正。 |
emscripten | LLVM字节码 | JavaScript | 例如,这允许在浏览器中运行C/C ++代码库 |
C2GO | C | 去 | 在1.5版本发布之前,GO编译器是用C写成的。开发了自动转换器,以将编译器代码库从C中自动转换为GO。由于GO 1.5,因此“编译器和运行时现在已在没有C的情况下实现”。 |
c2rust | C | 锈 | C2rust将C代码作为输入,并输出unsafe 锈蚀代码,重点是保存与原始代码库的兼容性。此过程存在一些已记录的限制。将所得代码转换为安全和惯用的锈蚀代码是一项手动努力,尽管存在自动化工具以简化此任务。
|
Google Web工具包 | 使用特定API的Java程序 | JavaScript | 与普通的Java代码相比,Java代码有点限制。 |
ocsigen的js_of_ocaml | OCAML | JavaScript | |
J2EIF | 爪哇 | 艾菲尔 | 由此产生的Eiffel代码具有类似于Java程序的类和结构,但按照Eiffel语法和约定。 |
C2EIF | C | 艾菲尔 | 由此产生的Eiffel代码具有试图尽可能清洁的类和结构。该工具已完成,如果无法正确翻译它,则依赖于嵌入C和汇编代码。 |
迅速 | Objective-C | 迅速 | Swiftify是从Objection-C到Swift的源转换工具的在线来源。它协助将其全部或部分iOS代码库迁移到Swift的开发人员。转换主要旨在转换Objective-C和Swift之间的语法,并得到帮助,因为Apple竭尽全力确保Swift和Objective-C Runttime之间的兼容性。 |
运行时转换器 | php | 爪哇 | 运行时转换器是一种自动工具,可将PHP源代码转换为Java源代码。有一个用于PHP语言某些功能的Java运行时库,以及使用JNI拨打PHP标准库和扩展功能调用的PHP二进制本身的能力。 |
迁移管道
递归递减的移植物管道是递归移植的原因。通过将多层技术串在一起,每层之间都可以反复转换技术,从而有效地创建了分布式语言独立的规范。
XSLT是一种通用变换工具,可以在许多不同的技术之间使用,以创建这种导数代码管道。
递归移植
递归移术(或递归式跨性)是递归递增的概念的过程,以创建转换的管道(通常是从单个真理来源开始),这将一种技术反复将一种技术变成另一种技术。
通过重复此过程,可以将A→B→C→D→E→F,然后返回A(V2)。一些信息将通过本管道,→a(v2)保存,该信息(在抽象层面上)演示了每个组件A – f的同意。
在转运管道产生的每个不同版本中,该信息都保留了。它可能需要许多不同的形状和尺寸,但是到返回A(V2)时,上面的管道中六次转移,信息返回到其原始状态。
通过A – F – A(V2)从每种格式中幸存下来的此信息,是(根据定义)衍生内容或衍生代码。
递归提交综合利用了以下事实:截止器可以使翻译代码尽可能地接近源代码,以简化原始源代码的开发和调试,否则它们可能会如此多地更改原始代码的结构,以至于翻译已翻译的结构代码看起来不像源代码。还有一些调试实用程序将映射到原始代码的移动源代码映射到原始代码;例如, JavaScript源地图允许将Web浏览器执行的JavaScript代码映射回原始源以偏移到JavaScript语言。
也可以看看
- 二进制重新编译器
- C到HDL - 将类似C的程序转换为硬件说明语言
- 代码生成(编译器) - 将计算机代码转换为机器可读形式
- DMS软件重新设计工具包- 程序转换工具 - 使用明确的模式指导的重写规则的来源对源编译器框架
- F2C - 将Fortran 77转换为C代码的程序 - 源代码编译器从Fortran 77到C
- Honeywell Liberator - 大型计算机家族(在Honeywell H200上运行IBM 1401程序)
- 中间表示- 编译器或虚拟机内部使用以表示源代码的数据结构或代码
- 语言绑定- 允许使用其他编码语言编码的另一个库的软件库
- 独立于语言的规范- 计算机编程标准旨在在编程语言中互操作
- 语言互操作性- 编程语言之间的互操作性
- 对象代码优化器,也称为二进制优化 - 软件编译的方面
- 预处理器- 处理另一个程序输入的程序
- 程序转换
- 玫瑰(编译器框架) - 源代码编译器框架
- 翻译器(计算) - 将代码从一种编程语言转换为另一种编程语言的计算机程序
- XSLT - 用于转换XML文档的语言