时间:2017-3-16来源:本站原创作者:佚名

在与前面提到的几位编程大师EricRaymond,LarryWall,PaulGraham通过邮件交流。和RichardStallman院士有长期的交流和当面请教的机会,第一次向他请教关于计算机的问题是在年5月份在九寨沟,一边欣赏风景,一边讨论计算机语言的过去,现状,未来的发展。正是在那次的谈话中,Stallman院士对Lisp的语言推崇备至,使得让我留下深刻的印象,并下定决心学好Lisp语言。同年的8月份,Stallman院士的好友RobertJ.Chassell一起启动GNUproject和自由软件基金会,RobertJ.Chassell曾经写过一本书《AnIntroductiontoprogrammingInEmacsLisp》,是EmacsLisp编程的入门书,8月份和Bob待在一起,去过很多的地方,在此期间Bob传授了许多关于EmacsLisp编程的知识。

第二次向Stallman院士请教关于编程语言的问题是在年,我们一起去了湖北的武当山,在游览完风景以后,在武当山脚下,闲暇之余,我向他请教了关于编程语言的一些问题,对当时流行的计算机语言予以点评,并向我提出了一个重要的观点,作为初学者,应当先从一门语言入手,力求精通并去感悟计算机的本质,在学习其他语言的同时借助第一门所学语言得到的感悟,以已贯知的将其推广到其他语言的学习中去。我认为这是一条多快好省的捷径,在这里推荐给大家。通过请教RichardStallman院士和自身多年的编程经验可知:可以将创客们究竟选用何种编程语言这个问题划分为两个阶段予以解说。

第一个阶段是创客们修行学习的阶段,第二个阶段是创客们利用计算机编程语言来从事某一项目的开发阶段,当然,两个阶段并不是截然分明的,它们之间存在一定的交集。在第一个阶段的主要目的就是创客们通过计算机语言的学习,编程实践来掌握计算的本质,我在黑客道有两门重要的课程,一门讲的计算机的本质,另一门讲的是编译原理。对这个问题已经做了系统的深入的探索和讨论,在黑客道中探索的观点直接引用在这里。

在第二个阶段的创作阶段我们可以运用许多其他的语言来进行开发稍后再做说明,在前面提到的四位伟大的计算机黑客中,计算机编程大师中,他们的观点不尽相同,有一个现象请大家注意,都已经提到了两种语言是极为关键的。一类是C语言,另一类是Lisp语言。在LarryWall先生提到的五种编程语言当中,虽然并未直接提到Lisp,但是他认为Haskell作为Lisp的现代版本来看待,所以我认为LarryWall先生实际上也把C和Lisp已经提炼出来了。

在我解说创客们修行学习的阶段中,我会重点解说C和Lisp这两种语言,我在黑客道的教学中,在初级阶段讲解计算的本质,这个课程是围绕计算的本质来讲解Lisp语言,在黑客道的第二个阶段讲解系统程序设计语言中,重点讲解了C语言,在这里先颠倒讲解的顺序,先来谈谈C语言,再来谈谈Lisp语言。关于C语言,在前面提到的黑客PaulGraham他曾经这样写过,C语言是一个beautifulsimplelanguagedevelopedbyDennisRicheintheearlyninetyseventitieswidelyusedininfrastructurelikeoperatingsystemandrouters,就是说C语言是一门简单的,简洁的,优美的计算机语言,由DennisRiche在20世纪70年代初设计,广泛用于基础设施,指的是操作系统,路由器方面的编程,即系统级的编程。这是PaulGraham在《HackersandPainters》书中给出的一种看法。刚才我已经提到了C语言是一种系统编程语言,在实践中基本上所有的硬件平台上都能得到C语言的运行时系统,所以从这个意义上讲C语言是最具有移植性的。C语言最大的用途就是抽象硬件的各种功能,将程序员从繁琐的硬件细节中解放出来,让编程变得模块化。

这个模块化是工程中一个非常重要的方法论,在黑客道2中所讲的系统程序设计中就讲解C语言,一共是五个阶段,第三个阶段就是讲如何在不同的硬件平台上去设计C的运行时系统,当然,还有前面几个阶段,具体可以参考我的那本《黑客道诠释》中的讲解,当然在完成硬件的抽象功能之外,C语言可以完成的还有好多,而且,C语言经过三次标准化以后规模不算太大,某些语法成分,语意非常的诡异,陷进重重。只有当你准确的理解这些难点以后,将其克服以后,方可灵活的运用了。PaulGraham曾经说过有些语言是给你安全带,在保护你的同时也限制你。而C语言给你拐棍,给你充分的自由,不会限制你。所以如果程序员熟练的掌握C语言里面指针的用法就可以开发出许多性能优异的程序来。

