Shell与C

    C实现了Shell;Shell上编辑、编译C代码,运行C程序。你中有我,我中有你;即是独立,又为互赖。

1 特点
    个人总结一下C语言到目前的地位特点(C语言还在持续贡献中),欢迎拍砖。
    1)计算机众多语言中,C是最基础、影响面最广的语言。K&R的《The C programming Language》,就定义了新语言的第一个程序学习模式,"Hello, World"
    2)语言编写的软件中,C的贡献是最高的,没有之一。Linux Kernel、Shell,直接用C实现;C++、Python、Java、PHP、ObjectC等等,你我能想到的如今的流行语言,几乎都是C语言实现的(或实现了早期版本,后期版本,有的用C++实现)
    3)C简单、易理解、复用性强、移植性高,是常规软件中算法实现的最好选择之一(如果还要更快,可以用CPU相关语言,如Intel IPP,Arm NEON;再快,用FPGA;再快,用专用芯片;再快,花钱买更强的硬件)

    个人再总结一下Shell到目前的地位特点(Shell同样还在持续贡献中),同样欢迎拍砖。 
    1)Shell是一门语言,更是一个集成平台,是开发人员工作的基础之一(也许有意无意地被忽略,我们没有意识到)。只要开发人员在,开源世界就在;只要开源世界在,Linux就在;只要Linux在,Shell就在。(练习K&R的《The C programming Language》的习题时,编辑、编译、运行,都在用Shell。
    2)Shell是一个更深层次的系统入口,通过她你可以进入计算机世界,去探索另一个时空的神秘微妙;其他语言主要是“为用户服务”,对此涉及较少(深入理解计算机,能为用户提供更好的服务)。
    3)Shell实现功能快,灵活多变,掌握她,你会多一种或若干种设计思想和编程范式,面对问题,可以从容淡定地选择适合的方案。如果是你是开发人员,对于Shell,你可以赞扬她(很显然我属于这一类),也可以贬低她,但你不可能忽略她(其实你可以忽略她,但要承担对应后果)。

2 差异 
    “对比”,是我们常用的最有效的分析学习方法之一。下面整理一个Shell和C的简单对比,理解一下两者的差异。

2.1 文件
    Shell中,经常听到的是;执行程序,查找文件,删除文件,批量改变文件名,备份文件...列出目录的文件,Shell中只需一条命令(ls)。
    C中,经常听到的是:字符串长度,整数小数,精确度,循环边界值,执行次数...一个浮点矩阵乘法,C中几个数组、两个for循环搞定。
    Shell的基本粒度在文件级别,特别适合文件系统的操作和改进;C是基本粒度在数据类型级别,特别适合算法层次的实现和应用。

2.2 性能
    系统启动时的调用、文本转换、等待用户响应等,如果给用户的响应在秒级别(假设C就算比Shell快10000倍),或不要用户干巴巴坐等,用户感觉应可接受,或不在乎。
    影音播放、大数据传输、实时控制同步XX机器人等,最理想就是没有延迟,快1秒、毫秒、微秒、纳秒,都有它的应用场景。
    Shell是解释性语言,性能比C低,大多应用场景已能满足要求(以人的主观角度);对实时响应、实时控制、大数据处理等,还是要用C。
    一个现状是,硬件性能越来越强,对软件本身性能,是个福音(但现在应用软件也越做越庞大、越来越好看,消耗的性能也持续增加)。

2.3 环境
    Shell中,除了内建命令,大多是运行其他程序。这些程序各自实现一个个小目标,本身是可以独立运行的;在Shell的组织下,共同努力,集成为一个大目标。(我想起了王健林的“小目标”、美国的“联邦分权制”)
    C中,除了关键字,主要就是调用各种库提供的接口函数。这些接口本身不会独自工作,按错误顺序调用也不工作(可能工作,但结果异常);各种库的接口之间可能不兼容,因为她们不是按一个个独立小目标来实现的,更多是通用实现。如果使用者能正确、精确调用,效果巨大。(我想起了“计划经济”)
    Shell中直接运行可执行程序;C中链接库,或通过system(cmd)子进程运行程序(有效获取运行程序的数据,又是一项专业技术活)
    从结果看,都达到了目的,没有谁好谁坏之分;从过程看,独立自主的“小目标”成就感更及时。何况,你我实现的,可能只是“小小目标,或者小小小目标”

