发布于 2026-01-06 18 阅读
0

为什么编程语言速度慢?DEV 全球展示挑战赛,由 Mux 呈现:展示你的项目!

为什么编程语言速度慢

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

介绍

来自Evrone的Grigory Petrov在 YouTube 上发布了几段关于编程语言的精彩演讲。他对编程语言设计以及编译器的工作原理进行了深入研究,并找到了有关编程语言性能问题的答案。

以下是我对他的两场讲座(1,2)的英文概述如果想了解为什么 Python 或 Ruby 运行速度慢,这篇文章正适合您。

主要问题

有些人不想学习和使用 Ruby、Python 等语言,因为他们听说这些语言速度慢。“我为什么要用这么慢的语言?”他们会想。“我听说 Go 或 JavaScript 速度很快,不如学习和使用它们。 ” 此外,一些已经学习了 Ruby 和 Python 的初级程序员也会对自己的选择感到担忧。他们是否做出了正确的选择,因为他们听说这些语言速度慢?让我们一起来探究一下为什么有些语言速度慢。

中央处理器

照片由 Jeremy Zero 拍摄,来自 Unsplash

为了描述编程语言的工作原理,我们必须从机器上的CPU开始。现代CPU拥有大量的核心以保证其性能。现代CPU架构的学习和描述都颇具挑战性。简单来说,代码执行速度是指一个CPU核心在一瞬间能够执行的机器代码指令数量。

CPU每次都要从内存中读取指令。读取操作始终是一个缓慢的过程。因此,现代CPU都配备了多级缓存(L1、L2、Ln缓存)和处理器寄存器。它们有助于减少从内存读取数据的次数。

简单来说,代码运行速度性能取决于我们的代码(机器代码)与内存交互的效率。我们可以将数据存储在 CPU 缓存中,还是必须从内存中读取数据?

看看这些语言

C、C++、Rust、Objective-C 和 Golang 等编程语言有什么共同点?程序员编写代码时总是会考虑内存:我们必须指定每个变量的数据类型;我们必须在堆中分配内存;总是要考虑指针、代码块等等。

好处在于,源代码会被编译成机器码,执行速度非常快。然而,众所周知,用 C、C++ 和 Rust 编写代码极具挑战性。这是因为它们的语法复杂,而且你必须时刻关注内存使用情况。

如果程序员/开发者不想操心内存管理,可以将这项工作委托给编译器。编译器是一种将源代码转换成机器代码的工具,它会尽可能高效地完成转换。转换成机器代码的源代码更容易被CPU处理,数据也会被存储在缓存和寄存器中。

Java、C#、JavaScript 等编程语言都遵循这一原则。用 Java 编写代码时,你无需担心内存问题,因为这些工作都委托给了编译器。

Java、C# 和 JavaScript 拥有高级且简洁的语法,代码执行速度也很快。然而,它们的扩展性却存在问题。编译器会转换源代码并隔离内存层,因此很难为 Java 代码编写扩展,或者使用第三方 C/C++ 代码。为了编写扩展,设计者必须实现 Java 本地接口 (JNI),但这会降低代码性能。

第三种方法是将例程委托给运行时环境,即虚拟机(VM)。这意味着编程语言不会将源代码编译成机器码,而是将源代码编译成字节码,然后在虚拟机中执行字节码。Python、Ruby 和 PHP 等编程语言都采用了这种方式。这些语言拥有强大的高级语法,并且可以轻松快速地编写扩展。但是,使用虚拟机的代价是速度——代码执行速度会变慢。

三项技能

照片由 Lucas Santos 拍摄,来自 Unsplash。

我们可以将每种计算机语言想象成视频角色扮演游戏(RPG)中的一个角色。在典型的RPG游戏中,当我们创建角色时,我们拥有有限的点数,并且可以分配点数到少数几个技能上(力量、防御、智力、敏捷等)。每种语言都有三个技能可以分配点数:

  • 速度——执行速度
  • 语法——简洁优雅的高级语法
  • 可扩展性——内存兼容性,以便轻松编写和使用第三方代码或扩展程序。

当一个人或一个团队开始设计一种新的编程语言时,他们只能选择两种技能作为基础。第三种技能总是难以掌握。例如,C、C++、Rust、Objective-C 和 Go 速度快、可扩展性强,但它们的语法不够优雅。

如果一种语言速度快、语法简洁,那么编写扩展程序或使用第三方代码就会很困难。Java、C# 和 JavaScript 速度都很快,而且拥有优秀的高级语法。但是,为 Java 代码编写扩展程序,或者使用用 C/C++ 编写的第三方代码,都比较困难。

Ruby、Python 和 PHP 选择了第三条道路。它们拥有简洁优美的语法,代码编写起来非常容易。编写代码时,你只需专注于业务逻辑,无需担心内存问题。此外,使用第三方库或编写扩展程序也十分便捷,例如 Python 中的 NumPy 和 SciPy,以及 Ruby 中的 Nokogiri、Ruby-OpenCV 和 Redcarpet。但代价是性能问题——这些语言的运行速度比之前的语言要慢。

结论

照片由 David Heslop 拍摄,来自 Unsplash。

每当我们说或听到N语言运行缓慢时,请记住,这是语言设计中一个经过深思熟虑的决定。你可能会问:“如何让N语言运行快速?这有可能吗? ”答案是肯定的,但这并非易事。

否则,速度较慢的语言也具有灵活性。用 C++ 编写扩展程序很容易,可以加快某些类型的操作。例如,Python 中的 NumPy 和 SciPy。当我们在 Python 中进行机器学习或使用 Ruby 编写企业登录程序时,我们可以利用 Python/Ruby 作为高级语言的优势,快速编写代码。此外,我们还可以将耗时的操作委托给第三方库中的快速扩展程序,以便处理数据、进行数学运算、解析文本等等。

坦白说,如今只有 JavaScript 试图兼顾这三项技能。但这很难。它试图将所有资源都投入到和谐统一的实现中。我相信在不久的将来,所有现代编程语言都将实现这三项技能的和谐统一。

文章来源:https://dev.to/kopylov_vlad/why-programming-languages-are-slow-1b2d