可冰

冰,是沉睡着的水......

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  37 随笔 :: 5 文章 :: 94 评论 :: 0 Trackbacks
大家都知道现在C/C++的编译是分为两个部分的,即编译和连接:源文件经编译后生成目标文件,然后再连接为可执行文件.
我对这两个阶段要做的工作还没有了解,所以我现在可以这样设想(也有可能是无知的设想):
以一种标准的方式定义目标文件的格式,使之在各操作系统上生成的目标文件完全一致,而且都可以在相应的平台上进行正确的连接.这样的话,就相当于是一个中间层次的可移植性了.其实,如果这样不行的话也可以像JAVA那样生成一定格式的"字节码"文件,然后再进行编译连接.
如果可以将连接的一部分功能结合到操作系统内部,实现动态的连接,这样就可以实现类似动态装载的特性了.
但这个要实现的话就需要有一个大的投资方或者开源社区自己的共同努力才能实现了.
所以现在这样的想法还是空想吧.

不过我想,事物都是发展的,我们的C++当然也不会例外的.我相信C++会在不久也实现动态及完全的跨平台的特性的.希望这一天不会太远!
posted on 2005-09-14 23:30 可冰 阅读(2403) 评论(7)  编辑 收藏 引用 所属分类: C++

评论

# re: 目前C++可以实现跨平台吗 2005-09-18 08:39 FrameSniper
"大家都知道现在C/C++的编译是分为两个部分的,即编译和连接:源文件经编译后生成目标文件,然后再连接为可执行文件."——现在?你的意思是以前不是了?原生开发环境下诞生的程序都上两个阶段吧,一个就是编译成目标文件,然后Linker把这些目标文件以及一些资源文件连接成最后的符合PE/COFF标准的EXE文件或者COM等可执行文件。

跨平台的基础是虚拟机,就我所知,VC.NET好象是可以同时对原生和基于虚拟的两个环境做开发的。
  回复  更多评论
  

# re: 目前C++可以实现跨平台吗 2005-09-18 09:54 cpunion
跨平台的一个方式是虚拟机,另一个方式是提供一致的API和ABI,也就是要求所有操作系统支持相同的可执行文件格式,完整支持POSIX,这个似乎很难达到。

所以目前看来,虚拟机是唯一的办法。

从C++语言的发展方向上,很难看到他们有在语言层面上跨平台的打算。

退而求其次,或许能够依赖于某个工具,帮助检查源代码的可移植性。  回复  更多评论
  

# re: 目前C++可以实现跨平台吗 2005-09-18 11:06 可冰
@FrameSniper
"现在?你的意思是以前不是了?"
----------
当然不是了,我的文字不好,没有讲明白,谢谢你指正.

另外,我不认为跨平台只有依靠虚拟机.像cpunion所说,只要系统提供一致的接口就行.但是,如果接口差异不是很大,我想应该可以靠编译器的工作来转换.
我的意思也不是要让生成的可执行文件实现跨平台,而是在一个中间代码的层次实现,而后由编译器针对各系统的不同而生成不同的程序.虽然这也不是完全的跨平台,但在开发者的角度看也差不多了,而且可以通过编译器的实现来将中间代码的编译速度提高,这样也可以实现.NET所谓的即时编译,即第一次运行的时候编译,以后就不用编译了.其实在虚拟机上,也不是可以生成目标操作系统的机器代码吗,但它的效率应该不及C/C++了吧.


  回复  更多评论
  

# re: 目前C++可以实现跨平台吗 2005-09-18 11:19 可冰
@cpunion
从C++语言的发展方向上,很难看到他们有在语言层面上跨平台的打算。
--------------
确实,但我觉得现在语言层面动态的需求是很大的,尤其是做应用开发的.而C++却是在已经做得不错的效率上下工夫,而且现在又要加入一些保证安全的语言特征.这可不符合大势所趋啊.所以我觉得C++也会往这方面发展的吧.
其实我觉得那些C++的元老对C++的发展起了太大的作用,而他们又是比较保守的,所以导致C++发展缓慢.我觉得现在JAVA的方式不错,通过JCP社区最终决定它的发展方向.
也许也是我错了吧:也许C++并不想走"大众化"的道路,或是那些元老不想让它走.
但我认为使用者才是拥有最终决定权的.  回复  更多评论
  

# re: 目前C++可以实现跨平台吗 2005-09-18 12:55 cpunion
C/C++代码有很多方面在跨平台时有问题,并不是JIT编译器可以解决的,主要是畎;它太底层了。

JIT本身也是虚拟机的一部分,采用它就得确定使用虚拟机。

C++跨平台的问题,通过良好的设计和编写规范代码,是可以实现的,很多产品都是跨平台的了。

C++最大的问题应该是动态性问题,C++除了虚函数和简单的RTTI以外,基本上没有任何动态性,而动态性却是分布式编程中基本的需求。目前C++编写分布式组件,都需要先以一种IDL来编写接口,再生成一堆调用代码,而很多其它语言则可以在语言内解决这个问题。

c++0x正在加入一个XTI(扩展类型信息),不过还没有看到实现产品,所以也无法评论。我希望它不要像上一个标准中的RTTI这么简单,而是要以一种语言层面的东西加入进来。
比如我在类声明时写成dynamic class X;则这个类在编译后,将在全局类型表中注册自己,并可以通过全局名称查找到类,还可以由类查找所有成员的名称、类型等,也就是反射,当然希望还能走得更远些,比如动态创建、动态加载类型库等。

爱之深,痛之切,适当抱怨一下也未尝不可。。。  回复  更多评论
  

# re: 目前C++可以实现跨平台吗 2007-07-18 17:13 学习
编译跨平台,标准c/c++,在vc下开发嵌入式应用,很普遍的事情  回复  更多评论
  

# re: 目前C++可以实现跨平台吗[未登录] 2007-08-12 01:37 南郁
你说的很有道理,“生成的目标文件完全一致”,这在C++的讨论里,称为“有共同的二进制格式”,但事实上有两个问题:

第一: “二进制格式” 的标准,不在语言里,而在操作系统手上,可惜操作系统之间往往是没有这个共同标准。所以只能通过编译成一个“伪代码”,再去调操作系统对应的功能。

第二,有了伪代码,在去调系统对应功能时,仍然可能遇上问题。那就是各个操作系统对应功能的实现差别太大,这时简单地“调用”就不可能了。比如有功能A,在操作系统O1上,只需要一个函数,而在操作系统O2上,需要3个函数的组合才能实现。所以这个“调用”,就得“智能”一点,这样就成了“虚拟机”了,也就是在不同操作系统,有不同的虚拟机实现对外统一的接口。举一个典型例子,你想吃汉堡,这时有三种情况:

1.本地有麦当劳,去麦当劳买一个,因为麦当劳的汉堡比较地道。
2.本地没有麦当劳,但有肯德基,去肯德基买一个。
3.本地根本没有卖汉堡的店。。。没关系,亲处去找面粉,鸡肉什么的,做一个,只要你愿意等。

这些事情就是虚拟机做的。C++不考虑虚拟机,所以也就不可能有运行时机制上的跨平台。但是C++的语法当然是跨平台的。还有就是库可以跨平台。比如网络,一个ACE库,确实跨了很多平台。


比如你想买一份 麦当劳的堡,但你现在所在的城市居然没有麦当劳,那就不好办了。。。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理