我经常听到用语言B写语言A的说法。例如,PHP是用C编写的,C#是用C ++编写的。
有人可以解释一下这是什么意思吗,甚至是正确的吗?这与该语言使用的解释器的编译器有关吗?
另外,选择实施语言所基于的因素有哪些?
s/written/implemented/
而且更清楚。
我经常听到用语言B写语言A的说法。例如,PHP是用C编写的,C#是用C ++编写的。
有人可以解释一下这是什么意思吗,甚至是正确的吗?这与该语言使用的解释器的编译器有关吗?
另外,选择实施语言所基于的因素有哪些?
s/written/implemented/
而且更清楚。
Answers:
大多数编程语言分为两类:解释型和编译型语言。
编译器将编译后的语言翻译成机器代码,即CPU直接逐步执行的语言。另一方面,解释型语言使用中介程序解释器来运行语言代码。解释器本身是另一个程序,通常本身会编译为机器代码。
PHP是一种解释型语言。您需要一个单独的程序来运行 PHP代码,计算机不会直接运行该程序。那个单独的程序,PHP解释器,本身是用C编写的。
C#是一种编译语言,但未编译为机器代码。而是将其编译为专用语言字节码,以在虚拟机上运行。Java是此类设置的另一个示例。您可以将其视为编译和解释之间的混合,其中虚拟机是解释器。用于C#的虚拟机(CLI或Common Language Infrastructure)是用C ++编写的。
其他示例是:
你基本上是对的。如果说Ruby是用C编写的,则意味着语言解释器和核心库的某些部分都用C编写。
因此,Ruby解释器是一个C程序,它将一个文本文件作为输入,对其进行处理,然后调用另一个文本文件(如果是用Ruby编写)中的或已编译的C代码的函数,这些都是所需的基本功能直接访问内存,文件系统等系统资源。还有一些功能要求很高的性能。
因此,您有一种语言的不同部分可以或必须用其他语言编写。没有什么可以阻止您使用C语言编写解释器和使用C ++语言编写库(尽管可能会使某些事情变得更加困难)。您甚至可以执行多个步骤,并使用一种非常擅长文本处理的语言来生成一些中间数据,然后由某些C代码对其进行处理。
决定因素可能与其他复杂应用程序相同。性能是其中之一。编写可以直接访问系统资源的代码的能力。因此,在大多数情况下,它必须是一种编译语言(尽管从理论上讲,您可以使用Python编写Ruby解释器)。如果要使语言在Linux,Win,OS X和其他操作系统上运行,则在不同系统上的可用性很重要。
这仅表示语言A的大多数核心都是用语言B编写的。什么“语言A的核心”可能因语言而异,但是总的来说,您猜对了,这意味着它是编译器或解释器。与几乎每个项目一样,选择一种语言编写另一种语言的决定性因素是开发人员更熟悉哪种语言。
也就是说,“语言A是用语言B编写的”对于大多数现代语言来说都过于简化了。如果以Python为例,虽然参考实现CPython确实是用C编写的,但还有其他语言编写的实现,例如Jython(用Java编写),IronPython(用C#编写),PyPy(用Python编写),CLPython(用Common Lisp编写),无堆栈Python(用C和Python编写)和Unladen Swallow(用C ++编写)。
编程语言是一种定义,并且如Python示例所示,对其编译器,解释器和库可以使用哪种语言进行的写入实际上没有任何限制。当然,也可以自行编写语言,通过称为自举的过程。
从使用编程语言的角度来看,编程语言只是一个程序。它可能是编译器,也可能是解释器,或者可能是某种虚拟机。所有这些都是计算机程序,因此可以用任何语言编写。
因此,如果您想创建自己的PHP版本,则可以从最熟练使用的语言开始。然后,您将编写一个程序,该程序可以读取PHP格式的代码,并且可以执行PHP规范要求的任何程序。因此,您正在使用语言X创建PHP语言。
具有完全不同含义的非常相似的措词是“用语言B编写语言A”,例如“用Java编写C”。
这描述了一种语言在语法上正确的代码,但是使用了另一种语言的结构,习语和约定。在“用Java语言编写C”示例中,此现象的标志是使用整数常量而不是枚举,使用identifiers_with_underscores等声明每个方法之上的所有局部变量。
通常,当某人长时间使用一种语言(尤其是仅使用该一种语言)并且对当前语言是新手(或对编写干净的代码不感兴趣)时,就会发生这种情况。
技术是一个固有的迭代过程。我们从简单的工具开始,然后使用这些工具来制作更好的工具。最初的汇编语言几乎是芯片的标准指令字节码的1:1翻译。8086体系结构及其汇编程序比其他体系结构(例如Z80,RISC等)占主导地位,因此我们开始开发可消化成8086汇编语言的语言,例如FORTRAN,COBOL,Pascal和C。这些语言必须用更原始的语言编写,否则您将陷入鸡与蛋的争论之中。如果第一个C编译器的源代码是用C编写的,那么该C源代码是由什么编译而成的,按照定义,那不是第一个C编译器吗?
基本上,“ C#是用C ++编写的”应理解为是指遵循C#语言规范(即Microsoft的.NET Framework和命令行编译器)的第一个和/或最受欢迎的编译器以及运行时/核心库。程序CSC.exe)用C ++编写。
“语言A用语言B编写”意味着语言A的唯一实现(或唯一被广泛使用的实现)实际上是使用语言B开发的项目,并且是唯一完整的,最新的。 A的规范是实现它的B源代码,因此,如果文档和B程序不一致,则通常认为B程序正确。