在Python的教程中,可以看到Python的原始实现是在C中实现的;
另一方面,用C编写的Python实现(...)
我很好奇为什么Python是用C而不是C ++编写的?
我想知道此决定的原因,答案应以历史参考为依据(而非基于观点)。
在Python的教程中,可以看到Python的原始实现是在C中实现的;
另一方面,用C编写的Python实现(...)
我很好奇为什么Python是用C而不是C ++编写的?
我想知道此决定的原因,答案应以历史参考为依据(而非基于观点)。
Answers:
从我所看到的一切来看,这是实践和历史原因的结合。(大多数)历史原因是CPython 1.0于1989年发布。当时,C刚刚被标准化。C ++几乎是未知的,而且绝对不可移植,因为几乎没有人拥有C ++编译器。
尽管C ++如今更加广泛且易于使用,但仍需要大量工作才能将CPython重写为与C ++兼容的C子集。就其本身而言,这项工作将几乎没有或没有真正的好处。
这有点像乔尔(Joel)的博客文章,关于重新开始并进行完全重写是软件公司可能犯的最严重错误。我要指出微软从Windows 3.0核心到Windows NT核心的转换,以及苹果从MacOS 9到Mac OS / X的转换来反驳。谁都没有杀死公司-但它们绝对是大型,昂贵,长期的项目。两者也都指出了对成功至关重要的事情:将这两个代码库维持足够长的时间,以便(大多数)用户可以(至少从感知上)受益于闲暇时切换到新的代码库。
但是,对于像Python这样大的开发团队来说,这种改变要困难得多。甚至从Python 2到3的更改也花费了很多工作,并且需要类似的重叠。但是,至少在那种情况下,更改有直接的好处,而改写C ++(本身)(至少立即)不会提供。
莱纳斯·托瓦尔兹(Linus Torvalds)对C ++的怒吼引起了人们的注意,所以我也要提一下。我从Guido看到的任何信息都没有表明他对C ++有那种强烈的消极情绪。我见过他说的最糟糕的情况是,教C ++通常是一场灾难 -但他立即继续说,这主要是因为老师不/不知道C ++。
我还认为,尽管可以相对轻松地将许多C代码转换为C ++,但要想从C ++中获得真正的优势,不仅需要进行大量重写,而且还需要对大多数相关开发人员进行大量培训。大多数写得很好的C ++与写得很好的C在做相同的事情上有本质的不同。这不只是一个改变的事情malloc
来new
,并printf
到cout
,通过的任何想象。
我认为它最初是用ANSI C89编写的原因很简单,因为在那时,由于不同的编译器之间不兼容,所以C ++并不是可行的选择。我的意思是直到2005年才提出ABI规范,该规范允许使用一个编译器编译的代码调用使用其他编译器编译的代码?
更加有趣的问题是为什么它仍然使用C89编写。
有一个令人惊讶的答案:因为人们实际上在没有C ++和C99编译器的平台上使用Python!合并了受Forth启发的线程代码解释器优化时,对此进行了广泛的讨论,因为(必须)使用的代码goto
是经过计算的,而不是C89的一部分。显然,人们确实担心该功能可能在当前使用Python的某些平台上不可用。
Unladen Swallow也发生了同样的事情,但使用的是LLVM,它是用C ++编写的。很清楚,将Unladen Swallow合并到CPython中的要求是您可以在没有JIT编译器的情况下进行编译,因为有些平台上运行Python,而C ++编译器不存在。
当然,如今,CPython不再是唯一的Python实现。有PyPy,它是用RPython(Python的静态类型子集),Java的Jython,C#的IronPython,NQP和PIR的Pynie编写的。
一个更好的问题可能是:“为什么Python不是用Python编写的?”
更重要的是,一旦用C编写了足够的Python类和对象原语,就可以将其用于编写其余的解释器,因此使用C ++不会获得任何收益。