Language agnostic 您是否曾限制自己使用语言功能的子集?

Language agnostic 您是否曾限制自己使用语言功能的子集?,language-agnostic,language-features,Language Agnostic,Language Features,您是否曾经限制自己使用语言功能的子集,更重要的是,为什么 我很想知道是谁选择只使用某些语言功能,而不使用其他功能,以便在内存使用、执行速度或简单的可读性和可维护性等领域赢得巨大的成功。通过这样做,它是否产生了预期的结果,或者可能只是妨碍了软件生产的其他方面。关于这个主题,有没有值得分享的警示故事或疯狂的成功故事?当你编写c/c++代码在linux和windows上都能工作时,你肯定会这样做,所以你只能使用ANSI c/c++, 所以我想多平台支持是原因之一 其他原因-如果你想最大限度地兼容广泛使

您是否曾经限制自己使用语言功能的子集,更重要的是,为什么


我很想知道是谁选择只使用某些语言功能,而不使用其他功能,以便在内存使用、执行速度或简单的可读性和可维护性等领域赢得巨大的成功。通过这样做,它是否产生了预期的结果,或者可能只是妨碍了软件生产的其他方面。关于这个主题,有没有值得分享的警示故事或疯狂的成功故事?

当你编写c/c++代码在linux和windows上都能工作时,你肯定会这样做,所以你只能使用ANSI c/c++, 所以我想多平台支持是原因之一

其他原因-如果你想最大限度地兼容广泛使用的软件/操作系统(如winXP、IE 6.0),那么你就把软件定位于那些应用程序/操作系统(如dot net framework 2.0而不是3.5,IE 6而不是IE.8),以便更好地兼容旧的用途

老硬件兼容性/老图形设备兼容性等等也是如此。

道格拉斯·克罗克福德的书就是一个很好的例子。他列出了JavaScript中应该避免的“特性”,并提供了使用该语言“好的部分”的替代方案

一些不好的部分是:

  • 评估
    更慢,更难阅读,危险的不安全感

  • =
    与不同类型的操作数混淆且不明确


  • 不可预测的结果


我避免
GOTO
,这在某些圈子里被认为是有害的。

一种情况是,当你编写一种新语言的编译器时。你可以:

  • 使用另一种语言为新语言的子集编写简单的编译器
  • 使用新语言的子集为其自身的完整版本编写编译器

    • 不使用共同开发人员不了解的功能是有道理的。在C++中,大多数语言都是这样的,但是C语言也有有趣的构造。像Delphi这样的旧语言可能仍然包含goto。我倾向于避免使用所有模板和XML,因为我发现它们是不可能干燥的

      尽管PHP最初是一种模板语言,但它已经发展成为一种成熟的OO编程语言。出于这个原因,有人说它不再适合用作模板语言

      但实际上,这只是一个纪律问题。在创建HTML/PHP模板时,我将自己限制在尽可能最简单的子集:条件和循环,没有任何业务逻辑。没有对象实例化。没有函数定义。更复杂的逻辑被分离到其他文件中。

      是的,一直如此

      因为我使用Perl,而且大多数人都认为最好不要使用我们的许多语言功能,除非您确实需要并且您知道自己在做什么。例如,支持符号引用,但不应使用它们
      goto
      存在,但您不应该使用它。您可以将变量标签作为不同类型重复使用,例如,
      $var
      @var
      %var
      ,但也不应该这样做。您不能
      使用strict
      将未声明的变量自动变为符号表条目,但您确实不应该这样做

      主要原因是,如果不小心使用,许多这样的特性会产生明显和深奥的后果,可能会在程序中引入微妙和难以调试的错误。Perl使许多事情成为可能,使用某些不寻常的语言特性来节省几分钟的编码时间是很有吸引力的。当然,有些时候,深奥的特性非常方便,在Perl中可以利用它们,而不是完全不存在,这是非常好的。但这需要经验才能知道什么时候节约是值得的,因为绝大多数时间你只是在为自己和其他人制造一场维护噩梦

      我喜欢说TMTOWTDI,BMOTWAW;有不止一种方法可以做到这一点,但大多数方法都是错误的


      创建大型、可读、可维护的Perl应用程序是完全可能的。这样做的一个很好的部分是将自己局限于语言功能的子集。

      显然,如果功能不受欢迎,最好避免使用它们,即使它们在技术上是可用的


      而且,若您要分发解释脚本以在多种机器上运行,我通常会避免使用全新的功能,这样我就不会强迫人们升级PHP/Perl/任何能够运行它的东西。

      大多数人都会下意识地使用他们所选择的语言的非正式子集进行编程,这是他们所熟悉的。例如,我在呈现一个需要重复的C++向量时的第一反应是达到一个for循环,而不是写一个谓词,使用一个标准库算法。可能是我的失误,但如果我真的需要的话,至少我知道算法在那里


      我记得最后一次简洁地用子集语言编写代码是在80年代,当时我的大多数目标平台都支持FORTRAN 77,但有一个平台不支持FORTRAN 77,所以我不得不用FORTRAN 77/FORTRAN IV混合语言编写。这是一种痛苦——近年来情况有了很大改善,这主要归功于自由和开放源码软件的发展。

      在许多情况下,你是无意识地这样做的——你使用你知道的子集,而忽略了未知的功能。在其他情况下,有不止一种方法可以做到这一点,而且您选择始终坚持一种方法,因为当程序使用较少的语言功能时,它会使程序更易于阅读。(特别是当“另一种方式”没有特别的优势时——例如,它只是为了取悦来自不同语言的人)

      很多时候。我的主要原因是跨平台兼容性。示例:

      一,