°

01_JAVASE学习之路_JAVA入门(历史、语言介绍、JDK/JRE/JVM概念介绍)

前言

    学习java的堂粉,可以下载尚学堂出品的(下载量和各平台观看量累计3000万次)《高淇老师java300集》www.bjsxt.com/javashipin.html  以及配套的书籍《实战java程序设计》。

    或者也可以去www.sxt.cn 平台上免费观看。


image.png

    大家可以去京东、当当网搜索书名即可。也可以和我们的客服人员领取对应的电子书资源。


1.1 计算机语言发展史以及未来方向

·计算机已经成为人大脑的延伸

计算机已经成为我们这个时代的核心设备,每时每刻都需要它。计算机也不再是大家以前印象中的台式机、服务器,已经演变成了我们身边随处可见的物体。比如:手机、平板电脑、笔记本,以及很多人没意识到,但实际上设备内部包含“计算机”的设备。比如:电视机、微波炉、汽车,甚至小孩玩的智能小机器人等。

可以这么说,计算机已经成为了人类身体的延伸、大脑的延伸,成为不可或缺的一部分。未来,计算机将真的进入人体、进入大脑,真正成为人体的一部分。比如,在科幻电影《黑客帝国》中,主角被超级针头插在颈部后方,便能使他快速学习,改变大脑神经网络,几秒就成为功夫高手,如图1-1所示。

image.png 

1-1 科幻电影中计算机让人快速学习

·算法是计算机的灵魂,编程语言是塑造计算机灵魂的工具

计算机是如何工作的?对于普通人来说,这很神秘。让计算机具备“灵魂”,可以按照人的意志运行,甚至某天按照计算机自己的意志运行(如果这一天实现,科幻电影《终结者》中的场景也会成为人类社会的可能选项),其核心就是“算法”。 “算法就是计算机的灵魂”算法的实现又依赖于“计算机编程语言”。

计算机编程语言的发展,是随着计算机本身硬件发展而发展的。硬件速度越快、体积越小、成本越低,应用到人类社会的场景就会越多,那么所需要的算法就会越复杂,也就要求计算机编程语言越高级。

最初重达几十吨但一秒只能运算5000次的ENIAC(世界上第一台计算机),只能做非常小的应用,比如:某些情况的弹道计算。现在任何一个人的手机运算能力都可以秒杀那个年代地球上所有计算机运算能力的总和。

计算机编程语言的发展历经了从低级到高级发展。发展的核心思想就是“让人更容易编程”。越容易使用的语言,就有越多人使用;越多人使用,就有越多协作;越多协作,就可以创造越复杂的物体;现代社会,一个软件动辄几十人协作、几百人协作、甚至几千人协作也成为可能,这自然就为开发复杂软件提供了“人力基础”。这是一个人类普遍的社会现象,越容易使用的工具,通过使用数量,通过大量人的协作,彻底改变某个行业甚至人类社会。

 

· 三代计算机语言

计算机语言经历了三代:第一代是机器语言,第二代是汇编语言,第三代是高级语言。

·第一代语言:机器语言(相当于人类的原始阶段)

机器语言由数字组成所有指令。当让你使用数字编程,写几百个数字、甚至几千个数字,每天面对的是纯数字,我大胆预测:“程序员群体100%会有精神问题”。

机器语言通常由数字串组成(最终被简化成01),对于人类来说,机器语言过于繁琐。使用机器语言,人类无法编出复杂的程序。如下为一段典型的机器码:

                                                                    1. 0000,0000,000000010000 代表 LOAD A, 16

                                                                    2. 0000,0001,000000000001 代表 LOAD B, 1

                                                                    3. 0001,0001,000000010000 代表 STORE B, 16

·第二代语言:汇编语言(相当于人类的手工业阶段)

为了编程的方便,以及解决更加复杂的问题。程序员开始改进机器语言,使用英文缩写的助记符来表示基本的计算机操作。这些助记符构成了汇编语言的基础。如下是一些常见的汇编语言助记符(单词)比如:LOAD、MOVE之类,这样人更容易使用了。识别几百、几千个单词,感觉要比几百几千个数字,美妙多了。汇编语言相当于人类的手工业社会,需要技术极其娴熟的工匠,但是开发效率也非常低。

