附录B 编程的本质附录B 编程的本质编程的本质N小结编程简史名词纪要参考资料

附录B 编程的本质

编程的本质

N

尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日—),生於于瑞士温特图尔,是瑞士计算机科学家。Pascal语言之父。

让我们暂时撇开平台、框架、技术、设计模式、对象思想、敏捷开发论等。 追问程序本质。

2.0 什么是编程?

编程的本质是创造世界。

从本质上来说, 程序就是一系列有序执行的指令集合。 如何将指令集合组织成可靠可用可信赖的软件(美妙的逻辑之塔), 这是个问题。

N有一句在计算机领域人尽皆知的名言:

算法+数据结构=程序(Algorithm+Data Structures=Programs)

所有编程语言的最终目的都是提供一种“抽象”方法。这里的抽象,就是思维的对问题空间的映射。语言,只是为了表达我们的思想。

每一次“抽象”都抛弃了一些非本质特征而提炼出更普适的精髓特征,因而每一次抽象都是在透过现象看本质,每一次提炼都是一次质的飞跃和升华,从而使由此得到的新理论更具普遍性与包容性。例如量子力学不仅能解释经典力学的各种现象,还能解释微观世界里特有的(不能被经典力学或经典电动力学解释的)现象,如AB效应。

从硬件电路上的高低电平,到机器代码的01组合,再到汇编指令的mov、add,再到,中高级语言中的for、print, 编程语言的从底层到高层的发展,在做一层一层抽象的,正是编译器。

就好比是在数学中,无论多么复杂的问题,最终都可以拆分化归到最基本的运算和公理上一样;对于编程来说,每一个程序最终都可以被分解成一个一个最基本的指令以及这些指令的组合。

人类对这些问题的分析和理解,对问题的拆分,并用算法和代码来描述的过程,就是“编程”,这样的人,我们称之为“程序员”。

诗人用优美的意象,构建一个美的情感世界。作家用个性鲜明的人物,曲折离奇的情节,创造一个理想王国。音乐家用音符,创造一个悠远优雅的声音世界。数学家,通过最基本的公理推导出定理,数学规律,构建一个庞大的宇宙空间形式的逻辑世界……程序员,通过最基本的算法,数据结构,构建庞大的互联网云端的“虚拟世界”。是的,他们都是在创造一个世界。

从这个角度看,无论哪个学科,哪个领域,都是这样的一个过程。所以,人类的所有知识体系、学科类别,都是相通的。毕竟,都是人类大脑思维的结果。人类的大脑就像是JVM , 计算机编程、数学证明、物理公式、音乐、艺术设计、诗歌小说……等等就像是java,scala,kotlin,groovy,clojure,jython……等等,通过不同的思想与语言表现出不同的形式,但是通过人类大脑(jvm) 连通。

2.1 结构化程序设计

1971年4月份的 Communications of ACM上,N发表了论文“通过逐步求精方式开发程序’(Program Development by Stepwise Refinement),首次提出“结构化程序设计”(structure programming)的概念。

不要求一步就编制成可执行的程序,而是分若干步进行,逐步求精。 第一步编出的程序抽象度最高,第二步编出的程序抽象度有所降低…… 最后一步编出的程序即为可执行的程序。 用这种方法编程,似乎复杂,实际上优点很多,可使程序易读、易写、易调试、易维护、易保证其正确性及验证其正确性。

结构化程序设计方法又称为“自顶向下”或“逐步求精”法,在程序设计领域引发了一场革命,成为程序开发的一个标准方法,尤其是在后来发展起来的软件工程中获得广泛应用。有人评价说沃思的结构化程序设计概念“完全改变了人们对程序设计的思维方式”,这是一点也不夸张的。

从编程角度来说, 开发者应对的就是逻辑, 逻辑的表达、组织和维护。 逻辑是事物自此及彼的合乎事物发展规律的序列。指令是逻辑的具体实现形式。

