• Haskell curry。光看这个人的名字就很厉害,Haskell 被用来作为一门编程语言的名字,Curry 被用来作为一个编程技巧。在 1930+ 的时候发明了组合逻辑。但是大部分人都没接触过,而是在别人告诉你科里化的时候才去知道这个组合逻辑。
  • 图灵机,1937年。基本思想是用机器来模拟人们用纸笔进行数学运算的过程,像下图一样,一个纸袋在移动,可以写或擦除某个符号。简单来说就是一个能计算所有机器能计算东西的机器。目前计算机能做的时候图灵机都能做,只不过速度比较慢。

  • 邱奇,1936年。简单来说就是他用 lambda 演算来推演所有编程都等价于 lambda,和图灵机很相似(所有的计算机都是和图灵机等价的),而图灵是邱奇的徒弟(学生),也就是说你知道图灵机是什么就知道 lambda 演算是什么,知道 lambda 演算是什么就知道图灵机是什么。

上面三个一般人都没学会,大学不教,培训机构也不教,而大学一般从现代计算机开始教。

  • 冯·诺依曼,现代计算机,1945年。二战的时候美国因需求找上特斯拉,但特斯拉迟迟没有做出东西,于是美方又找到冯·诺依曼接手,但是他也搞不出来这个机器。但他规定了一个电脑必须要有内存、cpu…,一个电脑必须要有哪几部分,也做出来了。但是他的情商高他说他的所有灵感都来自图灵,所以图灵就被捧上去了。
  • 汇编 ASM,1947,布思(女)。这东西也几乎没人会了,但是三十年河东,三十年河西,现在前端又开始搞这个了(webAssembly)。汇编是做什么的?就是直接告诉(指令) cpu 要干什么事情。就像 一个软件不能在 mac 和 window 上同时运行,因为 cpu 不一样,指令集不一样。但是这种东西写起来很麻烦,虽然能用,所以能不能发明一种高级一点的语言呢,就是封装呗,能在不同的 cpu 上都能运行,你只需要表达自己的意思就好了,不用管底层是怎么执行的。所以语言有了低级、高级之分,如果一门语言离硬件很远,那么就是高级语言。第一门高级语言是什么呢?Fortran。
  • Fortran,1957年,由 IBM(1911年) 一个公司发明的语言,世界上第一门指令式编程,这个代码依然是给 cpu 下发指令。但是这个语言用的人也不多,因为这家公司是卖硬件的,买它的机器,然后手册上告诉你需要使用 Fortran 来操作,如果你不会,就专门派人上门来操作,那个时候软件是在作为硬件的附赠品给人的。IBM (国际 商业 机器)公司很厉害,唯一一家活了超过100年的IT公司。不想Alibaba (1999年)鸡贼,说102年,能存活三个世纪。

从这个时候开始,编程开始分为两派,编程语言一定要特别依赖某一个机器吗?
图灵它是以“机”为落脚点,这个理论非常依赖于机器,没有机器就没有他。
而 lambda 算法实际上是一种数学,并不依赖于机器,波及一些几何原理。
就像剑宗和气宗。剑宗主要是练剑,没有剑功法就发展不下去。而对于气宗而言,没有什么剑不剑的,那个树枝照样打。而编程的气宗是什么呢?就是 Lisp。

  • Lisp,1958年,不同于 Fortran,从 lambda 演算发展而来,世界上第一门函数式编程语言(虽然那个时候并没有这个概念)。

面向对象是什么时候呢?

  • 面向对象,1966年,Alan Kay,一个概念,并不是指定某个语言是面向对象,Lisp 也可以有,只要满足他的思想就是面向对象:1.所有东西都是一个一个对象,用对象来代替数据;2.对象和对象之间能发送消息。题外:源代码电影
  • Algol 60,1960+,最牛逼的编程语言,是程序设计语言发展史上的一个里程碑,它标志着程序设计语言成为一门独立的科学学科,并为后来软件自动化及软件可靠性的发展奠定了基础。

