源代码直接编译成机器语言
❶ java编译器如何实现把原始的代码翻译成目标机的机器语言
Java编译器并没有把源代码翻译为目标机器的机器语言程序,而是翻译成了字节码文件。字节码文件由Java虚拟机解释运行。Java解释器就是Java虚拟机。
Java字节码按照Java语言规范,统一了字节顺序等差异(大端还是小端?CISC处理器和其它的RISC处理器是不同的),对编译器的实现细节也进行了具体规定。这样就可以在虚拟机中执行了。
❷ 请问高级语言为什么不直接编译成机器码,而编译成汇编代码
2.Que:? ACK:1)其中有一个好处是方便优化,因为,编译器也是工具,也是机器,毕竟是机器生成的程序,不可以非常 完美的,而汇编是机器指令的助记符,一个汇编指令就对应一条机器指令(特殊指令除外)调试起来肯定会比 机器指令方便的方便,这样优化起来也方便。 2)高级语言只需要编译成汇编代码就可以了,汇编代码到机器码的转换是由硬件实现即可,有必要用软件实 现这样分层可以有效地减弱编译器编写的复杂性,提高了效率.就像网络通讯的实现需要分成很多层一样,主要 目的就是为了从人脑可分析的粒度来减弱复杂性. 3)如果把高级语言的源代码直接编译成机器码的话,那要做高级语言到机器码之间的映射,如果这样做的 话,每个写编译器的都必须熟练机器码。这个不是在做重复劳动么。
❸ c语言是把源代码转成汇编代码,再转成机器代码,对不对不是直接转机器代码的是不是
不只c,所有语言都是
❹ 用c语言编写的源程序需要用编译程序先编译成由机器语言组成的目标程序,在经过( )后才能得到可执行程序
源代码需经过编译和链接,才可生成可执行文件。
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。 例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
(1)静态链接
在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
(2) 动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。
❺ 能不能把java搞成编译型语言 有没有人设计一种编译器直接把java源码编译为机器指令
1. java已经是编译型语言,因为不编译源程序是没法直接运行的。只不过java是编译成中间的二进制代码,不是最终的机器代码。
2.已经有这种编译器,免费的如gnu的gcj,收费的如Excelsior JET。不过没有太大必要使用,java在运行时也会把中间代码动态优化成本地机器代码,这种优化的结果一般会优于预先编译的结果,因为动态优化可以因地制宜,根据程序运行情况和计算机硬件的状况来动态选择优化策略。
❻ Java代码到底是如何编译成机器指令的
编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?回答这个问题需要参照《编译原理》,总结过程如下:
1)词法分析:读取源代码,一个字节一个字节的读进来,找出这些词法中我们定义的语言关键词如:if、else、while等,识别哪些if是合法的哪些是不合法的。这个步骤就是词法分析过程。
词法分析的结果:就是从源代码中找出了一些规范化的token流,就像人类语言中,给你一句话你要分辨出哪些是一个词语,哪些是标点符号,哪些是动词,哪些是名词。
2)语法分析:就是对词法分析中得到的token流进行语法分析,这一步就是检查这些关键词组合在一起是不是符合Java语言规范。如if的后面是不是紧跟着一个布尔型判断表达式。
语法分析的结果:就是形成一个符合Java语言规定的抽象语法树,抽象语法树是一个结构化的语法表达形式,它的作用是把语言的主要词法用一个结构化的形式组织在一起。这棵语法树可以被后面按照新的规则再重新组织。
3)语义分析:语法分析完成之后也就不存在语法问题了,语义分析的主要工作就是把一些难懂的,复杂的语法转化成更简单的语法。就如难懂的文言文转化为大家都懂的百话文,或者是注释一下一些不懂的成语。
语义分析结果:就是将复杂的语法转化为简单的语法,对应到Java就是将foreach转化为for循环,还有一些注释等。最后生成一棵抽象的语法树,这棵语法树也就更接近目标语言的语法规则。
4)字节码生成:将会根据经过注释的抽象语法树生成字节码,也就是将一个数据结构转化为另外一个数据结构。就像将所有的中文词语翻译成英文单词后按照英文语法组装文英文语句。代码生成器的结果就是生成符合java虚拟机规范的字节码。
❼ 能否将C#代码直接编译成机器代码
很抱歉,这是不可能的。C#语言程序不可能脱离.net框架,就像Java一样,C#语言的运行环境是.net framework,.net对于C#就像Java虚拟机对于Java语言一样。另外,C#是一种有限制语言,.net负责保证代码访问的安全特性,C++是唯一可以允许程序员开发无限制低级程序的语言,.net不仅负责为代码提供运行支持,还负责保证程序的安全性,一种受限制的语言是不能脱离限制程序的控制的,对于C#,.net就是控制系统,因此,C#程序不可能脱离.net环境。
===================================================
对补充的答复:
这恐怕也是不行的。在以往的PE结构的程序中,因为不同的CPU拥有不同的指令集,所以为了适应客户机的硬件的不同,往往会开发一个程序的不同版本,微软为了解决这个问题,在.net中准备了多个即时编译器(JIT),当一个中间语言的程序在客户机上运行时,JIT会根据客户机当前的硬件配置和操作系统等方面的情况对代码进行优化,然后生成本地化的机器代码,这个机器代码并不是全部程序的代码,而是只生成程序运行必须的部分,其它的会在执行时根据需要动态生成。微软官方对项技术的解释为:
“JIT 编译考虑了在执行过程中某些代码可能永远不会被调用的事实。它不是耗费时间和内存将可移植可执行 (PE) 文件中的所有 MSIL 转换为本机代码,而是在执行期间根据需要转换 MSIL 并存储生成的本机代码以供后继的调用使用。当加载类型时,加载器创建存根 (stub) 并将其附加到类型的每个方法。当对方法进行初始调用时,存根 (stub) 将控制传递给 JIT 编译器,而编译器将该方法的 MSIL 转换为本机代码并修改存根 (stub) 以直接执行到本机代码的位置。后面对 JIT 编译的方法的调用将直接进行到以前生成的本机代码,从而减少了进行 JIT 编译和运行代码所需的时间。”(原文)
此外,当一个程序开始运行后,JIT首先开始进行即时编译,当某个被编译过的方法被再次执行时,将直接执行它的本地代码。
希望这些信息对您有所帮助。
❽ 源代码怎么翻译机器语言
编译器做的工作,
源码会先被处理成为汇编代码,然后由编译器根据目标芯片(cup)生成对应的机器码.
❾ 编译程序能直接将源代码转换成目标代码吗
这个中间代码是个必须的步骤,不能省略。打个比方:再怎么先进,也不可能把一只活猪赶进机器里,然后另一头就出来一盘盘做好的菜是吧?