在c# 高级编程中,讲到编译为中间语言就可以获得.net 平台无关性。我困惑的是(见补充问题)
答案:3 悬赏:20 手机版
解决时间 2021-04-12 08:34
- 提问者网友:浪荡绅士
- 2021-04-12 05:43
编译成中间语言后,还需要 CLR 把这个 中间语言 编译成为.net 平台专用的代码,这个CLR (。net 运行库)难道不是.net 特有的执行环境吗?难道这个中间语言可以跑在任何平台上吗?其他平台怎么认识这个中间语言啊? 为什么编译为中间语言就与.net 平台无关呢?这不自相矛盾吗?
最佳答案
- 五星知识达人网友:夜余生
- 2021-04-12 07:05
你好!
首先.net其实也是一种规范,基于COM+的规范,就像风靡一时的COM思想!不扯了
You are right!凡事无绝对,平台无关性也是相对某种意义上的。。。
首先你编写c#程序,编译成MSIL中间语言程序之后,运行经由CLR管理(所谓“托管”),不论目前的CPU是什么型号,哪个厂家生产的,不论目前的操作系统是哪个公司生产的都可以运行!
这样你就会问了,你不能在MAC或者linux上面运行,只能在windows上运行,而且还需要装net framewok,那这还叫什么平台无关性!
所以这里的平台无关性是指,你只需要编写一次代码,不用考虑目标平台的因素,之后只要目标平台装有“CLR”,就可以运行。如果希望能够在MAC或者linux上面运行,那么必须有人按照微软.net的规范去开发对应的CLR,比如linux的开源项目Mono!
CLR在托管运行该程序的时候,会针对目标平台和系统进行一些优化和“翻译”,形成一个二进制输出流给CPU去执行~
所以跟Java虚拟机的思想类似(java因为有linux版本和windows版本等,所以在对应系统上同样的程序可以运行),这些平台无关性指的是 “Once written, run anywhere!"这个意义上的。。。
我的表达能力不好,请见谅!
你可以去看看 .Net SDK中的一些头文件等,可以多少了解一些CLR,其实就是用COM+的思想,使用低级语言(c++)编写的一些核心的DLL,比如mscoree.dll等.
首先.net其实也是一种规范,基于COM+的规范,就像风靡一时的COM思想!不扯了
You are right!凡事无绝对,平台无关性也是相对某种意义上的。。。
首先你编写c#程序,编译成MSIL中间语言程序之后,运行经由CLR管理(所谓“托管”),不论目前的CPU是什么型号,哪个厂家生产的,不论目前的操作系统是哪个公司生产的都可以运行!
这样你就会问了,你不能在MAC或者linux上面运行,只能在windows上运行,而且还需要装net framewok,那这还叫什么平台无关性!
所以这里的平台无关性是指,你只需要编写一次代码,不用考虑目标平台的因素,之后只要目标平台装有“CLR”,就可以运行。如果希望能够在MAC或者linux上面运行,那么必须有人按照微软.net的规范去开发对应的CLR,比如linux的开源项目Mono!
CLR在托管运行该程序的时候,会针对目标平台和系统进行一些优化和“翻译”,形成一个二进制输出流给CPU去执行~
所以跟Java虚拟机的思想类似(java因为有linux版本和windows版本等,所以在对应系统上同样的程序可以运行),这些平台无关性指的是 “Once written, run anywhere!"这个意义上的。。。
我的表达能力不好,请见谅!
你可以去看看 .Net SDK中的一些头文件等,可以多少了解一些CLR,其实就是用COM+的思想,使用低级语言(c++)编写的一些核心的DLL,比如mscoree.dll等.
全部回答
- 1楼网友:不想翻身的咸鱼
- 2021-04-12 09:58
CLR确实是.net特有的,只是.net平台上叫CLR而已。java上也有JRE,功能和CLR很类似。只不过java平台没有那么多语言罢了。
.net的多语言机制是建立在CLS上的,即公共语言规范。这是一个限定规范,它将现行的.net所支持的语言都是符合这个规范的。不然怎么会和中间语言相关呢。
.net平台上的中间语言叫做MSIL(微软中间语言),这种语言类似汇编语言的语法,如果你是程序员,你是绝对不会想去看这样的代码的。一个赋值的操作能写7,8行。而MSIL是.net平台特有的,在net平台上执行的代码都是MSIL。
所有支持.net平台的语言最终都会编译成为MSIL,然后再有.net平台执行这些代码。而编译的过程就是由CLR执行的。这也是编译型语言和解释性语言的区别之一!!
- 2楼网友:撞了怀
- 2021-04-12 08:35
using system;
namespace consoleapplication1
{
class program
{
static void main(string[] args)
{
console.writeline("请输入一个日期:");
var str = console.readline();
try
{
var day = datetime.parse(str).dayofyear;
console.writeline("输入的日期是第" + day + "天");
}
catch
{
console.writeline("输入的日期有误!");
}
console.readkey();
}
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