Api 编译器输出代码的类型

Api 编译器输出代码的类型,api,compiler-construction,operating-system,Api,Compiler Construction,Operating System,当编译器将高级语言编译成可执行的目标语言时,目标语言是什么形式 它是像机器代码一样的低级语言吗?或者编译器只是将其从操作系统的API转换为操作系统的函数,而操作系统则在幕后完成所有工作?编译器可以有许多不同的输出: 直接在计算机上运行的机器代码 动态转换为机器代码的中间代码,以及 汇编程序的源代码 选项2的优点是,它允许输出可移植到不同的计算机,只要您有一个适当的中间代码到本地机器代码转换器可用于目标机器。这就是Java能够“编写一次,在任何地方运行”的方式。编译器是将程序从一种表示形式转换为另

当编译器将高级语言编译成可执行的目标语言时,目标语言是什么形式


它是像机器代码一样的低级语言吗?或者编译器只是将其从操作系统的API转换为操作系统的函数,而操作系统则在幕后完成所有工作?

编译器可以有许多不同的输出:

  • 直接在计算机上运行的机器代码
  • 动态转换为机器代码的中间代码,以及
  • 汇编程序的源代码

  • 选项2的优点是,它允许输出可移植到不同的计算机,只要您有一个适当的中间代码到本地机器代码转换器可用于目标机器。这就是Java能够“编写一次,在任何地方运行”的方式。

    编译器是将程序从一种表示形式转换为另一种表示形式的任何程序。目标表示可以是任何形式,只要它的计算能力至少与源表示相同。特别是,这意味着如果源表示是图灵完备的,那么目标表示也必须是图灵完备的


    编译器可以从一种高级语言编译到另一种高级语言(例如,将Java编译成ECMAScript的GWT),从一种高级语言编译到一种低级语言(例如,将Scheme编译成C的Gambit),从一种高级语言编译到机码(例如,将Java编译成本机代码的GCJ),从低级语言到高级语言(如Clue,它将C编译成Java、Lua、Perl、ECMAScript和Common Lisp),从低级语言到另一种低级语言(如Android SDK,它将JVML字节码编译成Dalvik字节码),从低级语言到机器码(例如,作为HotSpot的一部分的C1X编译器,它将JVML字节码编译成机器码)、将机器码编译成高级语言(任何所谓的“反编译器”)、将机器码编译成低级语言(例如JPC中的JIT编译器,它将x86本机代码编译成JVML字节码)以及将本机代码编译成本机代码(例如,PearPC中的JIT编译器,它将PowerPC本机代码编译为x86本机代码)那么,高级语言和OS的API之间的关系是什么?我的假设是JVM是使用不同的OS的API实现的,因此所有的类代码最终都要使用OS的API。但是对于C和C++,它们直接编译成机器代码或中间代码?是这样的吗?到底什么是NAT?操作系统的调用是通过编写被编译的语言来调用OS中的函数来编写的。编译器然后创建直接调用这些函数的机器代码。C和C++正好是用来编写操作系统的语言。本机代码是可以直接执行的代码。中间代码通过一个转换器(称为即时编译器)将中间语言翻译成本地机器代码,然后由微处理器执行。