Java崛起:巨人的肩膀/ 精简 / 跨平台 / 垃圾回收 / 字节码 / 历史现状

更多
2020年02月11日 16点44分 作者:叶飞 修改

巨人的肩膀

Java是今天——包括昨天,乃至可预见的明天——最流行的(大型)应用程序开发语言,没有之一。(tiobe榜单前三的c和python都不适合大规模应用开发:C只适合于底层,python更像一种小型的、灵活的工具/胶水语言)

今天的Java,可以骄傲的说:我站得更高!

C++

1979年,Bjame Sgoustrup到了Bell实验室,开始从事将C改良为带类的C(C with classes)的工作。1983年该语言被正式命名为C++。

可以看出,C++其实就是在C的基础上添加了类(class),是C语言的扩展,将面向过程的C语言进化成可以面向对象

至少到目前为止,面向对象是大型项目开发必不可少的利器。所以,C++诞生以后,广受欢迎,迅速发展,几乎就取代了C。

C++以其强大、灵活(直接操作内存)和复杂(各种语法特性)而著称。

段子:简历上写着“精通C++

Basic

但同时期,另一门语言却像它的名字(Beginners' All-purpose Symbolic Instruction Code)一样,初学者友好,简单易学,随着微软的推广,很快就风靡全球。尤其是其进化版VB(Visual Basic)在1991年推出:

在当时引起了很大的轰动,许多专家把VB的出现当作是软件开发史上的一个具有划时代意义的事件

飞哥个人觉得:码农阶层的诞生,Basic应该功不可没。1995年,飞哥就是凭着小霸王学习机的说明书,学会的人生第一门编程语言BASIC,^_^

PS:Basic是第一个有IDE的编程语言

PROGRAM product
LET m = 2                         
LET a = 4                        
LET force = m*a                   
PRINT force
END

tiobe演示:C++和VB仍然坚挺

在.NET平台仍然被保留,称之为VB.NET。沉寂了一些年,突然窜起来了,飞哥也不知道为什么,^_^



对C++的继承和删改

1991年,Sun公司,James Gosling和他的同事,开始为单片机开发设计一种能够C++的编程语言:Java诞生。

Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名,所以Java的图标就是一个咖啡杯:

Java

因为C++在当时已经非常流行了,所以Java保留了:

  • C语言风格
  • C++面向对象的语法特性

但是,当时C++的弊端也已经暴露的越来越清晰,简单两个字:复杂。

PS:有时候,语言特性并不是越多越好。再次重温:KISS原则

所以C++里面一些冗余复杂语法,被Java直接删除。但其中最根本性的改变是:


禁止直接操作内存

这曾经是一个非常有争议的话题,但现在没人提这茬了(或许是飞哥心态老了,懒得关心这些争论了……)。本质上就一个选择问题,你要自己操作内存,你就用C++呗,又没人拦着你,是不是?

没有指针

如果你学习C或者C++,指针首先是一个非常晦涩难懂的概念(一些看得开的老师都会略过这一部分);然后在实际开发中,使用指针极其容易出错的(error prone),非常麻烦。

一旦给用户自由,用户就会瞎JB用

所以Java很果决,直接把这部分砍了,开发人员不允许直接操作内存,全部交给我来!

由此就必然产生:

垃圾回收机制

Garbage Collection,所谓垃圾,就是不再使用的内存。

在C或C++中,经常会出现这样的代码:

  1. 申请一块内存
  2. 使用该块内存
  3. 释放这块内存
首先这样很麻烦,容易忘记第3步;但其实更大的问题是,随着代码变得越来越复杂,你搞不清楚该在什么时候释放了:
  • 释放早了:后面还要用呢,bug
  • 晚了/忘了:资源浪费,甚至出现内存泄漏(memory leak)

所以,这活干脆Java(运行时)来干:自动的、定时的检查并回收那些不再使用的内存。这极大的解放了开发人员,使得Java变成一个快捷、易用,而且安全(不会发生内存泄漏啥的)的强大语言。

其实GC完全够得上一个大标题,但目前同学们知识储备不够(还需要堆栈值/引用),我们就先讲到这里。


跨平台

注意Java最初设计的目的:为单片机开发设计。

当时,微机(PC)上的操作系统已经形成了windows、Linux,最多加一个MacOS三足鼎立的场景,但单片机……多如牛毛(其实今天也差不多),咋整?

Java语言开发团队想到了一个办法:

  • 开发一个Java虚拟机(Java Vitual Machine上),不同的操作系统安装不同的JVM
  • Java的源代码被编译成JVM可识别的字节码(Byte-Code重新定义了编译,^_^)
  • JVM再(解释/编译混合)执行这些字节码

所以,Java被戏称为:一次编译,四处运行(复习:C语言一次编写,四处编译

不能直接做不同的编译器吗?

为什么要做不同的JVM,多了一个字节码,就有哪些不一样了呢?

这实际上就是软件架构中的“分层”问题:为什么需要分层

这就像社会要分职业,工厂要分部门一样,是一个管理问题。

比如说做一扇实木门,大致的流程是:

  1. 砍树
  2. 做成门板
  3. 门板上雕刻
  4. 上漆

你管着100号人,你可以:

  • 让每一个人,从砍树到上漆,头到尾把整个流程做完;
  • 也可以把100号人分成4组,一组砍树,一组做门板,一组雕刻,一组上漆

@想一想@:哪一种更好,为什么?(提示:没有绝对的答案)


#常见面试题:Java究竟是编译执行,还是解释执行?

这是个坑!

首先,严格来说,语言本身不存在编译还是解释一说,编译和解释指的是由该语言书写的源代码的执行过程,而该执行过程是又软件(编译器/解释器/JVM)控制的,这软件谁都可以写,想怎么写就怎么写……

官方的JVM,默认是混合执行经过编译过后的字节码:

  • 大部分:解释执行,提高响应速度
  • 热点(Hot-Pot)部分,即反复使用部分:予以编译缓存,可以认为是编译执行,JIT(Just-In-Time)Compile
延伸问题:Java为什么会越来越快?


发展历程

潜龙在渊

单片机时代,名字还叫做Oak,公司内部用一用,几乎被搁置

头角峥嵘

1995年,将其嵌入网页,Java Applet横空出世。然后以一种非常夸张的速度迅速发展:

IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。

如日中天

1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个JRE(Java Runtime Environmen)版本:

  • J2SE(JavaSE):Standard Edition,标准版,桌面环境
  • J2EE(JavaEE):Enterprise Edition,企业版,服务器
  • J2ME(JavaME):Micro Edition,微型版,智能移动
以上圆括号中的名字,是2005年6月Java SE 6发布之后更改。

2007年3月,Java开源!

直到2009年04月20日,甲骨文74亿美元收购Sun,取得java的版权。曾经让开源世界伤透了❤,但是,事情最终还是没那么糟:

2011年,Java7正式发布

2014年,Java8正式发布,成为目前仍然在使用,而且是最多使用的一个版本。究其原因:

  • Java8仍然免费,白嫖怪永不为奴!(不然OpenJDK
  • Java8够用:语言特性丰富,该有的都有了;Oracle宣布永久支持(打补丁修bug啥的)
  • Java8的生态已经形成:类库、中间件、IDE……
  • 之后的版本没有足够的吸引力,而且发布太频繁,追不上(从Java9开始,每隔半年发布一次)

现状

仍然最流行的通用(Web/App/嵌入式……)开发语言之一,未占领的领域:Windows桌面开发

拥有丰富的类库、框架、中间件,良好的社区环境

在国内的互联网企业中占有绝对的统治地位。

PS:了解国内甚至某个城市某个语言就业形势怎么样,干嘛不去查一查招聘网站呢?

Java 历史 垃圾回收 跨平台
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

编程基础


项目管理相关

需求发布、开发规划、部署、测试,源代码版本管理(git)等……

逸闻史话

认识计算机

编程语言

数据结构和算法

Web开发基础

全部
关键字



帮助

反馈