Board logo

标题: [电脑] 外行问一个各种编程软件的问题 [打印本页]

作者: pangeng    时间: 2010-1-10 08:10     标题: 外行问一个各种编程软件的问题

1,不同编程软件理论上是不是可以编出同一种功能的软件?比如basic,c++都能写出office??谢谢。
2,编写mac系统的软件可以在windows环境下用微软出编程软件编出来么??还是必须是mac系统自己的编程软件?
作者: westlost    时间: 2010-1-10 08:53

1某些编程软件由于固有的限制,是无法达到的,如对内存大小操作限制,函数限制等等
2微软下的是可执行文件exe,mac下的不是这个吧,当然理论上是可以的,因为都是二进制
作者: 大头木    时间: 2010-1-10 09:19

对于现在的高级语言来说就不一定了

高级语言在某些方面比较快捷方便,比较有针对性了,很多东西都进行了封装


如果说的是低级语言的话那基本是什么都能做出来了,越低级的能实现的越多
作者: 打击者    时间: 2010-1-10 10:02

1. 是  , 但 运行效率有区别
2. mac软件必须objective-c语言
作者: jun4rui    时间: 2010-1-10 10:59

1,不同编程软件理论上是不是可以编出同一种功能的软件?比如basic,c++都能写出office??谢谢。
是的,用Basic也可以写出和C++一样的office来,LS几位说得不透彻,因为Basic里面也可以嵌入汇编代码,或者执行汇编级别的操作,只要是能够编译成硬件可直接执行的二进制文件的,几乎都可以实现一样的功能。
除非是在虚拟机上运行的,例如java、php、python之类的,在某些地方因为虚拟机的关系(因为人家最大也只能控制虚拟机,虚拟机的功能比实际上运行的电脑还是有些地方缺乏的,要获得全部的功能不太可能。)而且也不具备太底层的操作方法,所以会比编译类的语言功能少一些。
但是也可以做出Office类的软件。

不同之处在于,编程语言的级别,越高级的语言,写起来越简单,高级语言相当于吧显卡、声卡、主版、CPU都做好了,你只要拼接在一起就能实现一台电脑的功能了,开发起来非常快捷简单,缺点是对于标准模块以外的东西(例如你要开发个以前没有过的能实现实时光线跟踪的硬件加速模块)就很费力(因为压根没有这种模块),而且实现起来麻烦(因为这种语言本身就是为快速开发设计的,底层操控的方式要么就是没有,要么就是很简陋或者很麻烦,就像basic实现汇编比较麻烦),甚至不能实现(压根就不让你进行底层操控的语言不是没有,javascript就是,虽然人家依然用这个东东做出了所见即所得的编辑器,例如我现在正在回帖的输入框)。

回过头来,编译型的语言虽然也有一些模块,但是基本还是要你用更底层的东西做,回到电脑的例子,你就要从电容、电路板之类的小零件开始搭建整台电脑了。而像汇编语言,你基本是要从原材料级别来制作电脑啦!优点是你可以做出各种各样的东西,这些只受限制于你的想象力和目前PC的处理能力。

不过其实像C语言这种发展了很久,玩家众多的语言,有很多函数库,相当于已经做好的显卡、声卡之类的,你也可以快速搭建一台可以用的电脑来,但是缺点在于,这种东西并不是官方设定的标准(当然官方也设定过一些,但是这些模块数量不太多),相当于这家公司出的显卡有72个引脚,另一家的有172个引脚…………,发展太久,规范太多,而且针对不同的平台,甚至导致这些语言在不同平台有不同的特性,例如插在支持SLI主板上才能支持SLI,支持双通道主板才支持双通道。虚拟机型的语言由于是存在一个虚拟的电脑上的,所以特性基本是一样的。

2,编写mac系统的软件可以在windows环境下用微软出编程软件编出来么??还是必须是mac系统自己的编程软件?
这个就涉及到跨平台的问题了,像前面说过的,不同平台的特性不一样,所以,专用的编程语言是不同的,你不能换到其他平台还能用,就算mac的objective-c和win的VC都是C语言,但是他们是发展不同的变种,很多特性不同,甚至有些函数不同,你需要做很多修改也许才能用。但是跨平台的语言就能通用了,采用虚拟机运行的语言就是这样一种,因为前面说过了嘛,虚拟机的规格都是一样的,java语言编写的程序在mac平台和win平台基本都能通用,因为sun公司发布了mac和win平台的虚拟机,虚拟机把jaca语言编写的程序都翻译成统一的东西。

