Java程序设计(Java9版):第0章 绪论(Introduction)

第0章 绪论(Introduction)

千里之行始于足下。 —-《道德经》
Man is still the most extraordinary computer of all. — John F. Kennedy
Java is a good language, and JVM is an excellent but under-utilized engine.


学习要求:
了解计算机组成与基本工作原理
了解计算机语言发展史
了解Java语言发展史
掌握Java运行机制
掌握Java相关名称

0.1 计算(Calculate)

在人类文明之初,就有了计算的概念。在漫长的进化过程中,人们逐渐学会了计算物品的个数,比如使用小石子来表示个数,其中拉丁文中“Calculus”的本意是用于计算的小石子;据文字记载,在上古时期的中国人民使用结绳计数的方法。后来,人们开始计算土地的面积、计算商业账目等等,在生产生活中学会了小数和负数的计算方法。据可靠史料记载,早在两千多年前,中国最早出现了正负数的概念,掌握了正负数的运算法则,特别是三国时期的刘辉给出了正负数严谨的定义。计算工具以算筹和算盘为代表,其中算盘是一种简单的计算器,直到今天让然可以看到它的身影,算盘不但可以快速进行十进制的加减乘除计算,还可以进行十六进制计算。

到了近代,计算概念在西方世界得到了快速发展,出现了微分计算和积分计算等复杂计算。计算工具也出现多样化,出现了比中国算盘更加先进的加法机、乘法机和差分机。这些机械式计算机,引导的人们发明了现代的电子计算机。计算机的出现,从本质上改变了人们的计算能力,可以说彻底摆脱了繁重枯燥无味的低级计算,让人们把更多的精力投入到高级计算中去。

计算工具大致经历了石子和结绳计数阶段、算筹阶段、算盘阶段已经今天的计算机阶段。

侠义上的计算概述是数学领域的数值运算,包括算术计算、微分积分计算、方程求解、等等。随着人类文明的发展,特别是计算机的出现,对计算的概念有了新的认识。除了狭义上的数值计算,还包括一大类非数值计算,比如逻辑推理、程序算法设计、图像处理、分布式计算、网格计算、并行计算、云计算、量子计算等等。现在人们最新的认知是人类的思维也是计算,生命本身就是由一系列复杂的计算或算法组成的。

除了实验和理论研究,计算成为人们认识世界的第三种方法。

0.2 二进制(Binary)

人们在生活中使用最多的计数系统是十进制,由0、1、2、3、4、5、6、7、8、9十个元数字组成。十进制数表示方法:

Java程序设计(Java9版):第0章 绪论(Introduction)
比如,Java程序设计(Java9版):第0章 绪论(Introduction)

二进制是由十八世纪德国数学家莱布尼兹创立,二进制数据是用0和1两个元数字来表示的数,它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。

Java程序设计(Java9版):第0章 绪论(Introduction)
比如,Java程序设计(Java9版):第0章 绪论(Introduction)

十九世纪英国数学家布尔创立了布尔代数。布尔代数处理只有0或l两种值的变量和常量,基本运算是与、或、非。布尔代数在数字电路(digital circuit)中得到了广泛应用,比如高电平表示0,低电平表示1。计算机内部芯片是由数字电路构成,数字电路是由一定数目的基本单元的门电路构成,门电路可以进行简单的布尔运算。也就是说门电路就是一个简单的布尔逻辑功能。

二进制是在计算机系统中使用最为广泛的一种进制。有时为了表述方便,程序中也使用八进制和十六进制,但本质上就是二进制。

为什么计算机使用二进制,而不直接使用十进制呢?
答:因为计算机的运行是通过数字电路实现的,数字电路只有高低两种状态,用高低电平来实现,进行布尔代数运算方便。如果直接使用十进制,则数字电路需要表示十种状态,实现代价较大。

0.3计算机系统概述(Overview of Computer System)

