如何"实现"编程语言?

Inn*_*nno 22 programming-languages

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

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

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

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

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

[编辑]

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

Nor*_*sey 23

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

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

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

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

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

典型的实现包括

  • 直接解释语言语法.这种模式很少见,但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 Guide.

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


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


Jör*_*tag 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++实现的).

  • "如果英语是一种打字语言,那将是一种类型错误." - 爱它 (5认同)
  • 我同意理解编译器和编程语言之间的区别很重要。但是,诸如“Python has a GIL”之类的陈述在非正式上下文中很常见,并且是无害的,前提是目标受众具有技术背景以清楚地理解其含义。我建议语言的精确性是有用的,但仅限于它有助于意义/理解的精确性。 (2认同)

Ale*_*x F 11

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

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

  • 至少在理论上,即使第一个编译器版本可能是:但是(未编译)它必须由人解释,而不是由机器执行. (4认同)
  • 那么,在这种情况下,这个人可以解释为第一个编译器版本:) (4认同)

Dun*_*can 6

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

主要的相关性在于它让您对可能将语言移植到的系统有所了解:C编译器所针对的任何事物(至少在理论上)应该能够运行Python的C实现,但如果它们' d选择使用C++会有一小组可以运行它的系统.

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

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


sla*_*ppy 5

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