可能又有人要骂我做这种无聊的比较,诚然,我也非常清楚,语言只不过是工具罢了。
但是,我觉得还是很有必要为像我一样的在各种语言之前徘徊的初学者,指明一下各种工具的优缺点,这样才能使我们选择一个适合自己的工具,使学习的效率达到最大。
在开发应用软件的过程中,使用c++开发的效率要远远低于C#和Java
在系统底层的开发过程中,c++又不如c
请问复杂的c++的优点到底在什么地方?让人晕头转向的多重继承,虚继承,在实际的开发过程中,到底能不能发挥作用。c++引以为自豪的泛型,不是在Java和C#中得到了很好的应用?
C++是否显得有点不伦不类?
各位大侠,是什么驱使你们投向C++的怀抱?忘不吝赐教,为小弟解惑
在下并没有丝毫批判C++的意思。
灌水灌水……
1、C# 和 Java 都需要附带一个虚拟机的累赘
2、C++ 可以直接操作 C 的接口
3、C++ 提供了超越 C 的抽象能力
4、当实际开发的时候可以有选择的使用部分 C++ 的功能。C++ 提供了选择的余地而不是功能的限制
5、一旦学会 C++ 的大部分,学习 C# 和 Java 就显得……嘿嘿
个人爱好,就是喜欢,没办法。
学好C++ 走遍天下都不怕
学习C++你不仅仅学的是一种语言,你也不要限制在这里,你学的一个语言的思想,这个思想是大多数情况下是通用,这才是最重要的。当你有了经验,有了思想,你就知道在什么时候用什么语言,不可能所有的场所都用一种语言,
好了,之所有要学习C++,是因为:一种这个C++能力正好wolf0403说的那样。而且还不止这里,你深入进去了就知道了:
另一种C++反应和实践了这些思想,包括用C++开发。
所以个人认为C++是必学,学好了,C#,java只要下点努力,很快上手,以后再出现什么语言,只要思想一样,就没有什么难度。就和学API一样。
对自己要有信心。
C==》C++==》C#||JAVA
又有多少人是为了学C++,而学C++?
我看大多数都想转到c#和Java吧,C++能给你的思想,难道不能通过Java和C#获得?
// c++比你认为的“思想”可要丰富多了,这些东西不是java,c#能给你的。
想转到C#和Java的,就没有必要走这种弯路了吧。
1、C# 和 Java 都需要附带一个虚拟机的累赘
//虚拟机难道就是累赘,那这项技术为什么还存在?
当然是累赘。效率很低。不要说硬件便宜了,硬件发展是跟不上人们对软件需求的。同时,别现在的虚拟机,稍微说难听点,就是把你绑在那颗树上,你是没有自由。
2、C++ 可以直接操作 C 的接口
//如果直接用C,还要一个多余的接口干什么?
当然需要,除非你只写c。
3、C++ 提供了超越 C 的抽象能力
//C++难道比C#和Java还抽象?
oo方面差不多。从语言核心讲,c++要精简一些。不像c#,java,有些东西是没必要在语言层面提供的,用类库就搞定。再看看gp,你就知道什么是更高层次的抽象。
5、一旦学会 C++ 的大部分,学习 C# 和 Java 就显得……嘿嘿
//有大多数人是为了学C#和Java才学C++的吧,何必走这种弯路?
我所知道的情况,很多人是觉得,即使对java,c#很熟悉,但是还是认为c++才是真正的王,还是得面圣的。如果你认为是弯路,也由得你。毕竟c++本来就是自由的。
支持~~~
这个有什么好讨论的嘛 一个东西既然存在就有他存在的理由 每个语言都有他自己的优缺点 与其在这里争论这些还不如专攻一门语言
===============================
CSDN小助手 是一款脱离浏览器也可以使用csdn论坛的
软件!
界面: http://qqwwee.com/
下载: http://qqwwee.com/csdn.rar 包含源代码
我最早学 C#,做过些东西,非常有心得,在我们那儿片算是老大。
后来学 JAVA,感觉 JAVA 就象是 C# 的哥哥,优雅、稳重。
最近开始学习 C++,让我感受最深的一句话就是:“这是一个让人兴奋的语言。”
真是兴奋啊,都快受不了了!我买到一本最好的书,生怕看得太急、太快了,我得不断强制自己“到什么什么日子之前只看这几章……”
有几种语言你是不能在其中做比较和选择的,我听说过很多人都学习了多种语言。即便你目前只有能力去学习一两种,心里也要有个准备,有些东西将来也要去学习。
如果没有一点编程经验,从 JAVA 入手是个不错的选择,JAVA 的语法是最简单的了。如果想尽快能做些东西,C# 会容易些。C++ 稍稍困难些,这也是它让人兴奋的一个原因。
不怕楼主笑话,楼主提到的三门OO的语言,兄弟也算是都用过一段时间了,但感觉还是无法回答楼主的问题,真的,越想说越不知道从何说起。
其实这三种语言及其相关技术都足以让人废寝忘食,但说到最爱,对我来说恐怕还是C++。
如果楼主非要问我的建议,那建议还是从C++学起吧。
如果非要问理由,似乎没有明确的理由,就是一种感觉。当然,你可能需要比别人付出更多。
至于楼主问的C++的一些特性能否在实际工作中发挥作用,答案都是肯定的。
不过楼主后来提出的几个具体的小问题倒是挺有意思的,不妨说说偶的看法:
1、C# 和 Java 都需要附带一个虚拟机的累赘 //虚拟机难道就是累赘,那这项技术为什么还存在?
虚拟机的确不是累赘,C++编写的程序直接跑在操作系统之上,而操作系统本身就是一个虚拟机。所以大家只是虚拟的层次不一样而已。C#和Java由于跑在了操作系统之上的虚拟机上,而上层的虚拟机能够提供比操作系统接口更高的抽象,所以许多事情做起来也容易得多,比如C#和Java更容易把OO带到目标文件格式中,从而进一步带到运行时。而C++编出来的东西都是PE文件,为了把OO进行到下层,COM在这方面做了好多努力,但路也走得很辛苦。
2、C++ 可以直接操作 C 的接口 //如果直接用C,还要一个多余的接口干什么?
C++就是这样,对下没有丧失灵活性和效率,对上又有丰富的抽象能力。
3、C++ 提供了超越 C 的抽象能力 //C++难道比C#和Java还抽象?
我感觉C++的抽象能力至少不比C#和Java差。
5、一旦学会 C++ 的大部分,学习 C# 和 Java 就显得……嘿嘿//有大多数人是为了学C#和Java才学C++的吧,何必走这种弯路?
学好了C++,学C#和Java会容易一些,但学C#和Java的目的通常却不在于语言本身,大家都想能够在.net平台或者J2EE框架下做点事情,所以从这个角度上说,C++也帮不了多少忙。
其实说多了都是废话。
就是喜欢,没办法。有的语言,一旦工作中用不着了,哪怕暂时用不着了,就想搁置一边,但C++不是的,至少对我来说。
可能每个人的喜好也不一样吧。以后C#和Java的应用只能更广,这一点毫无疑问。所以楼主要么还是学它们去吧。相比而言,C#的特性更丰富一下,毕竟是踩着巨人的肩膀走上去的,而Java跨平台性好。当然,从.net的规范里你也丝毫看不出有什么理由能阻止.net跨平台,这里恐怕只是商业因素。
其实脚本语言也应该至少掌握一门,很有好处的。
飘过。。。
学习C++就是你为自己打好计算机软件开发基础的最佳方法。
我的推荐是在Linux下面学习C,C++。你会对C,C++有更深的了解。
各位大哥,我是学计算机科学与技术的 本科毕业生
以前没有工作没有怎么好好学
在我工作之后,我发觉了我的专业的重要性
开始出发点是赚钱,我重新选择了我的发展方向,在这个方面有的人建议我学习java或者.net
但是我是比较保守的人 也可以用楼上的大哥说的 开始是想学习c++再转到java.c#吧
但是我接触了c++后 发现我确实喜欢这门语言,在学习上从来就没有过喜欢什么知识的时候
这是头一次 虽然我看不太懂我的那本书 但是我还是喜欢看 感觉就是在学习领悟一门艺术
而不单纯是挣钱的工具,c++可以很简单,也可以很复杂。到现在为止,虽然还有很多不明白的
但是我想我永远也离不开它了
看了各位大哥的帖子才知道我不懂的还有很多很多 希望我不会的问题在这里提出来各位大哥能帮助我
先谢谢啦
做系统软件就用c/c++,c++基本可以条用任何平台的API,一个字:爽!
喜欢用指针。
回复人:steedhorse(晨星) ( 两星(中级)) 信誉:123 2005-9-8 20:48:37 得分:0
C++编写的程序直接跑在操作系统之上,而操作系统本身就是一个虚拟机。
================================================================
看来你根本就不懂什么是“虚拟机”。
C#和Java由于跑在了操作系统之上的虚拟机上,而上层的虚拟机能够提供比操作系统接口更高的抽象,
================================================================
“抽象”是由应用框架来提供,而不是虚拟机。
应用框架可能运行在虚拟机中,比如Java类库和J2EE之类;
也可能根本不运行在虚拟机中,比如.net AF。
为了把OO进行到下层,COM在这方面做了好多努力,但路也走得很辛苦。
================================================================
COM接口并不是真正的OO。
从.net的规范里你也丝毫看不出有什么理由能阻止.net跨平台,这里恐怕只是商业因素。
================================================================
你根本不了解.net的结构,看我的第二条回复。
to: xuleicsu
有时间看下,《C++语言的设计和演化》
DelphiGuy: 跟晨星讨论问题之前请去读更多的数,尤其推荐 "Structured Computer Organization" 2nd Edition by Andrew S. Tanenbaum。这本书可以告诉你什么叫做虚拟机,什么叫做抽象。
虚拟机是个广义的概念,相对于“裸机”,操作系统就是个“Virtual Machine”,我是这么认为的。有了操作系统,你就只需要跟系统API打交道,而不需要每写一个程序,都要先写一个驱动。
但程序最终是肯定跑在硬件上的,包括输入、输出和处理。这难道不是一层虚拟机么?
DelphiGuy : 回去好好看看书吧。-_________-!
To:DelphiGuy()
首先谢谢你的批评。
虚拟机是个广义的概念,相对于“裸机”,操作系统就是个“Virtual Machine”,我是这么认为的。有了操作系统,你就只需要跟系统API打交道,而不需要每写一个程序,都要先写一个驱动。
但程序最终是肯定跑在硬件上的,包括输入、输出和处理。这难道还不算一层虚拟,一层抽象么?
我知道这里的“虚拟机”跟“Java虚拟机”不是一个概念,而且根本不是一个层次上的概念,而且这一点我已经提过了,何况后者只是个具体的产品而已。但远在Java出现之前,“虚拟机”这个名词已经被大量使用了,你可以查查各类操作系统方面的书籍,包括比较老的。
我承认自己对.net平台了解远不如我对C++的了解,可能某些措词也不严谨,还请多指教。但如果说.net绝对不可以跨平台,那么Mono项目算什么?难道偶被他们骗了?以下是他们官方网站上自己的介绍:
Mono provides the necessary software to develop and run .NET client and server applications on Linux, Solaris, Mac OS X, Windows, and Unix. Sponsored by Novell, the Mono open source project has an active and enthusiastic contributing community and is positioned to become the leading choice for development of Linux applications.
还有,偶也没说COM是真正的OO。当然,这是因为偶根本不知道怎样定义“真正的OO”。
不过你也没说偶说过COM是真正的OO,这个问题无聊,就此打住吧,嘿嘿。
青菜和萝卜哪个好吃???
別的不清楚,但目前广泛使用的操作系统不能当作虚拟机看。
c++编译出来的程序是直接运行在硬件上的,看编译后的汇编代码,是直接运行在X86上面的。
操作系统只是起到了很小的辅助作用。
Windows NT 家族都是使用“虚拟”内存,又有什么硬件“抽象”层。而以后的长牛角已经无法与框架分开了。
因此,我觉得 NT 多少也有些虚拟成分在里边,而长牛角当然就有更多的虚拟成分了。:)
突然看到有人说OS不是VM。
To:doway(john)
你还是想多了。^_^
“操作系统是不是虚拟机”,这个问题的答案是肯定的,不用拿跟CLR捆绑的Long Horn做例子,就连DOS都是。这是由操作系统的功能决定的。如果不能隐藏硬件细节的差异,从而对上层应用程序虚拟出一个统一的接口,那就是一个很槽糕的操作系统。
关键问题是这个“虚拟机”跟“Java虚拟机”里面的虚拟机既有联系,又有区别,毕竟不是一个概念,更不是一个层次上的概念。联系是他们都完成了隐藏底层的差异从而对上层提供统一的接口;不同的是:操作系统虚拟了硬件及体系架构的差异,而JVM虚拟了操作系统,当然,也有体系架构的差异。
TO: steedhorse(晨星) (双星)
这两天读了不少你的贴子。:)
感觉总是写得长长的……,俗话说言多必失啊,难免就会有些说不清楚的东西在里边了。我觉得持否定态度的人应该是更认真读了你的贴子的人。我很少持否定态度,因为我不总是有耐心仔细去读。
To:doway(john)
谢谢你,以后少说话,多看书。:)
某些人依据什么认定操作系统就是虚拟机?
屏蔽硬件相关性、为应用程序提供统一的接口这并不能叫做“虚拟机”。
如果这样定义,
APIs也是应用程序的“虚拟机”了?,
一个应用程序为其他程序提供服务也是“虚拟机”?
这只能叫做“service”,提供服务的就是“server”。
Virtual Machine的最重要特点是要能提供一个machine。
在它的应用程序看来,这个machine是一个完整的、独立的、是它可见的全部的世界。
看看美国传统词典对VM的解释:
virtual machine
n.Computer Science 【计算机科学】
A computer designed to replicate copies of its entire hardware-software interface so that two operating systems can be run on a single computer.
虚拟计算机:设计用于复制整个软硬件接口拷贝的计算机,以便两种操作系统能在一台单机上运行
VM要能够完整运行它的应用程序,应用程序不能穿透VM去接触VM之外的东西。
而一般的操作系统,除了加载应用程序和提供APIs服务层之外,应用程序的大多数指令都直接运行在真正的处理器上。
这种鱼网一样的东西怎么能叫做VM?
连PHP、perl解释程序都比一般操作系统更有资格称之为VM。
我并没有说JVM才是VM,
象游戏模拟器、20多年前出现的UCSD-P Pascal系统都可以算是VM。
虚拟机能够提供比操作系统接口更高的抽象?
“比操作系统接口更高的抽象”是由VM提供的吗???
J2SE、J2EE这些应用框架是由JVM提供的吗?
错。
这些只是运行在JVM中的应用程序,而且并不是100%的java byte code,还有5%-10%的native code。
而.net的CLR、FCL、WinForms连虚拟机代码都不是,他们本身是Windows APPs/DLLs。
JVM虚拟了操作系统?
JVM只是一个java byte code解释器。
它加上辅助软件诸如java类库、J2SE/J2EE应用框架之类的才能运行应用程序。
我并没有说.net环境绝对不可移植。
但是在通常意义上,.net环境是“不可移植”的。
其实我在以前的若干个帖子中都说过了,
这是由于.net环境与Java环境的本质不同造成的。
在Java中,JVM基本上是一个“唯一”的根,
只要移植了JVM,移植工作就完成了90%以上了。
而在.net环境中,MS ILVM只是整个环境很小的一部分,
它的服务层CLR、FCL、WinForms等等本身都是Windows应用。
要移植.net环境,
并不仅仅是重新实现MS ILVM,
把CLR、FCL、WinForms这些东西的二进制文件拷贝过去就可以用的。
整个都要重新实现,
基本上等同于重新实现Windows吧。
我理解ms这样做的原因:
1. 减少工作量;
2. 加快运行速度;
3. 也可能有蔽帚自珍的味道吧。
至于Mono,那是完全重新实现的,仅仅是功能类似而已,与ms毫无关系。
比如我们说Linux是“类Unix操作系统”,并不意味着Linux是某个Unix的移植版本。
事实上,它与任何Unix的源码和二进制代码都没有关系。
To:DelphiGuy
首先不得不佩服和羡慕你广博的知识面。
的确,按照你的定义和理解,操作系统不能算是个VM,因为它是个“渔网”。在许多情况下,应用程序可以透过它,甚至故意透过它去做恶意动作。
不管怎样,感谢你让我对虚拟机有了更新的认识。
我对操作系统的理解,主要来自于有着些许传承关系的两个人,一个是Andrew S. Tannenbaum。他在他的许多本书中提到了虚拟机的概念,《Operating System:Design and Implementation》一书中提到了。手边一时找不到原文,电子工业出版社的译文是这样的:
……许多年以前人们就认识到必须找到某种方法将硬件的复杂性同程序员分离开来。经过不断探索和改进,目前采用的方法是在裸机上加载一层软件来管理整个系统,同时给用户提供一个更容易理解和进行程序设计的接口,这被成为虚拟机。这样一层软件就是操作系统。……
另一个就是上面这本书的译者之一,上海交通大学的尤晋元教授,他在他的《Unix操作系统教程》一书中写到:
一般而言,设置操作系统的主要目的有两个:
第一个目的是将裸机改造成一台功能更强,服务质量更高、用户使用起来更加灵活方便、更加安全的可靠的虚拟机。……
而现在,按照你的定义,要把其所构成的平台之上所有程序的所有动作全部包揽的“一揽子代理商”,才能算是个虚拟机,否则就不算。
看来要么是大家概念的不同,要么也只能遗憾地说“大师也会犯错误”了。至于我个人,可能是需要静一静,重新整理一下自己这么多年的认识了,呵呵。
不过我们大家都可以再考虑一下,操作系统除了“直接透过”了那些实在没必要进一步管理,实在没有必要进一步翻译的CPU指令,比如MOV,ADD等等,还透过了什么呢?通常连地址空间都是虚拟的,更不用说设备文件,标准I/O。而即使那些无法进一步翻译的指令,其执行流程还经常被操作系统强行打断。中间隔着操作系统这么个待定义的“??机”,应用程序还能说啥呢?
我对Mono项目理解得不深,只是看到过一些相关的报道,比如他们为实现.net GUI所做的不懈努力。但我不认为“基本上等同于重新实现Windows”。
在逻辑上,你似乎倾向于认为.net平台的虚拟机仅仅是那个名字被显式地成为“ILVM”的东西,而CLR,甚至WinForm都是和FCL在同一个级别上的。所以用“并非仅仅需要移植ILVM”来显示跟JVM的不同。难道分工更明确了就必须这样比较吗?我不是说他们一定相同,但他们毕竟组件的分工不完全一样,所以,不能简单的把JVM跟ILVM来类比,而其他的所有都跟Java Lib来类比,从而说明这种移植都多么的不一样,即使事实上是很不一样。还有,Java的lib也是不能跨系统简单拷贝的呀。
Mono与MS没有关系能说明啥呢?按照MS的某个规范来实现一套东西就必须跟MS产生很大的关系么?
至于说是移植,那么难道Linux的JVM就是Windows JVM的移植吗?是否都看成是独立实现更好呢?
还有,你找到的美国传统词典对VM的解释,偶还是没完全看懂。但感觉似乎与我们说的都不一致。
.net平台所包括的的确更广泛,VC 2003.net编出来的完全unmanage code也都可以纳入.net的范畴,但我觉得我们现在不是要辨析这些问题。
还有,你一直在针对那句“而上层的虚拟机能够提供比操作系统接口更高的抽象”,上面有位朋友说得对,这就是言多必失吧,呵呵。
我想表达的意思是这样的:基于上层虚拟机平台上的应用程序开发,相比直接基于操作系统之上的程序开发,在某些方面,比如OO,有着先天的便利。一个C++类一旦编译成了目标文件,所有的封装、继承信息就都没了,不像.net dll或者java class那样,他们针对自己定义的平台上而专门设计,在运行时还能进行几乎是为所欲为的反射。也正因为此,C++一旦离开了.h文件和.lib文件,几乎就寸步难行。COM和ActiveX只是做了些许努力,但无法做实质性的改观。
还是 Andrew S. Tannenbaum,在他的 Structured Computer Organization 2/e 中,chapter 6 "The Operating System Machine Level" 中有这么一段:
There is an important difference between the way the operating system machine level is supported and the way the conventional machine level is supported. ... Most of the operating system machine levels instructions are also present at the conventional machine level. We will call these instructions the "ordinary" level 3 instructions, because they include such ordinary operations as arithmetic, Boolean ops, shifting and so on. We will call the other level 3 instructions (those that are not present at level 2) OSML instructions...
Although it would be possible to have the operating system interpret all level 3 instructions, doing so is neither efficient nor necessary. The ordinary level 3 instructions can be interpreted directly by the microprogram....
其实晨星老大已经说过这些东西,我算是提个佐证吧。
继续根据 OS 的『渔网』性质怀疑 OS 作为 VM 一种的,可以致信 Andrew S. Tannenbaum 进行质疑。
至于 Delphi 老兄给出的 VM 定义,看起来更像是 IBM VM/390 或者 VMware 的介绍。
继续旁观学习……
OS通常都是虚拟机,UNIX的编码机制就是建立虚拟机管理机制。汇编语言编写的许多程序大多数也是建立在虚拟机的基础之上的,当然,单板机可以除外。只要你使用了BIOS或微码调用,你就在使用虚拟机所提供的服务,在DOS里,INT 21H中断调用其实就是典型的虚拟机访问,如果没有虚拟机技术,我们现今的许多程序都会变得异常庞大而且不稳定。
使用虚拟机技术是为了简化一些共通的操作,好让机器工作得更有序些,Java的虚拟机,也是寄希望于建立不同平台运行的Java解释器来实现跨平台的目的,但这直到今天也仅仅是个梦想而已。
真正跨平台的语言,我个人认为,并不是什么Java,而是C/C++这样的语言,如果构架的好,可以在任何平台上运行。其它的语言,就很困难了。
关于虚拟机的定义,我认为把各种服务层都叫做“虚拟机”未免可笑。
至于你说的某些操作系统书中的说法,我看叫“抽象机”更恰当一些。
我还没有看到权威的操作系统书籍中有这种说法,应该理解为一种比喻,而不是对“虚拟机”的定义吧。
至于.net环境为什么难以移植的原因,我前面已经说过了。
说得更简单一些:
.net环境的大部分服务层是用Windows可执行代码实现的,而不是虚拟机代码。
所以移植的工作量是相当大的。
Mono,就我所知,现在还没有实现WinForms,所以还不能支持GUI。
Java的类库,大部分是用Java代码实现的。
.jar文件是可以直接复制使用的,
而awt.dll、net.dll等等这些东西是涉及到具体操作系统的调用接口,
当然是不能直接复制使用的。
《Operating System:Design and Implementation》这本书算是操作系统的经典教材。
看来对“虚拟机”的定义有几种不同的层次。
不过我坚持我的看法:
对“虚拟机”概念过于宽范的使用是不恰当的,只会导致概念混淆。
我觉得一个完整的OS和某种具体的服务程序,或者服务层毕竟还是质的区别,而且我觉得这种质的差别也不仅仅是集合和元素的差别。
至于是否可以找到一个角度,从这个角度上看OS仅仅是一套服务程序的集合,这个一时也想不明白了。不想了,呵呵。“服务程序”本身似乎还有广义与狭义之分呢。
而对于那些原封不动的交给CPU执行的指令,我也更倾向于废人所给出的片段中所解释的,尤其是那句:“Although it would be possible to have the operating system interpret all level 3 instructions, doing so is neither efficient nor necessary.”
通过讨论,我也已经基本了解你对“虚拟机”这个词的内涵外延的看法。而且我觉得,按照你的说法,似乎一个虚拟机必须首先是个解释器。否则,它如何包揽应用程序的一切动作,成为它的应用程序可见的全部呢?这一点,我还是保留自己的意见。
再有就是我觉得从你的理论上,一个东西要成为一个虚拟机,它甚至未必需要对上“简化和统一”,哪怕它使得程序的开发更加复杂和繁琐,理论上也并不影响它是一个虚拟机。从这个角度想,似乎也有道理,这或许就是你所说的“虚拟”和“抽象”的区别吧。“抽象”就是要简单和统一,比如统一使用文件指针来打开文件和字符设备。再比如数学上把所有各种方向的平面直线都抽象成了“Ax + By = C”,这么简单的、一致的形式。
当然,以上分析似乎更像是基于语言学的分析。而实际中,虚拟机通常首先是个抽象机,只是按你的说法反之不成立。
看来我自己对.net还远远没有发言权,这方面就不多说了。
按照Mono项目原定的计划,对System.Windows.WinForm 1.1的支持应该是包含在将于明年第一季度发布1.2版本中吧。
我也听说过Java类库有90%是用Java语言实现的说法。而且我也一直觉得不仅仅是Java和.net,几乎所有语言或开发平台的跨平台移植难度都是在GUI/进程通信/多线程/网络这些方面吧,而其他那些基本的东西,也几乎对于所有语言都不构成问题,比如数值运算,字符串处理,容器类型,甚至规则表达式等等。
DelphiBoy:
>> 关于虚拟机的定义,我认为把各种服务层都叫做“虚拟机”未免可笑。
请直接质疑 Andrew S. Tannenbaum 先生。
Mono 虽然没有实现 WinForms,但是它实现了 Gnome 库和 GTK 库。Mono 的许多 GUI 程序是我见过最漂亮的 Linux GUI 程序,包括 Beagle、Muine 等,都是我见过功能最强、界面最漂亮的 Linux GUI 程序。WinForm 是几乎绑定在 MS 平台,不代表 GUI 部分就不能移植。
不希望看到这个帖子纯粹陷入语言和逻辑方面的诡辩。
关于虚拟机的概念,我又仔细思考了一下,也查找了一些资料。
我还是坚持我的看法:
某些操作系统书籍中将操作系统称之为虚拟机的说法是一种比喻,是在形容操作系统的功能,而不是对虚拟机的定义。
这并不是文字游戏,这两者之间的差别还是很大的。
下面是我找到一些关于虚拟机的定义和解释:
http://www.fabiaos.com/topic/virtual-machine
http://encyclopedia.laborlawtalk.com/Virtual_machine
没有找到将通常意义上的操作系统定义为虚拟机的一种。
文字很多,就不摘抄了,大家自己看吧。
回复人:Wolf0403(完美废人)(CSDN,请不要侮辱 Linux) ( 两星(中级)) 信誉:127 2005-09-11 02:43:00 得分:0
请直接质疑 Andrew S. Tannenbaum 先生。
=====================================
在你引用的那段话中Andrew S. Tannenbaum只是在解释操作系统的权限管理。
并没有将操作系统定义为虚拟机的一种。
况且,即使他这样定义了,我也照样要质疑他。:)
Mono 虽然没有实现 WinForms,但是它实现了 Gnome 库和 GTK 库。Mono 的许多 GUI 程序是我见过最漂亮的 Linux GUI 程序,包括 Beagle、Muine 等,都是我见过功能最强、界面最漂亮的 Linux GUI 程序。WinForm 是几乎绑定在 MS 平台,不代表 GUI 部分就不能移植。
不希望看到这个帖子纯粹陷入语言和逻辑方面的诡辩。
=====================================
你这才是诡辩。
按你这样说的话,就没有什么是“不可移植的”。
只要花足够的工夫,在其他环境下重新实现一套完整的Windows也是完全可以做到的。
我在谈的是.net操作环境的可移植性,mono实现了什么GUI与这个问题毫无关系。
通常意义上的可移植有两种含义:
1. 二进制可移植,即一种环境下的二进制代码可以直接拿到另一种环境下运行;
2. 源代码的可移植,即一种环境下的源代码不用修改或者少量修改就可以在另一种环境下编译运行,实现相同的功能。
显然,.net操作环境本身不具有这两种特征,而Java环境是具有的。
当然,如果你认为重新实现也算是“可移植”的话,我也无话可说了。:)
Java也仅仅是假想的可移植性语言,按楼上的定义,至少在单板机、单片机上是不可移植的,无论是二进制方式还是源代码方式,道理很简单,因为这两种硬件都没有OS。没有基本的VM,如何构架高级的VM呢?
VM定义早在Java语言出现前20年就有了,相反,抽象机的概念却比较迟。至少抽象机最初是建立在数学模型的基础上的,至于用来形容OS,因我的孤陋寡闻在这里才是第一次“明白”。
VM的定义,在UNIX系统中,会经常提到,尤其是XWindows这种GUI系统。相反,DOS却很少用,也许这就是楼上对VM的偏见吧。
目前,我所见过的真正可移植的语言仅有C,其它的语言,从目前来看,都不符合你所说的那两个条件,这可能并不是你所愿意看到的事实。所以,如果想使程序移植性好,那就搞C语言,当然,学C++也是一样的。
1. 单板机、单片机上没有OS吗???
你太孤陋寡闻了吧。
别的不说了,就说手机,用的大部分都是单片机,至少也是单板机吧。难道上面没有OS???
就是支持Java的也汗牛充栋了!你还说什么Java在单板机、单片机上是不可移植!
连直接执行Java Byte Code的处理器都出来好几年了!
老兄!三天不学习,比不上刘少奇呀。
2. VM的概念,我在前面已经说过了,也找出了若干定义。
现在可以肯定地说,在一般意义上,所谓“操作系统就是VM”这种说法是不正确的,至少是不恰当的。
在VM的若干类定义中,没有将一般意义上的操作系统定义为VM的。
3. 前面已经说过若干次了,我谈的是.net操作环境本身的可移植性问题。
不是基于.net的语言或者Java语言的可移植性。你去前面把若干帖子仔细看过了再发言也不迟。
4. “目前,我所见过的真正可移植的语言仅有C”。
可能在你看到的范围之内确实如此。
就语言的可移植性来看的话,不只Java,连Java Script、PHP、perl,甚至DOS Batch,都比C的可移植性更好。:)
5. “我关于可移植性的定义”是什么?
1. 二进制可移植,即一种环境下的二进制代码可以直接拿到另一种环境下运行;
2. 源代码的可移植,即一种环境下的源代码不用修改或者少量修改就可以在另一种环境下编译运行,实现相同的功能。
看清楚了是一种环境到另一种环境,不是一种环境到其他所有环境。
拜托先把语文学好一点。
我并没有说必须能移植到所有系统下才算是可移植。
看大家如此热闹,我也苟言几句:
其实,具体的讨论C/C++,C#和java的差别,犹如孔乙己在研究“回”字有几种写法一样。就功能而言,C/C++,C#和java语言可以等同的相互可以替代。C/C++,C#和java的应用场合有些不同,
C#和java适合于开发商业软件,C/C++适合于开发系统软件了!
好!我承认自己的孤陋寡闻。确实现在有很多高级的“单片机”是有OS的,也正因为如此,Java的可移植性才变得可能。可是在8098、8096、80C51、C52等等这种传统概念意义上的单板机、单片机上,目前还没办法实现OS,他们的OS就是那些定制的IO应用程序。Java并不是一个很好的可移植性的语言,从你的回答中也已经肯定了这点。
Sun公司提倡开发一种在网络方面通行的开发工具,考虑到多平台实现的可能性,才倡议并发布了Java这种工程语言,由于其基于现有的常规OS技术基础之上,并提供相应的版本与接口,才使得可移植性得以实现。别忘了,Win9x并不支持Java,只有安装了相应的运行环境以后,才实现了“可移植性”。我们说Java可移植性好是基于OS支持这一层的,由于现有的大多数OS都在努力支持,因此,Java语言才没成为一种空想。
楼上这位,可移植性并不是一句空话,如果没有OS的默默贡献,Java的可移植性就是一种空谈,因为Java的基础就是建立在VM之上的。这点也一直是Sun公司炫耀Java先进性的地方,但什么是VM呢?Sun公司一直含混的说是基于底层的模拟实现,说穿了就是在OS上放一个Java解释器,让OS知道Java是什么玩意,让OS帮它解决问题。而它哪个解释器自己却并不驱动硬件,当然,也许将来会有一种芯片在指令这级支持Java,但目前还没有。不知楼上这位仁兄,是不是打算开发一种指令级支持Java的芯片或是开发一种支持80C51这样的芯片的Java工具来让我等开开眼界呢?说真的,我真的想从这里学点东西,因为如果单板机开发程序能够支持Java,那么许都智能系统的开发门槛就会降低许多,这对我们大家会多了很多显示身手的地方,我们离现代化的生活也就越来越快,开发周期也会越来越短,这可是一个功德无量的事,如果你打算做,不妨告诉我,我虽不一定帮上多上忙,但我很想将其运用到产品中来。我想多个测试和使用客户应该不算坏事吧。