软件的复杂性表现在如何表达和维护交互复杂的大型逻辑上。但无论软件发展到多么复杂的程度, 总有一群人(我们可称之为“计算机科学家”), 在试图从程序的本质中探究软件开发的基本问题, 他们试图论证和确保程序的正确性、提炼软件的基本属性并进行衡量; 程序的正确性本质是逻辑学来保证的。 没有逻辑学, 程序根本就无法立足, 更不可能有今天的大规模应用。

2.2 怎样解决问题?

工欲善其事必先利其器

在编程中,我们的武器装备通常有(不限于)如下的几个方面:

1.开发工具,让我们更有效率地创造逻辑、 远离语法错误的困扰(IDE); 2.公共库,将常用的通用逻辑块封装成可反复使用的组件, 避免不必要的重复劳动(SDK); 3.设计模式,体现的是如何可扩展地解决常见的逻辑交互问题; 4.应用框架,解决的是应用的通用逻辑流的控制的问题,让开发者更多地聚焦具体业务逻辑上(我们本书讲的Spring Boot,就是这样的一个优秀的应用框架); 5.问题领域建模,在具体的应用情境下按照既定总体思路去探究具体问题解决的方法。

我们在软件工程中,通常采用的自顶向下的架构设计思想,即先着手系统架构设计,然后逐层分解,进入业务模块,最后进入细粒度功能模块的详细设计开发。

而所谓自底向上,就是先从一行代码,一个Bug,一个模块做起,然后再做一个流程,一个业务模块,最后构建出一个庞大的系统架构。

自顶向下与自底向上这两个过程,不是彼此孤立的,而是互相融合的。

2.3 层次化分解与复合

我们经常说一些代码片段是优雅的或美观的,实际上意味着它们更容易被人类有限的思维所处理。

对于程序的复合而言,好的代码是它的表面积要比体积增长的慢。

代码块的“表面积”是是我们复合代码块时所需要的信息(接口API协议定义)。代码块的“体积”就是接口内部的实现逻辑(API背后的实现代码)。

在面向对象编程中,一个理想的对象应该是只暴露它的抽象接口(纯表面, 无体积),其方法则扮演箭头的角色。如果为了理解一个对象如何与其他对象进行复合,当你发现不得不深入挖掘对象的实现之时,此时你所用的编程范式的原本优势就荡然无存了。

2.4 面向对象编程(OOP)

面向对象编程是一种自顶向下的程序设计方法.万事万物都是对象,对象有其行为(方法),状态(成员变量,属性).

所谓“面向对象语言”,其实就是经典的“过程式语言”(比如Pascal,C),加上一点抽象能力。所谓“类”和“对象”,基本是过程式语言里面的记录(record,或者叫结构,structure),本质是一个“映射表”(map)(一切皆是映射)。

2.5 函数式编程(FP)

函数式编程方法通过组合和应用函数来构造逻辑系统.函数式编程倾向于把软件分解为其需要执行的行为或操作,而且通常采用自底向上的方法.同时,函数式编程也提供了非常强大的对事物进行抽象和组合的能力.

在函数式语言里面,函数是“一类公民”(first-class)。它们可以像1, 2, "hello",true,对象…… 之类的“值”一样,在任意位置诞生,通过变量,参数和数据结构传递到其它地方,可以在任何位置被调用。

很多所谓“面向对象设计模式”(design pattern),都是因为面向对象语言没有first-class function,所以导致了每个函数必须被包在一个对象里面才能传递到其它地方。

2.6 混合式编程(HP)

深刻理解了“数据流”的本质(CPU的存储,寻址,中断等)。不管是OOP、FP,其实本质上都是把你的“思想”放进一个“管道”,让其流动运行起来。只是在不同的语言范式里,放置的形式有一点不同而已!

对编程各种范式运用,游刃有余。

庖丁释刀对曰:“臣之所好者,道也,进乎技矣。始臣之解牛之时,所见无非牛者。三年之后,未尝见全牛也。方今之时,臣以神遇而不以目视,官知止而神欲行。依乎天理,批大郤,导大窾,因其固然,技经肯綮之未尝,而况大軱乎!

这里的“牛”,可以理解为我们所说的各种编程思想,编程范式,编程方法,编程技巧等等。最后,达到“运用之妙,存乎一心”之境也。

小结