接下来就是开始一些大家都耳熟能详的语言了

  • Pascal,1970年,一般从小开始编程的人会有接触,因为他经常用于竞赛。作为一个小型的和高效的语言,意图鼓励使用结构化编程和数据结构进行良好的编程实践。
  • smallTalk,1972年,面向对象的首个代表,因为一开始的语言不是指令式就是 Lisp 的函数式,没有专门就是面向对象,这门语言也是非常的精巧,让人能够一眼就能够看懂,基本上从这个时候开始,正常人都开始能够看的懂
  • C,1972年,和 smallTalk 同时期的语言,很多地方是借鉴 Algol 60 和 Pascal。
  • Prolog,1972年,他的编程方式有点特殊(比如:friend(X,Y):-likes(X,Y),likes(Y,X).,表示对于两个对象XY,如果X喜欢Y,且Y喜欢X,那么他们是朋友。),有点像现在的 CSS 一样,为什么现在都没人用了呢,因为太慢了。那什么时候又火了呢?现在比如 Siri,预先在后台把所有的信息先输入进去,然后就能够回答你。人工智能就和他有关系。并且他也和 Lisp 有点渊源的,最初的概念都是和他相关的,和图灵和相关(因为有图灵测试)。
  • SQL,1974年,他和 Prolog 就是挺像的,比如说 select * from users,就好像和人说话一样(按照某些结构),没有任何的算法,只是表达了你的需求。而 Prolog 则是我只想知道这个命题是真是假,他就会告诉你结果,你不需要思考。所以这就是这种语言的生命力,在机器越强的时候,这种语言越容易被挖掘了,我们把这种语言就是叫做声明式编程(写什么就做什么,别搞什么指令加减乘除,能做到就去做,不能做到就算了,我继续升级,我们最常用的就是 CSS 了,body {color: xxx},你写什么他就会做到什么,一般你不会问为什么是这个颜色,只会问为什么会生效,题外:中二的打架招式要念出招式名字)。
  • C 语言,1972年,规规矩矩的指令式编程,依赖于冯诺依曼架构,没有面向对象。
  • Objective-C,1984年,只有苹果公司在用,他是面向对象和 C 语言的结合(如他的名字一样),质朴的面向对象,对象和对象之前能发送消息。特点啰嗦。
  • C++,1985年,除此之外,如果你想在 C 语言上面加上面向对象还有 C++ 可选,什么多态、封装继承都有。

C 的这一脉生命力还是非常强大的。

  • MVC 范式,1979年,主要用于 UI 编程,于是这个思想就广泛的在桌面开发领域流行开了。前端也有,前端就是抄的桌面和后端开发的 MVC,

  • Scheme,1975年,Lisp 的方言。

  • CommonLisp,1984年,也是 Lisp 的方言。

为什么在编程语言这里也有方言呢?
当然就有,在中国就有,各地都有方言。编程语言也是语言,所有也有方言。
为什么会有方言这种说法,因为他们的语法特别像,这里并不像 C++ 和 Objective-C 一样,他们是在 C 的基础上加了很多的东西,或者说是拓展、升级。而方言就是语法几乎没有变,只是改变了一下意思(比如说单词)

  • Self,1987年,面向对象刚开始并没有怎么去面向对象,只是说了对象和对象之间有消息传递。但像 C++ 就是说我们必须要有 class,接口之类的。而 Self 认为并不一定得有 Class 这些,我们可以用原型
  • R,1993年,主要用于科学计算。
  • lua,1993年,本来很火,后来因为 Node.js被压下去了一点,特别适合用于给游戏写脚本,比较灵活。
  • Erlang,1986年,比较强调分布式的语言,现在也不多了,为什么?因为有了 Golang(即使是抄过来的)。
  • Haskell,1990年,这个语言当时是十几个人一起开发的,投票选出来的名字。从 Lisp(lambda 演算为基础发展而来,标志就是 “λ”) 这一脉。

这么看下来好像函数式式微,没关系,在前端这里起来了。
但是从 1990 年开始,事情开始变化,语言突然开始变多了。

  • Python,1991年,走的面向对象(smallTalk),指令式(c 语言)这一脉。那个时候也主要是用来写脚本。大概 2015 的时候火了,很多公司突然开始搞大数据,因为很多科学计算的库。
  • Perl 5,1994年,1991年那个时候万维网诞生了,也就是需要前端、后端,一般新起的领域都需要新的语言来,因为他需要单独为这个领域做一些事情。最早最早于用 C 在做开发,但是因为开发效率太低了,所以有了 Perl 第五版语言,特点是有很多的正则。
  • PHP 3,1998年,这个在中国被广泛使用,当时如果你要做后端就大概率话选择这个,很大的原因可能是在于对中文的支持,像 unicode、GBK,都是 1995年以后出来的,不然如果是写页面,为什么不用更成熟的 Perl 或者 Python等,而选择这么新的 PHP。
  • Racket,1995年,属于Lisp家族的函数式程序设计语言。
  • Ruby,1995年,如果是 web 编程,这个也是可以用。在中国没有火起来,因为他的定位和 PHP 一样,都是 Web 后端。但 Ruby 的教程就几乎为零,所以入行的人也少了,入行的人少了教程就更少了,恶性循环,不像 PHP 选择的人多。这也就像 MySQL一样,和同时期或者后起来的数据库相比真不怎么样,各方面都排不到前三,除了流行度就是因为网上搜数据库的教程基本上都是 MySQL。还有就是因为 LAMP 这套组合(Linux+Apache+MySQL+PHP)。前端也总结了一套有 MEAN(MogoDB+Express+Angular+Nginx),为什么 Angular 也很火,因为他加入了这套组合拳,所以他也很流行。