计算机(Computer),全名是电子计算机,俗称电脑,是一种能够按照预先设定的程序运行并自动处理数据,可以进行高速计算的电子计算机器。现在普通的个人计算机(personal computer,简称PC机)每秒能执行上亿次基本运算。中国研发的超级计算机在世界超级计算机(supercomputer)TOP500排名中多次位列第一,成为当今世界运算最快的计算机。
从1946年第一台计算机ENIAC诞生,计算机大致经历了电子管计算机、晶体管计算机、集成电路计算机、大规模集成电路计算机四个阶段,甚至发展到今天平板电脑和智能手机,所有的计算机都按照计算机之父冯·诺伊曼(如图0.1所示)设定的计算机基本原理运行着。
Java程序设计(Java9版):第0章 绪论(Introduction)

如图0.2所示,计算机的组成与基本工作原理:
Java程序设计(Java9版):第0章 绪论(Introduction)
- 计算机的组成:由控制器、运算器、存储器、输入设备、输出设备五大部件组成。
- 二进制:程序和数据以二进制形式存储在存储器中。
- 存储程序原理:程序由指令组成,并和数据一起存放在存储器中,计算机启动后,能自动地按照程序指令的逻辑顺序逐条把指令从存储器中读出来,自动完成由程序所描述的处理工作。

没有安装软件(software)的计算机硬件(hardware)一般称为裸机,裸机就像一堆废铁,任何事都做不了。如图0.3所示,在裸机上安装第一层软件,也就是操作系统OS(Operating System),这样计算机功能就第一次得到扩展。操作系统隐藏了计算机硬件的复杂细节,向用户提供了一台功能扩展的机器,是硬件与软件相互作用的产物,称为虚拟计算机(Virtual Machine)。常见的操作系统有微软的Windows系统(多用于PC机)、苹果操作系统Mac OS X(苹果机专用系统)、开源的Linux(多用于服务器)、大型的UNIX操作系统、智能终端的Android和IOS。
Java程序设计(Java9版):第0章 绪论(Introduction)

裸机与虚拟机是操作系统课程重要的概念,如果读者朋友还没有学习操作系统课程,那我们可以这样理解:可以把人的肉体理解为裸机,没有穿衣服的人只能呆在自己的房间里待着,不能出门,否则就是裸奔;把衣服理解为操作系统,穿了衣服的人就是安装了操作系统的计算机,也就成了虚拟机,衣服屏蔽了人肉体上的一些细节,扩展了人的功能,比如可以出门工作或购物等等。

0.4 计算机语言简史(Brief History of Computer Language)

自然语言是人类交流的工具,计算机语言(Computer language)是人与计算机交流的工具。广义上,计算机语言包含程序设计语言(Programming language);在计算机语言中,程序设计语言的发展最具有代表性,反映了计算机语言发展阶段,所以狭义上讲计算机语言就是程序设计语言。计算机语言大致经历机器语言、汇编语言、面向过程语言和面向对象语言四个阶段,面向过程语言与面向对象语言又合称为高级语言。

0.4.1 机器语言(Machine language)

机器语言是直接使用二进制代码表示的机器指令语言。使用机器语言编写的程序可以直接被计算机理解执行,但是对人而言不直观,难写难记。在计算机发明的初期,只有计算机专家可以二进制的机器语言与计算机交流,最早的程序是通过打孔机在纸带上编写的,如图0.4所示。不同的机器,机器指令可能是不同的,也就是说机器语言针对特定的机器,为一台机器编写的机器语言程序很难在另一台计算机上执行。
Java程序设计(Java9版):第0章 绪论(Introduction)

0.4.2 汇编语言(Assembly language)

针对机器语言不适合人使用的问题,通过一些简洁的英文字母或符号串来替代一个特定的二进制串指令,比如用ADD代表加法操作、MOV代表数据传递操作,这就产生了汇编语言。计算机不能认识这些符号,需要将这些符号翻译成二进制数的机器指令,这种翻译程序称为汇编程序;汇编语言同样依赖于具体的机器硬件,移植性不好,但是执行效率较高。机器语言和汇编语言,都是直接操作硬件的,解决问题时不仅要考虑问题求解思路,更要熟悉机器内部结构。

0.4.3 面向过程的语言(Procedure oriented language)