汇编语言虽然能编写高效率的程序,但是学习和使用都不是易事,并且很难调试。另一个复杂的问题,汇编语言以及早期的计算机语言(Basic、Fortran等)没有考虑结构化设计原则,而是使用goto语句来作为程序流程控制的主要方法。这样做的后果是:一大堆混乱的调转语句使得程序几乎不可能被读懂。对于那个时代的程序员,能读懂上个月自己写的代码都成为一种挑战。

汇编语言仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。

·第三代:高级语言(相当于人类的工业阶段)

对于简单的任务,汇编语言可以胜任。但是随着计算机的发展,渗透到了工作生活的更多的方面,一些复杂的任务出现了,汇编语言就显得力不从心(应该说是程序员使用汇编语言解决复杂问题出现了瓶颈)。于是,出现了高级语言。像我们熟知的C、C++、Java等等都是高级语言。

高级语言允许程序员使用接近日常英语的指令来编写程序。例如,实现一个简单的任务:A+B=C  , 使用机器语言、汇编语言和高级语言的的实现如下图1-2所示

image.png 

1-2 三代计算机语言的直观对比

 

从上面这个简单的加法计算,可以看出越到高级语言,越接近人的思维,人使用起来就越方便。

 

高级语言的出现,尤其是面向对象语言的出现,相当于人类的工业社会,高级语言极其易用,编程门槛和难度大大降低,大量的人员进入软件开发行业,为软件爆发性的增长提供了充足的人力资源。目前以及可预见的将来,计算机语言仍然处于“第三代高级语言”阶段。

·为什么担心软件开发人才饱和是多余的?

很多未进入或刚进入软件行业的朋友,特别担心一个问题“这么多人学,会不会饱和?”。这其实是杞人忧天,越多人编程,才能为软件行业提供巨量的人力资源,才能实现我们以前都不敢想的应用开发。要以发展的眼光看问题,而不是静态的眼光。

越多人编程,越多应用需要做,越多应用需要做,更需要越多人编程。这就像一个农夫刚刚进入工业社会,担心服装工厂工人招满了怎么办? 他没有想到工业发展后,钢铁厂也需要工人、汽车厂也需要工人。年轻朋友请记住“软件行业发展永无止境,将会整合人类现有所有行业,也会创造很多新的行业”。

·未来30年必将是软件人才的世界

未来30年的世界必将是软件人才的世界;除了普通软件的应用,大批的人工智能应用也将出现;未来自动驾驶、自动翻译、机器人保姆甚至机器人女友都会进入我们的生活,甚至计算机编程和基因工程结合,长生不老都能实现;有兴趣的童鞋,推荐大家看《未来简史》、《奇点临近》这两本书,把握一下未来的脉搏。

image.png    

1-3 推荐阅读《未来简史》、《奇点临近》

请发挥我们年轻人的想象力,尽情的在IT的世界中挥洒吧!



1.2 常见编程语言介绍


Tiobe发布了最新一期(3月份)编程语言欢迎度榜单,其榜单根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据。

TOP5几乎没有 变化,Java和C语言牢牢占据前两名。

Python相较去年上升一位进入TOP3,C++下降一位,Visual Basic .NET也超越C#上升到TOP行列。



image.png 

C语言

C语言诞生于1972年,可以称之为现代高级语言的鼻祖,由著名的贝尔实验室发明。C语言是人们追求结构化、模块化、高效率的“语言之花”。在底层编程,比如嵌入式、病毒开发等应用,可以替代汇编语言来开发系统程序。在高层应用,也可以开发从操作系统(Unix/Linux/Windows都基于C语言开发)到各种应用软件。

 

老鸟建议:

大学生朋友如果大学开这门课请一定认真学习,而不要觉得老套,那是经典;C语言在现代社会流行程度仍然排名前三。

C++语言

作为C语言的扩展,C++是贝尔实验室于80年代推出的。C++是一种混合语言,既可以实现面向对象编程,也可以开发C语言面向过程风格的程序。

C语言让程序员第一次可以通过结构化的理念编写出易于理解的复杂程序; 尽管C语言是一个伟大的语言,但是程序的代码量达到30000行以上时,程序员就不能很好的从总体上把握和控制这个程序。 因此,在80年代初期,很多软件项目都面临无法解决的问题而不能顺利进行。 1979年,贝尔实验室发明了C++。 C++最初的名字叫做“带类的C”,后来才改名叫C++。国内通用叫法:“C加加”,国际通用读法“C plus plus”。

