是否有编译语言无法编译,而只是翻译成另一种语言?如果这是一个愚蠢的问题我很抱歉,但我只是想知道这是否是创建编程语言的字面快捷方式。不是更容易(可能不是很快)但仍然可行吗?
答案 0 :(得分:5)
是否有编程语言无法编译,而只是翻译成另一种语言?
这对我没有意义。我对编译的定义是"从一种语言(源语言)翻译成另一种语言(目标语言)"。
通常源语言是由人类编写的,目标语言是机器代码(或asm),但这不是必需的。事实上,许多编译器被构造为多个层,每个层都转换为另一种中间语言(直到最后一层发出目标语言的代码)。
它与语言没有直接关系,而是与特定的实现有关。我们可以使用C,例如:有C语言解释器,目标汇编程序代码的C编译器,目标机器代码(各种平台)的C编译器,C compilers that target JavaScript, C compilers that target Perl等。
至于简化语言的实现:是的,有各种适用的代码重用。
一种方法是将编译器前端(从源语言转换为内部抽象表示)和后端(从内部抽象表示转换为特定平台的机器代码)分离。这样,如果要支持其他目标平台,则可以保留前端并仅编写新的后端。如果要添加对其他源语言的支持,您还可以保留后端并仅编写新的前端。
另一种方法是使用完整的编程语言作为中间表示。例如,您的新编译器可能会生成C代码,然后可以通过任何C编译器将其编译为机器代码。 C ++ did exactly this的第一个实现。 C作为编译器目标语言有许多缺点;已经努力创建更适合该任务的语言(参见C--,GHC(Haskell编译器)在内部使用。
答案 1 :(得分:1)
今天,最常用的翻译语言是JavaScript。 ECMAScript的较新构造被翻译为旧版本以与旧版浏览器兼容。翻译由Babel完成。
还有其他语言,如TypeScript和CoffeScript,已翻译为JavaScript。
答案 2 :(得分:0)
f2c将Fortran 77转换为C代码。所以它可能是你正在寻找的一个例子。
答案 3 :(得分:0)
所有general-purpose programming languages均为Turing complete。这意味着他们中的任何一个都可以被翻译成另一个。
在创建新的编程语言时,许多设计师经常将他们的第一个原型翻译成他们熟悉的新语言。这样可以更容易地检查翻译是否正确,新语言是否正常工作,以及与同事分享想法,因为它与机器无关。
当他们的设计变得稳定时,他们会在现有编译器的前端进行编译。使用现有编译器有几个优点。优化即时可用。新语言可以访问现有库。编译可以针对所有现有的后端,使语言在不同的体系结构上可用。
答案 4 :(得分:0)
是的,这是一种创建新语言的技巧。成为C ++的第一个实验被翻译成C进行编译。取自http://wiki.c2.com/?CeeAsAnIntermediateLanguage:
以这种方式使用C的示例:
CeeFront; C ++的原始实现,翻译成C。
Comeau C ++(http://www.comeaucomputing.com/)将C ++翻译为C. It 是第一个提供完整核心语言支持的C ++编译器 标准C ++。
有几个Java-to-C转换器(有些翻译Java源代码; 其他人将JavaByteCode翻译成C)
许多实验语言编译器使用C作为后端,而不是 直接发射汇编语言。
SqueakSmalltalk的VirtualMachine是用Smalltalk的子集编写的 它被转换为C并送到C编译器。该 Scheme48使用的VirtualMachine是用StaticallyTyped编写的 SchemeLanguage方言称为PreScheme,编译为C.(The PreScheme编译器本身是用完整的Scheme编写的。)
几个SchemeImplementations编译为C(例如RScheme,Bigloo和 鸡)。这些方案经常使用中描述的技术 CheneyOnTheMta为ProperTailRecursion提供支持。
最近,已经创建了针对能够进行高效动态编译的JavaScript子集的编译器 - emscripten。
如果你计算汇编语言和高级语言,WebAssembly或其他字节码语言都适合。