还有一种东西,例如著名的gun编译器,它可以在mac平台上编写win平台的软件,反之也行,甚至还可以编写gba、psp之类游戏机程序,只要你编写程序没有用到某平台的独有特性,例如你写个gba游戏,不会去调用DX 11就行,只要针对不同的平台编译一份软件就行了(当然,还要做一点点小小的处理)。

简单点就是说,你要是编写一些各种设备都支持的程序(例如计算:1+1=2并显示在屏幕上),用支持交叉编译的编译器,你就可以再一个系统下编写出其它系统可以用的程序啦。或者是用跨平台的解释性、虚拟机类语言编写。
作者: otz    时间: 2010-1-10 11:03

[posted by wap, platform: Android]

Ps3游戏都不是在ps3上编出来的
作者: jun4rui    时间: 2010-1-10 11:04

好吧我写错了是gnu不是gun……
作者: henvelleng    时间: 2010-1-10 14:49

1,不同编程软件理论上是不是可以编出同一种功能的软件?比如basic,c++都能写出office??谢谢。
可以
编程语言是相对于编译器来说的,只要编译器能解析编译,你就是用天顶星语言都行。编译器会最终生成2进制可执行代码,由于该可执行程序是在操作系统下运行的,其中包含了大量针对目标OS的section信息,所以它是OS依赖的。它们通常不直接操作硬件(除非是驱动程序),而是直接通过各种封装好的库函数来使用OS提供的系统调用

有一种程序是完全不依赖OS而是直接依赖硬件平台的,比如说bootloader,比如说grub4dos,比如说windows软激活程序,它并不是在OS下运行的,而是直接操作硬件,以及使用bios提供的软中断资源。这类程序在编写时不能调用任何动态库,哪怕一个printf也要自己直接操作硬件寄存器去实现,我们称之为裸板程序。编译时只要在最后生成的可执行程序上多加一道工序(去掉OS依赖的section信息,转换成纯bin文件)即可


2,编写mac系统的软件可以在windows环境下用微软出编程软件编出来么??还是必须是mac系统自己的编程软件?
不清楚微软有没有出过针对mac的交叉编译器,如果有,当然可以
至于为什么,从上面第一点相信你已经能得出答案,不多解释
作者: henvelleng    时间: 2010-1-10 15:05

关于交叉编译器,欲知详细请猛击下面的网站
http://www.codesourcery.com/
作者: jun4rui    时间: 2010-1-10 15:33

引用:
原帖由 henvelleng 于 2010-1-10 14:49 发表
有一种程序是完全不依赖OS而是直接依赖硬件平台的,比如说bootloader,比如说grub4dos,比如说windows软激活程序,它并不是在OS下运行的,而是直接操作硬件,以及使用bios提供的软中断资源。
这句话其实狭义在X86体系是可以成立的,因为X86体系的引导方式都是一样的。

但是涉及更多的硬件就不行了,其他硬件上,引到方式和X86完全不同,这也是gurb根本一直不到其他硬件上的缘故。
作者: henvelleng    时间: 2010-1-10 15:53

其实其他平台的引导也是很容易的,只是x86有bios存在变得异常统一

就我自己来说,在手册相关硬件的章节看明白后写一个能引导kernel的bootloader大致在几百行代码左右(99%以上代码是C),真正需要初始化的硬件并不多(时钟、内存、设置中断向量表和中断处理等),主要精力反而在如何将一个几兆大小的kernel镜像弄到内存里。比较简单的是直接从flash或硬盘中读取到内存,复杂的有通过网络下载或传输到内存,那么一个走UDP的网络协议栈大概也是几百行代码,网卡裸板操作的封装也要几百行这样

如果要功能全面的话就移植u-boot过来,代码量看u-boot对该平台支持度而定,大概需要添加和修改千余行代码这样

