是什么因素决定了语言的“快”或“慢”?
Naser Tamimi在他的文章中比较了 C++ 和 Python,以下是他的观察结果:
正如你所见,Python 比 C++ 慢得多,但实际上没有哪种编程语言是绝对快或慢的。编程语言生成的机器代码要么简单,要么复杂。
所有语言都有相同的目标
-
高级语言(HLL),如 C++ 和 JavaScript,为程序员提供了一个类似人类语言的简单环境,以便他们与计算机进行交流。
-
编程语言的语法可能有所不同,但它们的共同目标是生成机器代码,而机器代码是计算机唯一能理解的语言。
因此,一切都归结于代码如何转换成机器代码。
要理解这一点,我们首先必须了解静态类型编程语言和动态类型编程语言之间的区别。
静态类型语言和动态类型语言
静态类型语言
- 静态类型语言是指在编译时就确定了变量类型的语言。静态类型语言中变量的数据类型必须明确指定,一旦定义,变量类型就不能修改。例如:C、C++、Rust、Java
/* C++/C code */
int number_1 = 1; //integer
number_1 = "digit"; //ERROR! cannot be changed to string
-
编译时会执行类型验证。因此,这些检查会在程序运行前发现诸如函数缺失、类型参数无效或数据值与其分配的变量类型不匹配等问题。

-
程序员只有在代码通过这些类型检查后才能运行代码,因此,它会在编译过程中抛出错误和警告,以此来促使程序员纠正错误。
-
在开发过程的早期阶段就发现了大量的错误。
动态类型语言
有些语言的解释器会在运行时根据变量当时的值来分配变量的类型。例如:JavaScript、Python
var name;
name = 57;
name = "Vibali"; //this will not throw any error.
JavaScript 没有编译阶段。浏览器解释器会检查 JavaScript 代码,理解每一行,然后执行它。
如果类型检查器此时发现问题,开发者会收到通知,并有机会在程序崩溃前修复代码。
- 您无需等待编译器完成编译即可测试代码修改,因为没有单独的编译过程。这使得调试过程更加快捷方便。
相关内容:
编译器和解释器的区别
这有什么关系呢?
请看这个 Python 示例:
# Python 3 program to find
# factorial of given number
def factorial(n):
if n < 0:
return 0
elif n == 0 or n == 1:
return 1
else:
fact = 1
while(n > 1):
fact *= n
n -= 1
return fact
n 的值是什么?它是数值吗?它是字符串吗?还是你之前创建的类?
解释器无法预知会接收到什么类型的数据。运行时,需要进行更多检查,这意味着基本操作需要更多隐式工作。
所有这些查找都极难快速完成。
因此,生成机器代码所需的时间会增加,使得这些语言看起来速度较慢。
另一方面,像 C++ 或 Java 这样的静态类型语言生成的编译代码执行速度更快,因为当编译器知道正在使用的具体数据类型时,它可以生成优化的机器代码(即速度更快和/或使用更少的内存)。
我应该选择哪种语言?
-
这并不是说像 JavaScript 这样的语言没有用处。这完全取决于具体的使用场景。每种语言都侧重于不同的方面。动态类型允许程序员根据运行时数据构建类型和功能,但代价是牺牲速度。
-
程序员可以通过在构建操作系统驱动程序或文件系统时使用 C、C++ 或 Rust 来微调代码,使其在任何情况下都能有效运行,即使硬件空间或能源不足以支持应用程序运行。
所以这一切都取决于我们想要达成的目标。
请在下方评论区告诉我你更喜欢哪种语言以及原因。
文章来源:https://dev.to/vibalijoshi/what-makes-languages-fast-or-slow-3l44


