“语言A用语言B书写”是什么意思?


31

我经常听到用语言B写语言A的说法。例如,PHP是用C编写的,C#是用C ++编写的。

有人可以解释一下这是什么意思吗,甚至是正确的吗?这与该语言使用的解释器的编译器有关吗?

另外,选择实施语言所基于的因素有哪些?


19
严格来说,“ PHP已经用C编写”是错误的。一种语言本身就是一种正式的定义,因此它不是用另一种编程语言编写的(而是用英语编写的)。只有编译器,解释器和/或库可以用C,C ++或任何其他语言编写。实际上,对于许多语言,只有一个主要的编译器或解释器,并且没有在语言定义和实现之间进行区分。
user281377

有趣的是BCPL主要是用BCPL编写的
OldCurmudgeon 2012年

7
PHP“本身”不是正式定义。这是一个C程序。
卡兹(Kaz)2012年

8
s/written/implemented/而且更清楚。
TMN 2012年

2
@ugoren有很多用汇编语言编写的C编译器。但是,本世纪不是那么多。
罗斯·帕特森

Answers:


30

大多数编程语言分为两类:解释型和编译型语言。

编译将编译后的语言翻译成机器代码,即CPU直接逐步执行的语言。另一方面,解释型语言使用中介程序解释器来运行语言代码。解释器本身是另一个程序,通常本身会编译为机器代码。

PHP是一种解释型语言。您需要一个单独的程序来运行 PHP代码,计算机不会直接运行该程序。那个单独的程序,PHP解释器,本身是用C编写的。

C#是一种编译语言,但未编译为机器代码。而是将其编译为专用语言字节码,以在虚拟机上运行。Java是此类设置的另一个示例。您可以将其视为编译和解释之间的混合,其中虚拟机是解释器。用于C#的虚拟机(CLI或Common Language Infrastructure)是用C ++编写的。

其他示例是:

  • Python:Python解释器将Python代码编译为Python字节码,然后解释该字节码。解释器本身是用C编写的。此后添加了新的实现,包括一个编译python以在用于C#的相同CLI上运行IronPython的实现,以及一个在Java虚拟机Jython上运行的实现。为了完成这一过程,有一个Python版本(用Python的子集PyPy编写)。
  • Ruby:Ruby最初是一种纯解释性语言,但是最新版本切换为使用字节码。对于Ruby,也有一个名为IronRuby的项目可以编译到CLI ,而对于Java VM的项目是JRuby

抱歉,虚拟机与解释器有何不同?我看不到使用一个是编译的中间点。您是说字节码是一半编译的吗?
菲利普(Philip)

1
@Philip:字节码不是机器码;因此,除了向CPU提供直接指令外,您还需要一个解释器来获取字节码并对其进行解释,然后将其转换为机器指令。优点是虚拟机更易于移植到其他体系结构,并且您可以应用诸如JIT编译之类的技巧。
马丁·彼得

有人认为“编译”一词已被稀释用于营销目的吗?
菲利普(Philip)

2
哇!我收回之前说过的话。我在那条错误的路上走了一会儿。我以为“编译”意味着变成机器代码,而只有机器代码,这实际上是不正确的。这只是将代码转换为其他代码的术语。可以是机器代码,字节码或您想要的任何语言。而且,事实证明那里有PHP编译器,因此您只能说它是“典型地”解释的。
菲利普(Philip)

也是一个很好的来源:youtube.com/watch?v=e4ax90XmUBc
亚当

34

你基本上是对的。如果说Ruby是用C编写的,则意味着语言解释器和核心库的某些部分都用C编写。

因此,Ruby解释器是一个C程序,它将一个文本文件作为输入,对其进行处理,然后调用另一个文本文件(如果是用Ruby编写)中的或已编译的C代码的函数,这些都是所需的基本功能直接访问内存,文件系统等系统资源。还有一些功能要求很高的性能。

因此,您有一种语言的不同部分可以或必须用其他语言编写。没有什么可以阻止您使用C语言编写解释器和使用C ++语言编写库(尽管可能会使某些事情变得更加困难)。您甚至可以执行多个步骤,并使用一种非常擅长文本处理的语言来生成一些中间数据,然后由某些C代码对其进行处理。

决定因素可能与其他复杂应用程序相同。性能是其中之一。编写可以直接访问系统资源的代码的能力。因此,在大多数情况下,它必须是一种编译语言(尽管从理论上讲,您可以使用Python编写Ruby解释器)。如果要使语言在Linux,Win,OS X和其他操作系统上运行,则在不同系统上的可用性很重要。


有人知道我为什么一发布就看到三个投票答案吗?
thorstenmüller2012年

1
我现在看到四个,但我不确定自己要问什么?投票速度是否太快?如果是这样,那么,好多人都在关注这个问题(三个几乎同时回答),并且您的回答很好。
yannis 2012年

嗯是的 也许我已经保存了它,然后进行了编辑,再次保存并忘记了第一次保存(我变老了)。对我来说,我发布的那一刻好像获得了前三票。
thorstenmüller2012年

@thorstenmüller+1表示“没有什么可以阻止您使用C语言编写解释器和使用C ++语言编写的库”,我正要问您这个问题。有没有著名的实现方式,其中解释器/编译器使用一种语言,而核心库使用另一种语言?
Songo 2012年

@thorstenmüller我曾经偶尔发生过几次。如果您发布时有几个人正在查看问题,则在您发送提示后一两秒钟内会出现一条小消息,说“新答案已发布”,因此他们可以略过整个答案并在10秒内投票您的发布。此外,发布答案后5分钟内所做的修改不会显示在修改历史记录中,这可能会进一步造成您的困惑。
Izkata 2012年

