为什么旧的编程语言会继续被修改?


46

这个问题不是, “为什么人们仍然使用旧的编程语言?” 我非常了解。实际上,我最了解的两种编程语言是C和Scheme,它们都可以追溯到70年代。

最近,我在阅读有关C99和C11与C89(实际上仍然是C语言中最常用的版本,以及我从K&R那里学到的版本)有关的更改。环顾四周,似乎每一种频繁使用的编程语言都会每十年左右获得至少一次新规范。尽管事实上大多数使用Fortran的人仍在使用FORTRAN 77,但甚至Fortran仍在获得新的修订。

将此与排版系统TeX的方法进行对比。1989年,随着TeX 3.0的发布,Donald Knuth宣布TeX具有完整的功能,以后的版本将仅包含错误修复。他甚至声明,在他去世后,“所有剩余的bug都将成为特性”,并且绝对不会进行进一步的更新。其他人则可以免费使用TeX并已这样做,但是对结果系统进行了重命名以表明它们与官方TeX不同。这不是因为Knuth认为TeX是完美的,而是因为他了解稳定,可预测的系统的价值,该系统将在五十年内完成与现在相同的任务。

为什么大多数编程语言设计师不遵循相同的原则?当然,当一种语言是相对较新的语言时,它会经历一段时间的快速变化然后才适应。没有人能真正反对微小的变更,这些变更所做的工作不只是编纂现有的伪标准或纠正意外的读数。但是,当一种语言在十到二十年后似乎仍然需要改进时,为什么不只是分叉它或从头开始,而不是尝试更改已经使用的语言呢?如果某些人真的想在Fortran中进行面向对象的编程,为什么不为此目的创建“ Objective Fortran”,而让Fortran自己呆着呢?

我想可以说,不管将来的版本如何,C89已经是一种标准,没有什么可以阻止人们继续使用它。这是对的,但内涵确实有后果。GCC将以学究模式警告C99中不推荐使用的语法或含义稍有不同的语法,这意味着C89程序员不能完全忽略新标准。因此,C99必须具有一定的优势,足以使使用此语言的每个人都承担此开销。

这是一个真实的问题,而不是引起争论的邀请。显然,我对此有意见,但是目前,我只是想了解为什么这不只是事情的完成方式。我想问题是:

与基于旧语言创建新语言相比,更新语言标准有哪些(真正的或可感知的)优势?


2
许多编译器都可以通过执行旧标准的--std=x开关(例如,GCC的开关)来调用,因此创建新标准并不会导致破坏旧代码的工具。
Blrfl 2012年

2
您如何定义“基于旧语言的新语言”?我认为Fortran 90是基于旧F77的“新语言”。它完全改变了您的编程方式-固定与自由源,动态与静态内存等。您还可以说Fortran 2003是基于F90的“新语言”-它在保持与F90兼容性的同时添加了面向对象的编程。听起来像C ++和C之间的关系
tpg2114

1
我认为这个问题非常重要,我不明白为什么有人要结束这个问题。这是一个非常有趣的现象,可能会有一些解释。几(20?)年前,我在阅读有关Fortran的新功能并问自己:Fortran程序员是否需要这些功能,为什么不简单地切换到C?最近,我对C ++也有类似的考虑:如果C ++开发人员想使用lambda,为什么不改用OCaml(linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php)?为什么他们更喜欢创建一种新语言并仍然将其称为C ++?
乔治

3
@ tpg2114(FORTRAN 77:Fortran 90)和(C:C ++)之间的区别在于,Fortran 90被认为已经取代了FORTRAN 77,人们被告知:“如果您想学习Fortran,请学习Fortran 2003或至少90,因为这是现在的标准。” 没有人会说“如果您想学习C,请学习C ++,因为这是新标准”,因为它们是以两种不同的语言呈现的。正如我所说,内涵确实有后果。

6
因为C永远不死
阿德尔

Answers:


13

我认为语言设计师修改现有语言的动机是在引入创新的同时,确保其目标开发者社区团结在一起并采用新语言:将现有社区迁移到现有语言的新版本比创建新社区更有效。围绕一种新语言。当然,这迫使一些开发人员即使在旧标准上也可以采用新标准:在社区中,如果要将社区保持在一起,有时必须对少数群体施加某些决定。

另外,请考虑一种通用语言,它试图为尽可能多的程序员提供服务,并且通常将其应用到并非为之设计的新领域。因此,当社区将语言转移到新的应用领域时,他们可以选择合并新的想法(甚至来自其他语言),而不是追求设计的简单性和稳定性。在这种情况下,您不能指望在第一次尝试时就将其正确。

