Python 3.0和语言演变

kgi*_*kis 13 python programming-languages python-3.x

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

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

Jas*_*n L 16

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

(Perl的"有多种方法可以做到这一点"的理念是有代价的.)

有一些例子,比如从基于.NET的语言版本到版本的变化(具有讽刺意味的是,考虑到.NET的整个观点应该是API稳定性和跨平台兼容性).但是,我很难称这些语言"成熟"; 它总是更多的是一种随时随地的设计,即按照我们的方式构建飞机.

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

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

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

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

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


dsi*_*cha 13

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


And*_*Cox 9

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


Dón*_*nal 7

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

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


S.L*_*ott 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以多种形式存在.我不确定,但我认为Digital的Fortran 90 for VAX/VMS与古老的Fortran IV程序并不完全兼容.

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

底线 我认为思考学习是不可避免的.您有三种回答来学习语言的局限性.

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

  2. 增量chagne,直到你被迫发明一种新语言.

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

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

商业企业选择以"新营销"或"保留现有客户"的名义采取懦弱的做法.这就是为什么商业软件企业不是创新的热点.

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


Jos*_*osh 4

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

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