代码之家  ›  专栏  ›  技术社区  ›  Imagist

编程语言如何保持向后兼容性并修复设计错误?[关闭]

  •  3
  • Imagist  · 技术社区  · 15 年前

    如你所知,如果你读过我的其他一些问题,我正在写一种编程语言。我最大的担心之一是许多语言在向后兼容性方面存在问题,我希望避免此类问题。一方面,在切换到python 3000的过程中,我看到了python社区中的许多痛苦和痛苦,因为它破坏了向后的兼容性。另一方面,我看到了C++,它开始束缚于C语法,而且从来没有真正恢复过,也就是说,C的语法对于许多C++结构来说是不合适的。

    我的解决方案是允许程序员向文件添加编译器指令,该指令将告诉编译器编译时要使用的语言版本。但我的问题是,其他语言如何处理这个问题?是否有其他解决方案已经尝试过,这些解决方案的成功程度如何?

    6 回复  |  直到 11 年前
        1
  •  7
  •   Norman Ramsey    15 年前

    当某些东西被破坏时,勇敢的语言设计者一定不要害怕破坏向后兼容性。我知道两种很好的方法:

    • 这个 Glasgow Haskell Compiler 典型地 贬低 不需要的功能,然后在两个版本之后放弃支持。

    • 这个 Lua 团队有一个策略,每个主要版本(自1993年以来有5个)都可能破坏向后兼容性,但它们通常提供 相容层 这有助于用户迁移到最新版本。(另外,他们对保持所有可用性都很谨慎;当前版本是5.1,但我仍然维护lua 2.5代码,如果我在lua 2.5中发现了一个bug,他们会修复它。)

        2
  •  6
  •   Spencer Ruport    15 年前

    简单:折旧

    当新的方法或函数可用时,它们并不是简单地消除旧的方法或函数。他们只是不赞成他们。因此,致力于开发新编译器的开发人员知道,在某种程度上,他们将需要使用这些函数的新版本,或者将来他们的程序将无法编译。通过这种方式,它们是“向后兼容的”,但同时强制使用新功能。

        3
  •  2
  •   Jim Ferrans    15 年前

    我认为您使用编译器指令是正确的。不过,最好将其打包为编译器的命令行参数。

    不管怎样,在您的编译器逻辑中,您可以对如下版本进行测试:

    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,因此很容易实现,几乎是欺骗,

        4
  •  1
  •   Simon Hayter Simon Perepelitsa    11 年前

    我将成为一个真正严厉的发人深省的声音,并说:你永远不会有足够的用户让它变得重要。对不起,但是统计数字是对你不利的。

    在不太可能成为问题的情况下,这些是我见过的解决这个问题的策略

    • 不用担心,只需打破向后兼容性

    • 将解释器的旧版本与新版本打包在一起,并使用某种指令或其他类型的元数据进行切换。

    • 使新版本成为旧版本的严格超集。这样,所有旧程序都在新版本的编译器/解释器中编译。

    • 提供将旧样式程序转换为新样式程序的转换器。

    • 将该语言建立在虚拟机上,该虚拟机接受从该语言的任何版本编译而来的字节码。确保有不同版本的设备可以相互“交谈”。

    • 妥协,结果是生气。 每个人 而不是你一半的观众

    • 新版本默认有一个松散的模式和一个“严格”的模式,前者是严格向后兼容的,后者删除了那些选择加入的旧的和坏的特性。

    好消息是,这些策略都没有一个非常好的效果,所以你有机会以一种新颖的新方式进行创造性和混乱。

        5
  •  0
  •   Andrew Siemer    15 年前

    一般来说,您至少要为一个新版本继续支持所有旧特性,但在将来最好是两个版本。然后,这个特性被贬值,在特性从您的语言中删除之前,由您的语言的用户更新它们的应用程序。

        6
  •  0
  •   Breton    15 年前

    我忘记了语言处理向后兼容性的另一种方式:顽固地坚持永不更新语言。请参阅Donald Knuth的Tex以了解此示例。