python - 为什么没有解释和(真正)编译的语言?
问题描述
我是一个(老)工程师而不是程序员,所以请原谅我问了一个幼稚的问题。
我的理解是,要获得真正快速的程序执行时间,需要将其编译为本机机器码。并且有相对少量的语言仍在使用中(例如 C 和 C++)。
但我更喜欢 Python 的语法,而不是 C 派生的编译语言的语法。但是我的理解是,解释型 Python(以及在虚拟机上运行的伪编译 Python)无法与真正编译型语言的执行速度相匹配。
是否有某些原因无法开发出真正的本机代码 Python 编译器?
[我对 Python 特别感兴趣,但我不知道任何可以解释并编译为本地机器代码的语言。]
解决方案
关键的区别是编译时间和运行时间之间的清晰分离。例如,在 Python 中,import
发生在运行时,并且可以有条件地发生。根据停机问题,这意味着编译器无法预先确定是否import
会发生给定的情况。然而,这会影响需要生成的代码。
正如 Bill the Lizard 所指出的,如果语言确实有明显的区别,解释者仍然可以选择忽略它。C#include
可以发生在 之前main
,但这并不意味着解释器必须这样做。
在语法之外,由于弱类型化,Python 实际上也无法编译。在 C 中,+
具有非常有限的一组含义 - 整数、浮点或指针,编译器将知道参数的静态类型。C++ 有更广泛的重载,但同样的基本原则也适用。virtual
函数允许一些运行时灵活性,但来自有限的一组选项,所有这些都是在main
启动之前编译的。
内存模型也不是语法——C 和 C++ 都有一个内存模型,它是 Java 内存模型的改进派生,这使得线程非常高效。(与 Java 不同,不是每个对象都可以同步,需要特殊成员)。随着 CPU 获得越来越多的内核,优势只会继续增长。编译器可以很好地看到内存和 CPU 寄存器需要同步的地方。
推荐阅读
- go - 用 go gin 提供视频
- html - jQuery在与overlay一起使用时淡入淡出
- html - 有没有办法将我的 mongodb 中的数据添加到我的 html 文件中
- python - 为什么我使用 MinHash 分析器的查询无法检索到重复项?
- javascript - 为什么我得到 undefined 而不是 null
- javafx - 为什么我的 javafx 代码以我所有的形状为中心?
- python - Python 3 - 字典理解的范围 -> 在对象中 -> 在列表理解中
- sql - 查询第一个可用插槽 postgres
- macos - sdkman 安装了 grails 4.0.4,现在 grails 坏了,无法启动
- python - 使用fuzzywuzzy将列的每个值与单独数据框列的所有值进行比较的最佳方法是什么?