编程的本质就是创造世界。

编程简史

1940之前

提花织布机

1801,Joseph Marie Jacquard用打孔卡为一台织布机编写指令,在提花织布机(或称甲卡提花织布机,Jacquard loom)上,运用打孔卡上的坑洞来代表缝纫织布机的手臂动作,以便自动化产生装饰的图案。Jacquard织布机是第一台可进行程序控制的织布机。用打孔卡进行编程的概念,直到电子计算机被发明出来之后仍然被广泛运用。

1842,爱达·勒芙蕾丝(Ada lovelace)在1842年至1843年间花费了九个月,将意大利数学家Luigi Menabrea关于查尔斯·巴贝奇新发表机器分析机的回忆录翻译完成。分析机由于其设计思想过于先进,在当时根本没有 被制造出来。(Babbage的分析机一般被认为是现代电子通用计算机的先驱)。她于那篇文章后面附加了一个用分析机计算伯努利数方法的细节,被认为是世界上第一个电脑程序。 “她的努力只遇到了一点点小小的麻烦,那就是:实际上并没有任何计算机能够用来运行她的程序。后来的企业架构师们重新吸收了她的这个技能,用来学习如何更好地使用UML进行编程。”[8]

1890,霍列瑞斯(Herman Hollerith)在观察列车长对乘客票根在特定位置打洞的方式后,意识到他可以把信息编码记载到打孔卡上,随后根据这项发现使用打孔卡来编码并纪录1890年的人口统计数据(这种语言是种编码)。

1936, Alan Turing发明了世间一切程序语言的最终形态,但很快他就被英国军情六处“请”去当007了。与通用图灵机(Universal Turing machine)等价的语言被称为图灵完备的(Turing completeness),它定义了“什么样的语言可以被称作是程序语言”。

1936 , Alonzo Church同时也发明了世间一切程序语言的最终形态,甚至做得更好。他发明的λ演算是当今函数式编程(FP)的鼻祖,对函数式编程有巨大的影响,特别是Lisp 语言。Church是Turing在Princeton的博士生导师,他在λ演算方面的工作先于Turing指出了不存在一个对可判定性问题的通用解法,这后来证明和Turing针对停机问题提出的图灵机模型是等价的。即著名的“Church-Turing”论题。

1940年代

最早被确认的使用电的计算机诞生在1940年代。

程序员在有限的速度及存储器容量限制之下,撰写汇编程序。用汇编语言的这种撰写方式需要花费大量的脑力而且很容易出错。

康拉德·楚泽于1948年发表了他所设计的Plankalkül编程语言的论文。但是在他有生之年却未能将该语言实现。(关于康拉德·楚泽的故事,可参考本书:附录1)

在这段期间被开发出来的重要语言包括有:

1943 - Plankalkül (Konrad Zuse)
1943 - ENIAC coding system
1949 - C-10

1950与1960年代

在这段期间被开发出来的重要语言有:

1951 - Regional Assembly Language
1952 - Autocode
1954 - FORTRAN
1954 - IPL (LISP的先驱)
1955 - FLOW-MATIC (COBOL的先驱)
1957 - COMTRAN (COBOL的先驱)
1958 - LISP
1958 - ALGOL 58
1959 - FACT (COBOL的先驱)
1959 - COBOL
1962 - APL
1962 - Simula
1962 - SNOBOL
1963 - CPL (C的先驱)
1964 - BASIC
1964 - PL/I
1967 - BCPL (C的先驱)

其中有三个现代编程语言于1950年代被设计出来,这三者所派生的语言直到今日仍旧广泛地被采用:

Fortran ,1954

名称取自"FORmula TRANslator"(公式翻译器),约翰·贝克斯(John Backus)针对汇编语言的缺点而研究开发的语言。

LISP,1958

名称取自"LISt Processor"(枚举处理器),约翰·麦卡锡(John McCarthy)在1958年基于λ演算所创造,采用抽象数据列表与递归作符号演算来衍生人工智能。LISP为函数式程序设计语言,所有运算都能以函数作用于参数的方式来实现。LISP核心的操作符只有7个:quote、atom、eq、car、cdr、cons、cond。前三者quote、atom、eq用于符号的推断;car、cdr、cons操纵表格;cond负责分支判断。这种简洁定义,非常接近图灵机原型的纯函数式语言,是现代语言完全无法比拟的。

