.net是不是用的虚拟机技术?

ztenv
博客专家认证
2008-05-27 10:42:34
最近看到两个对立的观点:
1 认为.net是使用的虚拟机技术,因为由其它语言编译生成中间代码,解释执行,等等.
2 认为.net与java截然不同,不是使用的虚拟机技术,说MS文档早已写明,其实.net运行速度和开发速度已经算是很快了(与C++等相比),之所以感觉慢是因为.net采用了很多出错处理机制和进行了大量的封装.

请各位高手讨论一下吧,谢谢!!
...全文
1127 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzlfe 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 heguo 的回复:]
这么基础的东西本不想参与讨论的,看到有这么多人在那里"猜测",有必要以正视听.
我也不想去找官方文档,只是在这里给那些一知半解的同仁提个醒:
C#编译成即时解释代码,虚拟机载入运行时,会再一次编译成可执行代码.
至于是不是每次都编译,全部编译还是部分编译,编译后放在内存中还是存在磁盘文件里,在载入后立即编译还是边执行边编译,
这是.NET虚拟机为优化性能选择的方案,与程序员无关,微软认为这是和Java虚拟机最大的区别,…
[/Quote]
大拇指
cppfaq 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vrhero 的回复:]
如果稍微对计算机和OS多些了解...就不会有这种问题...

虚拟机是个泛称...首先虚拟机是一种软件...其特征是在计算机硬件层之上的软件抽象层...也就是说它应该是和硬件层无关的...

按照抽象程度的不同一般把虚拟机分为五种...
1.指令集结构层
2.硬件抽象层
3.操作系统层
4.应用层
5.库层

其中硬件抽象层虚拟机和应用层虚拟机是最常见的...著名的VMware和Virtual PC就是硬件抽象层虚拟机...

很明显也是公…
[/Quote]
经典......
WJFSANHE 2008-08-01
  • 打赏
  • 举报
回复
上面的讨论各有各的说法,甚至歪解,提供一个链接,去看看权威的解释吧http://en.wikipedia.org/wiki/Common_Language_Runtime
ztenv 2008-06-10
  • 打赏
  • 举报
回复
看了楼上各位的讨论,貌似明白一些了,谢谢!!!!!!
heguo 2008-06-09
  • 打赏
  • 举报
回复
这么基础的东西本不想参与讨论的,看到有这么多人在那里"猜测",有必要以正视听.
我也不想去找官方文档,只是在这里给那些一知半解的同仁提个醒:
C#编译成即时解释代码,虚拟机载入运行时,会再一次编译成可执行代码.
至于是不是每次都编译,全部编译还是部分编译,编译后放在内存中还是存在磁盘文件里,在载入后立即编译还是边执行边编译,
这是.NET虚拟机为优化性能选择的方案,与程序员无关,微软认为这是和Java虚拟机最大的区别,因为.Net有二次编译过程。
kiraqian 2008-06-09
  • 打赏
  • 举报
回复
.Net Framework技术是一个借鉴了Java成功跨平台经验而研发出的改良的产品,C#语言是微软新研发出来用于.Net平台的高效开发语言。Java虚拟机仅仅是用来解释执行Java开发的应用程序的,而.Net不是,.Net里的CLS和CTS是一种通用语言规范和通用类型系统,通过了欧洲计算机语言规范标准,是一个真正做到可兼容多语言的框架体系。
.Net Framework中的CLR是类似Java虚拟机的功能,把中间代码翻译成本地CPU指令的一种解释器和执行器。但和Java不同的是Java虚拟机更偏重于解释,而.Net有良好的预编译机制,所以运行.Net程序速度和普通C++编写的程序差不多快。
第一次启动.Net程序时速度会相应较慢,而第二次启动就明显很快就是因为.Net中间代码被编译成本地CPU指令并执行后没有及时删除,而是有缓存机制。
对于在.Net平台上开发的程序中创建的类有GC机制控制内存的释放,该机制的算法基本是递归遍历资源释放,但回收周期仍旧不明确的。
radarhp 2008-06-08
  • 打赏
  • 举报
回复

