如何“实现”编程语言?

时间:2010-06-30 12:14:20

标签: programming-languages

也许这只是一个小小的误解,但编程语言如何实施

我不是在谈论如何实现我自己的编程语言,而是关于“已实现”这个词? 我的意思是,你可以实现编译器或解释器,但是编程语言?

如果我读“C ++是用C实现”还是“Python用C实现”是什么意思?

我认为一种语言更为严肃。就像某人如何思考事情的协议一样。例如,如果他想要显示一个消息框,他可以说这个命令是ShowMessageBox(字符串)并实现一个编译器,将其转换为可在计算机上运行的东西(除了他想象的所选编程范例)。 p>

我认为这个问题导致了“现实中的编程语言是什么”这个问题?关于如何用语言实现事物的编译器,解释器或文档语言标准?

[编辑]

答案:语言从未实现,只有编译器/口译员等。就这么简单。

8 个答案:

答案 0 :(得分:22)

这是一个非常学术性的答案(来自长期学术界)。 首先,我将重新构思这个问题:

  

编程语言实现意味着什么?

我将从“什么是编程语言”开始:

  1. 编程语言是一种形式语言(我们可以通过算法规则精确表征的一组话语),使得语言中的句子具有计算含义。有多种方法可以赋予计算意义;两个最流行的是计算代表一个函数(从值到值,或从机器状态到机器状态),并且计算代表一个机器,它使“状态转换”并与外部世界交互。

  2. 当提供用于读入话语并执行计算的装置,即计算功能或执行行为时,实现语言。手段就是实施。

  3. 典型的实施包括

    • 直接解释语言语法。这种模式很少见,但FORTH可能最接近它。

    • 将语法翻译成虚拟机代码,也称为字节码,它本身就是另一种语言并被解释。在C语言中编写字节码解释器很受欢迎.Loa,Perl,Python和Ruby或多或少地以这种方式实现。

    • 将语法翻译成硬件机器指令,硬件机器指令本身就是另一种语言,由CPU解释。 C和C ++通常(但不总是)以这种方式实现。

    • 直接解释硬件中的语言。 IA-32机器代码和AMD64机器代码以这种方式实现。

    当一个人说“语言X在Y中实现”时,他们通常会说X的翻译器或X字节码的翻译器用Y语言编写。 编译器编写者的一个重要秘诀是能够在语言X本身中编写语言X的编译器。如果您对此感兴趣,请获取Andrew Appel的论文 Axiomatic Bootstrapping:Compiler Hackers指南

    有时这个问题的答案并不明显。 Squeak Smalltalk在Smalltalk中写入转换器和字节码解释器,然后将解释器转换为C,转换为机器代码。什么是Squeak实施? Smalltalk中。


    戳一位教授;得到一个演讲。

答案 1 :(得分:22)

你是对的,这些陈述没有任何意义。很明显,无论谁做出这些陈述都不理解编程语言和编译器(或解释器)之间的区别。

这是一个令人惊讶的常见问题。例如,有时人们谈论解释语言或编译语言。这是一回事:语言不被解释或编译,它们只是 。解释和编译是实现的特征,而不是语言。

另一个好消息:Python有一个GIL。不,它没有:一个实现的Python有一个GIL,所有其他实现都没有,而Python 语言本身当然没有。或者:Ruby有绿色线程。同样,不是这样:Ruby有线程。期。任何特定的语言实现是否选择将它们实现为绿色线程,本机线程,平台线程或其他任何东西,都是该特定实现的特征,而不是Ruby的特征。当然我最喜欢的:Ruby 1.9比Ruby 1.8更快。这甚至没有意义:Ruby 1.9和Ruby 1.8是编程语言,即一堆抽象的数学规则。你不能运行一种编程语言,因此编程语言永远不会比另一种语言“更快”或“更慢”。

关于编程语言和实现之间差异的最明显的混淆是计算机语言基准游戏,它声称相互之间的语言基准测试,但实际上是基准实现。

所有这些只是表达事实的不同表现,显然有些人似乎从根本上无法理解抽象概念。或者至少是拥有抽象语言和该语言的具体实现的概念。

如果我们回到“Python在C中实现”的陈述,那么现在很明显,该陈述不仅仅是错误的。如果陈述是错误的,那就意味着该陈述甚至有意义,即有一些可能的世界在那里,至少在理论上它是正确的。但事实并非如此。声明既不错也不正确,根本没有意义。如果英语是一种打字语言,则会出现类型错误。

