12

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

另外,您认为这就是编程语言应该发展的方式,还是付出的代价太高了?

4

12 回答 12

16

我能想到的唯一尝试进行这种中游更改的语言是 Perl。当然,Python 是通过首先发布来击败 Perl 的。然而,应该注意的是,Perl 的变化比 Python 的要广泛得多,而且可能更难解开。

(Perl 的“有不止一种方法可以做到”的哲学是有代价的。)

有一些例子,比如基于 .NET 的语言版本之间的变化(讽刺的是,考虑到 .NET 的全部重点应该是 API 稳定性和跨平台兼容性)。但是,我几乎不会将这些语言称为“成熟”。它一直更像是一种在旅途中设计、在飞行时建造飞机的方法。

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

另一方面,Python 的工程化程度更高。花点时间浏览他们网站上的大量白皮书,看看对语言语法和实现的每一个微小变化都会引起广泛的争论。

进行这些影响深远的改变的想法对于编程语言来说有些新奇,因为编程语言本身在本质上已经发生了变化。过去,只有当具有新指令集的新处理器问世时,编程方法才会发生变化。早期的语言要么过于低级并与汇编语言(例如 C)相结合,要么在本质上是完全动态的(Forth、Lisp),以至于这种中游变化甚至都不会被考虑在内。

至于这些变化是否是好的,我不确定。然而,我倾向于相信指导 Python 开发的人。迄今为止,语言的变化在很大程度上是向好的方向发展。

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

于 2008-11-07T20:37:22.427 回答
13

坚持近乎绝对的向后兼容性的代价实在是太高了。如果您想了解原因,请花两分钟用 C++ 编程。

于 2008-11-07T21:25:59.957 回答
9

python 团队一直在努力使缺乏向后兼容性的问题尽可能轻松,以至于创建 2.6 版本的 python 时考虑到了轻松升级过程。升级到 2.6 后,您可以运行一些脚本,这些脚本将毫无问题地转移到 3.0。

于 2008-11-07T20:37:50.100 回答
7

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

松散地说,它可以归结为在一个实现不佳但向后兼容的新特性或一个实现良好但不兼容的新特性之间做出选择。在许多情况下,后者是更好的选择,特别是如果有可以自动翻译不兼容代码的工具。

于 2008-11-07T21:17:04.030 回答
6

我认为有很多向后兼容性破坏的例子。许多这样做的语言要么很小,要么在此过程中消失了。

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

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

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

Lisp to Scheme 事情涉及重命名。

如果您浏览一下旧的B 编程语言手册,您会发现向 C 的演变看起来是一种渐进式的——不是激进的——但它确实破坏了兼容性。

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

RPG 经历了重大变革——我认为实际上有两种不兼容的语言称为 RPG。

底线 我认为思考学习是不可避免的。对于学习一种语言的局限性,你有三种反应。

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

  2. 逐渐改变,直到你被迫发明一种新语言。

  3. 以一种可控的、深思熟虑的方式打破兼容性。

我认为#1和#2都是懦夫的出路。抓住旧的比试图保存它更容易。保留每一个细微差别的功能(无论多么糟糕)都是一项艰巨的工作,其中一些工作几乎没有价值。

商业企业以“新营销”或“保留现有客户”的名义选择懦弱的做法。这就是为什么商业软件企业不是创新的温床。

我认为只有开源项目才能以 Python 社区应对这种变化的方式拥抱创新。

于 2008-11-07T21:24:29.337 回答
4

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

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

于 2008-11-07T20:27:16.953 回答
4

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

于 2008-11-07T23:29:44.590 回答
2

在 Lisp 世界中,这种情况已经发生过几次。当然,语言是如此动态,以至于通常进化只是弃用标准库的一部分并使另一部分成为标准。

此外,Lua 4 到 5 非常重要;但是语言核心是如此之少,以至于即使是广泛的更改也可以在几页中记录下来。

于 2008-11-07T21:09:55.963 回答
1

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

Perl 6甚至在 Wikipedia 上有自己的文章。

于 2008-11-07T20:28:09.120 回答
1

首先,这是一个关于 Python 将经历的变化的视频讨论。第二,变化不好。第三,我欢迎进化并相信这是必要的。

于 2008-11-07T20:30:00.460 回答
0

gcc regularly changes how it handles C++ almost every minor release. Of course, this is more a consequence of gcc tightening how they follow the rules, and less of C++ itself changing.

于 2008-11-08T04:03:43.257 回答
0

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

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

我认为有时(但不是太频繁)不兼容是必要的,以支持进步。

于 2009-01-09T12:38:57.730 回答