目前信息技术主要经历了互联网、移动互联网以及以大数据、云计算、物联网、人工智能、区块链等为代表的新兴技术三个阶段。
互联网
互联网自从20世纪90年代逐渐兴起,主要是通过网络连接了世界各地的PC,笔记本以及背后提供各种服务的大型服务器集群。
其中绝大多数PC、笔记本都运行着Windows,macOS操作系统,而服务器主要是以类Unix(CentOS,Ubuntu)占据主要市场。
依靠互联网成长起来的公司有Apple、Google、Amazon、Microsoft、Baidu、Alibaba、Tencent。
移动互联网
移动互联网主要从2010开始爆发式增长,主要是通过网络连接了世界各地的移动设备(最典型的就是手机),它们绝大多数都运行着Android,iOS操作系统。
依靠移动互联网成长起来的公司有字节跳动、蚂蚁金服、小米、美团、滴滴。
大数据、云计算
随着用户的爆发式增长,以海量数据为基础的大数据、云计算技术在Google、Amazon、Apple、Baidu、Alibaba、Tencent等大型互联网公司有着广泛的商业应用场景。
物联网
物联网会以手机作为中枢,通过物联网连接所有的智能设备,包括智能家居、汽车、电视等嵌入式设备,目前国内的小米、华为等在智能家居、电视、汽车等领域广泛布局。而随着5G的逐渐普及,万物互联的时代即将到来。
人工智能
人工智能(AI)作为当前最火爆的技术,国内的Baidu、Tencent、Alibaba等互联网公司逐渐根据自身的核心业务开始布局,Alibaba最早将人工智能技术布局在电商和物流领域,而Baidu开发出了对话式人工智能操作系统Dueros和自动驾驶平台Apollo,Tencent则是在游戏领域应用人工智能。
区块链
区块链经历了数字货币、智能合约和超级账本三个阶段,区块链技术可以广泛使用在金融、供应链、物流、公共服务等领域,解决互联网的信任问题,目前蚂蚁金服、京东已经有大量的区块链应用落地。
计算机(Computer)是一种用于高速计算的电子机器,可以进行数值运算、逻辑判断,能够接收和存储信息数据(文字、 图片、音频、视频等等),并按照存储在其内部的程序对海量信息数据进行自动、高速的处理,然后把处理的结果输出的现代化智能电子设备。
日常生活中常见的台式机(iMac Pro)、笔记本(MacBookPro)、手机(iPhone12)、平板(iPad Pro)等等都属于计算机,除此以外还有生产环境中支撑各种应用(电商、支付、金融、物流等等)的大型服务器集群(Server Cluster)都属于计算机。
计算机系统由硬件(Hardware)系统和软件(Software)系统两大部分组成。
软件是运行在硬件之上,而硬件性能的好坏会直接影响软件运行的性能。
计算机通过软硬件的共同协作就可以完成日常常见的任务,例如听歌、看电影、购物、聊天等等。
计算机硬件系统主要由主机和外部设备组成。
主机主要是包含中央处理器和内存储器
外部设备主要包含外存储器、输入设备、输出设备组成。
常见的外存储器包含移动硬盘U盘等等。
在后期程序排查错误时除了要考虑程序本身的错误以外,还要考虑计算机硬件故障,例如内存不足,磁盘写满,网络不通等问题
每个计算机组件的IO性能也各不相同,核心组件(CPU,内存,磁盘)都遵循容量越大,IO性能越差,在后期程序优化时,通常需要考虑时间和空间的问题。
服务器硬件性能瓶颈:
假设CPU有每秒处理100000个服务请求的能力,各种总线的负载能力达到50000个,但是网卡只能接受20000个请求,而硬盘只能负担15000个的话,那么这台服务器根据木桶效应的处理能力只能是每秒15000个请求,有85%的处理器能力浪费了。在计算机系统中,硬盘的读写速率已经成为影响系统进一步提高的瓶颈。
在后期优化程序时需要考虑程序时间复杂度和空间复杂度的问题,性能优化时,可以使用多线程并发来提高CPU的使用效率,而使用内存来缓存高频访问的数据来提升程序的性能。
软件的出现实现了人和计算机更好的交互,它是由开发人员采用某种编程语言(C/C++/Java/Python/Go/JavaScript等等)编写的一系列指令以及不同业务场景产生的数据组成。
通常将软件分为系统软件和应用软件
系统软件
驱动程序、操作系统、语言处理程序等都是属于系统软件。
驱动程序是硬件厂商使用编程语言(C/C++)编写的程序,在使用硬件(例如打印机、显卡、声卡等等)前必须安装对应的驱动程序。
操作系统是负责通过驱动程序管理硬件资源,同时给应用软件提供运行平台,目前主流的操作系统有Windows,Linux,macOS,Android,iOS,华为鸿蒙OS。
语言处理程序是用于将编程语言编写的源程序编译或者解释成对应平台的机器语言的程序。
应用软件
微信、支付宝、淘宝、WPS等等都是属于应用软件,它们都是运行在操作系统(Windows,Linux,macOS)之上的。
运行在不同操作系统之上的软件交互方式也不一样,Linux(CentOS)上的软件通常是使用字符界面的交互方式,运行在Windows,macOS上的软件通常是以鼠标、键盘操作的交互方式,运行在Android,iOS上的软件通常是以手势触控、语音等交互方式。
程序是为了完成某项任务(例如聊天、听音乐)而使用某种编程语言(例如C/C++)编写的一组指令序列。
而指令是计算机程序控制的最小单位,由操作码和操作数组成,操作码是计算机要执行什么操作,例如加减乘除操作,而操作数具体执行的对象,具体的数据以及数据的位置。
所有指令的集合称为指令系统,常见的PC机指令系统有Intel X86指令集,常见的手机指令系统有ARM,因此手机上的程序不加修改是不能直接在PC机上运行,因为不同的指令集是不兼容的。
那么计算机是如何处理程序的?
根据冯诺依曼计算机结构的原理,计算机的工作流程大致如下
当用户从计算机中打开程序时(鼠标点击桌面的快捷方式图标),程序开始执行。
操作系统将程序的指令和相关的数据传送到内存中。
CPU根据程序内容从内存中读取指令。
CPU分析、处理指令,并为下一条指令做准备,如果有涉及到调用硬件资源(例如调用声卡播放音乐)的指令,操作系统会通过调用对应的硬件驱动程序来实现调用硬件的功能。
CPU取下一条指令并分析、处理,如此重复操作,直到执行完程序中的全部指令,最后将计算的结果放到指令指定的存储器地址中。
计算机已经成为人类大脑的延伸,成为不可或缺的一部分。而算法是计算机的灵魂,编程语言是塑造计算机灵魂的工具。让计算机具备"灵魂",可以按照人的意志运行,甚至某天按照计算机自己的意志运行,其核心就是算法。
计算机程序设计语言经历了机器语言到汇编语言和高级程序设计语言三个阶段,其特点是使得程序员用编程语言开发、测试、部署应用程序越来越方便、高效。但是是以牺牲效率为代价,但是随着计算机硬件的快速发展,绝大多数应用场景的效率损失可以忽略不计。
机器语言
计算机发展的最早期,程序员编写程序采用二进制的指令(010010101)来实现的,而每种CPU都有各自不同的指令系统(SPARC/Intel X86/ARM),因此在不同的机器上使用不同的机器语言实现。其特点是性能特别高效,而面向机器编程也就意味着不能移植,需要手动处理底层硬件的差异性,而且二进制的指令难以理解和维护。
汇编语言
随着时代和计算机技术的发展,汇编语言和编译器的出现解决了机器语言需要记住非常多的二进制机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底只能识别二进制的0001110100110机器指令,而且汇编语言是面向机器的,不同机器(SPARC/Intel X86/ARM)的汇编指令是不相同的。尽管如此汇编语言目前仍然在工业电子编程、软件的加密解密和计算机病毒分析等场景广泛使用。
高级程序设计语言
高级程序设计语言的高级之处体现在开发人员在编写程序时无需关心计算机底层硬件差异而只需要专注于业务模块实现即可。而且相对于机器语言、汇编语言而言,高级语言学习起来更加容易,因此会有更加充足的人力资源,也更容易开发大型商业软件,例如Windows、macOS、Linux等操作系统都是使用C/C++实现。国内的阿里巴巴在电商、物流、金融、支付领域大量使用Java实现。
如果想知道目前主流的编程语言有哪些,可以访问tiobe 首页获取编程语言排行榜。
目前(2020年11月)C/Python/Java排名前三位
每种编程语言都有自己擅长的应用场景。
编程语言 | 应用场景 |
---|---|
C | 硬件驱动、操作系统、系统软件 |
C++ | 系统软件、网络通讯、科学计算 、游戏 |
C# | Windows应用,Web应用、游戏 |
Java | 大型互联网应用(淘宝、天猫),Android,大数据 |
Go | 高并发、区块链、微服务 |
Kotlin | Android应用开发 |
swift | macOS,iPhone,iPad应用开发 |
python | 人工智能、机器学习、自动化运维、数据分析 、图形处理 |
javascript | 浏览器端、服务端、PC桌面 |
Scala | 大数据开发 |
那么如果你作为初学者,面对如此之多的编程语言,到底应该先从哪门语言上车呢?如果你想深入的学习其他语言和架构相关的知识之前建议熟练掌握Java语言,因为Java无论是市场需求还是开源的资源都是首屈一指,但是无论哪种语言,都是实现目标的工具,而不是目标本身。
由于高级编程语言和计算机底层语言是互不相通的,计算机最底层只能识别01010这种二进制的机器指令,因此需要使用工具进行语言之间的转换。这个就是程序编译或者解释的由来。
为了理解程序编译和程序解释,这里引入两种语言,分别是高级计算机语言L1,以及低级计算机语言L0。
程序编译
开发人员使用高级编程语言L1编写的应用程序通过编译器生成成计算机底层能够识别的低级语言L0,L0就是计算机实际执行的语言,而编译器生成的计算机底层识别的二进制机器指令过程就是程序编译。常见的编译型语言有C/C++/Objective-C/Go
程序解释
首先使用L0语言实现另外一个程序,也就是解释器,然后将开发人员使用高级语言L1编写的应用程序作为输入,每一句L1编写的程序都会在L0中作为等价的转换然后执行,解释的过程就是由L0编写的解释器去解释L1程序。常见的解释型语言有PHP,Python,JavaScript。
而Java和C#属于编译+解释型语言,以Java为例子,Java程序在运行之前首先被编译成Java字节码,然后在JVM虚拟机上解释运行。
起源
1991年,SUN(Standford University Network)公司的James Golsing领导的工程师小组想要开发一种用于像有线电视机顶盒这样的消费类电子产品的小型计算机语言,该产品的特点是由于不同的厂商选择不同的CPU和操作系统,因此要求该语言不能和特定的体系结构绑定在一起,也就是跨平台的。最初将这个语言命名为Oak,然后发现已经有一种语言叫这个名字,然后改为Java。
流行
20世纪90年代末,Java赶上了互联网发展的潮流,而互联网的特点刚好和消费类嵌入式电子产品类似(不同计算机产商选择不同的CPU和操作系统),得益于Java的跨平台特性,可以制作在支持Java的Web浏览器内的程序(Applet)而逐渐流行起来。
生态
由于Java开源,也得到了许多大厂(例如Oracle,IBM,阿里巴巴,谷歌,苹果)的支持,逐步发展成为具有开源、跨平台、高性能、支持多线程、分布式、安全可靠等诸多特性的开发平台和运行平台,而且自JDK1.4以后逐渐涌现出许多为了简化企业级开发的开源框架,例如后期会学习的Spring Framework,MyBatis,Netty,Dubbo等等都是使用Java实现,开发者可以通过阅读Java和框架的源码来提高自身的编程功力。
开发平台
经过20多年(1995年正式对外公开发布)的发展已经逐步建立起自己强大的生态体系,在大型互联网应用开发,移动端Android开发以及大数据开发占据了广阔的市场,最典型的就是国内互联网巨头-阿里巴巴在其电商、物流、金融、支付、大数据、云计算等业务场景中大量使用了Java及其相关技术栈(Spring Framework/Spring Boot/Spring Cloud/Alibaba-Spring-Cloud,Hadoop,Spark,Flink/Android)。
运行平台
Java程序是运行在JVM(Java Virtual Machine)之上的,这就是Java程序跨平台实现的本质原因,而且由于Java的开放性,有越来越多的语言是运行在JVM之上的,例如大数据处理语言Scala,Android开发的Kotlin以及Clojure,Groovy等等。
Java是基于C/C基础之上发展而来,但是不同于C/C的是Java是纯粹的面向对象语言,舍弃了C语言中容易引起错误的指针,并引入了垃圾回收机制,不需要手动释放内存。
相对于C/C而言,Java更加简单易用、安全 ,开发效率更高,但是运行效率略低。而且基于JVM实现了一次编译,到处运行。也支持大型分布式应用开发、高并发(原生支持多线程)、高可用、高性能等应用场景。
Java是体系结构中立的,所谓的体系结构中立有两层含义,其一是JVM的实现只要是遵守JVM规范的实现都可以,其二是JVM除了识别java编译器编译生成的字节码以外还可以识别scala,kotlin等语言编译生成的字节码文件。
Java自从1998年之后将Java分为三个版本,分别是JavaSE,JavaEE和JavaME,不同的版本有不同的应用场景。
JavaSE(Java Standard Edition):标准版Java,提供了完整的Java核心API,主要用于桌面应用开发,不过目前桌面开发基本都基于C++实现。
JavaEE(Java Enterprise Edition):企业式Java,主要用于企业级后台服务,大型分布式互联网应用开发。
JavaME(Java Micro Edition):嵌入式Java,主要用于开发嵌入式设备的产品,例如塞班手机游戏(已经消亡)。
Java9尝试把JavaSE,JavaME,JavaEE合并起来,用模块的方式进行区分
由于目前Java主要的擅长领域是企业级后台服务开发、Android移动应用开发以及大数据应用开发,而Java语言是它们的基石语言,因此无论是从事企业级后台服务开发,还是Android以及大数据应用开发,都要先从JavaSE入门,然后再学习企业级应用以及大型分布式互联网应用相关的Java技术栈,例如MyBatis,Spring Framework/Spring Boot/Spring Cloud, Spring Cloud Alibaba等等。
平台指的是操作系统平台,目前主流的三大操作系统平台是Windows,Linux,macOS。
Java语言的跨平台是Java程序可以在任意的操作系统上运行,其原理是Java程序不是直接运行在操作系统之上,而是运行在JVM之上。在需要运行Java应用程序的操作系统上,安装一个与操作系统对应的Java虚拟机(Java Virtual Machine)即可实现跨平台,Java虚拟机是采用C语言实现的。
生活中有一个典型的场景:例如一个中国人想要和美国人、德国人、法国人交流,但是中国人不懂英语、德语和法语,此时中国人可以分别找英语翻译、德语翻译和法语翻译来实现和美国人、德国人和法国人的交流。而Java程序想要在不同的操作系统上运行,也可以找不同平台的翻译,这个翻译就是指的JVM(Java Virtual Machine)。
在使用IDE开发Java程序之前需要在命令行窗口下操作文件,而操作文件就需要使用到常用的命令
如何打开Windows的命令提示符窗口
而macOS推荐大家使用iTerm2终端软件
windows/macOS操作 | 说明 |
---|---|
盘符名称: | 盘符切换,例如E:回车 表示切换到E盘 macOS是基于Unix发展而来,因此文件系统只有一个根目录,无法切换盘符 |
dir/ls | 查看当前路径下的文件列表 |
cd 目录 | 进入指定单级目录 例如cd workspace |
cd .. | 回退到上一级目录 |
cd 目录1\目录2\目录3 | 进入多级目录 例如 cd workspace\java\vscode |
cd \ | 回退到盘符目录 |
cd | 切换到用户的家目录 |
cls/clear | 清屏 |
exit | 退出命令提示符窗口 |
JRE(Java Runtime Enviroment)表示Java程序的运行时环境,JRE主要包含JVM和运行Java程序时所需要的核心类库。我们想要运行一个已有的Java程序,那么只需要安装JRE即可。JVM(Java Virtual Machine)负责解释执行JDK编译生成的字节码文件,针对不同的操作系统(Windows,Linux,macOS)官方提供了不同的JVM实现来实现Java程序的跨平台。
JDK(Java Development Kit) 表示Java程序开发工具包,包含了JRE和开发人员使用的工具,其中常用的开发工具有:编译工具(javac)和运行工具(java)。我们想要开发Java程序,必须首先安装和配置JDK。而SUN公司在2010年被Oracle公司以74亿美金收购,也就意味着如果想要下载JDK,需要去Oracle官网下载。
JDK整体架构图
这里回顾下几个重点版本的JDK发布历史
JDK重要版本说明:
JDK5.0是JDK发展史上具有里程碑意义的版本,具有许多新特性,例如可变参数、自动拆装箱,泛型、注解等等,JDK1.5等同于JDK5.0,至此许多简化企业级开发的框架也如雨后春笋般发展和壮大起来。
JDK7.0是Oracle公司09年收购SUN公司之后发布的第一个版本,也就意味着JDK7以后下载JDK需要去Oracle官网下载。
JDK8.0是目前互联网公司生产环境的主流JDK版本,也是Oracle公司长期支持的版本。许多Java的开源框架(例如SpringBoot2.x,Spring Cloud)都是基于该版本开发。
JDK9.0以后每半年会发布一个新版本,但是JDK9.0,JDK10.0,JDK12.0,JDK13.0,JDK14.0,JDK15.0都不是Oracle长期支持的版本。
目前(2020/11/07)只有JDK8.0和JDK11.0是Oracle官方长期支持的版本,分别支持到2025年和2026年。
同学们在公司开发项目时选择JDK版本,应该和公司项目的生产环境保持一致。
跟光磊学Java应用开发与架构设计在Java语言新特性篇中涵盖所有JDK版本的新特性
JDK下载地址:https://www.oracle.com/java/technologies/javase-downloads.html