【问题标题】:How fast should an interpreted language be today?今天的解释语言应该有多快?
【发布时间】:2010-05-18 03:09:40
【问题描述】:
  • 解释性编程语言的(主要/唯一可行的)实现速度是当今的标准吗?

  • 速度和抽象之间的最佳平衡是什么?

  • 脚本语言是否应该完全忽略所有关于性能的想法,只遵循快速开发、可读性等概念?

我问这个是因为我目前正在设计一些实验性语言和解释器

【问题讨论】:

  • 虽然这个问题可能有点主观(我认为它比一开始可能意识到的更客观),但我相信它很有价值,我会投票重新开放。
  • 在具有“快速”运行时的语言和具有分析器的语言之间进行选择,我每次都会选择后者。不管语言有多快,你仍然需要找出你的应用程序的瓶颈是什么。如果你有一个好的分析器,你可以解决一个较慢的运行时。

标签: performance interpreter scripting-language


【解决方案1】:

速度很重要,是的,但通常在执行速度超过 I/O 成本的情况下使用脚本语言,所以这不是最终目的。更重要的是语言结构和特征。先处理这些,然后处理执行速度。

也就是说,我认为最终如果你想构建一种新的通用语言,你会走他们大多数人都会走的路,即在执行期间预编译成字节码和 JIT 编译.

【讨论】:

  • 另一方面,我们应该安装或要求用户安装多少运行时环境?
  • @Gilbert Le Blanc:嗯,这属于“我们真的需要另一种语言吗?”伞,我同意在构建新语言之前应该总是问这个问题。提问者提到了实验性语言,所以我假设他看到了一个需要填补的利基市场,或者可能只是想将这门行业作为 CS 教育的一部分来学习。
  • 不要离题太远,但多种语言可以使用一个通用的运行时环境。回到主题,生成字节码的另一种方法是为现有语言生成源代码。是的,使用新语言进行开发的人员需要执行额外的步骤。但是,如果该语言是实验性的,那么就需要在更快的语言开发与更快的开发时间之间进行权衡。
  • @Gilbert Le Blanc:两者都很好。 .NET 框架是针对同一运行时的多种语言的示例。是的,翻译而不是编译也是一种选择。
【解决方案2】:

我不明白为什么现在有人会写解释器。有两个出色的虚拟机,CLR (+DLR) 和 JVM。为任一运行时编写编译器都很简单,然后您就可以获得与大量现有代码互操作性的优势,加上出色的标准库,以及 JIT 编译器,这将使您的语言的速度在许多方面都不是问题案例(肯定比任何解释器都快。)

如果您想开发一种语言,而不仅仅是开发人员的好奇心,那么这绝对是这些天要走的路。

【讨论】:

  • 这取决于所讨论的解释语言正在与哪些其他语言进行互操作。我不会要求 C++ 用户在 JNI 中与我的语言进行互操作。
  • 我写过编译器,我不认为 any 后端是“微不足道的”,即使是 JVM。我当然不相信你会免费获得互操作。 (我也不相信 .NET 或 JVM 标准库“很棒”,但那是另一回事了!)例如,我正在研究一种需要尾调用优化的(“纯”)函数式语言;如何以 JVM 为目标并允许程序员使用现有的 Java 库(其中变异是核心概念)?任何地方都有困难的问题。 JVM(例如)工作的好坏似乎与您的语言与 Java 的接近程度直接相关。
  • @Ken - 都很好,但我想说 Java 和 .NET 中的标准库非常出色,比我所知道的其他任何东西都好 - 关于可变性的限制你提到。既然 F# 是一种完全受支持的 .NET 语言,那么 CLR 中对不可变类型的支持就更多了。当然 IronPython 在 CLR 上实现了一个更快(取决于基准)的 Python,我不会说它与 C# 非常相似。我似乎在一个周末就在 CLR 上完成了玩具语言的实现,但当然完整的语言需要更多的工作。
【解决方案3】:

开发人员需要的速度。

没有规则,只需要喂。

【讨论】:

    【解决方案4】:

    这样的问题没有唯一的答案。没有一个答案可以适用于所有可能的目的和受众。

    可能要考虑的最大的一个因素是您是否打算让该语言主要是独立的,还是与其他语言结合使用。如果您编写类似 Lua 的东西主要(或专门)用于与其他东西(在 Lua 的情况下为 C)一起使用,那么速度就变得不那么相关和有趣了。如果您编写的东西主要是自己使用的,那么速度就会变得更加重要。

    【讨论】:

      【解决方案5】:
      1. 是的
      2. 这取决于您的语言打算如何使用。
      3. 没有。没有理由不能设计一种速度快的可读语言,这样就不会成为忽视性能的借口。

      您确实必须根据实验目标自己回答这些问题。

      【讨论】:

        【解决方案6】:

        除非您的语言毫无用处,否则速度总是相关的。如果它有用,人们会尝试用它来做一些繁重的工作,如果在尝试时它不会掉在脸上,那总是更好。这并不意味着值得优化速度(这取决于你的目标),也没有告诉你如何(例如,快速编译成字节码与返工如何访问用 C 编写的高级库,以便解释器在调用它之前做的更少)。

        速度和抽象之间的最佳平衡取决于要解决的问题的类型。计算机时间通常不如人们的时间宝贵,但两者都值得。完全忽略计算机时间,考虑工作和等待结果的人将花费多少时间total 仍然很有用;当总编码+执行时间最小化时,该语言的用户应该会感到最大的快乐。 (如果您想制作一个最强大的商业案例,则按编码员与用户的薪水来衡量。)

        由于前面两点,我认为解释型语言完全忽略性能是个坏主意。当然,如果语言本身是实验性的,你必须问问自己你想花多少时间在性能上而不是添加特性上。如果随着使用更频繁和任务要求更高的任务逐渐优化,初始实现可能会非常慢。 JavaScript 就是一个很好的例子。

        【讨论】:

          【解决方案7】:

          我个人会选择一种具有出色 API 的语言。如果你看一下 Lua,人们编写的 90% 的 Lua C 代码只是样板。如果出现一种速度较慢的语言,但有更好的 C++ API,我会立即切换到它。

          归根结底,“过早的优化是万恶之源”,也就是说,您的语言需要一些出色的特性,并且需要速度快。如果它像汇编程序一样可用,那么速度就不好了,用户必须实现操作系统。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-06-07
            • 1970-01-01
            • 2010-09-06
            • 1970-01-01
            • 2011-03-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多