如何“实现”编程语言?

How can a programming language be “implemented”?

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

我不是在说如何实现我自己的编程语言,而是在说"实现"这个词?我的意思是,你可以实现一个编译器或者一个解释器,但编程语言呢?

如果我读"C++在C中实现"或者"Python在C中实现",这意味着什么?

我认为一种语言更像是一种关于某人如何思考事情的协议。例如,如果他想显示一个消息框,他可以说这个命令是showmessagebox(string),并实现一个编译器,将它转换成在计算机上工作的东西(除了他想象的选定的编程范例)。

我认为这个问题引出了一个问题"什么是现实中的编程语言"?一个编译器、一个解释器或者只是一个文档化的语言标准,关于如何在一种语言中实现事物?

[编辑]

答:语言从来没有实现过,只有编译器/解释器等。这很简单。


你说得对,那些说法毫无意义。很明显,编写这些语句的人并不理解编程语言和编译器(或解释器)之间的区别。

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

另一个好人:Python有一只镀金的。不,它没有:Python的一个实现有一个gil,其他所有实现没有,而Python语言本身也没有。或者:Ruby有绿色线程。同样,不是这样的:Ruby有线程。时期。任何特定语言实现是否选择将它们实现为绿色线程、本机线程、平台线程或其他类型,都是该特定实现的一个特性,而不是Ruby。当然,我最喜欢的是:Ruby1.9比Ruby1.8快。这甚至没有意义:Ruby1.9和Ruby1.8是编程语言,也就是一堆抽象的数学规则。您不能运行编程语言,因此编程语言永远不能比另一种语言"更快"或"更慢"。

对于编程语言和实现之间的区别,最明显的困惑是计算机语言基准游戏,它声称对语言进行基准测试,但实际上是基准测试实现。

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

如果我们回到"python是在C中实现的"语句,那么很明显,该语句不仅仅是错误的。如果声明是错误的,这意味着声明甚至是有意义的,也就是说,在外面有一些可能的世界,至少在理论上它是正确的。但事实并非如此。这句话既不对也不对,简直没有道理。如果英语是一种打字语言,那将是一种类型错误。

python是一种编程语言。编程语言没有任何实现。它们只是实现了。编译程序和解释程序是用语言实现的。但是,即使用这种方式解释语句,也不是真的:Jython是用Java实现的,IrpyPython是用C语言实现的,PyPy是在RPython和Python中实现的,Pynie是在PGE、NQP和PIR中实现的。(哦,所有这些实现都有编译器,所以你的Python是一种解释语言。)类似于Ruby:RubimIUS在Ruby和C++中实现,JRuby和XRuby在Java中实现,IrrRuby和Ruby.NET是用C语言实现的,Hutruby在ECMAScript实现,Red Sun在ActionScript中实现。在go中实现,在pge、nqp和pir中实现基数,在smalltalk/x中实现smallruby,在gemstone smalltalk和ruby中实现磁悬浮,在io中实现yari。对于C++,Clang(C,C++和Objy-C前端用于LLVM)在C++中实现(所有三个前端都用C++实现)。


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

What does it mean for a programming language to be implemented?

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

  • 编程语言是一种形式语言(我们可以通过算法规则精确描述一组话语),因此语言中的句子具有计算意义。给出计算含义的方法有很多种;最流行的两种方法是:计算代表一个函数(从值到值,或从机器状态到机器状态),计算代表一个机器,它进行"状态转换",并与外部世界交互。

  • 当提供了一种方法来读取一个话语并执行计算(即计算函数或执行行为)时,就实现了一种语言。手段就是实施。

  • 典型的实现包括

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

    • 将语法翻译成虚拟机代码,也称为字节码,它本身是另一种语言,可以解释。在C.Lua、Perl、Python和Ruby中编写字节码解释器是很流行的,它们或多或少都是通过这种方式实现的。

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

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

    当一个人说"语言x是在y中实现的"时,他们通常说x的翻译器或x字节码的翻译器是用语言y编写的。编译器编写者最大的秘密之一是能够用X语言本身编写X语言的编译器。如果您感兴趣,请阅读安德鲁·阿佩尔的论文《自动引导:编译器黑客指南》。

    有时这个问题的答案并不明显。scueak smalltalk在smalltalk中编写了一个转换器和一个字节码解释器,然后将解释器转换为C,并将其转换为机器代码。"吱吱"是在什么中实现的?Simultalk。

    捅一个教授;去听课。


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

    一般来说,C++编译器可以用任何语言编写,包括C++本身(除了第一个编译器版本之外)。


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

    主要的相关性是,它给了你一些可以将语言移植到系统上的想法:C编译器所针对的任何对象都应该(至少在理论上)能够运行Python的C实现,但是如果他们选择使用C++,将会有一组更小的系统来运行它。

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

    如果您为一个新平台编译gcc,那么构建过程将使用现有的编译器(可能是旧的gcc)一次编译源代码,然后使用新编译的编译器第二次编译源代码,然后使用第二次编译的输出第三次编译源代码。如果第二个和第三个版本不相同,则会出现生成错误。如果它们是相同的,那么您就得到了一个很好的指示,表明它是正确编译的。


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


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

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

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


    语句"language x is implemented in language y"是有意义的,并且只有当存在语言x的规范实现并且该实现是用语言y编写时才是正确的。在常用用法中,通常假定第一个或最流行的实现是规范的。

    例如,Perl是少数具有明确规范的语言之一。"Python是用C实现的,"如果CPython被认为是Python的规范实现,并且C++中实现的C++是真正意义上的"cFrand",那就是Bjarne Stroustrup的"C类"的最初实现。


    直接回答:在您所讨论的上下文中的实现仅仅意味着编写,而语言实际上意味着编译器。原来的C++编译器是我在C.写的,没有什么东西(除了知识和时间)阻止你用另一种语言编写C++编译器。

    实现是使软件工作的代码。我们经常讨论函数的实现,如:"函数尚未实现"。如空(){//函数尚未实现抛出();}

    这通常发生在程序的设计阶段,因为调用需要在那里才能写入/调试/概念测试调用代码,但我们还没有开始实现(编写代码以插入函数)