所以一门技术要流行,一是名字要取得好,像 MySQL,简单的、短小,大家一看就记下来了。二是要和流行的技术打包。
JS 深的这种体会,傍了 JAVA

  • Java,1995年,基于 class 的面向对象,而且 Java Spring 太好用了。

  • Java Script,1995年,他是抄袭最多的语言(因为只有 10 人的时间),需要有指令式(if else 之类的)的语言(C 语言),原型(Self),函数式(函数是一等公民,函数可以像变量一样传来传去)编程(Scheme),JAVA(必须,Kpi 任务,10天,必须像 JAVA),但是呢。JS 之父喜欢函数式那套,所以一开始这们语言就是四不像,有点像函数式但又差远了,有点像面向对象但也差远了。所以那个时候大家都是随便写写,从 1995-2005 这年间,没有人专门去学这种“缝合怪”的东西。

  • C#,2000年,如果一个语言出来的比较早,那他的库一定很多,如果一个语言出来的比较慢,那他一定设计比较好,这门语言基本上是照着 JAVA 设计的,并且改了很多不好的地方,在面向对象的实现上比 JAVA 好很多,既可以做桌面应用,也可以写 Web。

  • LINQ,2007年,一项技术,适用于 C#,他结合了 SQL 和 Haskell,用函数式编程的想法去写 SQL。

  • Rx 库,2011年,他受到 LINQ 的启发,除了搞 SQL 还可以搞其他的,那么所有跟事件相关的东西都可以用 Rx 来操作,并且是以流的方式。Angular 中 Rx 就是重要的章节。有衍生出 Rx.js,Rx.java。

面向对象和 MVC 的特点,适合于 UI 编程,但是 JS 不止界面还有处理事件,面向对象不好处理事件,事件一般都是异步的,像 JAVA 处理异步要么用线程、事件委托等都搞不好,线程还会涉及到锁,所以函数式火了起来,阴差阳错,本来是四不像,现在好像用来处理事件不错。

  • TypeScript,2012年,微软发明的 JavaScript 超集。
  • Golang,2009年,谷歌,主要用于分布式、云系统,可能借鉴了 Erlang。
  • Dart,2012年,谷歌为了 Flutter 跨平台 UI 需求发明。
  • kotlin,2011年,JetBrains 主要是为了升级 JAVA,宣传语-修复 null,空值之类的错误。如果现在用来开发安卓应用,不会在选择 JAVA 了,而是选择他。
  • Clojure,2007年,JAVA 和函数式的融合。
  • Swift,2014年,苹果升级了 Objective-C,为了跨平台需求(电脑、手机和手表)。
  • Hack,2014年,Facebook 升级了 PHP。最近又被 JS 抄了 pipe 语法。
  • Rust,2010年,Mozilla 有一个 Firefox 浏览器,但是是用 C++ 写的,但这个浏览器 10~20 的版本卡的要死,如果直接去改(优化) C++ 还不如搞个新的语言。虽然这里可以用 C++ 重写程序也能优化,但是不如发明一个新的语言去推动重写,这样也有利于宣传。在前端 webpack 的 babel-loader 太慢了,可以用 rust 加快100倍(swc)或者 esBuild。主要用于系统编程。

到现在那些 199x年的语言,到现在 30 年了,都到了瓶颈,所以一门语言都是有生命实效的,不可能一直存活,因为需求变了,语言的诞生就是为了某个需求。

·
题外话:
现在的编程知识就像上面的那个图一样,像个树一样的东西,慢慢生长的,目前学的 JavaScript 已经在很后面了,直接在这里开始学,前后左右都是很复杂的东西(也积淀他是抄袭王),一般没有写 JavaScript 的人去学 C++、Golang、Java 这种,一般走不出去,那要怎么才能突破呢?从最上面开始学,慢慢学到 JavaScript 时,会发现这东西不就是上面组合而成的。

语言切换是很简单的,思维模型不一样,如果用 typescript 就得思考类型,还有库不一样,如果一个语言能调用以前的库就很好,还有工具链能否继续支持,