这意味着这些年来,语言可能会发生深刻的变化,而最新版本看起来可能与第一个版本大不相同。保留该语言的名称不是出于技术原因,而是因为开发人员社区同意为新语言使用旧名称。因此,编程语言的名称标识其用户的社区,而不是语言本身。

IMO促使许多开发人员认为这是可接受的(甚至是理想的)的动机是,逐渐过渡到稍有不同的语言比过渡到全新的语言要容易得多,而且不会造成混乱,这将花费他们更多的时间和精力来进行掌握。考虑到有许多开发人员拥有一种或两种最喜欢的语言,并且不太热衷于学习新的(根本不同的)语言。即使对于那些喜欢学习新知识的人,学习新的编程语言也总是一项艰巨且耗时的活动。

而且,与使用鲜为人知的语言的很小的社区相比,成为一个较大的社区和丰富的生态系统的一部分可能更可取。因此,当社区决定继续前进时,许多成员决定遵循,以避免孤立。

顺带提一句,我认为在允许演化的同时保持与传统代码的兼容性的论点相当微弱:Java可以调用C代码,Scala可以轻松地与Java代码集成,C#可以与C ++集成。有许多示例表明,您可以轻松地与用另一种语言编写的旧代码交互,而无需与源代码兼容。

注意

从一些答案和评论中,我似乎理解一些读者将这个问题解释为“为什么编程语言需要发展”。

我认为这不是问题的重点,因为很明显,编程语言需要发展以及为什么要发展(新要求,新想法)。问题是,“为什么这种演变必须在编程语言内部发生而不是产生许多新语言?”


在我这里看到的任何答案对我来说都是最有意义的:更新语言可以让您继承(至少是其中一些)现有社区,库等。我记得阅读过Lisp的最大问题是,不兼容的方言使社区难以维护;更新现有语言可能是避免以其他方式分散其他社区的一种方式。

@SunAvatar:据我所知,Lisp有几种方言,但有些方言比其他方言更成功(Common Lisp,Scheme,Racket,Clojure)。每当您开始使用一种新语言时,您都会冒着一个很小的社区围拢它的风险。在Lisp社区中,这似乎很普遍:如果有人有新想法,他们会分支并观察会发生什么。对于其他语言的创造者来说,失去社区不是一个选择。
Giorgio

@SunAvatar:我不认为继承现有库是一个有力的论据。您不需要为此提供源代码兼容性。请参见例如Clojure和Scala如何使用Java代码。
Giorgio

1
语言不会消亡,只有使用它们的程序员会死。
Evan Plaice 2012年

@SunAvatar:也有一些社区尝试遵循不同的政策:名称标识一种语言,如果社区的一部分创建的方言差异太大,他们会使用新的名称以避免混淆。参见例如racket-lang.org/new-name.html
Giorgio

21

向后兼容性是您的答案。一种给定的语言,尤其是像C这样被广泛使用的语言,可能具有数十年不变的运行代码。如果需要维护,那么让编译器在现代系统上运行以进行开发工作时仍然可以将目标平台定位为目标。标准化和语言版本更新有助于使编程实践保持最新,同时为经验丰富的程序员提供熟悉的感觉,他们可能不愿意学习一种完整的“新”语言。

请记住,许多更新的语言更新得很少,就像“固定了新的亮点”。昔日的野兽经常仍潜伏在里面。

就Knuth而言,请记住他是一名学者,TeX仅被证明是正确的,没有更新。


14
Tex =格式科学论文的问题域,没有太大变化。编程语言的领域=寻找新计算机的新用途,范围更广。这是同样的原因,拉美不会增加这么多新词英语
马丁贝克特

我认为向后兼容性不是一个正当的理由:Scala可以轻松地与现有Java代码集成,但它不是Java的超集。因此,我认为一般而言,在源代码级别上,新语言不必与旧语言兼容。拥有定义明确的机制以从新代码中调用旧代码就足够了。
Giorgio

@马丁·贝克特(Martin Beckett):“ Tex的问题域=格式的科学论文文本,变化不大。”:我认为您缺少问题的重点。OP并不是在问编程语言是否应该进行创新(没有人会否认创新是必要的),而是为什么要修改旧语言而不是创建新语言。
Giorgio

系统建立在时间,金钱和专业知识(以特定语言获得的经验)上的投资之上。(在所有三个类别中)新工作的成本比维护工作的成本高得多。一般而言,如果不对语言和平台进行改进,则维护成本将上升,那么新系统的成本将更具吸引力,并且似乎无法在第八次真正将COBOL应用程序真正移植到完全不同的平台上喜欢这么多了。
JustinC

