为什么我们说Java是一种编译和解释语言?
(编译和解释)这样做有什么好处?
Java在编译时被编译为中间的“字节码”。这与像C之类的语言在编译时被编译为机器语言相反。Java字节代码无法像编译的C代码那样直接在硬件上执行。相反,字节码必须在运行时由JVM(Java虚拟机)解释才能执行。像C这样的语言的主要缺点是,当编译该二进制文件时,该二进制文件将仅在一种特定的体系结构(例如x86)上运行。
诸如PHP之类的解释语言实际上是独立于系统的,并且依赖于系统和体系结构特定的解释器。这导致更大的可移植性(相同的PHP脚本可在Windows计算机和Linux计算机等上工作)。但是,这种解释导致性能显着下降。比起可以由硬件执行的机器特定指令,像PHP这样的高级语言需要更多的时间来解释。
Java试图在纯编译的语言(没有可移植性)和纯解释的语言(要慢得多)之间找到折衷方案。它通过将代码编译成更接近机器语言的形式来实现此目的(实际上,Java字节码是机器语言,仅对于Java虚拟机而言),但是仍然可以在体系结构之间轻松地进行传输。因为Java仍需要执行软件层(JVM),所以它是一种解释语言。但是,解释器(JVM)以称为字节码的中间形式而不是原始源文件进行操作。此字节代码由Java编译器在编译时生成。因此,Java也是一种编译语言。通过这种方式,Java获得了编译语言的一些好处,同时也获得了解释语言的一些好处。但是,它也从这两种语言中继承了一些限制。
正如Bozho指出的那样,有一些策略可以通过使用即时(JIT)编译来提高Java代码(和其他字节代码语言,如.Net)的性能。实际过程根据需求的不同而有所不同,但是最终结果是原始代码在编译时被编译为字节码,但随后在运行时通过编译器运行。这样,可以以接近本机的速度执行代码。一些平台(我相信.Net会这样做)保存JIT编译的结果,替换字节码。这样,程序的所有将来执行都将像从一开始就以本机编译的方式执行。
那么,让我看看我是否明白了这一点。 > 当我们说编译器和解释器之间的区别时,解释器将高级指令翻译成中间形式,然后执行。[我认为编译器也将高级指令翻译成中间形式,但此刻它生成目标代码而不是执行它,对吗?] 解释器一次读取一条指令或一行的源代码,将该行转换为机器代码并执行它。[解释器本身不会将代码转换为机器代码,它会使用ist自己的预编译函数评估指令(在解析之后)。例如,高级语言中的Add表达式将使用
翻译的结果是什么?它会把高级语言变成汇编语言还是机器语言,即二进制代码? 如果是后者,这是否意味着解释语言与介绍集没有关系? 一种语言只能有一个口译员?是因为解释器不做任何优化,所以我们不需要找到更好的解释器吗?
问题内容: 我正在学习Java,以下内容对我来说有些混乱。我了解的是: Java编译器 →Java编译器仅将程序转换为文件,这意味着将我们的源代码转换为字节码(这是使Java平台独立的虚拟机(JVM)的操作码的列表)。 Java Interpreter →仅“解释”代码,而 没有 将其转换为本地机器代码。它将一条字节码的每条指令作为一条命令一一执行并执行,而不管同一条指令出现多少次。这就是为什么它
我正在学习Java,下面的事情让我有点困惑。我的理解是: > Java编译器→Java编译器只是将程序转换为文件,这意味着将我们的源代码转换为字节码(它是虚拟机(JVM)的操作代码列表,使Java平台独立)。 Java解释器→只是“解释”代码,而不是将其转换为本机机器代码。它将字节码的每一条指令作为命令逐一执行并执行,而不管同一条指令发生多少次。这就是为什么它很慢,Java引入了JIT概念。 JI
在我参加的一个reactJS会议上,演讲者使用了一个术语转译器来进行一些代码转换/移植。当涉及到将语言代码转换为计算机系统/机器上的可运行形式时,我总是使用和听到术语编译器和解释器。转译器对我来说是新的。转译器与编译器或解释器有什么不同,为什么真的需要它?
问题内容: 我正在构建一个专用的嵌入式Python解释器,并希望避免依赖于动态库,因此我想改用静态库来编译解释器(例如,不编译)。 我还想静态链接Python标准库中所有的动态库。我知道可以使用来完成此操作,但是有没有一种替代方法可以一步完成呢? 问题答案: 我发现了这一点(主要是关于Python模块的静态编译): http://bytes.com/groups/python/23235-buil