Python是一种编程语言。编程语言没有任何实现。他们刚刚实施。编译器和解释器以语言实现。但即使你用这种方式解释语句,也不是这样:Jython用Java实现,IronPython用C#实现,PyPy用RPython和Python实现,Pynie用PGE,NQP和PIR实现。 (哦,所有这些实现都有编译器,所以你的“Python是一种解释语言”。)类似于Ruby:Rubinius用Ruby和C ++实现,JRuby和XRuby用Java实现,IronRuby和Ruby.NET是在C#中实现,HotRuby在ECMAScript中实现,Red Sun在ActionScript中实现,RubyGoLightly在Go中实现,Cardinal在PGE,NQP和PIR中实现,SmallRuby在Smalltalk / X中实现,MagLev在GemStone Smalltalk和Ruby中实现, YARI在Io中实现。对于C ++:Clang(它是LLVM的C,C ++和Objective-C前端)是用C ++实现的(所有三个前端都是用C ++实现的。)

答案 2 :(得分:11)

“C ++在C中实现”。我理解为“C ++编译器是用C语言编写的”。很简单,没有太多的哲学。

通常,C ++编译器可以用任何语言编写,包括C ++本身(第一个编译器版本除外)。

答案 3 :(得分:6)

“Python在C中实现”意味着至少有一个Python编译器(在这种情况下是最常用的编译器)使用C编写。该Python实现的开发人员故意决定不使用C ++。作为一个声明,它是不完整的,因为Python也已经用Java,C#和Python实现。

主要的相关性在于它让您对可能将语言移植到的系统有所了解:C编译器的任何目标应该(至少在理论上)能够运行Python的C实现,但是如果他们选择使用C ++,那么会有一小部分可以运行它的系统。

C ++目前通常没有在C中实现:我相信它通常是用C ++实现的。语言以相同的语言(或语言的子集)实现是很常见的,因为这意味着您不再依赖于目标可用的其他一些不相关的语言。要引导到新系统,您可以从其他系统交叉编译。

如果你为一个新平台编译gcc,那么构建过程包括用已经可用的任何编译器(可能是一个较旧的gcc)编译源代码一次,然后用新编译的编译器再次编译它,然后编译第三次时间与第二次编译的输出。如果第二个和第三个版本不相同,则会出现构建错误。如果它们完全相同,那么你就可以很好地指出它是否正确编译了。

答案 4 :(得分:4)

编程语言是一种标准。它的解释器或编译器是该标准的实现。

答案 5 :(得分:2)

要构建新语言,您不一定需要在低级机器代码(例如程序集)中进行操作。所以,使用另一种语言来实现你的目标(在这里创建一种新语言)是完全正常的。所以,当我们说:Python是用C实现的时候,它只是意味着C被用来创建那种语言。例如,C可以在许多不同的架构上进行编译,因此程序员不必处理不同类型的计算机(便携式)。

语言只是表达自己对计算机的一种方式。今天,它可以通过各种方式完成。但是当您使用与语言相同的语法并创建自己的框架时,它被称为库或框架。编程语言只是编写程序的符号。如果符号更改,则您使用其他语言。像法语或西班牙语来自拉丁语。 (法语用拉丁语实现;)

为什么有这么多不同的语言?因为语言的目标是解决复杂的问题。因此,根据您想要尝试完成的内容,选择合适的语言可能是一个重要的决定。

答案 6 :(得分:1)

语言“语言X在语言Y中实现”是有道理的,当且仅当存在语言X 的规范实现时,该实现是用语言Y编写的。 ,第一个或最流行的实现通常被认为是规范的。

例如,Perl是少数具有明确规范的语言之一。如果CPython被认为是Python的规范实现,那么“Python在C中实现”是有意义的,并且“C ++在C中实现”对于CFront来说是正确的,这是Bjarne Stroustrup的“C with classes”的原始实现。

答案 7 :(得分:0)

直接回答: 在你所讨论的上下文中的实现意味着书面和语言实际上意味着编译器。 最初的C ++编译器就像我所理解的那样用C语言编写。除了知识和时间之外,什么都没有阻止你用另一种语言编写C ++编译器。

实现是使软件工作的代码。我们经常讨论函数的实现,如:“函数尚未实现。” 例如 void foo()
{
//功能尚未实现
   扔();
}

这通常发生在程序的设计阶段,因为调用需要在那里进行编写/调试/概念测试调用代码但我们还没有完成实现(编写代码来实现功能) )