一般来讲,同一道程序使用C开发的效率比其他高级语言开发的效率高,指的是运行时效率。所以说用C语言开发的速度应该是最快的。这也是为什么操作系统内核要用C语言开发的主要原因,因为内核必须要求速度快。在系统编程领域,这个C语言特别适合干这么几件事情,第一处理中断的历程,第二是多任务的操作系统上在任务切换时完成对硬件资源管理,第三是内存资源的管理,因为在C语言中指针是可以用来分配内存和回收内存的,从C的特性来看,它不适合开发大规模的应用程序,而实际情况也是如此。

目前已经有很多的选择利用其他语言针对不同的任务特点来开发应用是非常方便的。当然C语言的开发不仅仅局限于操作系统内核的开发。对于其他计算性能要求比较高的散核,C的使用并不少见,比方说在编写图形界面时有一个库叫做gtkplus即gtk+,gtk+这个库就是用C来写的。gtkplus使用回调函数,叫做callbackfunctions。这样在设计图形界面的时侯可以很方便的利用这个回调函数操作控件。当然了你要利用好gtkplus库来设计图形界面必须知道如何使用C的函数指针。

还有一个例子是我的朋友俄罗斯的黑客GorSysoev是白俄罗斯人,他出生在哈萨克,他父母是白俄罗斯人,他是在莫斯科上的大学,留在了莫斯科,在工作期间,他在Unix平台主要就是FreeBSD和GUN/Linux平台上开发了世界上速度最快的Web服务器Nginx,这个是用C语言来写的,体现了精明的俄罗斯人的编程风格:直于主题,敢于突破常规,不落俗套,集中精力,精简而高效的完成一个确定的问题。体现了他丰富的想象力。大家知道,在传统的Unix服务器设计中,通常是每当服务器得到客户机请求的时候,服务器就在操作系统的内核的帮助下启动一个进程,把来自客户机的数据传递给新启动的进程去处理。在Nginx问世之前,最流行的Web服务器叫做Apache,Aache服务器就是这样做的。那么对于低负载的网站,这个模式是没有问题的。但是对于高负载的网站来说,这套机制是不可行的。因为操作系统每次启动进程的时候,内核需要做许多的准备工作,特别是要为新启动的服务器的进程分配内存空间,拷贝数据给它。这样在高负载的场合下它就严重制约了服务器的性能。所以在gorSysoev设计Nginx的时候,他采用的思路与传统的设计思路不同。

Nginx是一个单进程的程序,也就是说,服务器一旦启动起来,它就是一个进程在运行,这方面的内容在第七章会涉及到,即如何启动精灵进程(daemonprocess)。gorSysoev聪明的利用内核的机制来帮助多任务的处理,避免了操作系统启动多个进程,多个线程,在Nginx内部也没有使用的多线程的,就避免了复杂的线程调度算法。是如何实现的呢?它是频繁的使用指针,二级,三级,多级指针来开发新模块,利用多级指针可以避免大块数据的拷贝和移动,这是一个很聪明的做法。指针长度是很小的,在32位的寄存器上占用4byte或者更大,从空间效率和时间效率角度分析,基于指针的效率比直接操作大块数据得效率更高一些。对于服务器的请求和响应,Nginx的设计的确达到了很高的效率,体现了gorSysoev深厚的编程功力,这也是关于C编程技巧一个极好的案例。除了在服务器和桌面计算平台上以外,还有一个更广大的应用领域,即嵌入式系统。而且C语言是这个领域的首选语言,这个局面在32位微处理器得到了进一步的巩固,在目前市场上stml32的这种芯片价格低于10元,这种芯片强大的计算能力,低功耗的特点使其迅速的淘汰了,自由软件基金会GUN的工具链支持stml32的平台,在这一平台上开发C程序具有很大的优势,除了stml32微处理器以外,当然还有其他的微处理器也已经到32位微处理器这个产品上,所以GUN的工具链支持的范围有所扩大。对于C语言的特点就介绍到这里。









































白癜风介绍
治疗白癜风最好的办法

转载请注明原文网址:http://www.gzdatangtv.com/cksc/6214.html
------分隔线----------------------------