回答
几乎没有口译员真的直接解释代码 - 它的效率太低了。几乎所有的解释器都使用一些可以轻松执行的中间表示。此外,可以对此中间代码执行小型优化。
Python还存储了这个代码,这对下次执行代码具有巨大的优势:Python不必再解析代码;解析是编译过程中最慢的部分。因此,字节码表示相当大地减少了执行开销。
即使我的TRS-80上的旧MS BASIC使用了一种非常简单的编码方案:只要我输入或编辑了一行,BASIC关键字就被折叠为单个字节。 – 2009-07-27 17:46:39
@DavidThornley:1980年代的许多计算机都使用MS-Basic的衍生产品,它将关键字转换为记号,但是保留了文本形式的数字和变量名称,因此必须计算它们的值或在运行时查看它们。 Atari BASIC做了更多的处理,建立一个变量表并用索引替换它们的名字。它还将数字转换为BCD浮点数。只有字符串文字和评论被存储为文本。这样的事情可能会让Atari BASIC超越其他,除了每行的编号被存储为二进制,但GOTO的目标...... – supercat 2014-01-29 16:59:52
...被存储为BCD浮点,所以每个GOTO都需要一个BCD到二进制的转换。不过,有趣的是,Atari BASIC的作者将程序转换为解析表示,而不是简单地用关键词替换关键词。 – supercat 2014-01-29 17:01:34
因为直接从字节码解释更快。首先,它避免了需要进行练习。
因为您可以编译为.pyc
一次并从中解释很多次。
因此,如果您多次运行脚本,只会产生一次解析源代码的开销。
一遍又一遍地重新解析和分析源代码,而不是仅仅执行一次(通常在第一个import
上),显然是一个愚蠢和毫无意义的浪费。
我非常怀疑,原因是性能,尽管这是一个很好的副作用。我会说,认为围绕某种高级汇编语言构建的虚拟机比在某些源代码字符串中查找和替换文本更实用是很自然的。
编辑:
好了,显然,谁没有把在我的岗位-1票不留一个合理的评论,说明知之甚少虚拟机(运行时环境)。
虽然有一个小的效率方面是它(可以字节码存储在磁盘上或在存储器中),其主要是工程:它允许分开解释解析。解析器通常是令人讨厌的生物,充满了边缘情况,不得不遵守隐秘的规则,比如只使用适量的预测和解决移位减少问题。相比之下,解释非常简单:它只是一个使用字节码操作码的大开关语句。
- 1. 1. Java不是编译语言,但是它是解释语言。怎么样? (因为我们在运行之前将代码编译为字节码)
- 2. 为什么java解释代码是否可以编译它?
- 3. 为什么此代码与免费的monad解释器编译?
- 4. 在编译器将其转换为字节码之前,是否可以从jython中找到java源代码?
- 5. 语言在网络从源代码解释字节码与
- 6. 将Java源代码翻译为字节码时的优化
- 7. 解释为networkx代码python
- 8. 将源代码从ARMv5编译为ARMv6
- 9. 我应该使用什么工具将Java字节码反编译为Java源代码?
- 10. 为什么我无法在手机上编译源代码?
- 11. 为什么在编译时删除u-boot源代码?
- 12. 在编译之前修改Gradle构建的Groovy源代码
- 13. 在NetBeans和Ant中编译之前过滤源代码
- 14. 在ubuntu中编译/编译源代码
- 15. 在执行之前拦截python解释器代码
- 16. 此代码为什么编译失败?
- 17. 这段代码为什么要编译?
- 18. 这个C代码为什么编译?
- 19. 为什么不编译这个代码?
- 20. 这段代码为什么不编译?
- 21. ASP.NET尝试编译注释的代码行。为什么?
- 22. python字节码解释器实现
- 23. 从源代码编译内核。错误解释。
- 24. 为什么下面的代码在VS2010中成功编译?
- 25. 将源代码转换为Java字节码的实用程序是什么
- 26. 在编译之前用Python代码进行原型设计
- 27. 如何将Java源代码转换为字节代码?
- 28. 提前编译代码和本机编译代码之间的区别是什么
- 29. 像Python一样,可以将Ruby编译为字节码吗?
- 30. 为什么这个代码不能在打字稿中编译?
听起来像给我作业。 – 2009-05-20 14:08:42