Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“编译与翻译”;编辑「;Java到字节码?_Java_Compilation_Compiler Theory - Fatal编程技术网

“编译与翻译”;编辑「;Java到字节码?

“编译与翻译”;编辑「;Java到字节码?,java,compilation,compiler-theory,Java,Compilation,Compiler Theory,我的理解是这样的,定义: 翻译——用某种语言编写代码,用另一种语言生成代码 编译-翻译成机器代码 机器代码-CPU的直接指令 现在,从: Java编程语言编译器 编译器。。。?我认为它是Java翻译器,因为它生成的是代码,而不是机器代码。字节码需要解释器(JVM)来运行,所以它肯定不是机器码 发件人: Java应用程序通常编译成字节码 同样地。根据定义,我想说Java被转换成字节码。互联网上还有更多的例子,我认为这是一个困惑,或者我只是错过了一些东西 你能澄清一下吗? 翻译和编译有什么区别?ja

我的理解是这样的,定义:

翻译——用某种语言编写代码,用另一种语言生成代码

编译-翻译成机器代码

机器代码-CPU的直接指令

现在,从:

Java编程语言编译器

编译器。。。?我认为它是Java翻译器,因为它生成的是代码,而不是机器代码。字节码需要解释器(JVM)来运行,所以它肯定不是机器码

发件人:

Java应用程序通常编译成字节码

同样地。根据定义,我想说Java被转换成字节码。互联网上还有更多的例子,我认为这是一个困惑,或者我只是错过了一些东西

你能澄清一下吗?
翻译和编译有什么区别?javac的结果是机器代码。机器是虚拟的而不是物理的这一事实与此无关(否则,如果您是Mac用户,您可能会认为在x86中编译代码是翻译,因为x86代码不是Mac机器代码)

“编译器是一个计算机程序(或一组程序),用于转换 用编程语言(源语言)编写的源代码 转换成另一种计算机语言(目标语言,通常具有 二进制形式(称为目标代码)。”

所以不,编译并不意味着输出是机器代码。 例如,早期C++编译将生成C程序,然后需要重新编译成机器代码。当然,任何好的编译器都会对用户隐藏这些单独的步骤,但它们仍然存在

现在我知道至少有一个NesC编译器可以执行相同的过程

可以构建运行JVM字节码的机器,实际上是结构化计算机组织的一些章节,来自A.Tanenbaum描述了如何做到这一点


这都是定义的问题,对于“编译”的含义没有一个公认的定义。在您看来,编译是将某种语言的源代码转换为本机代码;因此,不生成机器代码的转换过程不应称为“编译”。在我看来(显然,在
javac
文档作者的眼中),它应该是

实际上有很多不同的术语:翻译、编译、反编译、汇编、反汇编等等

就个人而言,我认为将所有这些术语归为“编译”是有意义的,因为所有这些过程都有很多共同点:

  • 它们将一种形式语言中的代码转换为另一种形式语言中的代码
  • 他们尽量保留输入代码的语义
  • 它们都有一个非常相似的设计,一个前端,一个后端,中间的一个可能的优化器()。我已经看到了
    javac
    和本机编译器的本质,它们相对相似
此外,您对“生成本机代码”的定义存在问题:

  • 如果编译器可以生成汇编代码,但不需要麻烦地将其转换为机器代码,将其留给外部程序(通常称为“汇编程序”)?你会因为最后一个比较步骤中不重要的一步而否定他们对“编译器”的定义吗
  • 你是如何对“机器代码”进行分类的?明天怎么样
但这些只是我的意见。我认为,最被接受的定义是:

  • 编译是将高级语言中的代码转换为低级语言。示例:Java到Java字节码,或C到x86机器代码
  • 反编译是将低级语言中的代码转换为高级语言-实际上与编译相反。示例:Java字节码到Java
  • 翻译源代码到源代码编译是将某种语言中的代码转换为另一种具有类似“级别”的语言。示例:ARM到x86,或C到Java。当两种语言实际上是同一种语言的不同版本(例如Javascript 6到Javascript 5)时,也会使用术语transpiler
  • 汇编是将某些汇编语言中的代码转换为机器代码
  • 反汇编是反编译的同义词,或是汇编的反义词,具体取决于上下文
在这些定义下,
javac
绝对可以被视为编译器。但是,所有这些都在定义中:从技术角度来看,这些行为中有很多共同点

编译器。。。?我认为它是Java翻译器,因为它生成的是代码,而不是机器代码。字节码需要解释器(JVM)来运行,所以它肯定不是机器码

JVM是Java虚拟机,它是一台机器,其机器代码称为Java字节码。(字节码中的每个“字节”都是JVM机器指令。)

您可以通过阅读JVM规范了解更多信息。从这里开始:

另外,JVM不是解释器;这是机器的定义。JVM的一些实现包括即时(JIT)编译器、超前(AOT)编译器、自适应编译器(例如Hotspot),当然,还有解释器(尽管我已经20年没见过Java解释器了)

大多数开始使用编译器的人不明白的是,现在已经没有生成“机器代码”的编译器了。它们都会生成一些中间表单(例如,由特定的操作系统定义),然后由操作系统加载和屏蔽这些表单

在今天的大多数情况下,没有编译过的程序能够执行