您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 中间代码 >

能否将C代码直接编译成机器代码

发布时间:2019-07-21 03:01 来源:未知 编辑:admin

  我们知道.net上运行的所有程序在编译时候都会先编译成一种“中间语言”,我想问的就是,能否将C#代码,编译成脱离.net运行环境的机器码?我想应该可以的吧?不知道哪位能告诉我如何将...

  我们知道.net上运行的所有程序在编译时候都会先编译成一种“中间语言”,我想问的就是,能否将C#代码,编译成脱离.net运行环境的机器码?

  那么可不可以在.net平台环境下将C#先编译成机器码?比如说:在一个按装了.net Framework 2.0的平台上的一个C#开发的.exe程序, 因为我们知道此时的.exe里面仅仅只是一种中间语言,他在运行前必须被.net编译成本机的机器指令,那么可不可以将他事先编译成机器码,而省去翻译中间语言这一步骤呢?这样的话,代码的运行速度会更快。展开我来答

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  展开全部很抱歉,这是不可能的。C#语言程序不可能脱离架,就像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首先开始进行即时编译,当某个被编译过的方法被再次执行时,将直接执行它的本地代码。

  c#语言是基于架的语言;编译c#源代码生成的exe文件只能运行在支持.NET框架的平台上;一旦离开了.NET框架,c#语言就成为无源之水。

  但是,不排除出现基于c#语言的新的编程工具(例如c++和c++ builder这两种编程工具),那时或许可以用这种新的编程工具将c#语言直接编译成机器代码。

  既然.NET是一种框架,那么就具有框架的通性(可以参考一下字典中“框架”的含义),我个人认为框架可理解为:有一定的约束,有一定的规则,相对的一成不变,好像很呆板的样子。.NET允许使用多种编程语言,这就要求各种语言在.NET框架中必须遵循一套相同的规则,C#作为其中一种编程语言也要遵循这样一套规则,这套规则具体体现在.NET框架的各个层次(各个层次就不详细列举了),我们可以体会一下;C#编译后只能生成中间代码的exe,当其运行在支持.NET框架的平台上的时候,由框架中公共语言运行时这一层次将其转换为该平台上的机器语言;.NET框架必须有将中间代码转换为机器代码这一步骤,这就好像框架的呆板的性质一样,当然也正是这种呆板使得跨平台得以实现。

http://cemonstyle.com/zhongjiandaima/401.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有