为了解决机器语言和汇编语言遇到的问题,把人们的精力集中于解题思路上,关注数据加工过程,完成特定的功能,而不是过多地关注机器低层细节,面向过程的计算机语言诞生了。经过努力,1970年第一个面向过程的程序设计语言—Pascal语言出现,标志着结构化程序设计时期的开始;1972年贝尔实验室在B语言和BCPL语言的基础上,开发出著名的C语言。

0.4.4 面向对象的语言(Object-Oriented Programming Language)

上世纪80 年代初开始,在软件工程设计的思想上,又产生了一次革命,产生了面向对象的程序设计语言。面向对象思想更接近人的思维方式,把现实世界抽象为类,类产生对象,对象具有属性和行为。最早出现了面向对象程序设计Smalltalk 语言;1983年在C语言的基础上产生了C++;在C++的基础上,1995年SUN公司推出了Java;在Java的基础上,2000年微软推出了C#。此外,面向对象语言还有Objective-C(苹果公司专用语言)、PHP、Python等语言。

0.5 为什么选择Java?(Why choose Java?)

编者在给本科生上面向对象课程时,有学生会问到为什么选择Java语言,而不学习C++呢?我的回答是:因为Java是个纯爷们!
Java语言是纯的面向对象编程语言。而C++为了兼容C语言,所有C++既有面向过程语言的特征又有面向对象语言的特征。C++相对Java语言来说,语法较为复杂,没有垃圾回收机制,C++程序员需要考虑更多的细节问题。
Java语言是世界上第一个跨平台的编程语言。Java语言的口号是“一次编写,处处运行”,使用Java语言编写的程序可以在其他操作系统平台下直接运行,无需修改。这是Java语言的理想,也是Java语言多年努力的方向。
Java是可以免费获得,我们不必花钱购买相关的Java开发工具,这就省去了**软件的烦恼。一般Java开发工具可以免费获得正版,无需**。当然,不收费是为了更好的收费,更容易占领世界市场,这正是国人欠缺的思想。
我们不是单纯为了学习Java语言,是为了学习后继Java EE开发课程,因为在企业级应用开发中,当涉及到架构设计异构分布式系统,Java EE是唯一能做到的。正如一个美国程序员所说:“Today, as an enterprise developer, I’d say I choose Java because its the language that is used by Java EE application servers. When it comes to architecting heterogeneous distributed systems, Java EE is the only game in town.”此外,Android应用软件大部分使用Java语言开发。

0.6 Java语言简史(Brief History of Java Language)

著名的SUN(Stanford University Network)微系统公司1982年创建。1991年SUN公司的James Gosling(Java之父,如图0.5所示)带领团队做关于家电的Green项目。Green项目组一开始使用C++语言来开发,由于家电产品硬件的多样性和差异性,以及C++的不足,比如C++语法太过复杂、缺少垃圾回收和多线程机制、可移植性差等问题,最后项目组放弃了C++,他们设计出了一种基于C++且平*立的语言Oak,即是Java的前身。很不幸,Green项目失败了,没有给SUN带来任何收益。直到1994年,随着互联网的飞速发展,Green项目组使用Oak技术开发HotJava浏览器,第一次证明了该语言强大的能力。但是Oak已被注册,改名为Java。之后,世界上的浏览器市场最后被微软的IE浏览器吞并,HotJava浏览器阵亡。

Java程序设计(Java9版):第0章 绪论(Introduction)

