it-swarm.cn

为什么Python)用C而不是C ++编写?

Python的教程 中,可以看到Python的原始实现是在C中实现的;

另一方面,Python实现,用C编写,(...)

我很好奇为什么Python)用C而不是C++编写?

我想知道此决定的原因,答案应以历史参考为依据(而非基于观点)。

79
Piotr Dobrogost

从我所看到的一切来看,这是实践和历史原因的结合。 (大多数)历史原因是CPython 1.0于1989年发布。当时,C刚刚被标准化。 C++几乎是未知的,而且绝对不可移植,因为几乎没有人拥有C++编译器。

尽管C++如今更加广泛且易于使用,但仍需要大量工作才能将CPython重写为与C++兼容的C子集。就其本身而言,这项工作将几乎没有或没有真正的好处。

这有点像 Joel的博客文章 关于重新开始并进行完全重写是软件公司可能犯的最严重错误。我要指出微软从Windows 3.0内核到Windows NT内核的转换,以及苹果从MacOS 9到Mac OS/X的转换来反驳这一点。谁都没有杀死公司-但它们绝对是大型,昂贵,长期的项目。两者都指出了成功的关键:维持both的代码库足够长的时间,以便(大多数)用户可以根据需要随意切换到新的代码库。至少感觉到的好处。

但是,对于像Python这样大的开发团队来说,这种改变要困难得多。甚至从Python= 2到3)的更改都已经花费了大量的工作,并且需要类似的重叠。但是至少在那种情况下,更改有直接的好处,将其重写为C++(本身)不会(至少立即提供)。

莱纳斯·托瓦尔兹(Linus Torvalds)对C++的怒吼引起了人们的注意,所以我也要提一下。我从Guido看到的任何信息都没有表明他对C++有那种强烈的消极情绪。我见过他说过的最糟糕的情况是 教C++通常是一场灾难 -但是他立即继续说这主要是因为老师不/不知道C++。

我还认为,尽管可以通过relative轻松地将许多C代码转换为C++,但要想从C++获得更多实际优势,不仅需要重写很多,还需要但这还需要对大多数参与的开发人员进行大量的再教育。大多数写得很好的C++与写得很好的C在做相同的事情上有本质的不同。not只是将malloc更改为newprintf更改为cout的问题想像力的任何延伸。

122
Jerry Coffin

我认为它之所以用ANSI C89编写最初的原因很简单,因为在那时,由于不同的编译器之间不兼容,因此C++并不是可行的选择。我的意思是直到2005年才提出ABI规范,该规范允许使用一个编译器编译的代码调用使用其他编译器编译的代码?

更有趣的问题是为什么它用C89编写still

并且有一个令人惊讶的答案:因为人们实际上在不存在C++和C99编译器的平台上使用Python !!)当合并了受Forth启发的线程代码解释器优化时,出现了- huge对此进行了讨论,因为该代码(必需)使用了goto,这不是C89的一部分。显然,真正的担心是,某些平台上可能不提供此功能。 Python当前用于。

Unladen Swallow也发生了同样的事情,但是使用LLVM(它是用C++编写的)。非常清楚的是,将Unladen Swallow合并到CPython中的要求是您可以在没有JIT编译器的情况下进行编译,因为存在运行平台的平台,其中Python on 。

当然,如今,CPython不再是唯一的Python实现。现在有PyPy,它是用RPython(Python的静态类型化子集),Java的Jython,C#的IronPython,Pynie编写的)。在NQP和PIR等中。

30
Jörg W Mittag

更好的问题可能是:“为什么不使用Python编写Python?

更重要的是,一旦用C编写了足以用于Python的类和对象的原语,则这些原语可用于编写其余的解释器,因此使用C++不会获得任何收益。

10
Larry Coleman