编程语言的自举

部署运行你感兴趣的模型镜像

什么是自举?

就是自己的编译器可以自行编译自己的编译器。
实现方法就是这个编译器的作者用这个语言的一些特性来编写编译器并在该编译器中支持这些自己使用到的特性。
首先,第一个编译器肯定是用别的语言写的(不论是C还是Go还是Lisp还是Python),后面的版本才能谈及自举。
例如Python解释器中的CPython、JPython、PyPy等版本,PyPy就是自举。

自举的意义?

自举过程中和自举之后,核心开发者每天使用自己设计的语言工作(开发自己的编译器),不断的在实践中锻造,利于及早发现设计缺陷和不足之处,并及时解决;自举之前,只能每天花费大量的时间和精力,使用其他编程语言开发和维护自己的编译器,学习积累的都是别的语言的经验和教训,缺少在实践中检验自己设计的语言的机会。如果自己设计的语言自己都不去深度地使用,又上哪里获取第一手的反馈信息呢,又如何改善呢。
所以自举越早对编程语言自身发展完善越有利,最好是在自身定型之前尽早自举。

如果你的语言不是图灵完备,或者缺乏好用的指针等其它高级玩意儿,前者往往无法自举,后者你累死你也很难写出自举的程序来。

什么是图灵完备?

Turing completeness
In computability theory, a system of data-manipulation rules (such as an instruction set, a programming language, or a cellular automaton) is said to beTuring complete or computationally universal if and only if it can be used to simulate any single-taped Turing machine and thus in principle any computer.
在可计算理论里,一个数据操作规则的系统(比如:指令集、编程语言、细胞自动机)被称作图灵完备或者通用计算的,当且仅当它可以被用来模拟单带图灵机。

简单来说,都能完全模拟图灵机的就完备的。

什么是图灵等价 ?

Turing equivalence
In computability theory, there is a closely related concept known as Turing equivalence. Two computers P and Q are called Turing equivalent if P can simulate Q and Q can simulate P. Thus, a Turing-complete system is one that can simulate a Turing machine, but the term is most often used to mean Turing equivalent to a Turing machine.
在可计算理论里,有一个很相关的概念叫图灵等价。当计算机 P 和计算机 Q 是图灵等价的,当P可以模拟Q而且Q也可以模拟P。因此,一个图灵完备的系统可以模拟图灵机,但是这个术语(即图灵等价)常常被用来指与图灵机等价。

然后我们再来看看在可计算理论中,这两个词的正式定义:

Turing completeness:A computational system that can compute every Turing-computable function is called Turing complete (or Turing powerful). Alternatively, such a system is one that can simulate a universal Turing machine.
图灵完备:一个可以计算所有图灵机可计算的计算系统被称为图灵完备的。换句话说就是一个可以模拟通用图灵机的系统。

Turing equivalence:A Turing-complete system is called Turing equivalent if every function it can compute is also Turing computable; i.e., it computes precisely the same class of functions as do Turing machines. Alternatively, a Turing-equivalent system is one that can simulate, and be simulated by, a universal Turing machine. (All known Turing-complete systems are Turing equivalent, which adds support to the Church–Turing thesis.)
图灵等价:一个图灵完备的系统被称为图灵等价的,如果任何它可以计算的函数也是图灵可计算的。也就是它可计算的函数和图灵机可计算的函数是完全相同的。换句话说,就是图灵等价的系统就是能模拟通用图灵机同时也能也被通用图灵机模拟的系统。(所有已知的图灵完备的系统都是图灵等价的,这增加了对丘奇-图灵论题的支持)

综上,图灵等价有两个意思,一个是指两个计算系统在可计算性上计算能力相同;另一个,也是常用的一个就是指一个系统的计算能力与通用图灵机计算能力相同(在可计算性的意义上)。
而图灵完备是指能够模拟通用图灵机的计算系统。而所有已知的图灵完备的系统都是图灵等价的,这也增加了对丘奇-图灵论题的支持。因此,在现有的计算机系统(编程语言、指令集等)上,使用图灵等价和图灵完备是一个意思。

图灵完备语言?

套用上面的定义,如果一个编程语言可以完全模拟图灵机,那么它就是图灵完备的。

大部分编程语言都是图灵完备的,因为他们需要解决各种问题的通用能力,而这正是图灵机所具备的。
确实存在一些语言不是图灵完备的,他们通常是被设计用来解决某些特殊的问题,比如,SQL、正则表达式。

以经验来看,凡带有分支,跳转能力,并且支持数组状数据结构的语言基本上就是图灵完备的。

 

参考文献