C++语言在科学计算、操作系统、网络通讯、系统开发、引擎开发中仍然被大量使用。

Java语言

由美国SUN公司发明于1995年,是目前业界应用最广泛、使用人数最多的语言,连续多年排名世界第一,可以称之为“计算机语言界的英语”。

Java广泛应用于企业级软件开发、安卓移动开发、大数据云计算等领域,几乎涉及IT所有行业。关于Java的发展历史和特性,将在后面专门介绍。

JavaScript语言

JavaScript是一种脚本语言,已经被广泛用于Web应用开发;应用范围越来越大,重要性越来越高。目前,流行的H5开发的核心其实就是JavaScript语言。

Python语言

Python发明于1989年,语法结构简单,易学易懂;Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。Python广泛应用于:图形处理、科学计算、web编程、多媒体应用、引擎开发;尤其是在未来大热方向机器学习和人工智能上有非常大的潜力。


PHP语言

PHP原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor"。PHP语言,一般用于WEB开发领域;大量的中小型网站以及某些大型网站使用PHP开发。

Object-C和Swift语言

Object-C通常写作Objective-C或者Obj-C或OC,是根据C语言所衍生出来的语言,继承了C语言的特性,是扩充C的面向对象编程语言。OC主要用于苹果软件的开发。

Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与OC共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。

C#语言

C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#在基于windows操作系统的应用开发这一领域在取代C++,占据主导地位。“成也萧何败也萧何”,C#的微软身份,也成为了发展的阻力,在其他IT领域应用较少。

Kotlin语言

    Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发。Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。

    Kotlin已正式成为Android官方支持开发语言,并且是一种可以兼容java的语言。

Go语言

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

易语言

   易语言是一门以中文作为程序代码编程语言,其以“易”著称,创始人为吴涛。易语言早期版本的名字为E语言。其最早的版本的发布可追溯至2000年9月11日。

Fortran语言

世界上第一种高级语言, IBM公司在1954年提出的,主要用在需要复杂数学计算的科学和工程领域。现在仍然被广泛使用,尤其是工程领域。Fortran虽然适合编写科学计算方面的程序,但是不适于编写系统程序。

Basic语言

虽然易学,但功能不够强大,应用到大程序的有效性令人怀疑。已经逐步退出历史舞台。

COBOL语言

 1959年提出。主要用于大量精确处理数据的商业领域中,比如金融、银行。今天,仍然有超过一半的商业软件使用COBOL编写。有将近100万人使用COBOL编程。

Pascal语言

Pascal的名称是为了纪念十七世纪法国著名哲学家和数学家Blaise Pascal而来的,它由瑞士Niklaus Wirth教授于六十年代末设计并创立的。Pascal语言语法严谨,层次分明,程序易写,可读性强,是第一个结构化编程语言。由于没有大厂商和政府的支持,只是限于大学教育这一块。



1.3 Java语言介绍

本节介绍JAVA语言相关背景知识,让大家对JAVA语言有一个基本的了解。

1.3.1 Java发展简史

1991年,James Gosling在SUN公司的工程师小组想要设计这样一种小型计算机语言。该语言主要用于像电视盒这样的消费类电子产品。另外,由于不同的厂商选择不同的CPU和操作系统,因此,要求该语言不能和特定的体系结构绑在一起,要求语言本身是中立的,也就是跨平台的。所以,将这个语言命名为“Green”,类似于绿色软件的意思。后来,改名为Oak,橡树的意思。改名后发现已经有一种语言叫这个名字了,再改名叫Java。Java语言发展到今天经历了一系列的过程:

  1. 1991年,SUN公司的Green项目,Oak

  2. 1995年,推出Java测试版

  3. 1996年,JDK1.0

  4. 1997年,JDK1.1

  5. 1998年,JDK1.2,大大改进了早期版本缺陷,是一个革命性的版本,更名为Java2。

  6. 2004年,J2SE 5.0 (1.5.0)  Tiger老虎

  7. 2006年,J2SE 6.0 (1.6.0)  Mustang野马

  8. 2011年,JavaSE7.0   Dolphin海豚

  9. 2014年,JavaSE8.0

  10. 2017年,JAVA 9.0

  11. 2018年3月,JAVA 10

  12. 2018年9月,JAVA11

  13. 2019年3月,JAVA12