在哲学上,新事物的诞生与发展是前进性与曲折性的统一,前途是光明的道路是曲折的,Java语言的发展史正好说明了这一规律。

  • 1995年,SUN公司正式发布Java语言。Java只是一种语言,如果想用Java开发软件,需要一个强大的开发类库。1996发布了JDK 1.0(Java Developer’s Kit,Java开发工具包)。SUN公司是一个具有**色彩的公司,在人类开源事业上做出了许多重大贡献。SUN直接把JDK连同源代码发布到互联网上,免费供全世界人民使用。忽如一夜春风来,千树万树梨花开,短短几个月的时间互联网上出现了大量的Java小程序。
  • 1998年12月,发布了JDK1.2,这个版本标志着Java已经进入Java 2时代,这个时期也是Java飞速发展的时期。 JDK1.2发展为J2EE、J2SE和J2ME三大分支,特别是J2EE在企业级平台开发中取得了巨大成功。Java 2是革命性的,直到今天仍在在继续。但微软对Java眼红,由“J#事件”到“微软抛弃Java案”,虽然SUN最终胜利,但是Java错过了可视化编程的黄金时期。这一时期可视化编程如日中天,VB、Delphi成为可视化编程的佼佼者。也许是天意,Java语言因祸得福,躲过了可视化编程衰亡一劫。在此期间,J2EE在企业中得到了广泛应用,涌现了大量基于Java语言的开源框架Struts、Hibernate、Spring等等。
  • 在2004年10月,SUN发布了JDK1.5。J2SE更名为 Java SE,J2EE更名为Java EE,J2ME更名为Java ME。Java进入了Java 5时代,实现了第二次飞跃。
  • 2009年4月IT巨头Oracle收购SUN,取得Java的版权,从此 Java属于Oracle公司,如图0.6所示。2010年Java之父的James Gosling离开了Oracle,Java的命运堪忧。英雄已去,浩气长存。在老一辈程序员心中,永远难以忘怀SUN的**。
  • 2011年7月,Oracle公司发布Java 7的正式版。
  • 2014年3月,Oracle公司发布Java 8的正式版。王者归来,Java仍然是世界第一的开发平台,并且Java用户组的数量以每年10%的速度增长,Java 8是革命性的,Java又回来了。
  • 2017年9月,Java 9正式版发布。

0.7 Java程序运行机制(mechanism of Java program)

0.7.1 高级语言的运行机制

计算机高级语言编写的程序不能直接被计算机识别,须经过转换翻译成机器可以直接执行的二进制代码,才能被执行。高级语言按转换执行方式可可以分为编译型和解释型两类。
编译型语言的执行过程类似于生活中的文章翻译过程,首先扫描整个源代码进行语法语义理解,然后将源程序整体“翻译”成可以被机器执行的二进制目标代码(机器语言),最后将该目标代码通过连接组装成当前计算机硬件可以识别的可执行程序格式。这个过程称为编译(compile)。也就是说,编译型语言一次性将源程序编译成特定平台的可执行文件,只“翻译”一次,可执行文件来说可以直接在特定机器上运行,所以运行效率较高。但是该可执行文件不能跨平台执行。常见的Pascal、C语言、C++等高级语言都是编译型语言。
解释型语言的执行过程类似于生活中的自然语言“现场翻译”,使用专门的解释器对源程序进行逐行读取,读取一行、翻译一行、执行一行。也就是说解释型语言通常不对源程序进行进行整体“翻译”。由于解释型语言程序每次执行时,都要经过一次“翻译”,所以运行效率相对较低。但解释型语言有一个特点,只需要在一个特定平台上提供对应的解释器,就可以对源程序进行“翻译”运行,每个特定的平台编译器只负责将源程序翻译成本地的机器码。那么解释型语言相对编译型语言,容易实现程序跨平台性。比如JavaScript、Ruby、MatLab等。

0.7.2 Java虚拟机(Java Virtual Machine)

Java语言的特点很多,最大的特点就是跨平台性,就是Java的程序不需要经过修改可以运行在多个操作系统平台上。我们知道不同的计算机硬件和不同的操作系统,差异性很大,Java跨平台性是怎么实现的呢?这就需要对虚拟计算机进一步扩展为Java虚拟机JVM(Java Virtual Machine)。
JDK是Java开发工具包,JDK包含了JRE(Java Runtime Environment,Java运行时环境),JRE中又包含JVM(Java Virtual Machine,Java虚拟机)软件。
在裸机上安装操作系统,这是计算机的第一次扩展,得到虚拟计算机;在虚拟计算机上安装JDK或JRE,计算机第二次扩展得到Java虚拟机JVM(运行JVM软件的虚拟计算机系统)。原来虚拟机的功能得到扩展,可以执行Java命令、运行Java应用软件。裸机、虚拟机和JVM之间的关系如图0.7所示。Java虚拟机屏蔽了虚拟计算机(比如Window系统计算机和Linux系统计算机)的差异性,提供统一的Java编译技术。在JVM层次,针对Java语言而言,所有的计算机都是相同的,具有一般机器的特性。
但是JVM本身不是跨平台的,一般由C/C++语言编写,Java提供了不同操作系统下的JDK和JRE版本(内含JVM),常见的有Linux版、Mac OS版、Solaris版和Windows版。

