Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?

前端圈一直流传着一个经典段子:Java和JavaScript是什么关系?就是雷峰和雷峰塔的关系。听过后令人会心一笑。但静下来想想🤔,真是这样吗?

什么是雷峰和雷峰塔的关系

雷峰(人)和雷峰塔(建筑)的关系非常明确:除了名字读音相似之外,两者在血缘、历史、物理构成等任何维度上,都百分之百毫无关联。

那么,Java和Javascript是否只是名字有点相似,实则毫无关系呢?

Java和Javascript的关系

如果抛开段子,翻开真实的计算机史,你会发现Java和JavaScript不仅不是"毫无关系",反而有着千丝万缕的渊源。

Javascript是Sun和Netscape联合发布的,Sun(现在是Oracle)是Javascript的商标持有者。

时间回到1995年,网景公司(Netscape)为了在浏览器里加入交互能力,搞出了一门脚本语言(最初叫Mocha,后改LiveScript)。当时Sun公司推出的Java语言正如日中天,被媒体炒作战无不胜的"神器"。网景为了蹭上这波热度,与Sun公司达成了战略合作,将这门语言正式更名为JavaScript

更硬核的事实是:直到今天,JavaScript的商标权依然掌握在Sun的继承者甲骨文(Oracle)手里。如果是毫无关系的两者,怎么可能共用一个具有法律效力的名字?

JavaScript就是按像Java设计的

网景公司在给语言改名的同时,也给开发者(Brendan Eich)提出了一个明确的需求:"让它的语法看起来像Java"。因此,JavaScript在诞生之初,大量借鉴了Java的基础语法结构。它的 if/else 分支、for 循环结构、try/catch 异常处理机制,甚至是 new 关键字的使用,看起来和Java几乎如出一辙。因此,JavaScript 不是巧合像,是故意设计成像 Java

Java中内置了JavaScript运行时

从JDK 6引入Rhino引擎,到JDK 8内置Nashorn引擎(后在JDK 15中移除),再到如今通过GraalVM JS等现代方案实现深度互操作,Java官方生态长期保持着对JavaScript运行时的支持。这意味着,你完全可以在Java程序里直接调用JavaScript代码,把它们当作业务中的"动态脚本层"。这绝不是两座毫无交集的孤岛,两者在运行层面长期深度集成。

Java脚本化后就是JavaScript的样子

如果说设计一门Java的脚本语言,要类似Java的语法,但是要脚本语言的特性,要能解释执行、方便灵活、宽松,还要高扩展性。那么设计出来就是JavaScript这个样子。

这是一个非常有趣的逻辑推导。假设1995年你需要为Java生态设计一门"附属脚本语言",你的需求清单是这样的:

  • 融入Java生态:语法必须像Java;
  • 运行机制:不需要编译,直接解释执行,轻量级;
  • 类型系统:不能像Java那么严苛,要宽松、动态,写起来方便;
  • 高扩展性:面对复杂多变的Web环境,必须允许开发者随时往内置类中添加方法;

当你按照这份需求文档写出一门语言时,恭喜你,你重新发明了JavaScript。它从一出生,就是带着" Java的轻量化脚本兄弟 "这个定位来的。

JavaScript和Java是两门不同的语言,但是不代表毫无关系。

有些人觉得JavaScript还是不够 "像" Java,比如JavaScript的类的实现是基于原型链的,和Java类有本质不同。对此我想说,脚本语言和编译型的语言本来就是为不同场景设计的。JavaScript和Java的差异确实足够大,大到应当作为两门不同语言分别学习,但是不能否认它们的历史渊源。JavaScript和Java的差异更多的可以用不同场景设计来解释。比如原型链问题,在Java中,你的API更新了,你只要升级JDK;而浏览器环境上应当让内置类有较高的扩展性,原型链无疑是最优解,让你重新设计一遍Javascript你也会设计成这样。

总结

Java 和 JavaScript 并非毫无关系,把它俩比作雷锋和雷峰塔,实在是冤枉了这两门语言。它俩的关系更接近于 VB 和 VBScript 的关系:VB 是微软推出的完整版编译型语言,适合开发大型桌面应用,VBScript 则是基于 VB 语法设计的轻量级脚本语言,灵活简洁,用于自动化、网页脚本,二者语法同源、定位互补,是同体系下不同分工的语言。

微软推出JScript

故事的走向在浏览器大战时期变得更加复杂。微软为了让自家的Internet Explorer浏览器兼容已有网站,迅速搞出了一个 JScript 。JScript虽然名字刻意避开了"Java"字眼,但就是为了兼容JavaScript而生的,可以看作微软的JavaScript。但由于JavaScript并非开放标准,微软是照着Netscape的JavaScript行为猜着做的,只能仿个大概,对边界场景可能存在不一致。

EcmaScript出现

为了推动Web标准化,1996年,网景将JavaScript提交给了欧洲计算机制造商协会(ECMA)进行标准化。第二年,ECMA出台了ECMA-262标准,这便是大名鼎鼎的 ECMAScript(简称ES)。

从此,技术界有了一个清晰的共识:JScript和JavaScript,本质上都只是ECMAScript标准的不同实现。 这个标准的诞生,把JavaScript从网景和微软的商业战中抽离出来,成为了一门真正开放的语言。

近年来ES朝着越来越不像Java的方向发展

随着Web标准化,ECMAScript已经不是Sun或Oracle可以控制的。如今ECMAScript的更新由TC39委员会主导,采用五阶段提案流程。如今ECMAScript的发展已经偏离的像Java的目的,比如Map/Set的API刻意避开了Java的命名规范。ES刻意都划清了界限。这导致JavaScript作为ES最核心的实现,如今越来越不像Java。

因此我更愿意把现在的js叫es,而不是否定Javascript和Java的关系

我知道有些人极度反感Java,甚至否定Javascript和Java的关系。对于这种掩耳盗铃的行为,我倒有个建议:既然这么嫌弃,不如彻底抛弃"JavaScript"这个带Java基因的名字,以后只准叫它ECMAScript。叫它ES,确实是对它如今独立设计哲学的最好宣告,证明它不再是任何人的附庸。也顺理成章地把"JavaScript"这个名字,留给那些真正需要"Java脚本化"的人。

相关推荐
重生之我是Java开发战士2 分钟前
【Java EE】认识Linux与项目部署
java·linux·java-ee
LXMXHJ6 分钟前
springboot项目测试
java·spring boot·后端·测试
程序员雪球14 分钟前
本地IDEA打断点debug容器
java·开发语言
码匠许师傅23 分钟前
【设计模式精讲】2. 设计原则基石:SOLID 与几条关键原则
java·设计模式·log4j
yychen_java28 分钟前
二:Multi-Agent 协作架构与 MCP 协议实战:Java 企业级 AI 智能体进阶指南
java·人工智能·架构
老白干28 分钟前
基于枚举 + 注解的 Java 数据脱敏实践(fastjson 序列化场景)
java·开发语言
SKH.31 分钟前
Linux软件编程(5)线程
java·linux·jvm
数据知道38 分钟前
Java 安全审计实战:SSRF、反序列化、SpEL 注入
java·开发语言·安全·网络安全
嗝屁小孩纸44 分钟前
通用后端基础能力平台(多模块技术总结与避坑指南)
java
CodeStats1 小时前
【Java 表达式引擎】如何设计一套 Java 表达式引擎:从递归下降到 AST 求值的完整实践
java·ai编程·表达式·引擎