我试图真正理解高级语言如何准确地转换为机器代码,然后由cpu执行。
我知道该代码已编译为机器代码,这是CPU可以使用的低级代码。如果我有作业说明,请说:
x = x + 5;
y = x - 3;
CPU是否一次执行每一行?因此,它将首先执行x = x + 5; 指令,然后CPU将执行的下一条指令是y = x-3; 我实际上是想了解执行过程以及我编写的代码实际上是如何由CPU执行的。
我试图真正理解高级语言如何准确地转换为机器代码,然后由cpu执行。
我知道该代码已编译为机器代码,这是CPU可以使用的低级代码。如果我有作业说明,请说:
x = x + 5;
y = x - 3;
CPU是否一次执行每一行?因此,它将首先执行x = x + 5; 指令,然后CPU将执行的下一条指令是y = x-3; 我实际上是想了解执行过程以及我编写的代码实际上是如何由CPU执行的。
Answers:
这些代码行与CPU的执行方式无关。我建议您阅读汇编程序,因为这将教给您很多有关硬件实际如何执行操作的知识。您还可以从许多编译器获得汇编程序输出。
该代码可能会编译成以下形式(以一种汇编语言形式):
load R1, [x] ; meaning load the data stored at memory location x into register 1
add R1, 5
store [x], R1 ; store the modified value into the memory location x
sub R1, 3
store R1, [y]
但是,如果编译器知道不再使用变量,则可能不会发出存储操作。
现在,为了让调试器知道什么机器代码与程序源代码行相对应,编译器将添加注释以显示什么行与机器代码中的位置相对应。
ADD Rx, Rx, $5
和的指令SUB Ry, Rx, $3
(假设x和y变量已映射到寄存器中)。您正在描述一种加载/存储RISC方法。
这取决于。
是的,在真正简单的机器的早期,代码一次只能执行一行。随着机器变得更大,更快和更复杂,您开始看到同时执行多条指令的能力和内存读写操作所需的时间比对寄存器的操作要长得多。
优化编译器必须考虑到这一点,您给出的代码行可以“或多或少”并行执行,其中处理器的一部分用于计算y,而另一部分则存储先前计算的y值。 x(而y的计算使用的是寄存器中的新值)。
Control Data 6600是我所知道的第一台执行这种操作的机器。整数加法花费了300纳秒,内存引用(读或写)花费了1000纳秒,乘法和除法花费了很多时间。根据所需的功能单元,最多可以并行执行十条指令。CDC 6600 FORTRAN编译器非常擅长调度所有这些。
x
是什么?这样,它已经执行了代码并将其存储在缓存中。
您应该在书中仔细阅读详细内容,以找到有关其工作方式的更多详细信息,可能还包括编译器类。
基本上,您的问题集中在2个不同方面。
1)代码如何转换为机器代码?
2)何时/如何使用并行化计算代码?
1)的答案取决于您使用的语言(尽管您的示例很简单,所以输出是相同的)。编译器翻译成机器代码的方式是语言的力量之一。此外,在您的示例中还需要考虑几个问题,代码应将数据加载到内存中,进行存储等。
最后,并行化是一种可以从编程角度考虑的功能,但是总而言之,某些处理器可能会认为某些代码部分可以同时运行,因为它们是独立的。很显然,情况并非如此,因为您需要按顺序执行语句,所以不会,它不会同时运行。