当然,这只是引导kernel,kernel要在目标平台上运行是肯定要经过移植的,主要工作量其实就在这里,除了添加一些必要的板级启动静态信息外,几乎可以肯定要自己添加许多外设的驱动程序,因为是基于kernel的驱动框架,所以代码量比uboot这种裸板的硬件操作复杂得多
作者: jun4rui    时间: 2010-1-10 15:58

引用:
原帖由 henvelleng 于 2010-1-10 15:53 发表
其实其他平台的引导也是很容易的,只是x86有bios存在变得异常统一

就我自己来说,在手册相关硬件的章节看明白后写一个能引导kernel的bootloader大致在几百行代码左右(99%以上代码是C),真正需要初始化的硬件并不 ...
嗯嗯,引到的部分其实都是蛮简单的,代码量不大,了解硬件特性和引导步骤后都能编写出来
作者: henvelleng    时间: 2010-1-10 16:00

我发觉我说话越来越没重点了 我来总结下上面说的:启动kernel的过程很容易,工作量的大头是kernel的移植,在熟练kernel的移植后,android的移植也就不难了

还有一些像数码相框之类的项目,则根本不用跑kernel,如此简单的应用可以直接用裸板程序从头到尾实现
作者: jun4rui    时间: 2010-1-10 16:18

[posted by wap, platform: GoogleChrome]
引用:
henvelleng 发表于 2010-1-10 16:00
我发觉我说话越来越没重点了 我来总结下上面说的:启动kernel的过程很容易,工作量的大头是kernel的移植,在熟练kernel的移植后,android的移植也就不难了

还有一些像数码相框之类的项目,则根本不用跑kern ...
就是单片机开发,直接用汇编写程序,好像进好几年来也有用C之类开发的了
作者: henvelleng    时间: 2010-1-10 16:31

只要在汇编里设好栈指针就可以跳到C里去了,有一些只能用cpu特定的汇编指令操作的寄存器也可以用内嵌汇编

这里面唯一一个算的上难点的地方是运行地址和链接地址的区别,必须清楚C语言中哪些语法特性是用链接地址实现的,比如函数指针。如果不能确定就用反汇编观察

之所以要区分运行地址和链接地址是因为有些平台的启动过程中,第一条指令在内部sram中执行,之后在初始化了内存后才把自身copy到内存中并跳过去的,由于绝大部分代码是在内存中运行,所以在代码编译链接的时候指定的地址是内存地址而非sram地址,这样在sram中运行时实际运行地址和链接地址是不一致的,在这种状态下是不能使用依赖链接地址的指令和语法特性的
作者: zenodante    时间: 2010-1-10 16:36

这年头单片机没MPU,大家还不是都在玩操作系统....8bit的片片裸奔都不好意思跟人说....
作者: henvelleng    时间: 2010-1-10 16:54

我感觉跑OS主要是为了简化应用程序的开发,如果是实现单一功能明显自己直接上更快更高效啊,单一功能就可以自己针对性地对内存优化对电源管理优化,没有进程调度那么实时性更能得到保证,网络栈usb协议栈么现成的一大堆

没有MMU的话只能跑uclinux之类,但是没有MMU就意味着多任务很难实现,对应用层要求过高,我感觉没太大意思,现在带MMU的SoC价格也不贵,不至于价格敏感到这地步。我感觉更多的是为了招标时吹水,当然还有种可能是有商业的现成的uclinux可用,为了省事
作者: henvelleng    时间: 2010-1-10 17:03

C语言中函数指针的实现、全局变量的访问(我记得是所有非text段的访问,连rodata段也是如此)都是依赖链接地址的,在链接的时候,链接器通过参数给定的链接首地址加上计算出的偏移量,然后把这个地址直接写死在了bin文件里。程序在执行的时候是从相应的text段中将地址取出来使用的,而不是通过pc指针来计算便宜的

每次有人遇到地址相关导致的错误我都会耐心讲一遍,还用反汇编代码说明,但是我感觉好像从来没人听明白过
作者: cc0128    时间: 2010-1-10 17:07

太高深了。土鳖飘过

[ 本帖最后由 cc0128 于 2010-1-10 17:27 编辑 ]
作者: pangeng    时间: 2010-1-10 21:15

apple script算什么级别的编程软件?
作者: jun4rui    时间: 2010-1-10 21:19

