Python 3.0和语言演变

时间:2008-11-07 20:23:15

标签: python programming-languages python-3.x

Python 3.0打破了与以前版本的向后兼容性,并将语言分成两个路径(至少暂时)。您是否知道在成熟期间经历过如此重大设计阶段的任何其他语言?

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

12 个答案:

答案 0 :(得分:16)

我能想到的尝试这种中流改变的唯一语言是Perl。当然,Python首先发布Perl,以击败Perl。然而,应该注意的是,Perl的变化比Python更广泛,并且可能更难以解开。

(Perl的“有多种方式可以做到这一点”的理念是有代价的。)

有一些例子,比如从基于.NET的语言版本到版本的变化(具有讽刺意味的是,考虑到.NET的整体观点应该是API稳定性和跨平台兼容性)。但是,我很难称这些语言“成熟”;它总是更像是一个随时随地的设计,建立在飞机上我们飞行的方法。

或者,正如我倾向于想到的那样,大多数语言来自“有机增长”或“工程建设”。 Perl是有机增长的完美典范;它最初是一个花哨的文本处理工具ala awk / sed,并且发展成为一种完整的语言。

另一方面,Python的设计要多得多。花一点时间浏览他们网站上的大量白皮书,看看对语言语法和实现的每一个微小变化的广泛争论。

进行这些深远变化的想法对于编程语言来说有点新鲜,因为编程语言本身已经发生了变化。过去,只有当新处理器出现有新指令集时,编程方法才会发生变化。早期的语言往往是如此低级,并且与汇编语言(例如C)结合或者完全具有动态性(Forth,Lisp),这样的中流变化甚至不会作为考虑因素。

至于变化是否好,我不确定。但是,我倾向于相信指导Python开发的人;到目前为止,语言的变化在很大程度上已经变得更好了。

我认为在未来的日子里,Global Interpreter Lock将比语法更改更加重要。虽然新的多处理器库可能会减轻其中的大部分内容。

答案 1 :(得分:13)

坚持近乎绝对向后兼容的代价太高了。如果你想了解原因,可以花两分钟用C ++编程。

答案 2 :(得分:9)

python团队已经非常努力地将缺乏向后兼容性尽可能地轻松,以至于创建2.6版本的python是为了实现无痛的升级过程而创建的。一旦升级到2.6,就可以运行脚本,将您带到3.0而不会出现问题。

答案 3 :(得分:7)

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

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

答案 4 :(得分: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. 增量chagne,直到你被迫发明一种新语言。

  3. 以可控,周到的方式打破兼容性。

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

    商业企业选择以“新营销”或“保留现有客户”的名义采取懦弱措施。这就是为什么商业软件企业不是创新的热点。

    我认为唯一开源项目可以采用Python社区应对此变化的方式进行创新。

答案 5 :(得分:4)

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

至少他们确实包含了一个升级向导,用于将源代码从一个版本升级到另一个版本(它适用于我们的大多数代码)。

答案 6 :(得分:4)

VB6到VB.net不是最好的例子吗?或者你们都认为它们是两种不同的语言吗?

答案 7 :(得分:2)

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

另外,Lua 4到5非常重要;但语言核心是如此微小,甚至在几页中记录了广泛的变化。

答案 8 :(得分:1)

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

Perl 6甚至在维基百科上也有自己的文章。

答案 9 :(得分:1)

首先,这是关于Python将要经历的变化的video talk。 其次,变化并不好。 第三,我欢迎进化,并认为这是必要的。

答案 10 :(得分:0)

gcc定期更改它几乎每个次要版本都处理C ++的方式。当然,这更多是因为gcc严格遵守规则,而C ++本身也在不断变化。

答案 11 :(得分:0)

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

考虑一下可能使用的库:gtk,Qt等等(它们也有不兼容的版本)。

我认为有时(但不是经常)不支持不兼容以支持进步。