现在开发软件基本上都用高级语言例如C语言,按理说不存在CPU指令架构的兼容问题吧?
我其实很好奇,操作系统也好,应用软件也罢,现在不都是用C语言了?面对不同的CPU,即使是英特尔、AMD的X86还是英特尔的IA-64或者IMB的POWER甚至移动平台的A...
我其实很好奇,操作系统也好,应用软件也罢,现在不都是用C语言了?面对不同的CPU,即使是英特尔、AMD的X86还是英特尔的IA-64或者IMB的POWER甚至移动平台的ARM,我想它们也就是汇编语言的不同吧?C语言或者别的高级语言不可能语法不同吧?那么按理说往其它CPU指令架构开发软件应该相对不难啊?为啥说软件往别的平台移植很难呢?
展开
3个回答
展开全部
我之前也提出过相关的问题。比你提出的更深。
就CPU架构来说,可以分为X86,ARM。
就OS平台来说,NT Linux UNIX等。
对于底层、驱动层来说,C语言就是汇编语言的功能。要操作的都是寄存器,内存,CPU,IO。这部分是不可以移植的,只是用C语言描述而已,这部分基本是不可移植,因为需要对硬件初始化,配置,不同指令集很多要做修改,甚至重新实现。
你想想,我要用C语言写一个中断,那不是要根据CPU的结构来对不同的寄存器,计时器的值修改吗?底层代码怎么能随便移植呢?
而对于OS以上的应用层,可移植性就比较高。但是还是会因为CPU,OS的差异,要做些修改。因为,C语言只是语言,用的函数跟语言无关。比如C语言可以用标准的C库。stdio.h stdlib.h这些。但是对于windows程序来说,C同样可以用windows.h。但此时,用的就是windows下的函数,linux内核的操作系统就不可以使用windows.h,这是windows的API。所以不可移植,应用层可否移植就看你用的是不是可移植的库。
QT就是一个可移植性很强的库,之所以可移植,是因为同样的源码,编译时链接的lib是各自平台的库,.h头文件只是声明用哪个lib的那个函数。虽然是声明是同一个lib里面的同一个函数。但是事实上不同平台的lib的内容不同,但都是一个效果。所以就可以移植。
实际上就是看一个库,是不是在多个平台支持,如果是的话就可以移植。比如opengl,gtk+,SDL这些就可以在nt linux上相互移植。C库基本是任何操作系统都可以的。
就CPU架构来说,可以分为X86,ARM。
就OS平台来说,NT Linux UNIX等。
对于底层、驱动层来说,C语言就是汇编语言的功能。要操作的都是寄存器,内存,CPU,IO。这部分是不可以移植的,只是用C语言描述而已,这部分基本是不可移植,因为需要对硬件初始化,配置,不同指令集很多要做修改,甚至重新实现。
你想想,我要用C语言写一个中断,那不是要根据CPU的结构来对不同的寄存器,计时器的值修改吗?底层代码怎么能随便移植呢?
而对于OS以上的应用层,可移植性就比较高。但是还是会因为CPU,OS的差异,要做些修改。因为,C语言只是语言,用的函数跟语言无关。比如C语言可以用标准的C库。stdio.h stdlib.h这些。但是对于windows程序来说,C同样可以用windows.h。但此时,用的就是windows下的函数,linux内核的操作系统就不可以使用windows.h,这是windows的API。所以不可移植,应用层可否移植就看你用的是不是可移植的库。
QT就是一个可移植性很强的库,之所以可移植,是因为同样的源码,编译时链接的lib是各自平台的库,.h头文件只是声明用哪个lib的那个函数。虽然是声明是同一个lib里面的同一个函数。但是事实上不同平台的lib的内容不同,但都是一个效果。所以就可以移植。
实际上就是看一个库,是不是在多个平台支持,如果是的话就可以移植。比如opengl,gtk+,SDL这些就可以在nt linux上相互移植。C库基本是任何操作系统都可以的。
展开全部
对于C语言来说,只能用标准C库写简单“黑框”程序,
复杂程序 只用标准C库肯定是不够的(标准C库提供的API太少),
这就需要调用操作系统提供的API,
但是各家操作系统提供的API是不可能相互兼容的,所以就给移植制造很大的麻烦
想移植程序就要用跨平台 库(API、SDK)
比如C语言的gtk+库最初在linux上把linux的api包装起来,实现了linux版的gtk+库 ,
接着又在windwos包装windows的api,实现了windows版的gtk+ for win32....
再比如使用 C++ 语言 的 Qt 库
有linux系统 x86处理器的的
有windows x86的
linux 系统arm处理器的.......
再如 某个windows系统 的上用mfc开发的软件 mfc是windowsapi的封装 m$ 没打算把打移植到 非windows 系统上
没打算把它一直到 windows不支持的处理器上 那么 就麻烦了 想移植 就要在新的系统或cpu上彻底重来
要是 用qt开发此 程序 ,代码几乎不用或者只要极少的修改 在新平台上 重新编译 就OK
由此可见 移植难主要是没有 考虑将来要移植,而用了可不跨平台的库,
复杂程序 只用标准C库肯定是不够的(标准C库提供的API太少),
这就需要调用操作系统提供的API,
但是各家操作系统提供的API是不可能相互兼容的,所以就给移植制造很大的麻烦
想移植程序就要用跨平台 库(API、SDK)
比如C语言的gtk+库最初在linux上把linux的api包装起来,实现了linux版的gtk+库 ,
接着又在windwos包装windows的api,实现了windows版的gtk+ for win32....
再比如使用 C++ 语言 的 Qt 库
有linux系统 x86处理器的的
有windows x86的
linux 系统arm处理器的.......
再如 某个windows系统 的上用mfc开发的软件 mfc是windowsapi的封装 m$ 没打算把打移植到 非windows 系统上
没打算把它一直到 windows不支持的处理器上 那么 就麻烦了 想移植 就要在新的系统或cpu上彻底重来
要是 用qt开发此 程序 ,代码几乎不用或者只要极少的修改 在新平台上 重新编译 就OK
由此可见 移植难主要是没有 考虑将来要移植,而用了可不跨平台的库,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
举个栗子吧, 一个小学生,一个中学生,一个本科生,还有个拨屎生。你要出一份有水平的试卷。既要考虑到每个人的知识面,又要考出每个人的水平。 这张试卷觉得好出不??
软件要考虑大小端,不同处理器处理不同字节的效率,有些硬件有这个模块,有些没有,那没有的怎么办? 底层你可能就要软件模拟实现出来。 所以就有虚拟机了,虚拟机把硬件之间的不同屏蔽了,你的软件遵守虚拟机的规则,在所有的虚拟机中都能用了。
软件要考虑大小端,不同处理器处理不同字节的效率,有些硬件有这个模块,有些没有,那没有的怎么办? 底层你可能就要软件模拟实现出来。 所以就有虚拟机了,虚拟机把硬件之间的不同屏蔽了,你的软件遵守虚拟机的规则,在所有的虚拟机中都能用了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询