引用:
原帖由 pangeng 于 2010-1-10 21:15 发表
apple script算什么级别的编程软件?
这个,和Windows下的VBScript差不多级别,算脚本,级别几乎是最高的……
作者: pangeng    时间: 2010-1-10 21:26

最高是指最难用的意思么???还是指最最最基础的语言但是什么都能编?
作者: sleepd    时间: 2010-1-10 21:38

最最最基础的语言但是什么都能编的语言是级别最低的。
作者: alucardx2004    时间: 2010-1-10 22:23

引用:
原帖由 jun4rui 于 2010-1-10 10:59 发表
1,不同编程软件理论上是不是可以编出同一种功能的软件?比如basic,c++都能写出office??谢谢。
是的,用Basic也可以写出和C++一样的office来,LS几位说得不透彻,因为Basic里面也可以嵌入汇编代码,或者执行汇编级别 ...
真的非常受教~
作者: member2nd    时间: 2010-1-10 22:44

引用:
原帖由 pangeng 于 2010-1-10 21:26 发表
最高是指最难用的意思么???还是指最最最基础的语言但是什么都能编?
最高级的语言是最接近人类使用的语言,最易用,但效率不高
作者: cc0128    时间: 2010-1-11 00:46

[posted by wap, platform: Nokia]
引用:
member2nd 发表于 2010-1-10 22:44
原帖由 pangeng 于 2010110 21:26 发表
最高是指最难用的意思么???还是指最最最基础的语言但是什么都能编?
最高级的语言是最接近人类使用的语言,最易用,但效率不高
高级不高级和效率没本质关系,最重要的是软件运行环境。
作者: jun4rui    时间: 2010-1-11 07:45

[posted by wap, platform: Nokia (E71)]

记得当年比尔盖茨有个著名的挑战说别人用c能写出的东西他用basic也可以写出来


所谓最高级,就是学起来最简单,但是能干的事情最少

[ 本帖最后由 jun4rui 于 2010-1-11 08:59 编辑 ]
作者: hourousha    时间: 2010-1-11 09:43

引用:
原帖由 jun4rui 于 2010-1-10 10:59 发表
1,不同编程软件理论上是不是可以编出同一种功能的软件?比如basic,c++都能写出office??谢谢。
是的,用Basic也可以写出和C++一样的office来,LS几位说得不透彻,因为Basic里面也可以嵌入汇编代码,或者执行汇编级别的操作,只要是能够编译成硬件可直接执行的二进制文件的,几乎都可以实现一样的功能。
Basic可以调用BIOS中断这倒是很早就知道,可用peek与poke实现部分指针的功能也知道,但我是没听说过Basic可以嵌入汇编代码,哪个Basic编译器支持Basic的内联汇编啊?
作者: jun4rui    时间: 2010-1-11 10:03

[posted by wap, platform: Nokia (E71)]
引用:
hourousha 发表于 2010-1-11 09:43
原帖由 jun4rui 于 2010110 10:59 发表
1,不同编程软件理论上是不是可以编出同一种功能的软件?比如basic,c++都能写出office??谢谢。
是的,用Basic也可以写出和C++一样的office来,LS几位说得不透彻,因为Basic ...
可以的,18年前我在dos就干过了。

不是内联汇编,而是用basic吧汇编代码弄成操作码和数直接丢到内存然后调用。

记得当年90年代初期家用电器推国产fc学习机就有篇例子用学习机自带的basic全程这样做然后调用做了个贪吃蛇。
作者: hourousha    时间: 2010-1-11 10:28

引用:
原帖由 jun4rui 于 2010-1-11 10:03 发表
[posted by wap, platform: Nokia (E71)]
可以的,18年前我在dos就干过了。
不是内联汇编,而是用basic吧汇编代码弄成操作码和数直接丢到内存然后调用。
记得当年90年代初期家用电器推国产fc学习机就有篇例子 ...
你指的是CALL Absolute这种东西?这倒是确实可以执行二进制代码。不过以我的看法,这种已经不属于嵌入‘汇编’了,就好象VC的内联汇编,如果里面全都是_emit...这种,那与其说是内联汇编,倒不如说是内联机器码,呵呵……
此外,学习机固化的6502的Basic,是极原始的纯解释型的Basic,能支持CALL Absolute么?我以为CALL Absolute是QBasic才支持的。
作者: finalx    时间: 2010-1-11 10:41

