是否存在直接转换为另一种语言的编程语言?

时间:2018-03-20 21:19:26

标签: language-design

是否有编译语言无法编译,而只是翻译成另一种语言?如果这是一个愚蠢的问题我很抱歉,但我只是想知道这是否是创建编程语言的字面快捷方式。不是更容易(可能不是很快)但仍然可行吗?

5 个答案:

答案 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完成。

还有其他语言,如TypeScriptCoffeScript,已翻译为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或其他字节码语言都适合。