SUN公司已经被oracle公司收购,目前每半年更新一次java的版本。但是,企业中的主流仍然以7和8为主。对于初学者,应该以企业主流应用版本为核心进行学习,没有必须在此处追求最新版本。

1.3.2 Java的核心优势

Java为消费类智能电子产品而设计,但智能家电产品并没有像最初想象的那样拥有大的发展。然而90年代,Internet却进入了爆发式发展阶段,一夜之间,大家都在忙着将自己的计算机连接到网络上。这个时侯,遇到了一个大的问题。人们发现连接到Internet的计算机各式各样,有IBM PC、苹果机、各种服务器等等,不仅硬件CPU不同,操作系统也不同,整个的网络环境非常复杂。这个时候,程序员们希望他们编写的程序能够运行在不同的机器,不同的环境中,这需要一种体系中立的语言(即跨平台)。Java的研发小组忽然发现他们用于小范围的语言也可以适应Internet这个大环境。

跨平台是Java语言的核心优势,赶上最初互联网的发展,并随着互联网的发展而发展,建立了强大的生态体系,目前已经覆盖IT各行业的“第一大语言”,是计算机界的“英语”。

虽然,目前也有很多跨平台的语言,但是已经失去先机,无法和Java强大的生态体系抗衡。Java仍将在未来几十年成为编程语言的主流语言。

1.3.3 Java各版本的含义

JavaSE(Java  Standard  Edition):标准版,定位在个人计算机上的应用

这个版本是Java平台的核心,它提供了非常丰富的API来开发一般个人计算机上的应用程序,包括用户界面接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。在上世纪90年代末互联网上大放异彩的Applet也属于这个版本。Applet后来为Flash取代,Flash即将被HTML5取代。

JavaEE(Java  Enterprise  Edition):企业版,定位在服务器端的应用

JavaEE是JavaSE的扩展,增加了用于服务器开发的类库。如:JDBC是让程序员能直接在Java内使用的SQL的语法来访问数据库内的数据;Servlet能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP是一种可以将Java程序代码内嵌在网页内的技术;

JavaME(Java  Micro  Edition):微型版,定位在消费性电子产品的应用上

JavaME是JavaSE的内伸,包含J2SE的一部分核心类,也有自己的扩展类,增加了适合微小装置的类库:javax.microedition.io.*等。该版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型产品能够随时增加支持的能力。

image.png 

1-4 Java三大版本的关系

菜鸟雷区:

    很多人开始会误解为安卓开发就是JavaME,这两个是完全不同的内容。

1.3.4 Java的特性和优势

跨平台/可移植性

这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。

安全性

Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。

面向对象

面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!Java则是完全的面向对象语言。

简单性

Java就是C++语法的简化版,我们也可以将Java称之为“C++-”。跟我念“C加加减”,指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。同时,由于语法基于C语言,因此学习起来完全不费力。

高性能

Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接待C++的效率。

因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。

分布式

Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMIRemote Method Invocation),使程序能够通过网络调用方法。

多线程

多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。

健壮性

Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。

1.3.5 Java应用程序的运行机制

计算机高级语言的类型主要有编译型和解释型两种,而Java 语言是两种类型的结合。

 

Java首先利用文本编辑器编写 Java源程序,源文件的后缀名为.java;再利用编译器(javac)将源程序编译成字节码文件,字节码文件的后缀名为.class; 最后利用虚拟机(解释器,java)解释执行。如图1-5所示。

image.png

1.3.6 JVM、JRE和JDK

JVM

JVM(Java Virtual Machine)就是一个虚拟的用于执行bytecode字节码的”虚拟计算机”。也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行,边解释边运行,这样,速度就会受到一定的影响。

不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编写,随处运行(Write once, run everywhere)”。 Java虚拟机是实现跨平台的核心机制。如图1-6所示。

 

image.png 

1-6 不同的操作系统有不同的虚拟机

 

JRE

JRE (Java Runtime Environment) 包含:Java虚拟机、库函数、运行Java应用程序所必须的文件。

JDK

JDK (Java Development Kit)包含:包含JRE,以及增加编译器和调试器等用于程序开发的文件。

JDK、JRE和JVM的关系如图1-7所示。

image.png 

   1-7 JDK、JRE和JVM的关系

老鸟建议

如果只是要运行Java程序,只需要JRE就可以。JRE通常非常小,其中包含了JVM。

如果要开发Java程序,就需要安装JDK。

打赏
  喜欢