Java程序设计(Java9版):第0章 绪论(Introduction)

Java虚拟机(JVM)是本章重要概念。
可以把人的肉体理解为裸机,没有穿衣服的人只能呆在自己的房间里待着,不能出门,否则就是裸奔;把衣服理解为操作系统,穿了衣服的人就是安装了操作系统的计算机,也就成了虚拟机,衣服屏蔽了人肉体上的一些细节,扩展了人的功能,比如可以出门工作或购物等等。

0.7.3 运行机制(Operating Mechanism)

Java语言是一类特殊的高级语言,同时具有编译型和解释型语言的特性,因此Java源程序需要先经过编译过程,后经过解释过程。源程序,是指未经编译的,按照一定的程序设计语言规范书写的,人类可读的文本文件。
Java程序设计(Java9版):第0章 绪论(Introduction)

如图0.8所示,假设我们有一台Windows系统计算机和一台安装了Linux系统计算机,并且均安装了对应的JDK(包含JVM软件),也就是说这两台计算机就是两台Java虚拟机。首先在Windows计算机上编写Java源程序A.java(Java源文件的扩展名是.java),经编译器编译A.java源文件后产生字节码(bytecode)文件A.class(字节码文件的扩展名.class)。字节码文件是经过Java编译器处理后的一种文件,只有JVM才能识别执行。然后将字节码文件A.class迁移到Linux计算机上,该计算机上的JVM使用JIT(Just In Time,即时编译)技术将字节码文件编译成本地机器码,然后让Linux系统运行该机器码,不是解释一句执行一句。
Java语言的跨平台性,是指字节码文件不经过修改直接移植到其他平台上运行,也就是Java的口号“一次编译,处处运行”(write once,run anywhere)。字节码文件跨平台的关键是JVM提供了跨平台的环境,但是JVM不是跨平台的,JVM完成字节码到本地机器码的转换。

0.7.3 基于JVM的语言(JVM-based language?)

JVM不单单是运行Java程序的Java虚拟机,还可以运行其他语言(如PHP、Python和Ruby等等)编写的程序。Jython(前身是JPython)是一个Python语言在Java语言上完全实现。

0.8 Java三大平台(Java Platforms)

Java语言中专业名称较多,容易产生概念混淆,下面集中解释一下。
1、Java SE:Java Standard Edition,即是Java标准版,提供基本的低层支持,最新版是Java SE8;Java SE是一个Java平台的名称。
2、Java EE:Java Enterprise Edition,即是Java的企业版,前身是J2EE,主要构建企业应用系统;
3、Java ME:Java Micro Edition,即是Java微型版本,主要用于嵌入式系统开发,现在主要用于开发手机游戏。
4、JDK:最新版本是JDK 1.9,是基于Java SE平台的开发程序发行版本,JDK是相对开发者而言。JDK包含JRE,JRE包含JVM,JVM包含JIT。

0.9 习题(Exercises)

0.1计算二进制数(11011011.1110)^2的十进制形式。
0.2 Java之父是谁?
0.3 J2EE是什么?(面试题)
0.4简要说明Java程序的运行机制。
0.5说明JDK、JRE、JVM、JIT之间的关系。
0.6翻译本章中的英语引文。
0.7翻译:
Computer hardware as a system of input, processing, output, storage, and control components. Thus a computer system consists of input and output devices, primary and secondary storage devices, the central processing unit, the control unit within the CPU, and other peripheral devices.