将编程语言一步步翻译成机器码的工具叫做编译器

首先,编程语言的编程语言确实是编程语言。这个编程语言可以是其他编程语言,例如Python的官方实现CPython是C语言写的。例如Python的官方解释器CPython是用C语言写的,JavaScript的主流解释器V8引擎也是C/C++写的。另外,也存在一些编程语言是部分自举的。

首先,编程语言的编程语言确实是编程语言。 该编程语言可以是其他编程语言。 例如,CPython,Python的官方实现,是用C语言编写的。 它甚至可以是它本身,这称为“引导”。

在解释这两种情况之前,我们先解释一下编程语言是如何工作的。 需要明确的一点是,所有的编程语言最终都必须翻译成机器代码(即01二进制代码)来执行。 无论是低级如汇编语言,还是高级如Python,都必须遵循这个规则。 这是因为CPU出厂时指令集(机器码)是直接烧入芯片中的,CPU只识别指令集中指定的机器码。 显然,不同厂家生产的CPU会有不同的指令集(不同的架构),因此要让程序在所有计算机上运行实际上是非常困难的,但这超出了本答案的范围。 。

将编程语言逐步翻译成机器代码的工具称为编译器(编译型语言)或解释器(解释型语言)。 它们的区别在于,前者将整个程序翻译成机器码后再执行,而后者则边翻译边执行,每翻译一位就执行一位。 当然,也有混合的情况。 例如,Java首先将整个程序编译成“字节码(一种中间代码形式)”。 字节码是一种只有Java虚拟机(JVM)才能识别的代码形式,然后Java虚拟机解释并执行字节码,这就是为什么可以产生所谓的“基于JVM的语言”,因为有是一些语言(比如Kotlin/Scala等)先把代码编译成字节码,然后依赖JVM来解释执行。

回到主题。 显然,这些编译器/解释器本身是用编程语言编写的。 要创建一种新的编程语言,您自然必须创建它的编译器/解释器。 至于这些编译器/解释器是如何编写的,又回到了开头提到的两种情况:用其他编程语言编写编译器/解释器,以及使用自己的编译器/解释器。

先解释一下前面的情况,比较简单,容易理解。 例如,Python的官方解释器CPython是用C语言编写的,JavaScript的主流解释器V8引擎也是用C/C++编写的。 把这个往下推,那么C语言编译器是用低级汇编语言编写的,汇编语言编译器是用机器码(二进制)编写的。 至于机器代码,没有编译器。 这个是直接烧进CPU的,自然就没有编译器/解释器的概念了。

然而,真实情况略有不同。 事实上,大多数C/C++的编译器实现并不是用汇编语言编写的,而是用C/C++本身编写的。 这就是上面提到的“引导程序”。 这听起来有点神秘。 语言如何实现自身? 如果你想用C语言写一个C语言编译器,那么首先要有一个C语言编译器来编译写好的C语言。 这不就成了先有鸡还是先有蛋的问题了吗?

情况确实如此。 确实存在一个“原始”编译器,它是用其他语言编写的。 例如,最初的C语言编译器可以用汇编语言编写。 这个“原始”编译器只实现了最基本的C语言语法,然后用这些最基本的语法扩展其他语法,然后使用这个原始编译器进行编译,这样就可以逐步用C语言编写一个完整的C语言编译器。 。

当然,只要有可用的C语言编译器,以后如果有人想“引导”C语言,就不需要使用汇编语言来实现“原始”编译器,而是可以直接使用C语言来实现。编译设备到这里就可以使用了。 这样才能实现真正的“bootstrap”,也就是“用C语言实现C语言”和“用Python实现Python”的套娃问题。

有趣的是,几乎所有主流语言都有通过引导实现的编译器/解释器。 它们要么是官方实现,要么是第三方实现。 例如,Python 的第三方解释器 PyPy 是用 Python 编写的。 对于一些自举的语言也有官方编译器,比如 C# 的官方编译器 Rosyln,Visual Studio 使用 Rosyln。 尽管引导听起来很神奇,但这并不是必需的。 Python的官方解释器CPython不是自举的,这并不妨碍它的流行。

此外,还有一些编程语言是部分引导的。 例如,Java 的 OpenJDK 实现是用 Java 编写的,但 OpenJDK 只生成字节码。 字节码需要依赖Java虚拟机来执行,而最常用的Java虚拟机热点是用C/C++实现的。 这样的例子还有很多,我就不一一列举了。

单片机

树莓派常见问题详见:RaspberryPi板的介绍及疑难杂症

2024-5-12 14:05:03

单片机

机器之心报道:新出8GB内存版本售价75刀

2024-5-12 15:06:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索