https://segmentfault.com/q/1010000000692678/a-1020000000693031
https://www.zhihu.com/question/25017764/answer/47013523
http://www.nowamagic.net/librarys/veda/detail/1856

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,用户问Python语言可以自举吗?我需要先理解什么是“自举”。自举通常指用语言自身来实现其编译器或解释器,比如C语言用C编译器来编译自己。Python的情况呢?Python的解释器主要是用C实现的,比如CPython。那有没有用Python自己写的解释器呢? 用户可能想知道Python是否像某些语言那样能够自我托管,也就是用Python来写Python的实现。这时候需要查资料,有没有这样的项目存在。记得有个PyPy项目,它是用Python写的Python实现,通过RPython翻译成机器码,这样是不是自举的一种形式? 需要确认PyPy是否算自举。PyPy的解释器工具链是用Python写的,但生成的是JIT编译器,可能不完全符合传统自举的定义。传统自举是指编译器能编译自己,而PyPy可能更多是工具链的一部分。 另外,是否有其他项目,比如用Python实现的编译器将Python代码转换为其他形式,比如字节码或者机器码?或者是否有人尝试用Python重写Python的解释器核心部分? 还要考虑用户可能的背景,可能是对编程语言设计感兴趣,或者在学习Python,想知道它的底层实现和自举的可能性。他们可能不太清楚自举的具体定义,需要解释清楚。 需要分清楚解释器和编译器的区别。Python主要是解释型语言,所以自举可能指的是解释器是否用Python自身编写。而CPython是标准实现,用C写的,但PyPy用RPython,而RPython是Python的子集,所以可以说部分自举了。 总结:Python可以实现自举,但主要依赖于PyPy这样的项目。虽然CPython不是自举的,但PyPy是用Python的子集编写的,通过工具链生成解释器,这算是某种程度的自举。需要明确说明两者的区别,以及自举的不同层次和实现方式。Python</think> 语言在严格意义上**尚未完全实现自举**(即用 Python 自身编写其主要的解释器或编译器),但通过一些项目和变通方法,Python 可以实现**部分自举**或**间接自举**。以下是详细分析: --- ### **1. 传统自举的定义** 自举(Bootstrapping)指一门编程语言能**用自身编写其编译器/解释器**,并通过已有版本的编译器生成新版本的自身。例如: - **C 语言**:用 C 编写 C 编译器。 - **Go 语言**:用 Go 重写 Go 编译器。 --- ### **2. Python 的标准实现(CPython)** - **现状**:Python 的官方解释器 **CPython** 主要用 **C 语言**实现,核心代码(如对象系统、内存管理等)依赖 C。 - **非自举原因**:CPython 的解释器本身并非用 Python 编写,因此不满足传统自举要求。 --- ### **3. Python 的“间接自举”尝试** #### **(1) PyPy:用 Python 实现的 Python 解释器** - **技术原理**: - PyPy 是一个用 **RPython**(Restricted Python,Python 的静态子集)编写的 Python 解释器。 - 通过 **RPython 翻译工具链**,将 PyPy 代码转换为 C 或机器码,生成高效的解释器。 - **自举性质**: - **工具链依赖**:PyPy 的构建过程依赖 RPython 工具链(本身用 Python 实现),但最终生成的解释器是机器码。 - **部分自举**:可视为通过 Python 的子集间接实现了 Python 解释器,但严格来说,核心工具链不完全由 Python 自身驱动。 #### **(2) 其他实验性项目** - **Codon**:将 Python 代码编译为本地机器码(类似 LLVM),但依赖外部编译器。 - **Mypyc**:将 Python 类型注解代码编译为 C 扩展,仍依赖 C 工具链。 --- ### **4. 自举的挑战** - **动态特性**:Python 的动态类型、反射等特性使得直接用 Python 实现高效解释器困难。 - **性能问题**:Python 运行速度较慢,若用纯 Python 实现解释器,性能可能无法满足实际需求。 - **工具链依赖**:现有工具(如 PyPy)仍需外部代码生成或编译步骤,未完全闭环。 --- ### **5. 总结** - **严格自举**:Python 目前没有完全用自身实现其主流解释器。 - **间接自举**:通过 PyPy 等项目,用 Python 的子集(RPython)生成解释器,实现了一定程度的自举。 - **实际意义**:PyPy 证明了 Python 在工具链层面的自举潜力,但核心性能仍依赖底层编译技术。 --- ### **示例:PyPy 的工作流程** ```plaintext PyPy 源代码(RPython 编写) ↓ RPython 翻译工具链(用 Python 实现) ↓ 生成机器码解释器(如 pypy3.exe) ↓ 执行 Python 代码(比 CPython 更快) ``` --- 若目标是完全自举,Python 可能需要更简化的核心或静态子集(类似 RPython),但在动态语言中实现这一目标仍面临显著挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值