c的汇编和c的il或java的字节码不是同一个概念吗

pqwbnv8z  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(329)

我们知道像c#或java这样的高级编程语言使用虚拟机,源代码被编译成中间语言(c#的il或java的字节码),这样这些程序就可以编写一次,在任何地方运行。
但是,低级编程语言c的“汇编”概念与源代码编译的“汇编”概念不一样吗。所以c也可以写一次,在任何地方运行,那么高级编程语言带来了什么呢?

wsewodh2

wsewodh21#

不。
像dotnet和java这样的平台,指定每个可能指令的确切语义。然后,运行时可以将一系列指令转换为具有完全相同语义的程序集序列。
c是一种完全不同的野兽。c程序的确切语义取决于操作系统供应商提供的c头。以及每个指令如何Map到cpu指令和寄存器的规则,也受操作系统供应商的影响。
然后是不确定行为的摇摆空间。c语言定义的一部分,其中指令的语义由编译器来定义(或不定义)。
而有些编译器在将源代码转换为机器代码时会使用中间形式。在解析系统头时,可能已经做出了一些特定于目标的决策。或者根据参数传递和返回值如何Map到寄存器或堆栈的规则。
当然,您可以定义一个伪目标os/cpu,将程序部分编译成它,然后构建一个运行时,将这些语义Map到实际的os/cpu。这正是chrome的实验性便携本机客户端所使用的方法。但这抛弃了c。

0h4hbjxa

0h4hbjxa2#

不。
c编译器发出的汇编语言特定于给定的机器体系结构和操作系统。
如果更改这些内容之一,则无法使用汇编语言。

相关问题