如果不是更新的COBOL语言标准和COBOL工具实现者在此过程中添加了自己的独特功能,那将改进该语言,并提高在更广泛的主流现代平台上运行的能力;该应用程序将无法生存60年。尽管由于后期专业知识的日益匮乏,相对成本肯定会在生命的后期上升,但是与当下出现这种语言时的常规重写相比,总体而言,付出的努力是一笔小钱。
JustinC

5

我认为显而易见的答案是,语言设计和系统体系结构仍在进步,并且足够多的人关心较旧的语言,他们想利用螺栓连接的新技术(多核,更好的线程或内存模型)或纳入语言标准。不管您使用哪种编译器或平台,也都可以采用“一种真正的方式”来做可以依靠的事情(例如XML解析,数据库访问),而不是依赖于某些第三方库可能已安装或未安装(可能不是您要求的版本等)。


因此,如果“足够的人在乎较旧的语言”是原因,您是否可以将您的回答改写为“对现有语言的情感依恋”?我并不是在贬低地说出来,只是想了解您的答案。
Avner Shahar-Kashtan '11年

不,我的意思是这些语言仍在积极使用中,并且那些想要利用最新技术的人都在使用它们。我认为没有人会向ALGOL添加多线程支持,因为(AFAIK)没有积极使用它。但是,FORTRAN和COBOL仍用于开发新系统,因此它们的语言规范会定期更新以合并新技术。
TMN 2012年

1

通用语言所基于的基本概念或目标不会失去相关性;但是,工作环境或硬件的细微变化要求将更新或小的功能添加到语言中。

即使语言可能需要更干净的支持64位类型,或更标准的正则表达式支持或更强大的对新型文件系统的支持,也不会改变用语言表示算法的方式。

在少数情况下,会将“新”功能添加到现有语言中,但是在许多情况下,这些更改简化了人们已经在努力的工作。(请参阅使用高级函数而不是函数指针和函子的C ++。)


1
您在第二段中描述的更改是完全没有异议的(这意味着我不仅表示不反对,而且没有人可以认真反对)。至于lambda,我无法评论它们在C ++中的用处,但是如果改变算法的表达方式,为什么还要麻烦添加它们呢?

哦,它们非常有用。不要误会我的意思。它们是C ++(IMO)中最重要的添加。我想我在那里的意思不清楚。通常选择C ++具有直接访问内存,确定性性能和高优化潜力的能力。最近的新增功能并没有改变。我们围绕您选择C ++的原因简化了许多其他编程任务,但是出于相同的原因,C ++仍然有效且有用。Scheme会定期更新,但是代码即数据和lispy-ness不会更改,因此出于与20年前相同的原因选择方案。
2012年

“至于lambda,我无法评论它们在C ++中的用处,但是如果不改变表达算法的方式,为什么还要麻烦添加它们呢?”:我走得更远:为什么将它们添加到C ++中,而不是切换到某种语言。从一开始就拥有它们?
乔治

2
@Giorgio可以控制语言的缓存和抽象功能。如果没有现有的语言同时提供这两种语言,那么您必须在不牺牲一种语言的情况下切换语言。您必须修改一种语言或创建一种新的语言。
mike30 2012年

@mike:“缓存功能”是什么意思?
乔治

-2

这有点像对口头语言的考虑。

在过去,那里的词现在不像现在那样被频繁使用(或用于不同的含义)。

例如。不错:在(很旧的)英语中,英语与我们今天使用的语言几乎具有相反的含义,尤其是在用来形容某人的性格时。

不好:不久前,坏只有一个意思,现在它的意思是“超级惊人”(以一种狂喜的方式使用(我可能已经错过了狂喜的拼写)!)

另一个新的发展是用于文字的手机“文字说话”。

我个人不明白为什么编程语言不会以类似的方式发展,单词和功能具有特定的含义/作用,并且需要进行更改以结合新的思想和新的方法论。

我认识的人会说多种不同的语言,他们经常建议在第三或第四之后,学习一种新语言会变得更加容易。

我不知道是否有具有类似经验的程序员,如果有,我也不会感到惊讶。

我知道我在用JAVA编程时感到很幸福(就像我在用英语说的时候感到幸福一样),这并不意味着我不能用“美国英语”或“澳大利亚英语”进行交流,尽管有些“陷阱”需要注意。就像从Java到PHP再到Perl一样,其构造是相似的,但是很少有陷阱可以吸引我,使我不敢相信。

这与从英语到法语,或从Java到SAS有所不同。这些是如此的不同,要花很长时间才能精通它们。

无论如何,这是我的看法。


我认为您正在考虑“小事”。
uliwitness '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.