2.4 进程
    Shell中,一不小心就创建了进程。在命令行中,每一次回车的成功执行一个脚本或程序,都创建了至少一个进程。进程之间的通信和数据分享,常规通过退出状态、管道、文件,使用简单,但非常实用。特别强调一下管道(Pipe),这是一个了不起的发明(至少可以和文件系统媲美),数据如水流送入管道,进程像过滤器,对管道中流过的水流进行加工,去除、加入、或转换。如果不创建进程,或进程通信、数据分享复杂,Shell脚本可能没有这么大的影响。
    C中,创建进程相对复杂;但设计进程间通信的机制、数据共享,就更为复杂;而为什么要用多进程,又是更高层次的复杂问题了。多进程的设计,一直都是真正C程序员的一个生死考虑。实际上,C中更常见的是“单进程、多线程”设计,在一个进程内,划分为“多重性格”捣腾。实际中,线程的同步、临界资源、优先级等,对资深程序员往往也是一个高难度考验。 
    总的来说,Shell中,进程是柴米油盐酱醋茶,实用品,呼之即来,挥之则去;C中,进程是奢侈品,不是什么人都玩得起,多少人在她的小闺蜜“线程”前面,就死翘翘了。

2.5 内存
    Shell中,主要是“Shell内部”和“调用独立程序”两类地方要使用内存,Shell内部,内存由Shell解释器管理;调用的独立程序,则由独立程序内部自行管理。不论是脚本,还是程序,一旦执行完毕,内存都由操作系统回收,重新分派。进程Shell用户,不用管理内存。这是一个“使用者角度”的福音(一些编译型语言,也提供用户不管内存的“资源自动回收机制”了,如Java、Python),把内存管理风险,转移到Shell解释器和独立程序中。
    C中,就是独立程序的一种实现,内存管理逃无可逃。内存的分派、使用,本身并不难,难的是随时都要检查异常,并做好预防。内存对程序来讲,就是空气对人一样,必需、重要、而且好获取,但是大家在陆地上生活久了,都忽略了。看看海洋中潜水员、太空中的宇航员,氧气罐是他们时刻关注,因为关乎于能否继续活着?
    内存是程序运行的必备资源,Shell中,我们把球踢出去,自己不关心;C中,内存管理,是多少英雄成功崛起的“竞技场”,也是无数豪杰殊途同归的“英雄冢”。

2.6 本身
    Shell中,变量全部是字符串,数值计算需要特殊语法支持;支持条件if,循环for、while、until,分支break、contine、case等,函数定义,功能和C差不多,但语法有区别;提供简单的数组(能不用不用),甚至还提供了指针用法(千万不要用)!输入输出(I/O)操作简单,“I/O重定向 + 管道”已经成为经典应用。因为经常做文件相关的查询(文件名、文件属性等),并执行后续操作,所以Shell在测试语句写法、字符串操作、文件判断等方面的操作,提供得多快好省。
    C中,变量为基础数据类型,更多的是数值类型,字符串只是其中一种(也是很强大的一种);条件、循环、分支、函数定义很常规,有自定义数据结构struct,还包含非常强大的数组、指针,输入输出中规中矩。特别强调是结构体、数组、指针,这是C除了数值运算,还能组织实现Linux这种超大规模代码的基础。虽然上手比较难,但对C专家来说,这些“水土火气”基本元素,就能构成多彩的代码世界。
    编程语言的语法、基本元素,是入门学习的第一步。编程语言有最基本的实现要素,理解这一点后,入门主要是适应撰写的习惯,更重要的是找到最适合的应用场景,使用最适合的工具来完成。 

3 总结
    目前的语言,有神秘莫测的,有温文尔雅的,有高大威猛的,有活泼可爱的,有大家闺秀的...
    C是短小精悍的,平时虎头虎脑,大智若愚;遇到地球毁灭、或宇宙危机,就能华丽变身超级赛亚人打怪兽。
    Shell大隐隐于市,亲切低调,甚至你会视而不见;待到茫茫黑夜大家呼呼大睡时,她在丛中笑。

    目前的计算机系统,有的只提供交互式的用户应用,完全封闭了Shell,切断了系统与人的入口(只剩下赤裸裸的人与人的联系);有的提供高大上集成的用户应用,弱化了Shell,只有那些额外研究者,才能偶尔脱离集成依赖,和系统时断时续的沟通;有的则反其道而行之(如开源世界),提供密道入口、工具箱,还有残缺的藏宝图,等待有心人的添砖加瓦。
    是勇敢探险深入虎穴,是到此一游空手而归?依据你我的选择。

4 参考文献
    1) Mendel Cooper, Advanced Bash-Scripting Guide. 杨春敏,黄毅 译;《高级Bash 脚本编程指南》(网上有电子版)
    2) Arnold Robbins & Nelson H. F. Beebe, Classic Shell Scripting. O'Reilly Taiwan公司编译,《Shell脚本学习指南》(网上有扫描版)
    3) B W. Kernighan & D M. Ritchie, The C programming Languag. 徐宝文,李志 译;《C程序设计语言(第2版)》(网上有电子版,练习这本书的习题,就会顺便学习了Shell、Linux)
    4) GNU C Library Reference Manual

猜你喜欢

转载自blog.csdn.net/zhouyulu/article/details/53072636