[posted by wap, platform: BlackBerry]
引用:
henvelleng 发表于 2010-1-10 17:03
C语言中函数指针的实现、全局变量的访问(我记得是所有非text段的访问,连rodata段也是如此)都是依赖链接地址的,在链接的时候,链接器通过参数给定的链接首地址加上计算出的偏移量,然后把这个地址直接写死在了bin ...
让我想想起编译原理这课程了,以前看linker and loader 看的脑袋大,mb,看完了以后在也不碰计算机了。。。
作者: jun4rui    时间: 2010-1-11 10:59

引用:
原帖由 hourousha 于 2010-1-11 10:28 发表

你指的是CALL Absolute这种东西?这倒是确实可以执行二进制代码。不过以我的看法,这种已经不属于嵌入‘汇编’了,就好象VC的内联汇编,如果里面全都是_emit...这种,那与其说是内联汇编,倒不如说是内联机器码,呵 ...
80~90年代那时候没有强有力的统一编程工具,顶天了算得上Turbo C?各种basic、c之类太多了,多少有点有特色的东西,那时候控制硬件,调用中断之类几乎人人可为。6502其实是很强力的CPU了,APPLE II也是用这个,当年的主流标准个人电脑
作者: alexacc    时间: 2010-1-11 12:49

交叉编译做bsp的用的比较多,主要是针对不同的架构,对上层来说的交叉编译与bsp层的差别还是比较大的,关键是“交叉”的位置不一样。
另外关于高级语言嵌入汇编的讨论,我觉得gnu c处理的是最完美的,当然模板和AT&T汇编的语法比较晦涩,对初学者而言。VC的那种方式谈不上真正的嵌入,编译器在这方面几乎没有支持
作者: henvelleng    时间: 2010-1-11 15:36

交叉编译是针对目标OS和硬件平台的,交叉编译器需要提供对应OS的动态库。只要是编译的程序运行环境和当前编译器所处的运行环境不同,就需要交叉编译

如果是编译裸板程序,则可忽略OS,只对应硬件平台,并且不使用动态库即可。在gcc4.4.1以后,裸板程序在编译时需要添加-ffreeestanding选项,但是使用的交叉编译器是完全一样的。裸板程序和基于OS的应用程序的区别实际上主要是在编码上,而编译过程只需要添加一步生成bin文件的步骤即可。就交叉编译的角度来说,其实没有区别,交叉编译器提供的目标OS的动态库不使用就是了

内嵌汇编的处理完全是看编译器的,和语言无关。同样的硬件平台,gnu使用AT&T规范是必然,因为要对应多种cpu,不可能在arm平台下遵循arm规范,在intel平台下遵循intel规范,那就乱套了。AT&T规范相当严谨,考虑到了几乎所有可能出现的因为编译器优化而导致的错误

我从来没有过出于性能优化的考虑去使用内嵌汇编,性能优化只要用inline关键字修饰循环调用的函数就行了。内嵌汇编在大部分情况下反而是性能劣化,如果要用汇编做大量工作,不如在高级语言中直接以函数的形式调用汇编。所以我想象不出应用层调汇编是为了干啥
作者: henvelleng    时间: 2010-1-11 15:44

引用:
原帖由 finalx 于 2010-1-11 10:41 发表
[posted by wap, platform: BlackBerry]

让我想想起编译原理这课程了,以前看linker and loader 看的脑袋大,mb,看完了以后在也不碰计算机了。。。
具体问题具体分析就容易理解了,编程完全是实践性技能,空谈理论和放P没区别,写过1W行代码的人就是比写过5K行代码的人牛逼2倍,智商差别可以忽略。不过我还是那句话,如果是应用层编程,确实不需要了解这些,把一个进程在内存中各个段的意义搞清楚就行了
作者: cc0128    时间: 2010-1-11 15:48

完全看不懂,你们太牛逼了
作者: pangeng    时间: 2010-1-11 18:39

谢谢各位,了解不少。
java语言可以跨平台,对我很有用,准备学。但我还有个问题,我需要编的软件需要接收电脑serial port和usb接口的信号,java能否编出读取电脑周遍硬件数据的软件?
作者: alexacc    时间: 2010-1-11 18:41

