为啥在语言的简单性和执行时间之间似乎存在张力? [关闭]

Posted

技术标签:

【中文标题】为啥在语言的简单性和执行时间之间似乎存在张力? [关闭]【英文标题】:Why does there seem to be tension between the simplicity of a language and execution time? [closed]为什么在语言的简单性和执行时间之间似乎存在张力? [关闭] 【发布时间】:2012-08-10 20:52:44 【问题描述】:

在我看来,使用起来非常简单的语言(例如 Python)的执行时间通常比被认为学习起来更复杂的语言(例如 C++ 或 Java)的执行时间要慢。为什么?我知道问题的一部分源于 Python 是解释而不是编译的事实,但是是什么阻止了 Python(或另一种高级语言)被有效编译?有没有你觉得没有这种权衡的编程语言?

【问题讨论】:

“较慢”的语言在幕后做的更多 - 因此它们更易于使用(例如,它们为您管理内存 - 这需要更多的处理时间和内存) 但是 Python 在幕后到底在做什么? 更重要的是,他们必须以通用的方式进行幕后工作。他们必须处理程序员可以扔给他们的任何事情。但是,让程序员完成其中一些工作(例如内存管理)的语言也可以让他们编写最适合他们特定情况的解决方案。 @MadisonMay:我不了解 Python,但如果它和其他脚本语言一样,那么两大方面将是运行时类型检查和垃圾回收。 叹息。这是另一个重要的问题,有相当明确的答案,如果幸运的话,可以引导提问者进行更深入的理解。几个实质性和赞成的答案。关闭是因为它“不适合问答形式”,仅由一个有趣的问题和几个有用的答案组成。 【参考方案1】:

让我们比较一下 C 和 Python。在大多数情况下,C 编程比 Python 更“复杂”。这是因为 Python 自动化了很多 C 没有的工作。例如,垃圾收集在 Python 中是自动化的,但在 C 中是程序员的责任。

这种自动化的代价是这些“高级功能”需要足够通用以“适应”每个程序的需求。例如,Python 垃圾收集器有一个预定义的调度/垃圾收集算法,它可能不是每个应用程序的最佳选择。另一方面,C 为程序员提供了完全的灵活性,可以按照自己的意愿定义 GC 计划和算法。

所以你有它,轻松与性能。

【讨论】:

不!希望您找到适合您的应用程序的编程语言之间的最佳权衡。【参考方案2】:

高级语言(或至少是动态语言)的效率问题源于这样一个事实,即在运行时解析对象的实际类型之前,通常不知道需要执行哪些操作。因此,这些语言不能编译成简单的机器代码,必须在幕后完成所有繁重的工作。

【讨论】:

感谢您的帮助,卡罗尔。但是,像一些类型声明这样简单的事情是否会导致从 Python 到 C++ 的 100 倍加速,这有时会被看到?编辑:我想垃圾收集也需要考虑在内。【参考方案3】:

基本上,这一切背后都有一个核心原因:做某事所需的指令数量。

在直接的旧 C 中,大多数语句只需要几条指令就可以完成,通常从 1 到大约 4,并且可能非常接近 1。

在 C++ 中,还有更多隐藏的内容,例如,调用虚拟方法需要额外的几条指令。这种情况可以通过一个好的优化器来解决,但是运行时类型信息会阻碍优化器。

在 Java 中,您也有同样的问题,而且代码在解释器中运行,该解释器将每个 JVM 指令扩展为一个或多个机器指令——在某些情况下更多,尤其是在代码运行时间不够长的情况下利用运行时优化。

Python 有所有这些问题,但它必须在启动时进行解析,并且具有处理类型的移动灵活(因此更复杂)系统,这意味着更多的指令。

是的,可以编译 Python。甚至还有projects that are trying it。但是硬编译会让你失去一些动态语言的优势。

【讨论】:

“但是硬编译会让你失去一些动态语言的优势。” - 喜欢省略类型声明的奢侈? 就是这样,虽然类型推断可以返回(参见,例如,Scala),但也可以轻松编写代码,编写特定领域的子语言,轻松使用REPL 进行实验,在运行时修改类的能力,易于构建灵活的编程环境。你可能不喜欢使用这些东西,但有些人觉得它们很有用,而且可以肯定的是,它们很难在 C++ 中使用。【参考方案4】:

Python 代码执行时间比 C++ 慢,主要是因为它是一种动态类型语言。参见例如:

Why are dynamically typed languages slow

【讨论】:

以上是关于为啥在语言的简单性和执行时间之间似乎存在张力? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Windows、Linux 等汇编语言之间存在差异?

为啥在使用 XCode 和 xcodebuild 之间存在差异?

女性修炼

C语言中啥叫调用函数?为啥函数和函数之间是调用关系?

为啥多线程(使用 pthread)似乎比多进程(使用 fork)慢?

模拟水面表面张力,效果自然真实,北大图灵班研究入选SIGGRAPH