在Google的Python类中
Python是一种动态的解释(字节码编译)语言
我知道什么是解释器,也知道什么是字节码,但两者加在一起似乎不合适。在阅读了一些之后,我变得更清楚了,基本上Python源代码在被解释之前是自动编译的;但是出现了一些新的问题。
使用Python解释器时,不会发生编译吗?如果有,什么时候?例如,如果您只是在命令行中键入代码,并且每次按enter键时它都会运行,那么编译器什么时候有机会完成其工作?
同样在上面的链接问题中,@delnan给出了编译器相当广泛的定义
更一般地说,编译器是将一种编程语言中的程序转换为另一种编程语言中的程序的程序。。。JIT编译器在运行时编译为本机代码
我想我的问题是:解释器和自动编译器有什么区别?为了进一步完善这个问题,如果Python是编译的,为什么不一直编译到机器代码(或者汇编,因为我知道编写能够生成纯机器代码的编译器很困难)?
也许最好忘记语义,试着了解Cpython实际上在做什么。当您调用Cpython二进制文件时,它会执行许多操作。一般来说,您可以期望它将您编写的代码翻译成一系列字节码指令。这是人们有时会参考python代码的“编译”阶段。与手工编写的代码相比,这是一种更简洁、更有效的方法来告诉解释器要做什么。python通常会缓存这些文件,以便在<代码>中重用。pyc文件(仅当关联的.py文件较新时才重新生成)。您可以将python字节码视为python虚拟机可以运行的一组指令——在很多方面,它与Java所获得的指令并没有太大区别。当人们谈到编译语言(例如C)时,编译器的工作是将代码翻译成一组直接在计算机硬件上运行的指令。像Cpython和Java这样的语言有一个额外的间接层(例如虚拟机)。虚拟机直接在计算机硬件上运行,并负责解释特定于域的语言。
与标准的“编译”语言(例如C语言、Fortran语言)相比,这个阶段非常轻量级,python并没有像“传统”编译器那样做很多检查(例如类型检查)。它几乎只检查语法,并使用窥视孔优化器进行一些非常简单的优化。
我们知道,JVM同时使用解释器和JIT编译器。JIT编译器将重复的字节码转换为机器码并存储在内存中。现在,当解释器逐行翻译字节码并运行它时,它将跳过已转换并存储在内存中的重复代码的翻译部分,但将直接运行它。从而减少了并发冗余翻译。 那么为什么Java在JVM中使用解释器呢?像JIT这样的编译器可以一次性完成将字节码转换为机器码的整个任务吗?
我想你们大多数人都知道在Java语言中是一个保留的关键字,但实际上并没有被使用。你们可能也知道是一个Java虚拟机(JVM)操作码。我认为Java、Scala和静态编程语言的所有复杂的控制流结构都是在JVM级别上使用和、、等的某种组合来实现的。 查看JVM规范https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.
问题内容: 我正在构建一个专用的嵌入式Python解释器,并希望避免依赖于动态库,因此我想改用静态库来编译解释器(例如,不编译)。 我还想静态链接Python标准库中所有的动态库。我知道可以使用来完成此操作,但是有没有一种替代方法可以一步完成呢? 问题答案: 我发现了这一点(主要是关于Python模块的静态编译): http://bytes.com/groups/python/23235-buil
问题内容: 我对JVM有一个非常基本的问题:它是编译器还是解释器? 如果它是解释器,那么JVM内部存在的JIT编译器怎么办? 如果两者都不是,那么JVM到底是什么?(我不希望将字节码转换为机器特定的代码等jVM的基本定义。) 问题答案: 首先,让我们对以下术语有一个清晰的认识 是Java编译器-将Java代码编译为 Bytecode 是Java虚拟机-运行/解释/将字节码转换为本 机代码 是即时编
2.1. 调用 Python 解释器 Python 解释器通常被安装在目标机器的 /usr/local/bin/python3.4 目录下。 将 /usr/local/bin 目录包含进 Unix shell 的搜索路径里,以确保可以通过输入: python3.4 命令来启动他。 [1] 由于 Python 解释器的安装路径是可选的,这也可能是其它路径,你可以联系安装 Python 的用户或系统
使用命令行编译器 注解 这一节并不适用于 solcjs solc 是 Solidity 源码库的构建目标之一,它是 Solidity 的命令行编译器。你可使用 solc --help 命令来查看它的所有选项的解释。该编译器可以生成各种输出,范围从简单的二进制文件、汇编文件到用于估计“gas”使用情况的抽象语法树(解析树)。如果你只想编译一个文件,你可以运行 solc --bin sourceFil