❶ 编译器是将高级语言编译成汇编语言吗
一般的编译器,是先将高级语言转换成汇编语言(中间代码),然后在汇编的基础上优化生成OBJ目标代码,最后Link成可执行文件
❷ 反编译程序,是把所有的高级语言,变成机器语言还是汇编语言
编译程序
是把
高级语言
变成汇编语言,进而变成
机器语言
,让机器执行,是一个从高级到低级的过程。
反便宜程序是把机器语言变成汇编语言,是一个从低级到高级的过程。
❸ 任何高级语言都是编译成汇编代码然后运行的吗
编译器,是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能识别,运行的低级机器语言的程序。编译器将源程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源程序一般为高级语言(High-level language),如Pascal,C++等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。一个现代编译器的主要工作流程如下:
源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables])工作原理
翻译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器言)。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。典型的编译器输出是由包含入口点的名字和地址以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。
肯定是要先编译成机器码,计算机才能识别。
❹ 高级语言编译后产生的是汇编语言还是机器语言
这个不一定,可以是汇编语言,也可以是机器语言,如果你用过Linux上的gcc你就明白了。如果编译完成,链接后,能运行肯定是机器语言。另外一种情况是:如果是Java或VS支持的语言,编译后,即不是汇编语言,也不是机器语言,而是一种供运行时环境识别的中间语言。
❺ 按理说高级语言编译后都成了机器语言了,那哪里来的不可移植性呢
据我的理解,正是因为高级语言最终要编译成为机器语言,才会有移植性的问题。可移植性通常指的是源程序代码来说的,而不是指它编译成的可执行代码。
高级语言的特点就是指令和最终的可执行代码的可读性,最终还是要编译成机器语言,这样计算机才会“理解”。而由于计算机硬件的千差万别(比如,同样的CPU,由于架构的不同分为好多种不同的指令集),如果你用在A硬件上才有的指令在B硬件上执行,那么结果估计不会让你得到满意的结果。
在不同的硬件上执行相同的高级语言的代码,这些针对不同的硬件差异,有针对性的编写相对应的计算机能够正确“理解”并执行的指令工作,这些都要靠编译器去解决。
❻ 汇编语言有标准,高级语言一定会转变成汇编语言吗
1、不一定
要求编译后生成*.exe文件的都会先转成汇编语言,然后汇编成*.exe
解释语言就不会转成汇编语言,例如Java就生成*.class,然后解释执行
2、没有实质性区别
3、汇编语言由机器语言发展而来
开始人们是直接用机器语言编程的,后来有人编出了汇编程序,就可以直接用比较易用的汇编语言写程序。汇编程序负责把汇编语言写的程序转换成机器语言(*.exe)
❼ 高级语言经过编译
高级语言要执行须经过以下步骤:
高级语言——》汇编语言——》机器语言(0和1的代码)
高级语言通过编译其编译成汇编语言,如:
c = a + b;//高级语言
add $s1 $t1 $t2 ; //汇编语言
再由汇编程序转换成二进制代码,如:
000000 10001 10010 01000 00000 100000
注:每条汇编语言都有唯一的机器语言与之对应
在翻译成机器代码后就要把机器代码与原文件 链接 加载 于是就运行了
❽ C语言中高级语言通过编译器得到的是汇编语言吗
不是哦,编译得到的结果是二进制可执行文件,要得到汇编源码还需要对其进行反编译
❾ 高级编程语言也要编译成汇编语言,不同的cpu汇编语言不一样,那会编译成那种汇编语言呢
高级语言一般最终不是编译成汇编语言而是机器语言,而像C#这类语言编译后为公共语言,不是机器码,运行时公共语言代码由NET框架负责进一步即时翻译即时执行为机器指令。只有C++这类语言编译后为CPU可以直接执行的机器码。
附图是VS2019中C++语言的一段调试时的反汇编窗口,其中白字是C++源代码,下面是对应的汇编码,汇编行左列为内存地址,中间是对应的机器指令和数据(内存中的实际值),右侧是对应的汇编码。
比如,定义整数变量a并赋值1的语句,被编译器编译成C7 45 F8 01 00 00 00 这样几个字节,其中C7为汇编码中的MOV指令,可以操作16位寄存器和内存以及立即数,45 F8 是当前命名空间中变量地址,即变量a的地址(F845),而01 00 00 00 为32位宽度的数值1(内存排列顺序是前低后高)。也就是说机器语言的指令格式为:指令代码,地址,数据,当然根据不同指令,有时候地址和数据是不需要的。而右侧 MOV dword ptr[a],1 是指令助记符,也就是汇编指令,而用汇编指令编写的程序也是需要编译成机器指令的。
指令C7对应的汇编码及含义
❿ 从编写高级语言到机器语言总共要编译几次编译出来的语言各是什么
二次,第一次是将高级语言翻译成汇编语言,然后在将汇编语言编译链接成机器语言。其实编译是只有一次。希望我的回答能让你满意