ALGOL 60,1960

名称取自"ALGOrithmic Language"(算法语言)。ALGOL 60是程序设计语言由技艺转向科学的重要标志,其特点是局部性、动态性、递归性和严谨性,发明于1960年。ALGOL 60强化了当时许多关于计算的想法,并提出了两个语言上的创新功能:

(1)嵌套区块结构(Nested block structure):可以将有意义的代码片段组群成一个区块(block),而非转成分散且特定命名的程序。

(2)词汇范围(lexical scoping):区块可以有区块外部无法通过名称访问,属于区块本身的变量、程序以及函数。

另一个创新则是关于语言的描述方式:

一种名为巴科斯-诺尔范式 (BNF)的数学化精确符号被用于描述语言的语法。之后的编程语言几乎全部都采用类似BNF的方式来描述程序语法中上下文无关的部分。

Pascal、Ada、Simula、C等都借鉴了ALGOL。

COBOL,1961

名称取自"COmmon Business Oriented Language"(通用商业导向语言),由格雷斯·霍波(G.Hopper)所开发。COBOL语言以代码极其冗长和通篇大写字母的书写风格而闻名。据称用COBOL书写的程序超过了2000亿行。另有调查发现世界上目前使用的商业应用软件之中的百分之七十是用COBOL代码编写的。

BASIC,1964