10

这仅表示语言A的大多数核心都是用语言B编写的。什么“语言A的核心”可能因语言而异,但是总的来说,您猜对了,这意味着它是编译器或解释器。与几乎每个项目一样,选择一种语言编写另一种语言的决定性因素是开发人员更熟悉哪种语言。

也就是说,“语言A是用语言B编写的”对于大多数现代语言来说都过于简化了。如果以Python为例,虽然参考实现CPython确实是用C编写的,但还有其他语言编写的实现,例如Jython(用Java编写),IronPython(用C#编写),PyPy(用Python编写),CLPython(用Common Lisp编写),无堆栈Python(用C和Python编写)和Unladen Swallow(用C ++编写)。

编程语言是一种定义,并且如Python示例所示,对其编译器,解释器和库可以使用哪种语言进行的写入实际上没有任何限制。当然,也可以自行编写语言,通过称为自举的过程。


2
我不会将Psyco称为另一种实现,因为它作为CPython的扩展运行。
马丁·皮耶特

@MartijnPieters据其网站称,这也是一个失败的项目。已移除。
yannis 2012年

@YannisRizos吞下的燕子不会吗?
Andres F.

1
@Songo:除此之外,这string.lower(s)是一个将其委托给的python函数return s.lower(),这是正确的。在CPython的3.3字符串操作情况是用C实现的
的Martijn Pieters的


3

从使用编程语言的角度来看,编程语言只是一个程序。它可能是编译器,也可能是解释器,或者可能是某种虚拟机。所有这些都是计算机程序,因此可以用任何语言编写。

因此,如果您想创建自己的PHP版本,则可以从最熟练使用的语言开始。然后,您将编写一个程序,该程序可以读取PHP格式的代码,并且可以执行PHP规范要求的任何程序。因此,您正在使用语言X创建PHP语言。


有趣的一点。所以基本上,如果我在PHP中有一个内置函数explode接受a String并返回an Array,则其实现(即将对字符串进行操作以生成数组的代码)用C编写,对吗?
Songo 2012年

@Songo:对。同样,PHP只是一个程序,与Word或Apache或Notepad或vi或emacs没什么不同。它读入数据并根据语言规范对其进行解析,然后执行该语言规范要求执行的所有操作。
Bryan Oakley

这个答案严重地混淆了语言和实现。
罗素·博罗戈夫

我认为这是最简单,最直接的答案,我看不出它如何融合任何东西。它甚至暗示可能有不止一种PHP实现。实际上,有很多东西,原始的PHP,还有Facebook的东西,还有可能还有其他东西。
沃伦·P

@RussellBorogove:您是否认为“从使用编程语言的角度”有助于澄清答案?记住,我们正在面对一个绝对是初学者的问题,因此,IMO牺牲一点精度来说明这一点是公平的。
Bryan Oakley

3

具有完全不同含义的非常相似的措词是“用语言B编写语言A”,例如“用Java编写C”。

这描述了一种语言在语法上正确的代码,但是使用了另一种语言的结构,习语和约定。在“用Java语言编写C”示例中,此现象的标志是使用整数常量而不是枚举,使用identifiers_with_underscores等声明每个方法之上的所有局部变量。

通常,当某人长时间使用一种语言(尤其是使用该一种语言)并且对当前语言是新手(或对编写干净的代码不感兴趣)时,就会发生这种情况。


“ CPython是用C编写的”绝对不意味着“该用户使用Python编写的就像是C”。这意味着CPython(在Windows上为Python.exe,在Unix上为/ usr / bin / python)是用C编写的。–
Warren P

@Warren P:可以,但是这些短语非常相似,因此不熟悉任何一个的人都可以在这里轻松地寻求解释。
Michael Borgwardt 2012年

3

技术是一个固有的迭代过程。我们从简单的工具开始,然后使用这些工具来制作更好的工具。最初的汇编语言几乎是芯片的标准指令字节码的1:1翻译。8086体系结构及其汇编程序比其他体系结构(例如Z80,RISC等)占主导地位,因此我们开始开发可消化成8086汇编语言的语言,例如FORTRAN,COBOL,Pascal和C。这些语言必须用更原始的语言编写,否则您将陷入鸡与蛋的争论之中。如果第一个C编译器的源代码是用C编写的,那么该C源代码是由什么编译而成的,按照定义,那不是第一个C编译器吗?

基本上,“ C#是用C ++编写的”应理解为是指遵循C#语言规范(即Microsoft的.NET Framework和命令行编译器)的第一个和/或最受欢迎的编译器以及运行时/核心库。程序CSC.exe)用C ++编写。


0

“语言A用语言B编写”意味着语言A的唯一实现(或唯一被广泛使用的实现)实际上是使用语言B开发的项目,并且是唯一完整的,最新的。 A的规范是实现它的B源代码,因此,如果文档和B程序不一致,则通常认为B程序正确。


没有C ++的权威实现。对于C ++,规范是正确的,规范中未定义的行为可能会在您的实现中做任何事情。所以不,这是不正确的。
沃伦·P

我看不到先前的评论与我的答案有什么关系。我没有对所有语言做出任何通用量化的说明,因此C ++反例不适用。除非“ B”是“英语”,否则以“ A用B编写”的形式的语句没有意义,其中A是“ C ++”。
卡兹(Kaz)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.