高级语言(例如Java)和汇编语言之间的关系?

时间:2014-01-15 23:39:37

标签: java c++ c assembly

在我的汇编语言书中,虚拟机级别列出如下:

  • 第4级:高级语言
  • 第3级:汇编语言
  • 第2级:指令集架构(ISA)
  • 第1级:数字逻辑

根据该书,第2级(ISA)是处理器的指令; ISA也称为机器语言。该级别中的每条指令都可以直接由计算机硬件或嵌入在微处理器芯片中的程序执行,称为微程序

高于2级,是汇编语言3级,编程语言提供翻译层,使大规模软件开发变得切实可行。这个级别使用简短的助记符,如ADD,SUB和MOV,可以很容易地转换到级别2上的ISA。这些类型的程序必须在ISA级别完全翻译或组装成机器语言才能执行。< / p>

顶层是4级高级编程语言,如C,C ++和Java。这些声明为包含强大语句的语言,这些语句可转换为多种汇编语言指令。

话虽如此,我并没有完全理解高级语言(在这种情况下是Java)和汇编语言之间的关系。在我看来,高级语言被简化为单个编程语句可能固有地执行许多代码行的功能,而不像程序集需要每个动作的显式语句。

任何人都可以提供一些输入来为我清除它吗?这是我第一次看到大会,到目前为止,这是一个与我在C#中的经历完全不同的世界。

5 个答案:

答案 0 :(得分:2)

每个汇编语句的高级语句数量变化不足以衡量两者之间的差异。人们常常会惊讶于实现看起来会更复杂的东西所需的汇编语言语句很少。在某些情况下,汇编语言甚至比高级语言更简单

注意的主要区别在于,在汇编语言中,您可以直接访问CPU的寄存器,这在大多数高级语言中都不可用。您还负责管理寄存器 - 决定将哪个变量放入哪个寄存器,将其保留多长时间,何时将其写回内存等等。

同样,您通常可以更好地控制(以及负责)如何在内存中排列数据。在更高级别的语言中,编译器决定在堆栈上创建哪些变量,在静态内存中创建什么,在堆上分配什么,等等。在某些情况下(例如,C或C ++),您可以对这些决策进行某种程度的间接控制,例如通常在堆栈上分配的局部变量和静态分配的全局变量。在汇编语言中,此控件是直接且明确的。例如,您不一定按名称引用局部变量 - 您通常会显式引用堆栈指针的偏移量。

另一个(主要是相当轻微的)观点:并非所有CPU都使用微程序设计。在某些情况下,所有指令都直接在硬件中实现。实现相同指令集的不同型号的CPU之间也可能存在差异 - 例如,在Intel x86系列中,早期型号(例如,8088,80286)使用微码来执行批次指令。最近的模型使用微编码 lot 更少,主要是为了提高执行速度。对于程序员来说,这种变化在很大程度上是无关紧要的,除了微编码指令往往在当前处理器上执行相对较慢,因此你更有可能在大多数新代码中避免使用它们。

答案 1 :(得分:2)

高级语言和汇编语言之间没有直接关系。

可能是C编译器或Java JIT生成汇编语言,然后运行汇编程序将其转换为机器指令。

然后,它可能不会,因为编译器或JIT就像汇编程序一样能够输出机器指令。

当您编写C编译器或Java JIT时,这完全是一个设计/实现决策。因此,如果您正在绘制用于编译和执行更高级语言的代码的技术的图表,您可能完全省略级别3,具体取决于编译器的编写方式。汇编语言主要(不完全)是将机器指令写为人类可读文本的冗长方式,但它不是生成机器指令的唯一方法(因为机器指令是使CPU执行任何操作的唯一方法) “数字逻辑”)。

我不完全确定为什么程序集被列为单独的“虚拟机级别”。与高级语言不同,它与机器指令与模型的显着不同的执行模型无关。也就是说,它确实抽象出机器指令不一定抽象的一些东西。例如,它包含标签和修正等,在机器代码加载到内存并准备运行时,它们将被地址和值替换。但是,再一次,存储在可执行文件中的机器代码也会抽象出那些东西,那么它的级别是多少呢?也许通过进一步阅读你的书,你会发现这个分类水平的目的是什么样的例子。

答案 2 :(得分:1)

在旧的,有时甚至是今天,编译器和口译员将高级语言翻译成汇编语言。汇编程序会将汇编语言转换为机器语言。

概念层与抽象概念,生产力和可移植性有关。高级语言允许程序实现更多概念,而不是担心寄存器和硬件。从而使程序员的工作效率更高。

高级语言的概念允许平台之间更容易的可移植性。例如,在80386程序集中实现的堆栈数据结构不能在ARM7上运行。需要为ARM7重写该模块,以便将使用它的任何内容移植到ARM7。

当开发人员在汇编中进行编码时,开发时间会变慢。为了以更快的速度生产产品和项目,需要提高生产率。生产力还包括解决错误的时间。

例如,让我们使用a = b + c;语句,即bc之和到变量a。这涉及以下(通用)低级别操作:

  1. 将变量b的值从内存复制到寄存器0
  2. 将变量c的值从内存复制到寄存器1
  3. 将寄存器0添加到寄存器1并将总和放入寄存器2
  4. 将寄存器2中的值存储到内存中的变量a。
  5. 所以这里的比例是高级语言的一行到4行汇编语言。要亲自查看,请执行hello world程序并打印汇编语言列表。

    如果开发人员的每行代码的错误注入率为1错误,那么上面的汇编语言示例将容易出现4个错误,而高级语言则容易出错1.高级语言也被设计用于减少生成的错误程序员随着应用程序的大小不断增加。

    高级语言的一个缺点是它们能够访问硬件或针对特定处理器进行优化。基本的FORTRAN和LISP,有点Java和C#,不允许轻松访问硬件。

    有比C,C ++和Java更高级的语言。这些语言关注抽象概念和实现,允许程序员更多地关注概念而不是语言。

答案 3 :(得分:1)

首先,每种高级语言都有自己的程序执行方式(有些类似)。

Java程序编译成Java字节码,然后在仿真器(自己的虚拟计算机)中执行。在执行期间,该仿真器与操作系统(从外部)通信并使用其操作系统调用。 对于示例:您有一个用Java实现的文件资源管理器。当正在执行删除文件的代码部分时,会向操作系统发送一条消息以进行删除。

然而,高级语言的主要思想是你可以使用的抽象(如果你想为数据库实现查询,你并不真正关心程序集级别的优化)。

历史:第一台计算机(当然是电动计算机)只能用汇编语言编程。为什么会发生这种情况,为什么没有直接用Java编程?因为它需要一个从Java语言到硬件知道的语言的翻译器,并且翻译器(事实上,或多或少是编译器)需要大量的内存,并且可能在那个时候不可能为每个程序执行。

很容易想到“for”循环语句,但不可能实现每次使用循环时执行的翻译器。

硬件发展后,实现了编译器并创建了高级语言。

因此,您希望掌握的这种关系实际上只是计算机历史中编程语言的不断发展。

答案 4 :(得分:0)

我认为答案是:只有当你考虑机器代码=汇编代码时。基本上编译或解释高级语言。在第一种情况下,高级语言被转换为一组机器代码指令,这取决于体系结构的类型。但是,在大多数情况下,汇编代码和机器代码之间存在1:1的对应关系,但这并非总是如此(我建议您阅读此讨论Assembly code vs Machine code vs Object code?)。

在第二种情况下,解释语言被翻译成中间语言,然后由解释器直接执行,跳过机器代码翻译。所以在这种情况下,不会产生汇编代码。