2008-11-07 165 views
13

Python 3.0打破了与以前版本的向后兼容性,并将语言分成两条路径(至少暂时)。你知道任何其他语言在成熟期间经历了这样一个主要设计阶段吗?Python 3.0和语言进化

另外,你是否认为这是编程语言应该如何发展或者付出的代价太高?

回答

4

C#和.NET框架打破了版本1.0和1.1以及1.1和2.0之间的兼容性。运行不同版本的应用程序需要安装多个版本的.NET运行时。

至少他们确实包含升级向导,以便将源代码从一个版本升级到下一个版本(它适用于我们的大部分代码)。

+0

作为提供迁移工具的Python 3000和2.6将具有一些前向兼容性设置。 – 2008-11-07 20:34:29

1

Perl 6现在也正在经历这种类型的分割。 Perl 5程序不会直接在Perl 6上运行,但是会有一个翻译器将代码翻译成可能工作的表单(我认为它不能处理100%的情况)。

Perl 6即使在维基百科上有它自己的文章。

1

首先,这里是一个video talk关于Python将经历的改变。 二,变化不大。 三,我对一个人欢迎进化,并认为这是必要的。

16

我能想到的尝试这种中游变化的唯一语言是Perl。当然,Python通过首先发布将Perl打到特定终点线。然而,应该指出的是,Perl的变化比Python更广泛,并且可能更难解决。

(有用于Perl的价格“有不止一个方式做它”的理念。)

有喜欢从版本基于.NET的语言版本的变化的例子(具有讽刺意味的,考虑到整点的.NET应该是API稳定性和跨平台兼容性)。但是,我几乎不会将这些语言称为“成熟”;它总是更多的是一种设计,即兴建立飞机的方法。或者,正如我倾向于想到的那样,大多数语言来自“有机增长”或“工程建设”。 Perl是有机增长的完美例子;它开始作为一个花哨的文本处理工具ala awk/sed并且成长为一种完整的语言。

另一方面,Python的设计更加复杂。花一点时间在他们网站上的大量白皮书中游荡,看看每次对语言的语法和实现进行的细微变化都会引起广泛的争论。

使编程语言发生这种深远变化的想法有点新,因为编程语言本身已经发生了变化。过去,编程方法学只有在有新的指令集的新处理器出现时才会改变。早期的语言往往或者是低级的,并且与汇编语言(例如C)或者完全动态的(Forth,Lisp)结合,以至于这样的中间变化甚至不会作为考虑。

至于这些变化是否是好的,我不确定。然而,我倾向于相信指导Python发展的人们。到目前为止,语言的变化基本上变得更好了。

我想在未来的日子里,全球解释器锁将证明比语法变化更重要。尽管新的多处理器库可能会缓解大部分问题。

9

python团队非常努力地将缺乏向后兼容性尽可能地无痛化,直到2.6版本的python被创建时,他们的思想就是无痛升级过程。升级到2.6后,您可以运行的脚本将您移至3.0,而不会造成问题。

+1

如果“没有问题”应该限定为“只要你的代码不那么动态,以至于2to3翻译者不能确定它需要改变”。 – 2008-11-09 23:40:08

2

在Lisp世界里它发生过几次。当然,这种语言是如此的动态,以至于演化通常只是废弃标准库的一部分,并使标准成为另一部分。

另外,Lua 4到5是相当显着的;但是语言核心是非常小的,即使是广泛的变化也记录在几页中。

7

值得一提的是,向后兼容性会导致其自身的成本。在某些情况下,如果需要100%的向后兼容性,以理想的方式发展语言几乎是不可能的。 Java的泛型实现(在编译时擦除类型信息以便向后兼容)是一个很好的例子,说明如何实现具有100%向后兼容性的功能会导致次优语言功能。

如此松散地说,它可以归结为一种向后兼容的实施不佳的新功能或者很好实施的新功能。在很多情况下,后者是更好的选择,特别是如果有工具可以自动翻译不兼容的代码。

6

我认为有很多向后兼容性破坏的例子。许多这样做的语言不是很小,就是一路消亡。

许多这样的例子都涉及重命名语言。

Algol 60和Algol 68是如此不同以至于Algol 68上的会议分手成了派系。 Algol 68派,Pascal派和PL/I派。

Wirth的Pascal变成了Modula-3。它与pascal非常相似 - 语法和语义非常相似 - 但有几个新特性。那真的是Pascal-2,没有向后兼容性吗?

Lisp to Scheme事情涉及重命名。

如果您追查旧手册B programming language的扫描,您会看到向C的演变看起来是渐进的 - 并非激进 - 但它确实打破了兼容性。

Fortran以多种形式存在。我并不确定,但我认为Digital Fortran 90 for VAX/VMS与古代Fortran IV程序并不完全兼容。

RPG经历了重大的动荡 - 我认为实际上有两种不兼容的语言称为RPG。

底线我认为思维学习是不可避免的。对于学习语言的局限性,你有三个答案。

  1. 发明一种完全不兼容的新语言。

  2. 直到你被迫发明一种新的语言,才会增加金钱。

  3. 以受控,体贴的方式打破兼容性。

我认为#1和#2都是懦夫的出路。抓旧的比试图保存它容易。保留每一个细微特征(无论多么糟糕)都是很多工作,其中一些很少或没有价值。

商业企业选择以“新营销”或“保留我们现有客户”为怯懦的方式。这就是为什么商业软件企业不是创新的热门原因。

我认为只有开源项目可以支持Python社区应对这种变化的创新方式。

13

坚持靠近绝对向后兼容性的代价太高了。如果你想知道为什么,用C++编程两分钟。

4

不会VB6到VB.net是这个最大的例子吗?或者你们都认为他们是两种不同的语言?

+0

我认为从确定性(COM)对象生命周期到垃圾回收的变化使得任何非平凡的VB应用程序的迁移成为一项艰巨的任务。 IMO,VB6项目实际上已经过时,没有升级途径。 – mackenir 2008-11-07 23:39:05

0

gcc定期更改它如何处理C++几乎每个次要版本。当然,这更多的是海湾合作委员会加强遵守规则的结果,而不是C++本身的变化。

0

新版本的Ruby编程语言也会破坏兼容性。

想起可能使用的库:gtk,Qt等(它们也有不兼容的版本)。

我认为不兼容是有时需要(但不是太常见)来支持进展。