[posted by wap, platform: Nokia]

高级语言内嵌汇编确实蛋疼,除非黑客们去修改CR0之类的寄存器或者使用处理器特有的一些指令。需要直接访问硬件也是用汇编做成obj给高级语言提供接口
作者: jun4rui    时间: 2010-1-11 18:45

引用:
原帖由 pangeng 于 2010-1-11 18:39 发表
谢谢各位,了解不少。
java语言可以跨平台,对我很有用,准备学。但我还有个问题,我需要编的软件需要接收电脑serial port和usb接口的信号,java能否编出读取电脑周遍硬件数据的软件?
java有相应的包,可以读写。不过虚拟机语言不是很好做这种东东,而且对于初学者来说java真的不太友好。试试用python吧,简单,高效,适用范围也很广,可能比java更广泛
作者: finalx    时间: 2010-1-11 18:47

[posted by wap, platform: BlackBerry]
引用:
henvelleng 发表于 2010-1-11 15:44
原帖由 finalx 于 2010111 10:41 发表


让我想想起编译原理这课程了,以前看linker and loader 看的脑袋大,mb,看完了以后在也不碰计算机了。。。
具体问题具体分析就容易理解了,编程完全是实践性技能,空谈 ...
恩,应用层看看语法,数据结构就可以接客了,不过要想卖个好价钱还是把基础打牢些比较好。
作者: gogogo    时间: 2010-1-11 18:52

那次是俩科学家狂掰生物工程

这次是N个程序员乱战软件工程
作者: henvelleng    时间: 2010-1-11 19:09

高级语言可以直接访问硬件的,而且语法上比汇编更简洁。能不能访问硬件关键看程序运行在cpu的什么级别上,用户空间是cpu运行在低权限级别,OS把部分地址用mmu保护了,也没有地址映射的接口,这才是无法访问到硬件的原因
作者: pangeng    时间: 2010-1-11 19:24

我现在问题是手里只有mac。机器是Electroencephalography,一般都是串口,用于windows版本。
作者: jun4rui    时间: 2010-1-11 19:30

[posted by wap, platform: Nokia (E71)]

python有mac版的,很多平台都有python甚至s60手机系统
作者: holybell    时间: 2010-1-11 19:32

引用:
原帖由 cc0128 于 2010-1-11 15:48 发表
完全看不懂,你们太牛逼了
正常吧,我也看不懂,回头咱开个帖子喷喷ssh?
作者: holybell    时间: 2010-1-11 19:35

引用:
原帖由 gogogo 于 2010-1-11 18:52 发表
那次是俩科学家狂掰生物工程

这次是N个程序员乱战软件工程
他们战的不是软件工程
作者: cc0128    时间: 2010-1-11 19:36

引用:
原帖由 holybell 于 2010-1-11 19:32 发表


正常吧,我也看不懂,回头咱开个帖子喷喷ssh?
强烈支持

作者: alexacc    时间: 2010-1-11 20:30

[posted by wap, platform: Nokia]

LZ太猛了,初学就搞usb,协议先看看吧,还有你所用的USB芯片资料,这不是语言层面的问题了
作者: pangeng    时间: 2010-1-11 21:52

嗯嗯。
我还有问题,对于一个编程人员来说,有一台windows兼容的外设,他可以自己编出mac用的驱动程序么?需不需要跟厂商要什么生产资料之类的?
作者: jun4rui    时间: 2010-1-11 22:50

[posted by wap, platform: Nokia (E71)]

是的,需要厂家资料
作者: henvelleng    时间: 2010-1-11 22:57

有官网公开的datasheet,要是觉得这还不够可以去找找开源项目中的驱动代码,分析它的寄存器操作。有的厂家甚至还直接提供详细的寄存器操作步骤方法和demo代码示例,这得看你公司什么来头了
作者: 舟易行    时间: 2010-1-12 00:00

[posted by wap, platform: BlackBerry]
引用:
cc0128 发表于 2010-1-10 17:07
太高深了。土鳖飘过

你不也是代码民工么?




欢迎光临 TGFC Lifestyle (http://bbs.tgfcer.com/) Powered by Discuz! 6.0.0