重新学习 c 语言(4)- 库和宿主实现(一)概论
(一)概论
C语言的特性相对比较少,其他类c语言也是一样.OO的语言中的class可以看做一个特殊的struct,对象的方法其实就是函数(只是要求有一个默认的指向其对象的地址作为参数,比如this).用c现有的元素也可以模拟许多OO的特性,比如interface,多态等等.我见过一些纯c程序,也使用了后绑定,interface等特性降低程序的耦合以及其他优良的特性.
知道c语言的语言特性,就可以编程了吗?当然可以,但仅仅是语言本身除了学习之外,好像还没有别的什么用途!
那么,真正的软件开发需要哪些知识呢?
先扯点题外话
看上去好像与软件开发无关,其实却是软件开发成功决定性的一个概念: “软件工程”
人类似乎总是遭到天神的嘲弄,比如给了人类了解”天意”的智慧,却没有给予足够的时间,人类连自己也搞不清楚,却要去”改造大自然”.软件行业也是一个典型,现代自动化和高科技支撑产业的软件行业,却是几千年前就存在的”手工业作坊”,知识工具变成了键盘,鼠标.
一个软件的成功有许多环境,包括可行性研究,需求分析,设计,开发,测试,发布,维护等等,软件的开发只是其中一部分,随着需求的复杂度的提升,”开发”这个”过程”对于软件工程成功与否的重要性在逐渐降低!
好了先不管其他东西,只是软件开发,在我们熟悉了一门语言之后还需要了解什么呢?
当然不同的软件工程需要不同的知识体系,但计算机的基本知识体系大概是差不多的!
无论是服务器软件,还是桌面应用,或者是嵌入式开发都离不开计算机本身,记得我的计算机启蒙老师说过一句话(1996年,当时win95盛行,我们学习还是在Novell环境和dos下学习汇编)”别说是win95,就是将来有了win2000(后来真的有了)也是在计算机上运行的,不是天上飘的”.潜台词是让我们充分了解计算机原理.
好了,接下来我要讲开发软件可能会涉及到的几个重要概念,许多与计算机(c语言的宿主)打交道的东西,c语言通过库的形式提供.另外,我选择Linux和GCC环境,或许这是学习c语言的最好的环境了(虽然我是个windows程序员).
- 第一个概念,库本身是通过什么载体提供的?计算机中可执行的程序是什么样子?
这里面涉及到可执行文件的格式,静态链接和动态链接的概念,(进程的概念在并发中提及)
当然每一个概念都涉及到很多内容,我只是做简单的讲述,需要深入的地方,另外大部分概念都是最终由操作系统提供服务的,OS的概念太大,庐山太大,还是先认识花草吧!- 第二个重要的概念是c语言中似乎缺少的语言特性,程序级异常,当然c是通过库函数提供的,功能可以用,还在乎什么是否是”语言特性”.
- 第三个也是语言相关的,关于动态内存分配.在c++/Delphi等OO语言,动态内存分配扮演着重要的角色,OO中的”对象”一般是用户掌握生存期的,而动态内存分配符合这个特性.
- 第四个是windows下最得意的部分,关于UI,用户接口(用户界面),当然用户界面一直是以Unix的命令行界面和Mac的GUI界面两个方向,本来没有什么技术的优劣,只是不同的资源和用途决定的,你不觉的地铁门上面只有一行的LED指示牌有什么不好吧!
- 第五个就是程序运行和并发!进程,线程,还有其他的吗?并发和内存的动态分配一直是大多数程序员困扰的问题.为什么呢?
- 第六个概念是几乎所有计算机书上都讲的IO! File的概念或许和进程的概念一样,是计算机领域最重要的概念之一.在Unix/Linux世界里,大多数设备都是靠”打开,读,写,控制,关闭”这五个概念操作的,能用这五个概念操作的都可以叫IO!键盘,显示器,磁盘文件(光盘什么的也一样),串口,并口,红外,USB,网络.Windows里其实也一样!
- 第七个概念是IO的一部分(或叫做延伸,internet可以算作是你硬盘的延伸):网络.未来的软件,应该总是围绕网络的.不是在提供服务,就是在请求服务,或者兼而有之!
- 第八个概念属于应用范畴了:数据库.做应用软件似乎离不开数据库的概念,数据库是一个存储,传输,数据分析等等综合的概念.
当然,或许还有许多重要的概念! 不同领域的软件开发遇到的问题差异很大,但上面的概念或多或少要涉及到!我也是在不断的学习领悟,欢迎拍砖!
现在进入话题! 等等先说点题外话!
大三的时候我突然喜欢上计算机,一个偶然的机缘,我参加了一个计算机原理(汇编语言)的学习班(70学时,每学时3块钱,这么贵的培训,可见我是下了很大的勇气的).掌握了一些微机的基本知识,某日在机房看到几个同学用debug (dos上最有用的工具了)调试一段报纸上抄的程序,功能是用程序实现重启计算机,搞了很久,我过去看了看,只写了一行代码 jmp FFFF:0
然后w存盘,大概只有5个字节的.com执行文件,运行后那台386重启了,当时我那种神气的表情恐怕日后很难再有了!
我讲这个故事是为了说明:理解原理更重要! 就现在来说,能够轻松在百度,google搜索到的所谓技巧等等只能算是”九阴白骨爪”,用得到的时候再查也不迟,那些需要你不断实践从中感悟到的东西才是真正的”九阳真经”.
下面的内容如果在实践中碰到问题需要了解,大家可以深入研究相关的领域,没必要先练好所有武功再出道,有了一定的基础,然后不断的实践再学习效果会更好!如果某些知识今后的实践中用不到,就等用的时候再了解也不迟!但一些原理性的东西还是需要掌握,需要的时候就知道从哪个方向入手,否则永远是一头雾水!