BASIC (初学者通用符号指令代码,Beginners' All-purpose Symbolic Instruction Code),匈牙利人约翰·凯梅尼(John G. Kemeny)与数学教师托马斯·卡茨(Thomas E. Kurtz)认为像FORTRAN那样的语言都是为专业人员设计,没有办法普及。于是,他们在简化FORTRAN的基础上由共同研制出来的。1964年BASIC语言正式发布。第一个BASIC程序在1964年5月1日早上4时,由BASIC编译程序进行编译后成功运行 。1975年,比尔·盖茨把它移植到PC上。

1967-1978:确立基础范式

在1960年代以及1970年代中,结构化程序设计的优点也带来许多的争议,特别是在程序开发的过程中完全不使用GOTO。

在这段期间被开发出来的重要语言有:

1968 - Logo
1970 - Pascal
1970 - Forth
1972 - C语言
1972 - Smalltalk
1972 - Prolog
1973 - ML
1975 - Scheme
1978 - SQL (起先只是一种查询语言,扩充之后也具备了程序结构)

1960年代晚期至1970年代晚期的期间中,编程语言的发展也有了重大的成果。大多数现在所使用的主要语言范式都是在这段期间中发明的。

Simula,1967

第一个面向对象编程语言。由挪威科学家Ole-Johan Dahl和Kristen Nygaard,以Algol 60超集的方式设计开发。

Pascal,1970

Niklaus Wirth(就是那位说:“算法+数据结构=程序” 的人)创造了Pascal,一个过程式的语言。Pascal语言语法严谨,层次分明,程序易写,具有很强的可读性,是第一个结构化的编程语言。Pascal的名称是为了纪念十七世纪法国著名哲学家和数学家Blaise Pascal。

C,1972

源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。1970年,美国贝尔实验室的 Ken Thompson,以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。 1971年,Dennis M.Ritchie伙同Thompson一起,合作开发UNIX。1972年, D.M.Ritchie 在B语言的基础上设计出C语言。Thompson和Ritchie就用C完全重写了UNIX。在开发中,他们还考虑把UNIX移植到其他类型的计算机上使用。C语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为x86开发的程序,不能在Alpha,SPARC和ARM等机器上运行。而C语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。

未来的JVM的“虚拟机”的思想,在某种程度上正是源自这里,通过对不同平台上JVM的实现,向上封装一层,从而使得基于JVM的编程语言可以更大限度的实现了跨平台(当然,对应需要实现各个平台上(比如说Windows,Linux,Mac OS)的JDK)。

Smalltalk,1975

由Alan Kay,Dan Ingalls,Ted Kaehler,Adele Goldberg等于70年代初在Xerox PARC开发的面向对象编程语言。

Alan Kay 总结了 Smalltalk 的五大基本特征。这是第一种成功的面向对象程序设计语言,也是Java 的基础 语言。通过这些特征,我们可理解“纯粹”的面向对象程序设计方法是什么样的: (1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论 上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。 (2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那 27 个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个 子例程或函数。 (3) 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所 以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。 (4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class) 是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。 (5) 同一类所有对象都能接收相同的消息。[10]

Smalltalk对其它众多的程序设计语言的产生起到了极大的推动作用,例如:Objective-C,Actor, Java 和Ruby等。90年代的许多软件开发思想得利于Smalltalk,例如Design Patterns, Extreme Programming(XP)和Refactoring等。

Prolog,1972

Prolog语言最早由Aix-Marseille大学的Alain Colmerauer与Phillipe Roussel、Kowalski等人于60年代末研究开发。它建立在逻辑学的理论基础之上, 最初被运用于自然语言等研究领域。现已广泛的应用在人工智能的研究中,可以用来建造专家系统、自然语言理解、智能知识库等。

ML,1973

ML(Meta Language)是Robin Milner主管LCF项目时(1970),作为LCF项目的元语言(Meta Language)而设计的,这也是其名字的来历。LCF项目是受Dana Scott给出的一组逻辑原则启发而设立的,致力于开发一种“可计算函数逻辑”(Logic of Computable Functions)。目标是构造一个方便实用的系统,来自动的或者半自动的证明函数程序中一些有趣的性质。今天,大多数著名的推理系统都是用ML写的。目前ML有两个发展分支:Standard ML和Caml。

ML使用了Hindley-Milner类型推论算法来推测大多数值的类型,而不需要四处使用注解。ML一般被归为非纯函数式编程语言,因为它允许副作用和指令式编程。这一点和纯函数式编程语言例如Haskell很不一样。ML特性有惰性求值的求值策略,一阶类型函数, 带有垃圾收集的自动内存管理, 参数多态,静态数据类型,类型推断,代数数据类型,模式匹配和异常处理等。ML中的思想影响了众多的语言,例如Haskell,Cyclone和Nemerle。

这些语言都各自演展出自己的家族分支,现今多数现代编程语言的祖先都可以追溯他们其中至少一个以上。

1980年代:增强、模块、性能

1980年代的编程语言与之前相较显得更为强大。C++合并了面向对象以及系统程序设计。美国政府标准化一种名为Ada的系统编程语言并提供给国防承包商使用。日本以及其他地方运用了大量的资金对采用逻辑编程语言结构的第五代语言进行研究。函数编程语言社区则把焦点转移到标准化ML及Lisp身上。这些活动都不是在开发新的范式,而是在将上个世代发明的构想进一步发扬光大。

然而,在语言设计上有个重大的新趋势,就是研究运用模块或大型组织化的程序单元来进行大型系统的开发。Modula、Ada,以及ML都在1980年代发展出值得注意的模块化系统。模块化系统常拘泥于采用泛型程序设计结构:泛型存在(generics being)、本质(essence),参数化模块(parameterized modules)。(参阅多态)

尽管没有出现新的主要编程语言范式,许多研究人员仍就扩充之前语言的构想并将它们运用到新的内容上。举例来说,Argus以及Emerald系统的语言配合面向对象语言运用到分布式系统上。

1980年代的编程语言实现情况也有所进展。计算机系统结构中RISC的进展假定硬件应当为编译器设计,而非身为人类的汇编语言程序员。借由中央处理器速度增快的帮助,编译技术也越来越积极,RISC的进展对高级语言编译技术带来不小的关注。

语言技术持续这些发展并迈入了1990年代。

在这段期间被开发出来的重要语言包括有:

1980 - Ada
1983 - C++ (加上类的C)
1984 - Common Lisp
1985 - Eiffel
1986 - Erlang
1987 - Perl
1988 - Tcl
1989 - FL (Backus)

C++,1983

Bjarne Stroustrup,他使用过Simula和ALGOL,接触过C。他对Simula的类体系感受颇深,对ALGOL的结构也很有研究,深知运行效率的意义。既要编程简单、正确可靠,又要运行高效、可移植。于是Bjarne Stroustrup以C为背景,以Simula思想为基础,把他所听说过的一切都试图嫁接到C上,创造出了C++。它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。

1990年代:互联网时代

1990年代未见到有什么重大的创新,大多都是以前构想的重组或变化。这段期间主要在推动的哲学是提升程序员的生产力。

许多"快速应用程序开发" (RAD) 语言也应运而生,这些语言大多都有相应的集成开发环境、垃圾回收等机制,且大多是先前语言的派生语言。这类型的语言也大多是面向对象的编程语言,包含有Object Pascal、Visual Basic,以及C#。

Java,1995

1995年,互联网的蓬勃发展给了Oak(Java之前的名字)机会。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

我们将在下一章中介绍Java编程简史。另外,关于上面提到的“提升程序员的生产力”的哲学理念,本书介绍的SpringBoot框架,就是为了推动程序员的生产力而设计开发的。不管在编程语言设计领域,还是在编程框架的开发领域,很大一部分的目的,就是为了这一点。

在这段期间被开发出来的重要语言包括有:

1990 - Haskell
1991 - Python
1991 - Visual Basic
1993 - Ruby
1993 - Lua
1994 - CLOS (part of ANSI Common Lisp)
1995 - Java
1995 - Delphi (Object Pascal)
1995 - JavaScript
1995 - PHP
1997 - REBOL
1999 - D

当今的趋势

编程语言持续在学术及企业两个层面中发展进化,目前的一些趋势包含有:

  • 在语言中增加安全性与可靠性验证机制:额外的堆栈检查、信息流(information flow)控制,以及静态线程安全。
  • 提供模块化的替代机制:混入(mixin)、委派(delegates),以及观点导向。
  • 组件导向(component-oriented)软件开发。
  • 元编程、反射或是访问抽象语法树(Abstract syntax tree)
  • 更重视分布式及移动式的应用。
  • 与数据库的集成,包含XML及关系数据库。
  • 支持使用Unicode编写程序,所以源代码不会受到ASCII字符集的限制,而可以使用像是非拉丁语系的脚本或延伸标点符号。
  • 图形用户界面所使用的XML(XUL、XAML)。

等等。

在这段期间被开发出来的重要语言包括有:

2001 - C#
2001 - Visual Basic .NET
2002 - F#
2003 - Scala
2003 - Factor
2006 - Windows PowerShell
2007 - Clojure
2009 - Go
2014 - Swift (编程语言)

编程语言发展史上的杰出人物

约翰·冯·诺伊曼,操作系统概念的发起者。 肯·汤普逊,发明了Unix。 丹尼斯·里奇,发明了C。 约翰·巴科斯,发明了Fortran。 阿兰·库珀,开发了Visual Basic。 詹姆斯·高斯林,开发了Oak,该语言为Java的先驱。 安德斯·海尔斯伯格,开发了Turbo Pascal、Delphi,以及C#。 葛丽丝·霍普,开发了Flow-Matic,该语言对COBOL造成了影响。 肯尼斯·艾佛森,开发了APL,并与Roger Hui合作开发了J。 比尔·乔伊,发明了vi,BSD Unix的前期作者,以及SunOS的发起人,该操作系统后来改名为Solaris。 艾伦·凯,开创了面向对象编程语言,以及Smalltalk的发起人。 Brian Kernighan,与丹尼斯·里奇合著第一本C程序设计语言的书籍,同时也是AWK与AMPL程序设计语言的共同作者。 约翰·麦卡锡,发明了LISP。 比雅尼·斯特劳斯特鲁普,开发了C++。 尼克劳斯·维尔特,发明了Pascal与Modula。 拉里·沃尔,创造了Perl与Perl 6。 吉多·范罗苏姆,创造了Python。

......

名词纪要

二进制

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由莱布尼兹发现(启蒙思想源自中国古代的易经八卦)。

指令

告诉计算机从事某一特殊运算的代码。如:数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令、处理器控制指令。

代码化指令序列就是计算机程序。

汇编

汇编是离机器码最近的一个人类可阅读可编写的语言形式。计算机CPU只能处理010101这样的二进制码。人类最早用0 和 1(纸袋打孔等) 来写程序,这样搞起来太费劲,效率太低。

幸亏人类有着聪明的善于思考,抽象问题的大脑。所以后来就有了汇编语言。人类用汇编语言来写人类看得懂的程序(mov, add ... )。 但是这样的汇编指令,CPU又看不懂了。怎么办?我们聪明的人类设计了“编译器”。 之后这个程序会把人类编写的程序,翻译成CPU能理解的010101.........通过编程语言建立起人类和CPU之间的翻译工作。(一切皆是映射)

编译器

简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。(一切皆是映射)是连接高级语言(如Pascal、C、C++、汇编语言)与机器语言(Machine code,01)的桥梁。

对于Java、C#等高级语言而言,编译器先把源码(SourceCode)编译成通用中间语言的字节码(ByteCode)(遵循一套各自平台上定义的协议规范)。最后运行的时候通过通用语言运行库,转换成最终可以被CPU直接执行的机器码。

参考资料

1 https://www.zhihu.com/question/22193700 2 http://baike.baidu.com/item/%E4%BA%8C%E8%BF%9B%E5%88%B6 3 http://baike.baidu.com/item/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80 4 http://baike.baidu.com/item/LISP/22083 5 http://baike.baidu.com/item/pascal/241171 6 http://baike.baidu.com/item/ada/5606819#3 7 https://en.wikipedia.org/wiki/History_of_programming_languages 8 http://james-iry.blogspot.co.at/2009/05/brief-incomplete-and-mostly-wrong.html 9 http://baike.baidu.com/item/%CE%BB%E6%BC%94%E7%AE%97 10 《Java编程思想》(Bruce Eckel)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程一生

一条项目中常用的linux命令引发的经典算法题

1193
来自专栏程序员的诗和远方

20180722_ARTS_week04

这题寻找两个已经排好序的数组的中值,一开始思路比较简单,两个数组合一起,然后排个序就很容易找到中值了。

1061
来自专栏程序人生

[技术] 谈谈Python

昨天的文章收获了不少有价值的回复。不少人发现了一个大bug,那就是「上帝的归上帝,撒旦的归撒旦」。囧死我了。脑手不同步这病怎么治啊~以后我写完文章争取好好复查一...

3715
来自专栏高性能服务器开发

去BAT,你应该要看一看的面试经验总结

说下我的面试经验吧,都是亲身经历,不喜勿喷: 我去年12月份从上一家公司离职,一直到今年3月份,基本上都在面试中度过来的。 先交代下背景:坐标上海,做技术开发,...

3984
来自专栏恰同学骚年

[转] Agile Software Development 敏捷软件开发

  敏捷开发是一种软件开发方法,基于迭代和增量开发,通过自组织,跨团队,沟通协作完成开发工作。

1032
来自专栏高性能服务器开发

去BAT,你应该要看一看的面试经验总结

首先是简单地了解下你之前的工作经历和项目经验,然后就是算法和数据结构题目,具体涉及到以下内容:

1662
来自专栏企鹅号快讯

两种编程高手

第一种工程师 给一段复杂的程序,比如有7个局部变量,5层循环和if嵌套,他能赤手空拳上阵,迅速领会程序意图、找到bug,不用借助任何工具甚至纸笔。 给一个复杂的...

1965
来自专栏Cloud Native - 产品级敏捷

从面向对象到函数式编程: 我们正在构建更成熟的关注点隔离生态系统

2016.11.17, 深圳, Ken Fang 在谈论关注点隔离生态系统前, 我想,首先需要谈谈 Procedure Programming, Functio...

19910
来自专栏武军超python专栏

2018年8月26日python常识和各大语言发展史

今天遇到的新单词: precision  n精确度 generator n发电机,生产者,生成器

1124
来自专栏Play & Scala 技术分享

为什么要创建开放源码的PlayScala社区?

2825

扫码关注云+社区