BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #83627同步于 2014/10/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

c语言可以跨平台或者直接控制硬件的原因是什么?

henceman
2014/10/24镜像同步13 回复
搜了下,发现有说所谓c语言跨平台是源代码级别上的跨平台,是说对应不同系统(平台)对应的编译器不同而已,这样说,所有语言岂不是都可以跨平台,只要构造出不同的编译器,肯定可以跨平台吗?java不也是不同os有不同的JVM。 问题是,是c语言的语法语义,或者特有的数据结构导致了c的通用或者底层或者强大功能嘛?如果是,哪些东西是c语言独有的,关键的,核心的东西? 另外,为什么不把C++弄成java那样,编译成中间码,再弄个C++虚拟机,然后跨平台?或者c++不这样弄的原因是什么?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
karcy机器人#1 · 2014/10/24
问题很深刻。不懂,坐等大神解释。 【 在 henceman (伊甸樱桃) 的大作中提到: 】 : 搜了下,发现有说所谓c语言跨平台是源代码级别上的跨平台,是说对应不同系统(平台)对应的编译器不同而已,这样说,所有语言岂不是都可以跨平台,只要构造出不同的编译器,肯定可以跨平台吗?java不也是不同os有不同的JVM。 : 问题是,是c语言的语法语义,或者特有的数据结构导致了c的通用或者底层或者强大功能嘛?如果是,哪些东西是c语言独有的,关键的,核心的东西? : 另外,为什么不把C++弄成java那样,编译成中间码,再弄个C++虚拟机,然后跨平台?或者c++不这样弄的原因是什么? : ...................
FromMars机器人#2 · 2014/10/24
历史很短,历史很长,坐等大神
novagforce机器人#3 · 2014/10/24
斗胆口胡,C++弄个虚拟机不就是C#么……
Mijoe机器人#4 · 2014/10/24
等大神来解答
nuanyangyang机器人#5 · 2014/10/24
语言是跨平台的,但是编译器对每个平台都要做一个代码生成器。
henceman机器人#6 · 2014/10/25
【 在 nuanyangyang 的大作中提到: 】 : 语言是跨平台的,但是编译器对每个平台都要做一个代码生成器。 你指的语言是所有语言么?
nuanyangyang机器人#7 · 2014/10/25
特指编译型语言。比如c。但如果有解释器的话,就是另一回事了。 【 在 henceman 的大作中提到: 】 : 你指的语言是所有语言么? 来自「北邮人论坛手机版」
qq86573255机器人#8 · 2014/10/28
问题1:是的,C语言是源代码级别的跨平台,为什么呢?因为不同平台有不同平台的C编译器,比如win有win的c编译器,*nix有*nix的c编译器,所谓的平台,除了跟OS直接相关外,底层的指令集架构更加相关,比如intel,sparc,arm, MIPS等等。 你要将你的程序部署到不同的平台上去执行,直接将它拷贝的各个平台上,编译并链接好,就可以加载执行了。 nothing more 问题2: 其实,C语言没有任何特殊的语法语义而导致它的底层性,真正的原因是C语言背后的编译器直接将它编译成对应的机器指令,这才导致了它在OS的协助/监督下,直接操纵硬件。 C语言的语法语义,其实是衍生于algo的语法语义,C,C++,Java等等都属于algo家族。 如果真的要说C语言核心的特殊的,不在于其编译器前端(syntax),而在于其编译器后端(code gen)----如前文所述,直接生成机器指令。 那么C++呢?C++跟C语言有着几乎一样的后端,直接生成机器指令,但是C++的前端,是C的N倍的大小,比如那个著名的虚函数表问题,就实现在C++的前端。 如果这么说C跟java就拥有一样的跨平台性了? 不是的。java的跨平台,不如说成,一次编译,到处执行。 C的跨平台,应该叫做一次编写,到处编译,然后再执行。 当然,当你的C程序中含有platform specific的代码片段的时候,它将破坏你的程序的可移植性。 问题3:为什么不C++搞个虚拟机像Java一样? C++完全可以搞个虚拟机,跟java一下样,但是C++内存模型和执行模型完全就是你的裸机器的硬件架构模型,所以没必要在本来就可以执行的平台上,模拟本平台的指令集再加个VM。而且加个VM往往意味着速度的代价(在真机上装个虚拟机玩游戏是不是比真机慢呢?)。 有的同学说C++加个VM就是C#了,这么说也有道理,毕竟C#的初衷就是设计一门跟C++一样的虚拟机语言来对抗Java(而且如java一样类型安全,支持GC,有继承根),于是海森伯格就带着众将把CLR搞了出来。但是随着C++和C#各自的演化,两门语言的语法分支明显。 比如,C#直接在语法上就支持函数签名的概念delegate,来实现callback function,对C++来说,还是要借用标准库的function模板来实现绑定。 (渣本第一次答题,轻拍~)
tonyjansan机器人#9 · 2014/10/29
跨平台这个说法其实有些宽泛了...特别是在说编译型语言的时候,至少很明显的存在两大分类:跨芯片平台和跨系统平台。 要仔细的讨论C的跨平台性,就得系统的分析这两大分类。 对于C来说,说到跨平台还是有很多尴尬与无奈的: 跨芯片平台只是编程语言语法意义上的,其实都是依靠工具链(编译器以及芯片平台基础类库)实现的,对于每一种芯片平台都需要构建基础的工具链; 跨系统平台也同上,甚至很多平台相关的基础库还有差别(如:Win下的tchar.h和Linux下的sys/*.h)。当然有MinGW这类东西想要调和这种矛盾,不过解决不了各平台的执行文件采用的封装结构不同的事实(如:Windows使用的是PE,Linux使用的是ELF)