是否有任何机制可使编程语言更稳定(兼容)以进行更改?


14

有大量的编程语言。他们中的一些人长大后变得非常受欢迎。人们越来越多地使用这种语言。此类语言的创建者(或创始组织/社区)可能会尝试实施更改以使语言更好。但是有时由于向后兼容性而很难进行一些更改,并且这种丑陋的东西已经在该语言中存在多年了,并为许多用户所使用。

在语言设计阶段是否有任何架构原则或步骤可以帮助使其更稳定,以使语言设计人员不会害怕破坏向后兼容性?


2
语言稳定性不包括进行任何重大更改。你能澄清你的问题吗?
西蒙·贝格

对我来说,更稳定意味着发生更少的更改(希望是因为它们是不必要的),这与向后不兼容的更改完全相反。您对哪个感兴趣,或者半独立地询问这两个?

@Simon如何设计一种语言,当您尝试添加新功能时,您不怕放弃可比性
Viacheslav Kondratiuk 2014年

@delnan都可以说。
Viacheslav Kondratiuk 2014年

@viakondratiuk不用担心,语言设计不会改变。更好的问题可能是“如何设计一种语言,以便添加新功能不会引起重大更改?”。
svick 2014年

Answers:


6

语言稳定性不是技术决定。它是语言作者和用户之间的合同。

作者宣传给定的版本或多或少稳定。语言越不稳定,作者可以进行的更改就越多。对这种语言感兴趣的每个用户都可以决定是否要花时间学习新功能或开发可能被下个月的更新破坏的应用程序。

使用不稳定的语言可能会很有趣,因为您对新概念感兴趣,或者希望通过提供反馈来提供帮助。如果您是一家企业,则可能更愿意等待技术变得更稳定之后再投入时间,而您更在乎诸如上市时间和用户体验之类的东西。

因此,这是一个沟通与信任问题。看一下锈语言的发展。他们清楚自己正在更改什么以及保持什么。当他们想要延迟对给定功能的决策时,他们使用所谓的功能门。另一方面,Angular团队对他们的2.0版本发布感到非常愤怒,因为更改幅度超出了预期。

甚至库作者也必须就其api的稳定性进行交流。几乎其他任何人使用的技术都必须在稳定性和完美性之间取得平衡。汽车制造商无法更改踏板的位置,笔记本电脑设计师也不会出于相同原因而发明新的键盘布局:如果您无法决定用户使用产品的方式,就不会对用户有所帮助。


5
  • 请注意,语言在其整个生命过程中都会发生变化,而不管其设计得如何好。与其尝试立即发布世界上最强大的语言,不如先尝试变得有用和可扩展。我可以实际使用的普通语言比任何仅在理论上存在的出色编程语言都有价值。
  • 考虑使语法可扩展的工具,例如宏。宏并不是一件好事,而且功能可能太强大了。某些语言从一开始就具有非常灵活的语法,这减少了对宏的需求。需要考虑以下两种情况:

    • 是否可以引入新的运算符,例如|>不离开语言?我可以为此运算符选择优先级和关联性吗?
    • 内联函数/ lambda /关闭需要经过多少仪式?
    • 我可以使用现有的语言语法来实现foreach循环语法吗?例如,Ruby和Scala可以通过使用lambdas的灵活方法调用语法来做到这一点。
  • 考虑保持语义可扩展的工具。共同的需求是:

    • 运算符重载,其中用户定义的类型可以将其自身的含义分配给现有运算符。这使得语言在大量数学应用中变得更加令人愉悦。
    • 文字重载。我可以使字符串文字成为我自己的字符串类型吗?我可以将当​​前范围内的所有数字文字设为bignums吗?
    • 元对象协议。如果语言没有特质,我可以在当前的对象系统中实现它们吗?我可以执行其他方法解析顺序吗?我可以交换对象的存储方式或方法的调度方式吗?
  • 有回归测试。很多测试。不仅由语言设计师编写,而且由用户编写。当添加功能破坏了这些测试时,请仔细权衡该功能的优点与向后兼容性的优点。
  • 版本您的语言。不仅在您的文档中,而且在源代码本身中。一旦这样做,您的语言中唯一无法更改的部分就是此版本的pragma语法。示例:使用球拍可以指定方言。Perl允许您使用use v5.20,这将启用Perl v5.20的所有向后不兼容的功能。您还可以显式加载单个功能,例如use feature 'state'。相似:Python的from __future__ import division
  • 考虑以较少保留字的方式设计语言。仅仅因为class引入一个类并不意味着我将不能拥有名为的局部变量class。实际上,这导致引入变量或方法声明的关键字,与使用类型名引入声明的类似C的传统相反。另一种替代方法是$variables在Perl和PHP中为您使用sigils 。

盖伊·斯蒂尔(Guy Steele)的演讲“发展一种语言”(1998)(pdf)(youtube)影响了部分答案。


您的一些观点谈论的是使用该语言能够对其进行扩展的程序员,而另一些观点则涉及了该语言的设计师能够对其进行扩展。这两个不是最无关的吗?我认为问题是关于后一种。
svick 2014年

@svick的想法是,语言可以被最终用户扩展,以至于可以在不更改语言本身的情况下进行大量扩展和试验。元对象协议,操作员重载和宏系统是为以后的更改打开大门的一种方法。通过这些门实施的任何操作都不会从根本上破坏语言。不幸的是,这些门本身可能必须在以后重新设计。这就是西蒙答案的前提所在:在保证稳定性之前,进行一些beta测试以了解您的语言是否真正有效。
阿蒙2014年

1

我认为一个非常重要的步骤是提升软件包管理器,同时还可以管理语言本身的版本。

例如,我将SBT用于Scala或Leiningen用于Clojure。他们两个都让我声明了每个项目要使用的语言版本。因此,以最新版本的语言启动绿色项目非常容易,同时如果有的话,可以以更舒适的速度升级现有项目。

当然,根据语言的不同,您可能还需要等待将相关的库移植到所需的版本(例如,在Scala中发生这种情况),但这仍然使事情变得更容易。


结果是,应在可导入的程序包/模块中定义尽可能多的语言
jk。

是的,但不一定。例如,Scala的编译器碰巧是用Scala编写的,但是当您在sbt中设置Scala版本时,它只是作为Jar提取并用于编译源代码。即使它是不透明的二进制文件,它也可以做到。现在,有足够的理由在可导入的程序包中定义尽可能多的语言,但是这些都包含在amon的答案中
Andrea
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.