【问题标题】:Relationship between High-Level Language (Ex. Java) and Assembly Language? [closed]高级语言(例如 Java)和汇编语言之间的关系? [关闭]
【发布时间】:2014-02-04 16:49:30
【问题描述】:

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

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

根据本书,Level 2 (ISA) 是针对处理器的指令; ISA 也称为机器语言。此级别中的每条指令要么直接由计算机硬件执行,要么由嵌入在微处理器芯片中的称为微程序的程序执行。

2 级以上是汇编语言 3 级,提供翻译层以使大规模软件开发变得实用的编程语言。此级别使用简短的助记符,如 ADD、SUB 和 MOV,可以轻松地在级别 2 上翻译成 ISA。这些类型的程序必须在 ISA 级别完全翻译或汇编成机器语言,然后才能执行。

顶层是 4 级高级编程语言,例如 C、C++ 和 Java。这些被描述为包含强大语句的语言,这些语句可以翻译成多种汇编语言指令。

话虽如此,我并没有完全理解高级语言(在本例中为 Java)与汇编语言之间的关系。在我看来,高级语言被简化为单个程序语句可能固有地执行许多代码行的功能,这与汇编不同,每个动作都需要一个明确的语句。

任何人都可以提供一些输入来为我清除它吗?这是我第一次研究 Assembly,到目前为止,它与我在 C# 中的经历截然不同。

【问题讨论】:

  • 你说的很对。我无法关注你没有关注的地方
  • 你的书遗漏了一个层次——Java(以及C#和VB)产生的IL,这是编译器产生的,介于3和4之间。当应用程序运行时,IL是翻译成汇编。
  • 1 级以下应该是 0 级:晶体管。我们可以争论-1级是否由各种掺杂的硅、锗或其他在一定程度上携带电子的介质(“半导体”)制成的几何结构组成。这些级别的基本意思是,您可以使用 N-1 级设备相对轻松地构建 N 级,而无需使用 >N 级抽象。
  • 另外,在汇编中,指令与 CPU 密切相关。在一种类型的 CPU 上运行的指令很可能不会被不同类型的 CPU 理解。
  • 还有更多的关卡。他们所说的“高级语言”实际上是大多数人所说的直接编译为汇编代码的低级语言(例如 C、C++、Lisp 的某些方言、D、Obj-C)。还有另一种级别的语言被认为是在以低级语言级别运行的 VM 上运行的高级语言。这些是 Java(JVM)、C#(CLR)、Ruby(YARV,有时是 JVM)、Python(python 解释器)等语言。

标签: java c++ c assembly


【解决方案1】:

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

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

【讨论】:

  • 通常,汇编代码是指令编号的人类可读形式。
【解决方案2】:

每个汇编语句的高级语句数量变化很大,无法衡量两者之间的差异。人们常常对用很少的汇编语言语句来实现看起来要复杂得多的东西感到有些惊讶。在某些情况下,汇编语言甚至比高级语言更简单

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

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

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

【讨论】:

    【解决方案3】:

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

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

    再一次,它可能不会,因为编译器或 JIT 与汇编器一样能够输出机器指令。

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

    我不完全确定为什么程序集被列为单独的“虚拟机级别”。与高级语言不同,它与机器指令所执行的模型没有显着不同的执行模型相关。也就是说,它确实抽象了一些机器指令不一定抽象的东西。例如,它包含标签和修正等,当机器代码加载到内存并准备运行时,它们会被地址和值替换。但是话又说回来,存储在可执行文件中的机器代码也确实抽象了这些东西,那么那是什么级别呢?也许通过进一步阅读您的书,您会发现这种等级分类旨在实现的目标的示例。

    【讨论】:

      【解决方案4】:

      在过去,有时在今天,编译器和解释器将高级语言翻译成汇编语言。汇编器会将汇编语言转换为机器语言。

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

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

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

      例如,让我们以语句a = b + c; 为例,它是将bc 之和赋值给变量a。这涉及以下(通用)低级操作:

      1. 将变量 b 的值从内存复制到寄存器 0
      2. 将变量 c 的值从内存复制到寄存器 1
      3. 将寄存器 0 与寄存器 1 相加,并将总和放入寄存器 2
      4. 将寄存器 2 中的值存储到内存中的变量 a。

      所以这里的比例是 1 行高级语言与 4 行汇编语言。要亲自查看,请使用hello world 程序并打印出汇编语言列表。

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        尽管如此,高级语言的主要思想是您可以使用的抽象(如果您想为数据库实现查询,您并不真正关心汇编级别的优化)。

        历史:第一台计算机(当然是电动的)仅使用汇编语言进行编程。为什么会发生这种情况,为什么不直接用 Java 编程?因为它需要一个从 Java 语言到硬件知道的语言的翻译器,并且该翻译器(实际上,它或多或少是编译器)占用了难以置信的内存量,并且当时可能无法为每个程序执行。

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

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

        所以,你想要掌握的这种关系其实只是计算机历史上编程语言的不断发展。

        【讨论】:

          猜你喜欢
          • 2010-11-18
          • 1970-01-01
          • 2021-03-14
          • 1970-01-01
          • 1970-01-01
          • 2011-02-07
          • 2017-02-20
          • 1970-01-01
          • 2023-03-06
          相关资源
          最近更新 更多