【问题标题】:What do you wish was automatic in your favorite programming language? [closed]你希望在你最喜欢的编程语言中是自动的吗? [关闭]
【发布时间】:2010-10-23 11:11:31
【问题描述】:

作为一名程序员,我经常查看我当前使用的语言的一些特性,并自言自语“这对程序员来说很难做到,机器可以自动处理”。

这种特性的一个例子是内存管理,它已经在各种语言中自动运行了一段时间。虽然在大多数情况下手动进行内存管理并不难,但在您的应用程序中完美地完成它而不泄漏内存是非常困难的。自动化再次让这件事变得简单,让我们程序员可以专注于更关键的问题。

您认为编程语言中是否有任何功能应该自动化,因为奖励/难度比率太低(例如并发性)?

这个问题旨在就编程的未来会是什么样子,以及语言可以为我们做些什么让我们专注于更重要的任务进行头脑风暴,所以即使你不认为自动化,也请发表你的愿望是实用的/可行的。好的答案将指出在许多语言中真正难以做到的事情,而不是单一语言的宠物。

【问题讨论】:

    标签: language-agnostic programming-languages language-features theory


    【解决方案1】:

    无论语言可以自动为我做什么,我都会想要一种为自己做的方式。

    【讨论】:

    • 我猜你是在汇编中编码的?如果没有,你应该放弃 Java、Python、C# 或任何你使用的东西,因为它们会自动为你完成 99.99% 的任务。
    • +1,计算机为您做的任何事情都会恰到好处.. 大多数时候。永远不要所有时间。
    • 不,我的大部分工作都使用 C++。但是我有时会使用 PHP、VB 等语言,我认为它们都可以通过允许访问它们必须并且确实实现的较低级别的机制来改进。例如,我一直不明白为什么 GC 语言不能支持 RAII(即析构函数) GC。
    • 您必须明确声明(只读)变量才能在 RAII 方案中使用。 (如果需要,C#s using 会发生这种情况)因为编译器无法检测到哪些对象仅用于函数的生命周期以及哪些对象会被传递。另外:分代 GC 将很快收集最近分配的对象,因此 RAII 和显式 using 块之间的差异并没有那么大。
    • 我正在考虑回应这里表达的观点,但这是一个如此宽泛且毫无意义的笼统答案,我不知道从哪里开始。
    【解决方案2】:

    Concurrent programming/parallelism 是(半)自动化的,而不是必须搞乱线程、回调和同步。能够并行化for循环,例如:

    Parallel.ForEach(fooList, item =>
    {
        item.PerformLongTask();
    }
    

    只是赢了。

    但是,某些语言已经在一定程度上支持此类功能。值得注意的是,F# 具有异步工作流。随着 .NET 4.0 的发布,ParallelExtensions 库将使 C# 和 VB.NET 中的并发大大变得更容易。我相信 Python 也有某种并发库,虽然我个人没有使用过。

    还有一点很酷的是purely functional 语言中的全自动并行性,即无需稍微更改代码并自动使其在多个内核上以接近最佳的方式运行。请注意,这只能使用 purely 函数式语言(例如 Haskell,但不能使用 CAML/F#)来完成。尽管如此,像上面给出的例子这样的结构对于自动化面向对象和其他语言的并行性是非常方便的。

    我认为,随着台式计算机开始从 2 核转向 4 核,然后是 8核心和自动化并发的优势变得更加明显。

    【讨论】:

    • 最新版本的 MATLAB 开始添加并行选项,其中之一或多或少与您给出的示例完全相同:PARFOR,并行 for 循环。它看起来很容易使用,并且可以显着提高速度。
    • @gnovice:是的,MATLAB 拥有这样的东西是有意义的。自己对这个包不熟悉,但很高兴看到它随着潮流而变化。
    • 据我了解,整个“函数式编程适合并行”论点是建立在这样一个概念之上的:一个函数的参数可以按任何顺序(因此是并行的)求值而不影响函数的正确性结果。对于像 C 和 Perl 这样的急切评估语言来说,这当然是正确的。但是(我认为)Haskell 在内部将每个函数都视为一个参数的函数,使用 currying 来构建多参数函数——这并不意味着函数参数评估顺序实际上对 Haskell 和其他惰性求值语言?
    • @j_random_hacker:关于对参数的任意评估,你说的是真的。我完全不熟悉 Haskell 的内部结构,但在某些情况下是否使用惰性求值并不重要。只要所有函数都是纯函数,它们每次都应该返回相同的结果,这意味着这里仍然没有问题。
    • @Noldorin:谢谢。但据我了解,评估顺序不会影响最终值如果评估完成 - 如果急切评估,有些计算会导致无限序列的缩减步骤,而如果懒惰评估则不会.因此,评估非惰性可能会将有限时间的计算变成无限时间的计算! (我认为;也许其他人可以纠正我/使这一点更准确。)
    【解决方案3】:
    exec("Build a system to keep the customer happy, based on requirements.txt");
    

    【讨论】:

    • 很明显,这个问题的精神是询问哪些编程功能可以自动化,以便您可以花更多时间专注于构建该系统以让客户满意......
    • 我希望系统也可以编写 requirements.txt (当然要不断更新它 100 次。)
    • @Lord,当然;但是一点幽默不会伤害任何人,不是吗? :)
    • exec("read $MY_MIND") 怎么样
    【解决方案4】:

    在 Java 中,创建 bean 时不那么冗长。

    例如:

    bean Student
    {
        String name;
        int id;
        type1 property1;
        type2 property2;
    }
    

    这将创建一个 bean 私有字段、默认访问器、toString、hashCode、equals 等。

    【讨论】:

      【解决方案5】:

      在 Java 中,我想要一个使整个类不可变的关键字。

      例如

      public immutable class Xyz {
      }
      

      如果任何不变性条件被破坏,编译器会警告我。

      【讨论】:

      • 您不希望这是一个错误,而不是警告吗?
      • 这可能在许多语言中都很有用,不仅仅是 Java,还可以用来帮助自动化并发。
      • 不变性是一个非常严格的条件。一个对象不能“有点”不可变。 immutable 关键字是用户和类的作者之间的契约的一部分。如果作者承诺不变性,编译器必须强制执行。
      • 是的。如果有任何条件被破坏,我想要一个编译器警告。
      • @ChristianKlauser:这样的关键字究竟会做什么?一些对不可变性的编译器和框架支持会很有用,但主要是在需要“并行”可变和不可变类型的情况下;目前,实现此类类型需要大量重复的样板代码。
      【解决方案6】:

      并发。这是我问这个问题时的主要想法。随着时间的推移,这将变得越来越重要,因为当前的 CPU 已经拥有多达 8 个逻辑核心(4 个核心 + 超线程),而 12 个逻辑核心将在几个月内出现。未来,我们将拥有大量的内核供我们使用,但大多数编程语言只让我们一次使用一个内核变得容易。

      大多数编程语言所公开的线程+同步模型是非常底层的,并且非常接近于 CPU 所做的。对我来说,目前的并发语言支持水平大致相当于 C 中的内存管理支持:没有集成,但有些事情可以委托给操作系统(malloc、free)。

      我希望某种语言能提出一种合适的抽象,使线程+同步模型更容易,或者为我们完全隐藏它(就像自动内存管理使 Java 中好的旧 malloc/free 过时一样)。

      一些函数式语言(例如 Erlang)以提供良好的多线程支持而著称,但进行函数式编程所需的大脑转换并没有真正让整个考验变得更容易。

      【讨论】:

      • 看看 OpenMP 的东西。使用不包括强调线程的不同并行化方法可能会使您的大脑有些弯曲。它改变了我对这个主题的看法。 Erlang 的强大之处在于不必处理同步共享数据,而不是因为它的“多线程”支持。
      • 是的,同步听起来应该是自动的。我的意思是,通常没有人希望他们的数据无论如何都会损坏。自己编写代码来避免它只是乏味的。
      【解决方案7】:

      .Net:

      使用 Replace 等方法操作字符串且不将值(新字符串)返回给变量时的警告,因为如果您不知道字符串是不可变的,则此问题将让你失望。

      【讨论】:

      • 同意。在处理日期时,这个问题也让我很沮丧。也许如果您可以将一个类指定为不可变的(正如 Fortyrunner 建议的 Java,但对 .NET 也很有用),在这种情况下可能会出现警告。
      • 我也会把它添加到 Java 中。
      • 有趣。在语言编译器中实现起来非常困难。但这对于分析器来说将是一个有趣的指标。
      • 我很确定 ReSharper 之类的工具会为您做到这一点,而且可能还有 Visual Studio 中的代码分析工具。
      • 如果我没记错的话,ReSharper 不会给出关于 Replace 方法问题的警告
      【解决方案8】:

      在C++中,变量声明的类型推断,这样我就不用写了

      for (vector<some_longwinded_type>::const_iterator i = v.begin(); i != v.end(); ++i) {
          ...
      }
      

      幸运的是,这是在 C++1x 中以 auto 的形式出现的:

      for (auto i = v.begin(); i != v.end(); ++i) {
          ...
      }
      

      【讨论】:

      • 你想要一个 const 迭代器怎么办?
      • 这也是我的担心,尼尔。我不希望实现正确地进行语义重载。这肯定会成为该语言的一个有趣的补充。
      • 我的问题有点滑稽——我希望它会给你一个基于'v'的常量的迭代器。但是,如果我真的想要一个非 const 对象的 const 迭代器,我将不得不要求它,就像现在一样。我不考虑“自动”的想法,只是因为我可以覆盖它。
      • 他们还为 being 和 end、cbegin 和 cend 的 const_iterator 版本添加了新名称,因此:for(auto i = v.cbegin(); i != v.cend(); ++i) { ... }
      【解决方案9】:

      咖啡。我的意思是这种语言叫做Java——所以它应该可以煮咖啡!我讨厌从编程中起床,走到咖啡壶前,发现营销部门的人喝了最后一杯,却没有再煮一壶。

      【讨论】:

      • LMAO。我同意!它们甚至包括豆类,但不包括糖。
      【解决方案10】:

      持久性,在我看来,我们编写了太多代码来处理持久性,而这确实应该是一个配置问题。

      【讨论】:

      • 持久性应该是一个配置问题,但一些辅助的平台本身也非常复杂。然后我们需要持久化配置自动化来进一步简化事情。
      【解决方案11】:

      在 C++ 中,枚举到字符串。

      在 Ada 中,语言将“枚举类型的图像属性”定义为一个函数,该函数返回与枚举值的文本表示相对应的字符串。

      C++ 没有提供这样干净的工具。需要几行非常神秘的预处理器宏黑魔法才能获得粗略的等价物。

      【讨论】:

      • Java 枚举非常强大并提供了该功能(Enum 的每个成员都有自己的类,因此允许枚举范围的函数可以为每个成员以不同方式实现。真的很酷!)
      • +1。令人惊讶的是,我经常希望使用这个简单的功能。
      • C++(和 C)中的问题是枚举值不必是不同的,并且可以被视为整数期望编译器区分非离散值将涉及较大的开销。
      • 不会有比预期更多的开销(至少在 C++ 中),每个枚举都是不同的类型。
      • 类型不同,值不必不同。
      【解决方案12】:

      对于提供运算符重载的语言,当只定义一个运算时,为对称运算提供自动生成的重载。例如,如果程序员提供了一个等式运算符但没有提供一个不等式运算符,那么该语言可以很容易地生成一个。在 C++ 中,复制构造函数和赋值运算符也可以这样做。

      我认为自动生成对称操作的一侧会很好。当然,我肯定希望能够在需要时明确地说不要那样做。我想提供双方的实现,其中一个是私有的和空的可以完成这项工作。

      【讨论】:

      • FWIW,Haskell 做到了。
      • 是的……总有另一种语言可以做更多的好事。 Eiffel 有许多我非常喜欢的特性,比如重命名和准确指定要继承的操作的能力。最后,我仍然会坚持使用 C++ 来完成我的一般编程任务。
      • 是的,Eiffel 的代码合同也很酷,但在我看来,这只不过是对 asserts 的赞美。然而,代码契约在静态验证的上下文中变得非常有趣。
      【解决方案13】:

      LINQ 所做的一切。 C# 宠坏了我,我现在发现很难用任何其他语言处理集合。在 Python 中,我经常使用列表推导,但它们不如 LINQ 强大。我还没有找到任何其他语言可以像在 C# 中那样轻松地使用集合。

      【讨论】:

        【解决方案14】:

        在 Visual Studio 环境中,我希望“删除未使用的使用”在项目中的所有文件中运行。我发现必须手动打开每个单独的文件并根据文件调用此操作会浪费大量时间。

        【解决方案15】:

        从动态语言的角度来看,我希望看到更好的工具支持。 Steve Yegge 对此有一个great post。例如,在很多情况下,工具可以查看各种代码路径并确定方法或函数是否存在,并提供编译器冒烟测试的等价物。显然,如果您使用大量真正的动态代码,这将不起作用,但事实是,您可能不会,因此如果 Python 会告诉您 .ToLowerCase () 在编译时不是一个有效的函数,而不是等到你点击 else 子句。

        s = "a Mixed Case String"
        if True:
           s = s.lower()
        else:
           s = s.ToLowerCase()
        

        【讨论】:

          【解决方案16】:

          简单:在 C/C++ 中初始化变量,就像 C# 一样。它可以让我在其他人的代码中进行多次调试。

          当你特别不想初始化一个变量时,当然会有一个关键字。

          noinit float myVal; // undefined
          float my2ndVal;     // 0.0f
          

          【讨论】:

            猜你喜欢
            • 2010-10-19
            • 2010-09-05
            • 2010-09-13
            • 2010-09-05
            • 2010-10-08
            • 2011-07-18
            • 2010-09-13
            • 2010-10-25
            相关资源
            最近更新 更多