同样的代码比较编译器才有意义
① 编译器有什么用
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
② 同样一段代码,为什么编译器不同会不同结果
这很正常,每种语言的标准只是给出了该语言实现的最小集合,而厂家或者开源社区做编译器的时候,只要遵循这些标准就可以,在此基础上增加的非标准功能,就有可能不一致了。
③ 编译器和解释器的主要区别是什么他们相对于对方各自的优点
解释器是解释执行的源代码,编译器是将源代码编译成目标代码
他们最大的区别是程序运行时需要解释器边解释边执行,而编译器则在运行时是完全不需要的
解释器的优点是比较容易让用户实现自己跨平台的代码,比如java,php等,同一套代码可以在几乎所有的操作系统上执行,而无需根据操作系统做修改;
编译器的目的就是生成目标代码再由连接器生成可执行的机器码,这样的话需要根据不同的操作系统编制代码,虽然有像Qt这样的源代码级跨平台的编程工具库,但在不同的平台上仍然需要重新编译连接成可执行文件,但其执行效率要远远高于解释运行的程序。
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;
而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.
这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)
④ java源代码为什么要编译
你现在电脑里的文件是文档文件确切的说在计算机里也是0和1的序列 但是他和执行程序不是一
个类型的文件 文件是由类型的比如说mp3 是播放声音的 MP4是播放视屏的 TXT是文档文件
就是存储文档的 在回到问题
.java文件其实就和TXT文件一样是文档文件是用来存储你写的代码的
他是拿来给你人看的
你要想让他变成其可执行程序的文件你就得通过编译器编译它
编译器是按照你写的代码把他们翻译成可执行文件的编码方式
然后你就可以运行它了
在计算机看来所有的文件都是0和1的组合 应为文件的类型的不同它会用不同的方式解读它们
具体的java程序。编译。运行等等环节怎么完成怎么解释 你得慢慢了解 或者有时间我在给你解释解释
写的比较乱 你凑合着看吧
⑤ C语言同一段代码,同样的文件,编译器为什么运行结果不一样
一般来说,C语言程序被编译为可执行程序后,每次都输出都是相同的,但有些特殊情况例外,比如,代码中引入了随机变量,并让它出现在输出结果中。
⑥ 同样需要编译器为什么汇编语言比较快
绝大多数情况下,并不是。
事实上除了对CPU工作模式极端熟悉的人,一般人是很难用汇编写出更高效的代码的。
编译器虽然智商比不了人,但是它更精通优化。生成高效的代码需要透彻地掌握硬件的工作模式,每个细节都要考虑清楚。而且这很大程度上是软件更擅长但人并不擅长的繁重无脑又要求极高精确性的机械化工作。
当然专业搞优化的人还是能打败编译器的,因为编译器能做到的人终究还是可以做到。而人要比编译器聪明得多。编译器只能遵循一些规定好的模式进行优化,人可以创造编译器根本不知道的优化方法。某些逻辑靠编译器是没办法生成出来的,只能由人直接用汇编写。汇编语言虽然也要编译,但是一般会和机器指令直接对应,相当于要求CPU在细节上严格按人的思路工作,而高级语言并不能控制太多细节。
⑦ 同样的一段程序,CCS 和 IAR 编译运行的结果不同
优化举个简单例子:int
i;i=1;i=2;i=3;i=4;i=5;i=6;i=7;i=8;i=9;i=10;这段代码会被直接优化成
i=10;连续10次给i赋值,只有最后一次才有意义。前面的赋值没有意义,会被直接优化掉。如果后面i也没有被使用,则变量i本身没有意义,直接优化掉。最后编译出来的代码就是空。进一步,把上面的赋值换成循环int
i;for(i=1;i<10;i++);这段代码也会被优化成i=10;循环相当于连续给i赋值9次,循环里面i的值是多少,是没有意义的,最后循环退出时的i值才有意义,相当于最后一次的赋值i=10;如果后面的程序没有用到i,则变量i本身没有意义,直接优化掉。最后编译出来的代码就是空。谨记:空循环是没有意义的,有点优化能力的编译器,都会将空循完全环优化掉。如果需要延时,请加上volatile,或者调用编译器的延时函数,或者用编译参数禁止优化,或者使用内嵌汇编。总之,不要使用没有volatile的空循环带实现延时,这是不规范的。