最简单的道理就是真正编译型的语言灭有见过可以反编译到源代码的(先不讨论是否具备很好的可读性)
PB,java都是电信的虚拟机技术的语言(解释型的)所以反编译得很轻松
vc6,delphi这些写出来的东西见过反编译到源代码的吗?
.NET的东西为什么要模糊,因为Reflector的存在……
既然这样子的话,.NET的最多无非就是解释型的一个变种

个人的点滴认识,欢迎大虾斧正……

zhujiechang 2008-06-08
  • 打赏
  • 举报
回复
对,.net存在着大量的数据校验,所以相对系统是安全些。
.net是慢得可以,各方面都慢,因为是中间语言,所以要编译,一般情况下像VC写的,
早运行n遍了,.net还在编译中,:),虽然是方法编译,但是大量的这样编译其实也大大影响性能。
.net其实属于虚拟机技术,ms当然不希望同java比,就像.net能用mono一样,可以运行在Linux上
wwmtv 2008-06-08
  • 打赏
  • 举报
回复
继续关注
怫悰 2008-06-07
  • 打赏
  • 举报
回复
每天回帖
怫悰 2008-06-07
  • 打赏
  • 举报
回复
每天在回帖灌水园回帖能不能的分呀?
somple 2008-06-07
  • 打赏
  • 举报
回复
继续关注
yanmo7 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhouhongyun 的回复:]
因此,第一次启动的.net程序通常是很慢的,而之后启动就没有这么慢了。
------是吗?第一次启动任何程序,在间隔比较短的情况下,再启动第二次,都会比第二次快,这跟是不是.net程序无关,这是由windows的缓存管理特性决定的,如果两次启动的时间相隔比较长,那么第二次启动所需时间仍然很长。 .net即时编译的本地代码只在本次运行期内有效,程序退出就失效。
[/Quote]
两次启动间隔时间长第二次启动所需时间仍然很长是应为系统要加在应用程序文件,而dotnet编译的文件体积都很小,因此一般不存在长时间加载应用程序文件的问题,1M体积的C++文件和100K体积的C#文件加载时间都长是因为C#文件要加载.NET去解释IL。
  • 打赏
  • 举报
回复
因此,第一次启动的.net程序通常是很慢的,而之后启动就没有这么慢了。
------是吗?第一次启动任何程序,在间隔比较短的情况下,再启动第二次,都会比第二次快,这跟是不是.net程序无关,这是由windows的缓存管理特性决定的,如果两次启动的时间相隔比较长,那么第二次启动所需时间仍然很长。 .net即时编译的本地代码只在本次运行期内有效,程序退出就失效。
JackLucifer 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liu_binq63 的回复:]
dotnet不是虚拟机。
我们写的源代码被编译后生成的exe文件不是真正的机器码,而是称为IL的中间语言。
然后在这个exe文件执行的时候,才被clr动态编译成可执行的机器码文件。
[/Quote]

是的,如果我没有记错的话,的确是说程序完成后先编译为IL的,然后在某台电脑上第一次运行时再编译为本地代码。因此,第一次启动的.net程序通常是很慢的,而之后启动就没有这么慢了。
win7cc 2008-06-02
  • 打赏
  • 举报
回复
不是吧 。NET是包含很多类 而JAVA虚拟机不是吧?
huyongzs 2008-05-30
  • 打赏
  • 举报
回复
微软当然希望大家认为dotnet用的是一种全新的技术。所以含糊其辞。
而实际上dotnet和java虚拟机技术很像,但是一个很大的差别就是dotnet运行时靠把中间态文件即时编译
  • 打赏
  • 举报
回复
微软换了名字,就把一帮傻蛋 唬得晕头转向。
.net的追随者总是这么半桶水
AechoJohn 2008-05-30
  • 打赏
  • 举报
回复
学习vrhero。
还想懒够 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zanfeng 的回复:]
很早的MS的开发文档说明。和JAVA的明显区别在于。一个是采用虚拟机一个是编译是不一样的。
JAVA听说很容易被反编译出源码。因为是解释性语言。而。NET是编译型语言。
[/Quote]

.NET也是一种解释性语言,不管是VB.NET还是C#,编译后形成IL,再由.NET Framework去解释的
基本上认为.NET是使用的虚拟机技术
加载更多回复(11)

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