如你所知,如果你已经阅读了我的其他一些问题,我正在编写一种编程语言。我最关心的一个问题是许多语言都存在向后兼容性问题,我希望避免这些问题。一方面,我在Python社区中看到了很多关于切换到Python 3000的痛苦和痛苦,因为它打破了向后兼容性。另一方面,我见过C ++,它从束缚到C语法开始,从未真正恢复过;即C的语法不适合许多C ++构造。
我的解决方案是允许程序员向文件添加编译器指令,该指令将告诉编译器在编译时使用哪种语言版本。但我的问题是,其他语言如何处理这个问题?是否有其他解决方案已经尝试过,这些解决方案有多成功?
答案 0 :(得分:7)
当某些事情被打破时,勇敢的语言设计者不能害怕破坏向后兼容性。我知道有两种好方法可以做到:
Glasgow Haskell Compiler通常弃用不需要的功能,然后在两个版本之后删除支持。
Lua团队制定了一项政策,即每个主要版本(自1993年以来已有5个版本)可能会破坏向后兼容性,但它们通常会提供帮助用户的兼容层迁移到最新版本。 (另外他们一丝不苟地保持一切可用;当前版本是5.1但我仍然保留了Lua 2.5代码,如果我发现Lua 2.5中的错误,他们会解决它。)
答案 1 :(得分:6)
简单:弃用
当新方法或功能可用时,它们不会简单地消除旧方法或功能。他们只是弃用了它们。因此,致力于新编译器的开发人员知道,在某些时候他们将需要使用这些函数的新版本,或者将来他们的程序将无法编译。以这种方式,它们是“向后兼容的”,但同时强制使用新功能。
答案 2 :(得分:2)
我认为你使用编译器指令走在正确的轨道上。尽管如此,将它作为命令行参数打包可能会更好。
无论如何,在您的编译器逻辑中,您可以测试类似这样的版本:
if ( language_major_version > 2 ) // 2.00.00 and above
... normal processing ...
else
... emit compatibility/deprecation error ...
VoiceXML是一种用于指定语音对话框的基于XML的语言,是将指令放在源代码中的一个示例:
<?xml version="1.0"?>
<vxml version="2.1">
...
</vxml>
由于语法始终是格式良好的XML,因此这很容易实现,几乎是作弊,
答案 3 :(得分:1)
我将成为一个非常严厉的发人深省的声音并说:你永远不会有足够的用户来解决它。对不起,但统计数据不利于您。
如果它确实成为一个问题,这些是我见过用于此问题的策略
不要担心它,只是破坏向后兼容性
使用新版本打包旧版本的解释器,并使用某些指令或其他类型的元数据进行切换
使新版本成为旧版本的严格超集。这样,所有旧程序都在新版本的编译器/解释器中编译
提供转换器,将旧式程序转换为新式程序。
将语言基于接受从任何语言版本编译的字节码的虚拟机。确保有不同版本的设施与彼此“交谈”。
妥协并最终惹恼所有人而不只是一半的观众
默认情况下,新版本具有松散模式,“严格”模式,前者严格向后兼容,后者为选择加入的用户删除旧的和已破坏的功能。
好消息是,这些策略都不能很好地运作,所以你有机会以一种全新的方式发挥创意并陷入困境。
答案 4 :(得分:0)
一般来说,您继续支持至少一个新版本的所有旧功能,但最好是将来的两个版本。然后,该功能将被折旧,并且在您的语言被删除之前,您的语言用户需要更新其应用程序。
答案 5 :(得分:0)
我忘记了语言处理向后兼容性的另一种方式:固执地坚持不更新语言。有关此示例,请参阅Donald Knuth的TEX。