前言
因为写另一篇推文牵涉到不少关于编程语言发展历史的东西。所以很想新开一篇写一下我知道的编程语言历史。我觉得大部分人都多多少少会有历史情结吧:玩魔兽世界想看一下魔兽的历史(虽然暴雪爸爸专业吃书300年,但可以看一下夏一鸽的炉石史册),谈个恋爱想知道一下对方的恋爱史,甚至说像英雄联盟这种即时策略游戏都想去了解一下它的历史。所以作为一个程序员,也许你对编程语言的历史也会有同样的想法。在这里我就简单的分享一下编程语言的几种分类和我所知道的一些编程语言历史。
分类
现在世界上的编程语言至少有1500多种(文章结束有个关于数量的小彩蛋)。这么多语言用不同的角度去看也就会不同的分类,我这里用几种常见的分类来大体介绍一下。
我这里的分类参考了WIKI上的
Category:Programming language
以及我的大学老师Dr. Lu的课件
按抽象程度
abstraction level
01
低级语言
低级语言的抽象化程度是最低的。简单介绍10种:
Machine Language(Machine Code)就是一堆0和1,Machine code也是唯一一种计算机不用再去做额外转换便可以直接执行的语言。
汇编语言(Assembly Language),汇编语言比Machine Code高级一点点将一些计算机指令从二进制数映射称一些简单的人类可读的单词或者字母符号。
这类语言的特点就是编写和维护起来很难但是因为写在最底层,代码直接对应计算机指令,执行效率很高。但是也有局限性,比如汇编语言就需要区分不同的CPU架构编程,不同的指令集都有不同的特点和指令。
02
高级语言
Algol, Pascal, C++, Java, C# 等等。现在大多数主流的编程语言都可以看做是高级语言。高级语言的可读性更高,把底层的机器码抽象化称人们可以更容易接受和理解单词或者符号。至于各个语言之间的话,只能说各有各的特点和擅长的领域这里不做太细的阐述。
相信大家也都清楚,这里的低级与高级并不是只好坏。而是指语言的抽象程度。很多书上讲高级语言更加抽象。如果不好理解的话,看一下这张图,其实语言越高级就越接近人的想法的表达方式,当然对于机器来说就更加抽象。
其实低级和高级也只是相对而言。比如说C语言本身作为高级语言,但是现在很多人都把它当做低级语言,因为C语言仍然可以通过地址去访问内存而且可以直接使用汇编语言。
按照程序范式分类
Programming Paradigms
编程范式(Programming paradigm),是一种根据程序语言的格式特点来进行语言分类的方法。范式的分类与语言并不一定是一对一的关系,有些语言就支持多种范式比如说JAVA就支持命令式编程(Imperative Language),面向对象编程(object-oriented programming)以及泛型编程(Generic Programming )。但是有些程序语言设计之初就是为了支持某种特定的范式比如说Scheme,Lisp 就只支持函数式编程(Functional Programming)。
01
命令式编程(Imperative Language)
命令式编程:用程序的状态(State)变化来表示计算(Computation)并且用语句(Statement)更改状态。现在大部分程序语言都是命令式编程。命令式编程多通多一条一条指令来改变程序的状态以解决问题。更侧重于用编程语言“命令”计算机怎么去做。我们用的大部分编程语言都支持命令式编程的范式比如assembly, Java, C, C++等等。
02
声明式编程(Declarative programming)
与命令式编程相对立。它描述目标的性质,让电脑明白目标,而非流程。声明式编程不用告诉电脑问题领域,从而避免随之而来的副作用。而指令式编程则需要用算法来明确的指出每一步该怎么做。(From Wiki)声明式编程可能我们平常接触的比较少所以我来举几个例子多介绍一下
函数式编程(Functional Programming)
它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。简单的来说就是由λ演算(lambda calculus)作为数学理论基础的,由函数组成的编程语言,我会写另外一篇推文详细介绍一下。
这里简单举个例子:求斐波那契数列。首先,我用keyword “define”定义了一个函数叫fib 这个函数有一个入参记做n。cond就类似switch语句 当 n = 0 时 输出0 当 n = 1时输出1。最后利用递归得出 fib(n) = fib(n-1)+ fib(n-2)。
值得注意的是递归思想渗透在函数式编程的每一个角落能用就用,简洁易证明。当然不论什么时候用到递归都要考虑一下递归的深度和效率问题,防止栈的溢出。比如我这写的算法就是在讨论算法导致递归效率低下时的经典例子。
逻辑编程(Logical Programming)
逻辑编程(逻辑程序设计)是一种编程典范,它设置答案须匹配的规则来解决问题,而非设置步骤来解决问题。
·不能生命变量
·没有loop
·每个语句之间是互不影响,相互独立的
逻辑编程的抽象程度非常高,有些地方也把它划为Very High-Level Programming Language.其中非常具有代表性的就是Prolog,
我先写一个简单的Prolog程序
likes(Laura, Brian).
Compile之后,接下在Console里写下Qurey
| ?- likes(Laura, Brian).
yes
| ?- likes(Brian, Whom).
Whom = Laura
yes
| ?- likes(Laura, Eddie ).
No
Prolog总的来说就是,你写的程序定义了一些规则和事实,然后你就可以写一些Query,编译器会根据程序里定义的事实来返回你Query的结果。再来看一个Factorial的例子
程序:
Query:
结果:
可以到这个网站在线试一下
当然,其实还有很多很多的分类,篇幅原因我只介绍这么多
历史
好了介绍完分类下面来大致讲一下我所了解的编程语言的历史
先来一张族谱图
01
早期的编程
最早计算机被发明就是用来进行数学计算的,而且当时的计算机很大很贵,性能还比不上你现在手里拿的手机。在最开始,那时候的程序员用最原始的方法进行编程:通过布线和开关
(图为通过布线和开关在ENIAC计算机上进行编 程,ENIAC为世界上第一台计算机)
再往后程序员们用机器码进行编程,前文也提到过机器码,计算机可以直接接收机器码不再做任何的处理和翻译直接执行计算机指令。
但是那个时候的计算机还不支持浮点运算以及数组寻址。首先,浮点运算就是带小数位的运算,因为要考虑到小数位的对齐,在硬件的设计上如果支持浮点运算是十分复杂的而且对电子元件的要求都很高,考虑要成本和技术的原因前几代计算机都是不支持浮点运算的。实际上浮点运算到现在仍是衡量超算性能的标准,许多低性能的处理器仍然不支持浮点运算。所以当时的浮点运算都是程序模拟的。(Linux 的内核现在应该也还是用程序模拟浮点运算的)其次,不支持数组寻址意思就是当时的计算机不支持A[i]去访问一个数组的值。那比如说,当时的程序员要访问A[7]怎么办呢?先看看A的地址(当时没有操作系统A的地址也是程序员自己分配的)加上7得到一个新的地址,再去访问这个地址就得到了A[7]的值。但是当你做个for循环你的i并不是静态的,所以每一次程序员都要算一遍这个地址,这样就增加很多繁琐的工作和开发成本。
于是IBM 的工程师 John Backus开发了SpeedCoding一个解释器(interpreter)来支持浮点运算以及数组寻址。这样程序员们就不用耗费精力在写浮点运算和寻址的机器码上了。但是执行效率肯定比不上直接的机器码,只是当时用机器码模拟浮点运算以及数组寻址太耗费人力了,相较之下SpeedCoding虽然慢但是人力成本就全省了,所以很多人都乐意用SpeedCoding。
02
高级语言之源:第一个编程语言
FORTRAN (Formula Translator)
1954年IBM 704发布了。这算是台划时代的计算机,很多最早的高级语言都是在这台机器上被发明出来的。IBM 704支持了浮点运算和数组寻址(1954年第一台计算机支持浮点运算,2017年最快的超算浮点运算峰值可以达到125,435.9万亿次运算/秒,摩尔定律要亡了)。随之而来的就是机器码比SpeedCoding快太多了因为计算机的支持用机器码去开发的人力成本一下子就降下来了。John Backus也意识到,真的要提高生产效率就要开发一种既方便程序员编程写公式计算又能很快的生成程序的系统才行。于是,Fortran项目在1954年开始开发了,耗费了IBM 216个人月于1957年才正式发布
(Fortran原始开发团队 左一: John Backus)
与其他高级语言不同,Fortran从一开始就没怎么设计语法,而是在怎么设计和提高编译器的性能上。在发布的第一年在IBM 704部署比例就超过了一半(虽然只卖了60台,毕竟一台好几百万)。
毫无疑问,Fortran对以后高级语言的开发以及影响都是深远的。但是Fortran是不支持递归的。想一想上学的时候多少数学公式的程序算法都用到了递归,简单方便。但是Fortran不支持递归了怎么办?答案很简单:展开。(什么太长了展不开?那就是你们这届程序员不太行。)
早期Fortran多被科学家用来进行数学计算,从气候模型的计算,到太阳系动力学的研究都在用Fortran来处理庞大的数学计算。Fortran后续也有很多版本的更新,最新的版本是03年的,已经支持OOP了感兴趣的朋友可以戳下面
Fortran ----密歇根大学cis400
(Fortran ‘Hello World’)
03
对目前主流语言影响最大
ALGO(Algorithm Language)
1958年 ALGO第一次被提出,ALGO设计之初就是为了规避Fortran上的一些设计缺陷比如:没有递归,IF语句有缺陷等等。大家可以往上翻一下族谱的图片,包括C和JAVA都是从ALGO演变过来的。ALGO算是第一个Structured programming(程序被分为一个一个小区域,任何一个独立的区域可以被随意调用。没有GOTO语句),第一次使用了BEGIN ,END 来定义一个BLOCK。也第一次有了local variable这个概念。
包括现在的IF....THEN....ELSE....ENDIF这种范式也都是从ALGO里继承过来的。最早的Fortran的IF语句是这样的 "IF ... A B C" ,A B C分别为当条件语句的值小于零,等于零,大于零时所GOTO的标签。这种三分支结构在后来也被Fortran淘汰。
BEGIN
FILE F(KIND=REMOTE);
EBCDIC ARRAY E[0:11];
REPLACE E BY "HELLO WORLD!";
WRITE(F, *, E);
END.
(ALGO ‘Hello World’)
关于ALGO还有一个比较有一意思的故事:
Donald Knuth
因为ALGO支持递归,但是ALGO的提出只是规定了语言规范,编译器却是五花八门有很多版本,水平参差不齐。有的编译器难免有些BUG,Donald Knuth就提出了一个测试来检测编译器递归和非本地引用的正确性:真男人编译器(Man_or_boy_test),你的编译器算对了这个算法就是男人编译器,得不到正确答案你的只能算男孩编译器(老爷爷说的不是我说的)。贴一个JAVA版本大家可以看一下。
“There are quite a few ALGOL60 translators in existence which have been designed to handle recursion and non-local references properly, and I thought perhaps a little test-program may be of value. Hence I have written the following simple routine, which may separate the "man-compilers" from the "boy-compilers" ”
- Donald Knuth.
pseudo code
让K=10 如果最后编译器的结果是-67那么就是男人编译器!其实老爷爷当初发的paper手算了一遍,给出的答案是-121(尴尬)。
这个老爷爷非常有意思,一生获奖无数,囊获过包括图灵奖在内的各种大奖,著作有“The art of computer programming”
谁能找出他的著作中的任何错误,他都会奖励2.56美元,因为“256美分刚好是十六进制的一美元”(256 pennies is one hexadecimal dollar);
04
“Lisp是世界上最好的语言!”
Lisp
Lisp语言作为第一个Functional Programming语言,到现在也有人使用。你也可以在各大论坛看到不少Lisp的信仰者高喊“Lisp是世界上最好的语言”
Lisp由John McCarthy在1958年创造,是现今第二悠久而仍广泛使用的高级编程语言。只有FORTRAN编程语言比它更早一年。LISP编程语族已经演变出许多种方言。现代最著名的通用编程语种是Common Lisp和Scheme(之前的斐波那契的例子就是用Scheme写的)。LISP最初创建时受到Alonzo Church'的lambda演算的影响,用来作为计算机程序实用的数学表达(其实lambda calculus也是几乎所有函数式编程的数学基础)。在计算机科学领域 LISP开创了许多先驱概念:包括IF语句,垃圾回收等等。(参考WIKI)
我会在另外一篇推文中详细介绍函数式编程和Lisp的历史
05
最早的OOP
Simula 67
Simula,一种编译式的编程语言,在1960年代在奥斯陆的挪威电子计算中心(Norwegian Computing Center)开始被发展出来,主要的设计者是奥利-约翰·达尔(Ole-Johan Dahl)与克利斯登·奈加特。被开发了Simula I与Simula 67两代。它承继了ALGOL 60的基础,被认为是第一个面向对象程式设计的编程语言。
Simula影响了Smalltalk以及接下来所有的面向对象程式设计编程语言,如比Bjarne Stroustrup
在设计C++语言时,将许多Simula 67的特性引入C++之中。
好了,基本的历史到这里就结束了。在找资料的过程中,真真正正的感受到“站在巨人的肩膀上”这句话。下面是一些对编程语言发展做出贡献且获得图灵奖(CS的诺贝尔奖,100万刀的奖金)的大神们。
不同的语言有不同的特点和使用场景。学习一下另外一种语言的编程思想,总会带来一些新收获。可能现在没什么太大作用,但以后也许成为你解决问题的新思路。
最后放一句大神的话:
“There are only two kinds of programming languages: those people always bitch about and those nobody uses.”
--Bjarne Stroustrup
后记
这篇推文是我在写函数式编程的时候涉及到很多概念和历史的部分,就想到不如重新开一篇单独把这些东西拉出来写。这里也只是分享一些我的主观看法和找到的一些资料,虽说多有考证和出处但是肯定有一些不对或者是片面的地方,欢迎大家交流和指正,谢谢。
Reference:
http://www-03.ibm.com/ibm/history/ibm100/us/en/icons/fortran/
https://www.seas.harvard.edu/courses/cs252/2016fa/
http://jlu.myweb.cs.uwindsor.ca/440/440prolog2017.pdf
https://www.zhihu.com/question/19811764/answer/19206777
https://rosettacode.org/wiki/Man_or_boy_test#Java
彩蛋
我在查找世界上到底有多少种语言的时候发现了这个网站:http://www.99-bottles-of-beer.net/
这个网站收录了超过1500种语言来做同一件事情:Hello world,打印 99 Bottles of Beer 的歌词(Full Version)然后我就搜了一下这首歌,看到歌词我就忍不住了,听到原版简直笑出声
99 Bottles of Beer
油管上还有人唱Full Version,科学上网点这里
最后附上歌词
99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.
98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wall.
97 bottles of beer on the wall, 97 bottles of beer.
Take one down and pass it around, 96 bottles of beer on the wall.
96 bottles of beer on the wall, 96 bottles of beer.
Take one down and pass it around, 95 bottles of beer on the wall.
95 bottles of beer on the wall, 95 bottles of beer.
Take one down and pass it around, 94 bottles of beer on the wall.
94 bottles of beer on the wall, 94 bottles of beer.
Take one down and pass it around, 93 bottles of beer on the wall.
93 bottles of beer on the wall, 93 bottles of beer.
Take one down and pass it around, 92 bottles of beer on the wall.
92 bottles of beer on the wall, 92 bottles of beer.
Take one down and pass it around, 91 bottles of beer on the wall.
91 bottles of beer on the wall, 91 bottles of beer.
Take one down and pass it around, 90 bottles of beer on the wall.
90 bottles of beer on the wall, 90 bottles of beer.
Take one down and pass it around, 89 bottles of beer on the wall.
89 bottles of beer on the wall, 89 bottles of beer.
Take one down and pass it around, 88 bottles of beer on the wall.
88 bottles of beer on the wall, 88 bottles of beer.
Take one down and pass it around, 87 bottles of beer on the wall.
87 bottles of beer on the wall, 87 bottles of beer.
Take one down and pass it around, 86 bottles of beer on the wall.
86 bottles of beer on the wall, 86 bottles of beer.
Take one down and pass it around, 85 bottles of beer on the wall.
85 bottles of beer on the wall, 85 bottles of beer.
Take one down and pass it around, 84 bottles of beer on the wall.
84 bottles of beer on the wall, 84 bottles of beer.
Take one down and pass it around, 83 bottles of beer on the wall.
83 bottles of beer on the wall, 83 bottles of beer.
Take one down and pass it around, 82 bottles of beer on the wall.
82 bottles of beer on the wall, 82 bottles of beer.
Take one down and pass it around, 81 bottles of beer on the wall.
81 bottles of beer on the wall, 81 bottles of beer.
Take one down and pass it around, 80 bottles of beer on the wall.
80 bottles of beer on the wall, 80 bottles of beer.
Take one down and pass it around, 79 bottles of beer on the wall.
79 bottles of beer on the wall, 79 bottles of beer.
Take one down and pass it around, 78 bottles of beer on the wall.
78 bottles of beer on the wall, 78 bottles of beer.
Take one down and pass it around, 77 bottles of beer on the wall.
77 bottles of beer on the wall, 77 bottles of beer.
Take one down and pass it around, 76 bottles of beer on the wall.
76 bottles of beer on the wall, 76 bottles of beer.
Take one down and pass it around, 75 bottles of beer on the wall.
75 bottles of beer on the wall, 75 bottles of beer.
Take one down and pass it around, 74 bottles of beer on the wall.
74 bottles of beer on the wall, 74 bottles of beer.
Take one down and pass it around, 73 bottles of beer on the wall.
73 bottles of beer on the wall, 73 bottles of beer.
Take one down and pass it around, 72 bottles of beer on the wall.
72 bottles of beer on the wall, 72 bottles of beer.
Take one down and pass it around, 71 bottles of beer on the wall.
71 bottles of beer on the wall, 71 bottles of beer.
Take one down and pass it around, 70 bottles of beer on the wall.
70 bottles of beer on the wall, 70 bottles of beer.
Take one down and pass it around, 69 bottles of beer on the wall.
69 bottles of beer on the wall, 69 bottles of beer.
Take one down and pass it around, 68 bottles of beer on the wall.
68 bottles of beer on the wall, 68 bottles of beer.
Take one down and pass it around, 67 bottles of beer on the wall.
67 bottles of beer on the wall, 67 bottles of beer.
Take one down and pass it around, 66 bottles of beer on the wall.
66 bottles of beer on the wall, 66 bottles of beer.
Take one down and pass it around, 65 bottles of beer on the wall.
65 bottles of beer on the wall, 65 bottles of beer.
Take one down and pass it around, 64 bottles of beer on the wall.
64 bottles of beer on the wall, 64 bottles of beer.
Take one down and pass it around, 63 bottles of beer on the wall.
63 bottles of beer on the wall, 63 bottles of beer.
Take one down and pass it around, 62 bottles of beer on the wall.
62 bottles of beer on the wall, 62 bottles of beer.
Take one down and pass it around, 61 bottles of beer on the wall.
61 bottles of beer on the wall, 61 bottles of beer.
Take one down and pass it around, 60 bottles of beer on the wall.
60 bottles of beer on the wall, 60 bottles of beer.
Take one down and pass it around, 59 bottles of beer on the wall.
59 bottles of beer on the wall, 59 bottles of beer.
Take one down and pass it around, 58 bottles of beer on the wall.
58 bottles of beer on the wall, 58 bottles of beer.
Take one down and pass it around, 57 bottles of beer on the wall.
57 bottles of beer on the wall, 57 bottles of beer.
Take one down and pass it around, 56 bottles of beer on the wall.
56 bottles of beer on the wall, 56 bottles of beer.
Take one down and pass it around, 55 bottles of beer on the wall.
55 bottles of beer on the wall, 55 bottles of beer.
Take one down and pass it around, 54 bottles of beer on the wall.
54 bottles of beer on the wall, 54 bottles of beer.
Take one down and pass it around, 53 bottles of beer on the wall.
53 bottles of beer on the wall, 53 bottles of beer.
Take one down and pass it around, 52 bottles of beer on the wall.
52 bottles of beer on the wall, 52 bottles of beer.
Take one down and pass it around, 51 bottles of beer on the wall.
51 bottles of beer on the wall, 51 bottles of beer.
Take one down and pass it around, 50 bottles of beer on the wall.
50 bottles of beer on the wall, 50 bottles of beer.
Take one down and pass it around, 49 bottles of beer on the wall.
49 bottles of beer on the wall, 49 bottles of beer.
Take one down and pass it around, 48 bottles of beer on the wall.
48 bottles of beer on the wall, 48 bottles of beer.
Take one down and pass it around, 47 bottles of beer on the wall.
47 bottles of beer on the wall, 47 bottles of beer.
Take one down and pass it around, 46 bottles of beer on the wall.
46 bottles of beer on the wall, 46 bottles of beer.
Take one down and pass it around, 45 bottles of beer on the wall.
45 bottles of beer on the wall, 45 bottles of beer.
Take one down and pass it around, 44 bottles of beer on the wall.
44 bottles of beer on the wall, 44 bottles of beer.
Take one down and pass it around, 43 bottles of beer on the wall.
43 bottles of beer on the wall, 43 bottles of beer.
Take one down and pass it around, 42 bottles of beer on the wall.
42 bottles of beer on the wall, 42 bottles of beer.
Take one down and pass it around, 41 bottles of beer on the wall.
41 bottles of beer on the wall, 41 bottles of beer.
Take one down and pass it around, 40 bottles of beer on the wall.
40 bottles of beer on the wall, 40 bottles of beer.
Take one down and pass it around, 39 bottles of beer on the wall.
39 bottles of beer on the wall, 39 bottles of beer.
Take one down and pass it around, 38 bottles of beer on the wall.
38 bottles of beer on the wall, 38 bottles of beer.
Take one down and pass it around, 37 bottles of beer on the wall.
37 bottles of beer on the wall, 37 bottles of beer.
Take one down and pass it around, 36 bottles of beer on the wall.
36 bottles of beer on the wall, 36 bottles of beer.
Take one down and pass it around, 35 bottles of beer on the wall.
35 bottles of beer on the wall, 35 bottles of beer.
Take one down and pass it around, 34 bottles of beer on the wall.
34 bottles of beer on the wall, 34 bottles of beer.
Take one down and pass it around, 33 bottles of beer on the wall.
33 bottles of beer on the wall, 33 bottles of beer.
Take one down and pass it around, 32 bottles of beer on the wall.
32 bottles of beer on the wall, 32 bottles of beer.
Take one down and pass it around, 31 bottles of beer on the wall.
31 bottles of beer on the wall, 31 bottles of beer.
Take one down and pass it around, 30 bottles of beer on the wall.
30 bottles of beer on the wall, 30 bottles of beer.
Take one down and pass it around, 29 bottles of beer on the wall.
29 bottles of beer on the wall, 29 bottles of beer.
Take one down and pass it around, 28 bottles of beer on the wall.
28 bottles of beer on the wall, 28 bottles of beer.
Take one down and pass it around, 27 bottles of beer on the wall.
27 bottles of beer on the wall, 27 bottles of beer.
Take one down and pass it around, 26 bottles of beer on the wall.
26 bottles of beer on the wall, 26 bottles of beer.
Take one down and pass it around, 25 bottles of beer on the wall.
25 bottles of beer on the wall, 25 bottles of beer.
Take one down and pass it around, 24 bottles of beer on the wall.
24 bottles of beer on the wall, 24 bottles of beer.
Take one down and pass it around, 23 bottles of beer on the wall.
23 bottles of beer on the wall, 23 bottles of beer.
Take one down and pass it around, 22 bottles of beer on the wall.
22 bottles of beer on the wall, 22 bottles of beer.
Take one down and pass it around, 21 bottles of beer on the wall.
21 bottles of beer on the wall, 21 bottles of beer.
Take one down and pass it around, 20 bottles of beer on the wall.
20 bottles of beer on the wall, 20 bottles of beer.
Take one down and pass it around, 19 bottles of beer on the wall.
19 bottles of beer on the wall, 19 bottles of beer.
Take one down and pass it around, 18 bottles of beer on the wall.
18 bottles of beer on the wall, 18 bottles of beer.
Take one down and pass it around, 17 bottles of beer on the wall.
17 bottles of beer on the wall, 17 bottles of beer.
Take one down and pass it around, 16 bottles of beer on the wall.
16 bottles of beer on the wall, 16 bottles of beer.
Take one down and pass it around, 15 bottles of beer on the wall.
15 bottles of beer on the wall, 15 bottles of beer.
Take one down and pass it around, 14 bottles of beer on the wall.
14 bottles of beer on the wall, 14 bottles of beer.
Take one down and pass it around, 13 bottles of beer on the wall.
13 bottles of beer on the wall, 13 bottles of beer.
Take one down and pass it around, 12 bottles of beer on the wall.
12 bottles of beer on the wall, 12 bottles of beer.
Take one down and pass it around, 11 bottles of beer on the wall.
11 bottles of beer on the wall, 11 bottles of beer.
Take one down and pass it around, 10 bottles of beer on the wall.
10 bottles of beer on the wall, 10 bottles of beer.
Take one down and pass it around, 9 bottles of beer on the wall.
9 bottles of beer on the wall, 9 bottles of beer.
Take one down and pass it around, 8 bottles of beer on the wall.
8 bottles of beer on the wall, 8 bottles of beer.
Take one down and pass it around, 7 bottles of beer on the wall.
7 bottles of beer on the wall, 7 bottles of beer.
Take one down and pass it around, 6 bottles of beer on the wall.
6 bottles of beer on the wall, 6 bottles of beer.
Take one down and pass it around, 5 bottles of beer on the wall.
5 bottles of beer on the wall, 5 bottles of beer.
Take one down and pass it around, 4 bottles of beer on the wall.
4 bottles of beer on the wall, 4 bottles of beer.
Take one down and pass it around, 3 bottles of beer on the wall.
3 bottles of beer on the wall, 3 bottles of beer.
Take one down and pass it around, 2 bottles of beer on the wall.
2 bottles of beer on the wall, 2 bottles of beer.
Take one down and pass it around, 1 bottle of beer on the wall.
1 bottle of beer on the wall, 1 bottle of beer.
Take one down and pass it around, no more bottles of beer on the wall.
No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.
作者介绍
白羊座 喜欢篮球,橄榄球和各种游戏。小时候的梦想就是长大以后能玩电脑就赚钱。
很好奇未知的东西和技术, 还有很多东西需要学习和提高,希望能和大家多多交流。