有没有可以直接翻译成另一种语言的编程语言?
Are there programming languages that directly translate into another?
是否有一种编程语言不能编译,而只是翻译成另一种语言?如果这是一个愚蠢的问题,我深表歉意,但我只是想知道这是否是创建编程语言的捷径。会不会更容易(可能速度不快)但仍然可行?
如今最常用的翻译语言是 JavaScript。较新的 ECMAScript 构造被转换为旧版本以与旧浏览器兼容。翻译由Babel.
完成
还有其他语言,如 TypeScript and CoffeScript 被翻译成 JavaScript。
Is there a programming language that doesn't compile, but rather just translates into another language?
这对我来说毫无意义。我对编译的定义是"translating from one language (the source language) to another (the target language)".
通常源语言是人类编写的东西,目标语言是机器代码(或 asm),但这不是必需的。事实上,许多编译器的结构都是多层的,每一层都翻译成另一种中间语言(直到最后一层以目标语言发出代码)。
而且它与语言没有直接关系,而是与特定的实现相关。我们可以以C为例:有C解释器,针对汇编代码的C编译器,针对(各种平台的)机器代码的C编译器,C compilers that target JavaScript, C compilers that target Perl等
至于简化语言的实现:是的,有多种代码重用适用。
一种方法是将编译器 front-ends(从源语言转换为内部抽象表示)和 back-ends(从内部抽象表示转换为特定平台的机器代码)分开。这样你可以保留 front-end 并且只写一个新的 back-end 如果你想支持另一个目标平台。如果您想添加对另一种源语言的支持,您也可以保留 back-end 并只写一个新的 front-end。
另一种方法是使用full-blown 编程语言作为中间表示。例如,您的新编译器可能生成 C 代码,然后可以由任何 C 编译器将其编译为机器代码。 C++的第一个实现did exactly this. C has a number of drawbacks as a compiler target language; there have been efforts to create languages better suited for the task (see e.g. C--, which is used internally by GHC(一个Haskell编译器))。
f2c 将 Fortran 77 翻译成 C 代码。所以这可能是您正在寻找的示例。
全部general-purpose programming languages are Turing complete。这意味着它们中的任何一个都可以翻译成另一个。
在创建一种新的编程语言时,许多设计师经常让他们的第一个原型将他们的新语言翻译成他们熟悉的语言。这使得检查翻译是否正确、新语言是否正常工作以及与同事分享想法变得更加容易,因为它是独立于机器的。
当他们的设计变得稳定时,他们会为现有的编译器制作一个前端来进行编译。使用现有的编译器有几个优点。优化立即可用。新语言可以访问现有库。编译可以针对所有现有的后端,使语言在不同的体系结构上可用。
是的,这是一种创造新语言的技术。成为 C++ 的第一个实验被翻译成 C 进行编译。摘自 http://wiki.c2.com/?CeeAsAnIntermediateLanguage:
Examples of using C in this fashion:
CeeFront; the original implementation of C++, translated to C.
Comeau C++ (http://www.comeaucomputing.com/) translates C++ to C. It
is the first C++ compiler to provide full core language support for
standard C++.
Several Java-to-C translators out there (some translate Java source;
others translate JavaByteCode to C)
Many experimental language compilers use C as a backend, rather than
emitting assembly language directly.
SqueakSmalltalk's VirtualMachine is written in a subset of Smalltalk
which gets translated to C and fed to the C compiler. The
VirtualMachine used by Scheme48 is written in a StaticallyTyped
SchemeLanguage dialect called PreScheme which is compiled to C. (The
PreScheme compiler itself is written in full Scheme.)
Several SchemeImplementations compile to C (e.g. RScheme, Bigloo and
Chicken). These Schemes often use the technique described in
CheneyOnTheMta to provide support for ProperTailRecursion.
最近,针对 JavaScript 的一个子集的编译器已经创建,能够进行高效的即时编译 - emscripten。
如果您将汇编语言和高级语言一起计算在内,WebAssembly 或其他字节码语言也适合。
是否有一种编程语言不能编译,而只是翻译成另一种语言?如果这是一个愚蠢的问题,我深表歉意,但我只是想知道这是否是创建编程语言的捷径。会不会更容易(可能速度不快)但仍然可行?
如今最常用的翻译语言是 JavaScript。较新的 ECMAScript 构造被转换为旧版本以与旧浏览器兼容。翻译由Babel.
完成还有其他语言,如 TypeScript and CoffeScript 被翻译成 JavaScript。
Is there a programming language that doesn't compile, but rather just translates into another language?
这对我来说毫无意义。我对编译的定义是"translating from one language (the source language) to another (the target language)".
通常源语言是人类编写的东西,目标语言是机器代码(或 asm),但这不是必需的。事实上,许多编译器的结构都是多层的,每一层都翻译成另一种中间语言(直到最后一层以目标语言发出代码)。
而且它与语言没有直接关系,而是与特定的实现相关。我们可以以C为例:有C解释器,针对汇编代码的C编译器,针对(各种平台的)机器代码的C编译器,C compilers that target JavaScript, C compilers that target Perl等
至于简化语言的实现:是的,有多种代码重用适用。
一种方法是将编译器 front-ends(从源语言转换为内部抽象表示)和 back-ends(从内部抽象表示转换为特定平台的机器代码)分开。这样你可以保留 front-end 并且只写一个新的 back-end 如果你想支持另一个目标平台。如果您想添加对另一种源语言的支持,您也可以保留 back-end 并只写一个新的 front-end。
另一种方法是使用full-blown 编程语言作为中间表示。例如,您的新编译器可能生成 C 代码,然后可以由任何 C 编译器将其编译为机器代码。 C++的第一个实现did exactly this. C has a number of drawbacks as a compiler target language; there have been efforts to create languages better suited for the task (see e.g. C--, which is used internally by GHC(一个Haskell编译器))。
f2c 将 Fortran 77 翻译成 C 代码。所以这可能是您正在寻找的示例。
全部general-purpose programming languages are Turing complete。这意味着它们中的任何一个都可以翻译成另一个。
在创建一种新的编程语言时,许多设计师经常让他们的第一个原型将他们的新语言翻译成他们熟悉的语言。这使得检查翻译是否正确、新语言是否正常工作以及与同事分享想法变得更加容易,因为它是独立于机器的。
当他们的设计变得稳定时,他们会为现有的编译器制作一个前端来进行编译。使用现有的编译器有几个优点。优化立即可用。新语言可以访问现有库。编译可以针对所有现有的后端,使语言在不同的体系结构上可用。
是的,这是一种创造新语言的技术。成为 C++ 的第一个实验被翻译成 C 进行编译。摘自 http://wiki.c2.com/?CeeAsAnIntermediateLanguage:
Examples of using C in this fashion:
CeeFront; the original implementation of C++, translated to C.
Comeau C++ (http://www.comeaucomputing.com/) translates C++ to C. It is the first C++ compiler to provide full core language support for standard C++.
Several Java-to-C translators out there (some translate Java source; others translate JavaByteCode to C)
Many experimental language compilers use C as a backend, rather than emitting assembly language directly.
SqueakSmalltalk's VirtualMachine is written in a subset of Smalltalk which gets translated to C and fed to the C compiler. The VirtualMachine used by Scheme48 is written in a StaticallyTyped SchemeLanguage dialect called PreScheme which is compiled to C. (The PreScheme compiler itself is written in full Scheme.)
Several SchemeImplementations compile to C (e.g. RScheme, Bigloo and Chicken). These Schemes often use the technique described in CheneyOnTheMta to provide support for ProperTailRecursion.
最近,针对 JavaScript 的一个子集的编译器已经创建,能够进行高效的即时编译 - emscripten。
如果您将汇编语言和高级语言一起计算在内,WebAssembly 或其他字节码语言也适合。