《关于并行貌似正确的废话》系列文章:
怎么办?解铃还需系铃人。既然自动的做不了,程序员就需要有并行的头脑,用并行的语言和开发方式,设计,实现。怎么并行?
或许计算机和程序语言的发展史能给我们一些启发。
先说最原始的图灵机,一个执行器,一个纸带,一个指针,一个状态。执行器根据当前状态,指针对应纸袋位置的符号,决定机器的下一个状态。后来有了冯诺依曼结构。纸袋和状态存在存储器中,执行器就是控制器,计算器负责计算下一个状态。我们可以把那时候对计算机的操作看作状态序列的跳转操作。
![]()
后来有了操作系统控制作业的输入、控制计算机执行作业、控制计算机输出结果。后来发现输入输出的时候,计算部分在空闲。计算的时候,输入输出空闲。花这么多钱买的噪音这么大的破铁箱子就这点本事?专家们忍不住了,要多任务!于是每个任务在计算机内部被细化为输入输出和计算三个部分。但任务有长有短,还是有空闲,于是多进程系统诞生。每个任务只能在独立的存储区内工作,一个单独的守护进程代替人做调度,谁做完了谁撤,谁在等待,就让谁执行。
后来有了编程语言,程序员使用C语言告诉计算机,你先这么这么做,如果满足这个条件,就从A语句开始往下做。如果不满足走B。然后到C点开始,如果满足条件,就反复执行C到D之间的代码,直到条件不满足。慢慢的,提倡在C语言中不使用Goto,只是函数调用,循环,判断,直线语句解决所有问题。主张重复的功能多写成函数。再后来,程序越来越大,提倡不同功能的函数放到不同的文件中,再后来有了变量,常用库函数,库文件。主张函数和变量的声明,复杂的头文件包含和宏定义放到头文件中。
Unix出现了,Unix的设计理念是模块化。模块化设计和实现至今还影响着我们。每个模块都完成独立的功能,提供清晰的接口。模块之间有依赖关系。将这些模块划分为内核态和用户态,限制权限。
后来有了面向对象语言,C++,C#,JAVA, python,Lua等等,有了类,有了模板,有了例外,有了继承,有了虚函数。一个类封装一类对象,C中的struct只是封装了属性,而C++中的class可以封装针对对象的动作。这个类只能做这些动作,这个类中的某些动作只能在它自己的其他动作中用到(private)。再把一些不同类中的类似操作合并成模板(template),这几个类的某个动作可以用一个函数来完成。如果除了错,不管你是在什么函数调用,什么类中,只要仍出一个信号告诉某一级的某个运行中的函数说,我出错了,出了什么错。它就能把这个信息输出出来,这样就把错误处理也做了封装。继承和虚函数也一样,封装,然后扩展。
其实我们一直在做的就是封装!把我们不关心的东西通通封装起来,只给出要使用这个东西必须的那部分内容就行了。这是计算机人机交互这几十年进化的永恒主题。让人尽可能简单的使用计算机。
====>



还在前戏中,群众们都在等高潮啊
@Sil, 文章开头就有最后一篇文章的链接,你可以直接打开看的:)
真有你的,还来个上中下。。。
Envy封装的不错,还有多态。。。
@myesis, 分成上中下是觉得以前的长篇大论太枯燥了,而且自己很难把握。呵呵。原来你也是钢炼迷,握手。
Pingback: 编译点滴 » 关于并行貌似正确的废话–串行已经尽力了
我等最后那篇……长下见识…
@baozii, 呵呵,感觉最后一篇也没能写出好东西。自己对编程的理解还不够,只能泛泛而谈
Pingback: 编译点滴 » 关于并行貌似正确的废话-程序员是优秀的管理者