前言
这次要写的内容几乎与硬件无关,是关于计算机编程语言的一些历史。本想邀请95级计算机专业的周沛学弟来执笔,不过后来还是硬着头皮自己上了。打算写好后请软件科班出身的学弟来加些批注。周沛学弟增加的内容将会以棕色字体显示。
堂主(中)与99届周沛学弟(右)和97届同学许炳(左)的合影
为了方便大家阅读,我照例还是加个之前写的文章链接在这里:
一部生动的计算机历史--美国计算机历史博物馆参观记(1)
第一部分:计算器
一部生动的计算机历史--美国计算机历史博物馆参观记(2)
第二部分:穿孔卡片
一部生动的计算机历史--美国计算机历史博物馆参观记(3)
第三部分:模拟计算机
一部生动的计算机历史--美国计算机历史博物馆参观记(4)
第四部分:计算机的诞生
一部生动的计算机历史--美国计算机历史博物馆参观记(5)
第五部分:早期计算机公司
一部生动的计算机历史--美国计算机历史博物馆参观记(6)
第六部分:实时计算
一部生动的计算机历史--美国计算机历史博物馆参观记(7)
第七部分:大型计算机
一部生动的计算机历史--美国计算机历史博物馆参观记(8-上篇)
第八部分:内存与存储(上篇--内存)
一部生动的计算机历史--美国计算机历史博物馆参观记(8-下篇)
第八部分:内存与存储(上篇-存储)
在进入正题前,我把周沛学弟写的一段关于计算机编程语言的综述贴在这里,让大家先了解一些概念:
计算机的语言,历史悠久,繁复庞杂,种类浩如烟海,下面尝试从几个不同的视角,来对计算机语言进行分类,以期给读者一个全面的视角来了解计算机语言。
1,低级语言与高级语言
A,低级语言
低级语言,泛指机器语言和汇编语言(ASM),是以机器为本,突出机器的执行效率。
机器语言
机器语言,是计算机最原始的语言,由0和1的代码构成,计算机在工作的时候只认识机器语言,即0和1的代码;
汇编语言
汇编语言,用人类容易记忆的语言和符号来表示一组0和1的代码,如AND表示加法助记符,然后用汇编编译器将汇编语言翻译成机器语言,翻译的过程几乎是一一对应的,这样,在保留机器执行效率的同时,降低了编写与阅读的难度。
相对于高级语言,低级语言的优点是执行速度快,但代码编写难度较大,可读性较差。另外,低级语言编写的程序只能在一种计算机上运行,想要运行在不同的机器上,必须重写。低级语言是早期的一种计算机编程语言,现在只在很少的特殊场景中使用了。
B,高级语言
高级语言,是以人为本,突出编写与阅读的便利性。我们现在大多数人使用的语言,如C、C++、Python、Java、JavaScript、R等等,都属于高级语言。
相对于低级语言,它更接近于我们平时正常的人思维,其最大的特点是编写容易,代码可读性好。实现同样的功能,使用高级语言耗时更少,程序代码量更短,更容易阅读。其次,高级语言是可移植的,也就是说,仅需稍作修改甚至不用修改,就可将一段代码运行在不同类型的计算机上。
高级语言缺点也很明显,使用高级语言编写的程序运行时,需要先将其翻译成低级语言(机器语言)计算机才能运行它,在翻译过程中可能会产生一些多余的部分,运行效率低些。另外,对硬件的可控性相对于低级语言弱些,目标代码量较大。
2,静态语言与动态语言
A,静态语言
静态语言,是指编译器在程序编写完成之后,程序运行之前,就对程序做语法检查和数据类型校验的语言。诸如,C、C++、JAVA等流行的语言都是静态语言。
静态语言的检测机制可以在程序运行之前就尽可能的发现程序错误,对于减少程序BUG、避免程序宕机起着良好的保护作用。此外,静态语言的代码结构规范,有利于调试。静态语言的缺点,是不够灵活,代码量大,不够简洁,开发周期长。
静态语言,比较适用于大型工程、高可靠性场景,如操作系统的编写,几乎所有的操作系统都是基于静态语言编写的。
B,动态语言
动态语言,在代码编写完成后没有语法和数据类型校验的环节,代码直接用于执行,在程序实际运行中发现问题寻找BUG。诸如,Python、PHP、JavaScript等流行的语言都是动态语言。
动态语言的特点是简洁、灵活、编程的效率高,可以快速的完成任务目标,让程序员聚焦于代码的功能,摆脱繁复的语法限制,开发周期短。动态语言的缺点是不方便调试,对于程序特别是大型程序中隐藏的BUG不易发现。
动态语言,适用于对开发效率要求比较高,同时对可靠性要求没有那么高的场景,如web服务器开发、科学计算等领域。
3,面向过程语言与面向对象语言
A,面向过程语言
面向过程语言,是面向机器的执行的。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数,采用自顶向下、逐步求精的程序设计方法,使用三种基本控制结构构造程序,即任何程序都可由顺序、选择、循环三种基本控制结构构造。诸如流行的汇编、C、Fortran等语言都属于面向过程语言。
面向过程语言的优点是,代码直观、执行效率高,计算机的是如何一步一步的执行程序一目了然。要求程序员了解程序的各种细节,使得程序的可驾驭性高。其缺点是,对于大型的逻辑复杂的程序,对程序员要求高,需要程序员将复杂的逻辑关系转换为对应的执行序列。
由于面向过程语言是面向机器执行的,其高效率是其主要优势,最流行的操作系统诸如UNIX、Windows、Linux、Android(内核是Linux)、MacOS/IOS(内核是FreeBSD)的系统内核均采用C语言写成。另外,对于一些逻辑不复杂的小型程序,面向对象语言的开发效率也较高。
B,面向对象语言
面向对象语言,是面向逻辑抽象的。在面向过程程序设计中,事务都被拆解为属性和行为(方法),然后将属性和行为打包成对象,再将对象如乐高玩具一般层层组合,最后形成程序。诸如流行的JAVA、C++、Objective-C等程序语言都属于面向对象语言。
面向对象语言的优点是,逻辑层次清晰、模块化程度高、复用性高、可扩展性高、利于团队协作等。缺点是,代码量大、冗余代码多、灵活性低、执行效率不如面向对象语言。对做架构设计的设计师水平要求高。由于存在大量的封装,使得程序员不易了解程序的细节,降低了程序的可驾驭性。
面向对象语言善于处理复杂逻辑,在UI界面设计(Windows的VC++,MacOS/IOS的Objective-C/Swfit,Android的Java)、编译器(Clang/LLVM),企业级应用(J2EE)等领域有着突出的优势。
4,编译型语言与解释型语言
A,编译型语言
编译型语言,是编译的时候直接编译成机器可以执行或调用的程序,如exe、dll、elf或so等类型。如将C语言可直接编译成exe程序,运行时直接运行exe程序就可以了,无需重新编译,所以程序执行效率较高。典型如C、C++、Pascal等语言,都属于编译型语言。
其执行过程如下所示:
相对于解释型语言,其优点是运行速度快,代码效率高,编译后程序不可以修改,并且,看不到源代码,保密性较好。缺点是代码需要经过编译方可运行,可移植性差,只能在兼容的操作系统上运行。
由于其执行速度较快,同等条件下对系统的要求较低,因此常用于开发操作系统、大型应用程序、图像处理、数据库开发等场合。
B,解释型语言
解释型语言,程序不需要编译,运行时使用一个专门的解释器去翻译,每一条语句都是执行的时候才翻译,所以这类程序每执行一次就要翻译一次,运行效率较低。典型如Python、JavaScript、PHP都属于解释型语言。
解释型语言的执行过程如下所示:
相对于编译性语言,其优点是可移植性好,只要有解释器环境,程序就可以在不同的操作系统上运行。缺点是代码需要有专门的解释器,在程序运行时,除要给用户程序本身分配内存空间外,解释器也占用系统资源,所以其运行速度较慢。另外,也很难达到像C、C++那样直接访问和操作计算机的底层硬件。
解释型语言常用于,一是对运行速度要求不高(如一些网页脚本、服务器脚本、接口辅助开发等)的场合,二是对跨平台(操作系统的兼容性)有要求的场合。
5,通用型语言与专用型语言
A,通用型语言
通用型语言,指不以针对特定的应用领域而开发设计的语言,如C、C++、JAVA、Python等程序语言。
C和C++可以从小到单片机大到巨型机,从操作系统底层到UI界面上层均可使用。JAVA也广泛运用于小至手机大至英特网后台系统等领域。
B,专用型语言
专用型语言,指为特定场景或特定应用而设计的计算机语言,如R、Fortran、CUDA等程序语言。
R语言和Fortran是专为科学计算而设计的,主要运用在数据统计、气象计算、数值模拟等领域。CUDA是专为Nvidia显卡设计的,主要用于图形/图像处理、机器学习等领域。
第九部分程序的艺术
美国计算机历史博物馆的第九部分展区是一个剧场,没有安排任何实物的展品,代之以一段讲述软件发展历史的影片。剧场外的墙面上是一副巨幅演化图案,大致揭示了计算机高级编程语言的演化史。由于当时的拍摄条件限制,我只能逐段拍摄了些照片。这张演化图的下方是一个时间轴,跨度从年一直到年。
计算机历史博物馆的程序语言演化图-1
计算机历史博物馆的程序语言演化图-2
计算机历史博物馆的程序语言演化图-3
计算机历史博物馆的程序语言演化图-4
计算机历史博物馆的程序语言演化图-5
这些照片拍摄得分辨率还是挺高的,我用图像处理软件把这些照片合成了一张全景图,如果需要高分辨率合成全景图的朋友可以发寻常型白癜风图片哪家看白癜风的医院好