1.3程序语言简介
我们经常会听到一些名词:低级语言、高级语言、编译型、解释型、面向过程、面向对象等。这些到底是啥意思呢?在正式进入Java世界前,笔者也尝试简单的聊一聊这块东西。
1.3.1低级语言和高级语言
我们中国人之间,想要沟通,一般就是通过汉语。那么想要和计算机沟通用啥呢?我们都知道,计算机内部存储的是0和1组成的二进制数字串,计算机指令也是0和1组成的二进制数字串,因此想让计算机干活,只能编写由0和1组成的程序。我们把由二进制代码组成的程序叫做机器语言程序,把由0和1表示的语言叫做机器语言。能够编写机器语言的程序员,他们需要对目标机器的硬件和指令系统非常熟悉,因此我只想对他们说一句:你们辛苦了!
由于程序员太辛苦了太累了,因此天天琢磨怎么才能不写该死的二进制程序。于是一种用符号来表示操作码、指令和内存地址的语言出现了,这就是汇编语言。例如它可以用ADD、SUB、MUL、DIV表示加、减、乘、除。这样程序员是轻松点了,但是计算机又不认识这些符号,咋办?因此需要有一个翻译员,把汇编语言程序翻译成机器语言程序,这样计算机又能干活了。
我们把机器语言和汇编语言称为低级语言,因为编写它们都需要对特定的计算机硬件和指令系统非常熟悉,编写难度大,可读性差,不可移植。因此更高的需求出来了,能不能有一种语言,能够不需要关心特定的计算机硬件和指令系统?
好在人类的智慧是无敌的,于是,一大堆高级程序语言相继被发明。高级程序语言更接近人的思维,更容易编写和阅读。并且具有可移植性(不做修改或做少量修改就能运行在不同的计算机上)。高级语言和汇编语言一样,也需要翻译成机器语言,最终才能被计算机执行。这里列出一些常见的语言简史:
年份 | 语言 | 简要说明 |
---|---|---|
1957 | FORTRAN | 约翰·巴克斯(John Backus)创建全世界第一套高阶语言FORTRAN,这是程序员真正意义上使用的第一种语言 |
1959 | COBOL | 葛丽丝·穆雷·霍普(Grace Hopper)发明了第一个面向企业的面向业务的编程语言,为“面向商业的通用语言”简称 COBOL。 |
1964 | BASIC | John Kemeny和Thomas Kurtz认为编程太困难了,他们需要回到基础上来,于是,他们称自己发明的编程语言为BASIC。 |
1970 | Pascal | Niklaus Wirth很喜欢开发语言,于是开发了多种语言,最终,他发明的Pascal成为当时世界上最受欢迎的语言之一。他还提出了一句计算机领域人尽皆知的法则:算法 数据结构=程序,这个公式对计算机科学的影响程度不亚于摩尔提出的摩尔定律。 |
1972 | C | 丹尼斯·里奇(Dennis Ritchie )在贝尔实验室上班上到无聊的时候,他决定发明带有花括号的语言,于是C语言诞生了,最终还取得了巨大的成功。之后,他又添加了分段错误等友好的功能来提高工作效率。倒腾出这门C语言后,他和贝尔实验室的朋友心想要不做一个C的演示程序,于是,一个叫做Unix的操作系统又诞生了。 |
1980 | Smalltalk | Alan Kay发明了面向对象的编程,并将其称为Smalltalk,在Smalltalk中,所有的东西都是对象,甚至一个对象也是一个对象。所以压根没人真正搞得清楚 small talk 是什么意思。 |
1983 | C | Bjarne Stroustrup 注意到C语言在编译方面还不够完美,于是把自己能想到的功能都加进去了,并将其命名为C 。程序员到处都采用它,这样,他们看各种视频和工作时读xkcd漫画的时候就有借口可找了。 |
1986 | Brac Box和Tol Move决定开发一个基于Smalltalk的C语言不可读版本,他们称之为Objective-C,然而却没有人能够理解它的语法。 | |
1991 | Python | Guido van Rossum不喜欢花括号,于是决定发明一种没有花括号的语言,然后又因为太喜欢英国肥皂剧《Monty Python飞行马戏团》,于是,就把该语言命名为Python。 |
1993 | Lua | Roberto Ierusalimschy和朋友决定开发一个巴西本地的脚本语言,在本地化过程中,一个错误使得索引从1开始算起,而不是0,他们把这门语言命名为Lua。 |
1994 | PHP | Rasmus Lerdorf为了要维护个人网页,在1994年,用C语言开发了一些CGI工具程式集,来取代原先使用的 Perl 程式。最初这些工具程式用来显示 Rasmus Lerdorf 的个人履历,以及统计网页流量。后来又用C语言重新编写,并将这些程式和一些表单直译器整合起来,称为 PHP/FI。 |
1995 | Ruby | 编程过程中存在很多不必要的琐碎时间,导致松本行弘不是很高兴,他注意到其他程序员也不是很高兴。于是,他创建了 Ruby 来让程序员高兴。最后,Ruby 社区高兴了,每个人也都高兴了。 |
1995 | JavaScript | Brendan Eich 利用周末时间设计了一门语言,打算用这门语言来为全世界的每一个主流浏览器乃至于最终的 Skynet 都提供动力。他先是找到了 Netscape 然后说这门语言叫做 LiveScript,但在代码评审期间 Java 变得流行起来,所以他们决定最好还是用花括号,然后就把它更名为 JavaScript。结果表明,命名带有 Java 会让他们惹上商标的纠纷,于是,JavaScript 就更名为 ECMAScript,但大家仍然把它叫做 JavaScript。 |
1996 | Java | 詹姆斯·高斯林(James Gosling)发明了Java,这是第一个过度冗长的面向对象编程语言,其中设计模式在实用主义方面几乎为0。于是乎,就诞生了超级有效的管理器提供商、容器提供商、服务提供商、单一管理器提供商模式。 |
2001 | C# | Anders Hejlsberg重新发明了Java并将其称为C#,因为感觉C编程比Java更酷。每个人都喜欢这个新版本的Java,因为它完全不像Java。 |
2005 | Rails | David Hanselmeyer Hansen创建了一个名为Ruby on Rails的Web框架,从此大家都忘了Ruby和Rails原来是两个独立的语言了。 |
2006 | jQuery | John Resig为JavaScript编写了一个辅助程序库,每个人都认为这是一种语言,并且从互联网上复制和粘贴jQuery代码。 |
2009 | Go | 肯·汤普森(Ken Thompson)和罗伯·派克(Rob Pike)决定开发一种像C这样的语言,但是编译速度要更快,更安全,并且把 Gopher(囊鼠)作为吉祥物。最后,他们把这门语言命名为 Go,并把它做成开源,然后另外卖 Gopher 商标来作为收入来源。 |
2010 | Rust | Graydon Hoare也想要像C这样的语言,于是开发出了Rust。Rust集齐了其他动态语言的重要特性。比如不需要管理内存,比如不会出现Null指针等,但Graydon想要更炫的东西,于是开始为苹果开发Swift。 |
2012 | TypeScript | Anders Hjelsberg希望在Web浏览器中编写C#,于是他设计出了TypeScript,它可以理解为是JavaScript的超集,但其中却包含了更多的Java。 |
2014 | Swift | Chris Lattner开发Swift时的主要设计目标就是不要成为Objective-C,最终它看起来像Java。 |
用一张图演示程序语言的进化:
1.3.2编译和解释
前面讲过,高级语言程序想要能够在计算机上执行,必须先要翻译成计算机能够识别的机器语言程序才行。这个翻译过程,有2种方式,一种是编译翻译,一种是解释翻译。
编译翻译,就是在在程序编写完成后,由编译器一次性翻译成目标计算机的机器语言程序,例如把C程序编译成exe程序,exe能够在所有的Windows操作系统的计算机上运行。常见的编译语言有C、C 、Pascal等。
解释翻译,就是程序在需要执行的时候,由专门的解释器去实时翻译,这一类的程序在运行的时候才去翻译,因此每运行一次就需要翻译一次。常见的解释语言有Java、Python等。
这里不过多的去阐述编译和解释的详细过程、优缺点,如果想更详细的了解,可以去参阅专业书籍。
1.3.3面向过程和面向对象
面向过程程序设计(Process-oriented programming,POP),就是通过一系列的过程(算法)来求解问题。一旦确定好过程,就开始考虑存储数据的方式。Pascal语言的设计者Niklaus Wirth提出的著名法则:算法 数据结构=程序,其实就是面向过程的程序设计。怎么理解呢?好比我们我们要解决一个复杂的问题,我们逐级细化为很多个小问题,每个小问题都用一个算法去解决,用一张图表示如下:
主函数就相当于复杂问题,子函数就相当于小问题,一级一级往下细化。在面向过程的思维里,算法是第一位,数据是第二位的。
面向对象程序设计(Object-oriented programming,OOP)和面向过程的思维相反,优先考虑数据(即对象),然后再考虑如何操作数据的算法。在面向对象的世界里,一切事物皆对象,当解决一个问题的时候,我们先会考虑这个问题会涉及到哪些事物,然后把事物抽象成对象的概念,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。用一张图表示如下:
面向对象有封装、继承、多态等特性,具体以后再表。
一般来说,面向过程的程序性能较高,但是当问题比较复杂的时候,程序就会很庞大臃肿,不易维护、不易复用和扩展。面向对象的程序性能略逊一筹,因为类的加载、实例化会有一定的开销,但是由于有封装、继承、多态等特性,很容易设计出易维护、易复用、易扩展、低耦合的系统。
1.3.4Java简介
想了很久,究竟怎么引导进入Java世界。本来想专门开一章,用比较大的篇幅来介绍一下Java,于是翻阅了很多书籍、看了很多网文和视频,发现信息量太多了,由于我又是一个比较懒的人,因此决定还是少码点字,把我认为重要的信息归纳总结一下,于是就放到这一小节来阐述了。
首先Java的产生及发展历程我想花点笔墨。时间追溯到1991年,当时由Patrick Naughton和James Gosling带领的Sun公司的一个团队想要设计一种计算机语言用于类似有线电视转换盒的设备。因为这些设备的处理能力和内存都比较有限,并且不同厂商的CPU也不同,因此语言需要短小并与平台无关。当时这个项目被称为“Green”。怎么才能做到平台无关呢?团队想起了一种早期的模型:设计一种为假想的机器生成中间代码的可移植语言,假想的机器叫做虚拟机,这种中间代码可以应用于所有已经正确安装虚拟机的机器上。一开始Gosling把这种语言叫做“Oak”(据说是因为他很喜欢自己办公室外的橡树),后来发现这个名字已经被别的一种语言占用了,于是改名为Java(Java这个名字的由来也有很多个故事版本,这里就不细说了)。下面这个图是Java的logo:
接下来,Java就一发不可收拾:
时间 | 事件 |
---|---|
1996-1 | Sun发布了Java的第一个版本JDK1.0,但是有很多明显缺陷 |
1997-2 | JDK1.1发布 |
1998-12 | JDK1.2发布,3天后,Sun公司市场部将Java平台改名为Java2。同时还推出另外2个版本:用于手机等嵌入式设备的微型版,用于服务器处理的企业版。Java SDK分成3个版本: J2SE:Java2 Platform, Standard Edition,Java平台标准版 J2EE:Java2 Platform, Enterprise Edition,Java平台企业版 J2ME:Java2 Platform, Micro Edition,Java平台微型版 |
2000-5 | J2SE1.3发布 |
2002-2 | J2SE1.4发布,Java平台大幅提升 |
2004-9 | J2SE1.5发布,该版本是Java发展史的一个里程碑,为了体现重要性,改名为:JAVA SE 5.0 |
2005-6 | JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,取消其中的数字"2":J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME |
2006-4 | JAVA SE 6发布 |
2009-4 | Oracle公司74美元收购Sun公司 |
2011-7 | JAVA SE 7发布 |
2014-3 | JAVA SE 8发布 |
2017-9 | JAVA SE 9发布 |
2018-3 | JAVA SE 10发布 |
2018-9 | JAVA SE 11发布 |
2019-3 | JAVA SE 12发布 |
其次,针对一些Java的术语,做一些解释:
缩写 | 全称 | 说明 |
---|---|---|
JDK | Java Development Kit | Java开发工具包,Java开发人员编写Java程序使用的工具包,它集成了JRE和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。 |
JRE | Java Runtime Environment | Java运行时环境,运行Java程序的软件。它主要包含两个部分,JVM的标准实现和 Java 的一些基本类库。它相对于JVM来说,多出来的是一部分的 Java 类库。 |
JVM | Java Virtual Machine | 就是我们耳熟能详的 Java 虚拟机。它只认识 ***.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。JVM是 Java 能够跨平台的核心 |
JAVA SE | Java Standard Edition | Java标准版,用于桌面或简单服务器应用的Java平台 |
JAVA EE | Java Enterprise Edition | Java企业版,用于复杂的服务器应用的Java平台 |
JAVA ME | Java Micro Edition | Java微型版,用于手机等嵌入式设备的Java平台 |
Java2 | 已经过时的术语,2005年6月取消该命名规则 |
最后,聊一聊Java的几个点:
- 面向对象
现代的高级语言,几乎都是使用面向对象技术。Java也是一种面向对象的语言。但是很遗憾,由于某些原因,导致Java的面向对象不纯粹,因为Java包含8种原始数据类型,另外Java还包含Static关键字,具体在后面会讲到。
- 工作原理
前面提到过,Java是解释型语言。Java开发者编写源程序代码,然后Java编译器将源程序代码编译成一种中间格式的文件,叫做字节码文件,也叫class文件。这种class文件可以在JVM中被解释执行。Java平台提供不同类型机器的JVM,这样就实现了平台无关。一般来说,解释运行比直接运行机器语言程序慢很多,但是Java使用了即时编译器,可以将频繁使用的字节码序列翻译成机器码,这样使得其运行速度和C 相差无几了,甚至比一些老的C 程序还要快一些。用一张图表示如下:
- JavaScript
JavaScript是一种在网页中使用的脚本语言,简称JS。是Netscape发明的,原名叫LiveScript,后来可能是想蹭Java的热度,改名叫JavaScript。它除了语法和Java有些类似外,和Java没有任何关系。目前JS的一个子集已经标准化为ECMA-262。
- 一些尴尬的功能
Java中有个Applet,它主要是让用户从Internet上下载Java字节码,然后在浏览器中运行。笔者还曾经研究过一段时间。这个想法很棒,可惜事与愿违,目前这个东西几乎被淘汰了。另外Java标准库中还有一大块用于桌面图形编程的工具包:AWT和Swing,笔者刚开始学Java的时候,花了很多精力研究,但是在后来的实际工作中,几乎无用,因此我觉得这块内容也很尴尬。