Java靠强大的JVM维护了一个蓝领级语言?

保姆级教程:用Docker一键部署vLLM大模型推理服务(附常见报错解决方案) 本文提供了一份详细的Docker化vLLM大模型推理服务部署指南,涵盖从环境准备到性能调优的全流程。通过容器化技术解决大语言模型部署中的显存利用率、吞吐量等核心问题,并附常见报错解决方案,帮助开发者快速构建高效、可扩展的AI推理服务。 阅读详情

下面的文章是冰河写的,就是一本common lisp书的作者,前网易的一个员工,文章后面的一个评论里说“java是蓝领级语言”,这么说我们都是民工了,不过稍后仔细想了想,确实是民工,让我对java有了新的认识!

从 Lisp 程序员的视角看 Java 语言的缺点

Java 语言的优缺点——Lisp 程序员的视角 - 冰河 - Chun Tian (binghe)

引子

带着三分无奈和七分不情愿,终于把 Java 复习了一遍。教材用的是我大学时买的《 Java 2 编程指南: SDK 1.4》,虽说老了一些,但书绝对是好书,讲得很透彻。我终于想起来了,Java 语言如果是 1995 年左右诞生的话, 我当时在杂志上读到了,《大众软件》或者《计算机应用文摘》,主标题好像是《Java 来了》。可惜当时我还在学 Turbo C 呢,忙不过来,于是把 Java 忽略了。
那么 Java 跟 Lisp 之间又有什么关系呢?首先,Sun 公司 Java 语言规范的制定者之一  Guy Steele 同时也是 Common Lisp 标准化委员会的成员之一,Common Lisp 标准草案文档《 CLTL2》的作者,以及 Lisp 史论文《 The Evolution of Lisp》的作者之一,这就意味着 Java 语言在定义的时候深受 Common Lisp 的影响,至少在定义 Java 的时候知道 Lisp 究竟是什么样子的;其次,Java 语言发明时引入的一些新特性(虚拟机,GC,流)根本就是来自 Common Lisp 的。
我对 Java 语言的总体理解是,设计者试图实现一个 OO 语言,它要在语法上尽可能接近 C,运行时环境上接近 Lisp,OO 部分则需要解决 C++ 中的一些难题。最后得到的是一个丑陋的设计,而且经常拆东墙补西墙。Java 的唯一创新应该是强制的软件包(库)管理系统,这对实现软件工程却极其有利。铺天盖地的 jar 包极大地扩展了 Java 语言的应用范围,组件重用也变得轻而易举了。最后,各种 Java IDE 弥补了程序中废话太多的不足。

非 OO 部分

Java 虽然有 GC 系统帮忙清理内存,但 整个语言似乎在鼓励程序员肆意浪费内存,我从 hello world 上就看到这点了。为了生成格式化的输出,Java 提供了 System.out.println(),其地位相当于 C 的 printf() 和 Common Lisp 的  format。Java 版本是最浪费内存的,因为它在运行期是通过字符串拼接的方式来产生需要输出的最终字符串的,而字符串拼接操作的所有中间结果以及最终结果在输出完成以后都要被丢弃,然后等待 GC。相比之下,printf 或 format 的格式化字符串更像是一段执行输出操作的微程序,不但表达能力上来了,格式字符串本身也不存在运行期的自我复制。
Java 数据的创建过程和 C 差不多,允许对数据进行静态初始化。问题是数组初始化语法  { … } 不但局限性很大(无法简单地将所有数组元素初始化成同一个值),而且该语法本身并不是一个合法的表达式,但却可以写在等号的后面,从而给编译器带来了额外的负担。相比之下,Common Lisp 的数组是由一个普通的函数  make-array 生成的,不但接受用来初始化数组元素的列表,还接受用来初始化整个数组的单个值;更重要的是,通过使用特殊的关键字参数,Common Lisp 的数组是可变大小的,必要时还存在类似指针的配套游标对象 (fill-pointer) 以支持灵活地向数组中输入数据。
Java 把所有从 C 那里过继来的 基本数据类型又给重新封装了一次,例如 int 封装成了 java.lang.Integer。这样做真的有必要吗?我看也未必。究其根源,Java 语言虽然让类 (class) 成为程序的最基本元素了,却没有配套地把所有的函数 (function) 都变成方法 (method)。诸如 sin/cos 和 max/min 这样的操作符仍然沿用了 C 语法,但 Java 设计者却不能接受更多的这类全局函数了,于是创造了基本数据类型的封装类,然后把更多的高级运算符以类方法的形式只供封装类的对象使用。Common Lisp 也有对象系统,称为 CLOS。知道 CLOS 是怎么做的吗?所有的方法调用 (method call) 都跟普通函数调用在形式上是一样的,而所有基本数据类型直接被并入 CLOS 的类层次体系了,在 Common Lisp 中,如果单纯观察一段用户代码的话,甚至无法鉴别究竟一个操作符是函数还是方法。我们把具有相同名称的所有方法称为广义函数 (generic function)。
P. S. 近年来某些更恶心的语言——我不确定是 Python 还是 Ruby——试图避免 Java 的这种尴尬,直接允许基本数据类型作为对象使用,例如  sin(1) 可以写成  1.sin()。这在一方面说明 Java 在这个地方确实设计得不怎么样,另一方面即便这么做也是误入歧途了。 一门语言中所有不同类型的子程序调用都应该具有统一的形式,无论是普通函数还是具有多态性的方法 (method),这才是最美的设计。你们写  1+1 时,我们写  (+ 1 1);你们写 sin(x) 时,我们写  (sin x); 你们说 you.fuck() 时,我们可以说 (fuck you) !!!
Java 的 字符串系列操作符(String, StringBuffer, StringTokenizer, interning, …)大概是整个基础语言中花费心思最多的部分了。这部分的主要问题是  “正交性“ 不足。就是说,字符串这种数据类型事实上包含了两个属性,首先它是一个串,也就是向量或者一维数组,其次它是由字符所组成的。一个充分正交的语言应当把串操作符和字符操作符分开定义,并让前者可在向量或一维数组上使用。比如说 Java 定义了一些在字符串中做查找和替换之类的方法,但这些事情其实在一维数组里也是有用的;而另一个方法,比如说检测整个字符串是否全部由数字或字母所构成,或者在不考虑大小写的前提下比较两个字符串的内容,这些才是 String 类的份内工作!Common Lisp 的基本数据类型是具有层次关系的,一维数组 (也称为向量) 和列表通称为序列 (sequence),并且诸如查找、替换和著名的 map 与 reduce 函数都是用于一般性序列的操作符。C++ 的 STL 也有类似的特征,不知道是不是跟 Lisp 学的。
P. S. Java 的字符数组和字符串是不同的类型?一切都是字符串整体作为一个对象所惹的祸。

OO 部分

Java 语言的 OO 部分整体感觉比 C++ 略强一些,但很多 C++ 的 OO 问题并不是真的解决了,而是被语言直接禁止了。(比较遗憾的是我 Objective-C 不熟,没法比较,这么多年苹果电脑算是白用了)
Java 类名和程序中的变量名似乎是在同一个名字空间的。这是因为 Java 在调用类的静态方法或静态成员时时是将类的名字方法对象的位置上,例如 System.out 以及 Class.forName()。这恐怕就是为什么 Java 教材中建议所有变量的名字都采用小写开头,而所有类的名字都用大写开头的缘故,怕程序员一不小心就名字冲突了。我相信 Java 编译器才不管这一套,所有出现在 . 之前的符号在编译期都要仔细地检查它究竟是附近定义的一个变量,还是来自遥远 jar 包的一个类名。Common Lisp 怎么处理静态成员的问题?我们可以用 MOP 的 class-prototype 函数从任何类中提取出一个原型对象来,然后就像使用正规对象一样来使用它。而且由于类的实例化过程是通过普通函数实现的,类的名字有自己的命名空间,跟函数、变量同名也没有关系。
嵌套类的存在就是一个悲剧,还嫌不够乱吗?我们接受局部函数是因为这可以消除重复的模式,让局部代码可重用;我们接受局部变量是因为这些东西可以帮助我们缓存中间结果;嵌套类有什么意义?类是对象结构的描述,这点儿破事儿难道还要掖着藏着不让整个程序知道吗?Java 书的这个地方我没仔细看,但如果一个嵌套类的实例被传给了完全无关的其他类的话,嵌套类的私有方法还能随便地被调用吗?
P. S. 我可以接受匿名类及其存在的理由,但 Java 编译器不应该针对每个匿名类 (还有嵌套类) 都分别编译出单独的 .class 文件啊! ABCL 源代码中的一个 .java 文件经常可以被编译出超过 100 个 .class 文件,这不是精神病嘛。
Java 对多继承问题的妥协。我听说 C++ 里麻烦的 钻石继承问题,推荐的解决方案是改用虚继承;Java 用一种不允许带有成员变量的特殊类——接口 (interface),把这个事情给避开了。为什么类不能多继承而接口就可以呢?哦,因为 Java 类的继承过程是跟 C++ 学的,子类的数据结构直接挂接在基类数据结构的后面,子类所定义的成员变量都被认为是全新的,而无论其名字是否与某个基类的成员同名。多继承是必需的,因为整个世界在本体论的意义上确实是单根多继承的。于是接口作为一种半残废的类出现了——它只允许有象征性的成员函数,而决不允许拥有成员变量。这样接口多继承中的钻石继承问题总算是混过去了,但这样搞出来的一切都是虚的,为了让这些接口类能真正的用来做事,你不得不用一个类来配合它,给它注入成员变量和实际的方法代码。
Common Lisp 对象系统 (CLOS) 是如何处理钻石继承问题的?简单地说,我们没有必要处理。因为所有类层次关系中同名的成员变量都被认为是同一个!但是子类为什么要重复地定义基类已有的成员变量呢?因为它需要特化基类的成员类型和其他属性,例如基类的某个成员是数值类型的,那么子类可以进一步说它是整型的,这是有意义的。Common Lisp 之所以能做到这点,是因为 Lisp 系统有权限访问所有那些基类的成员清单,但 Java 和 C++ 似乎都不可以。当然,如果允许同名的成员变量被视为等价的话,名字空间的问题就再次浮出水面了。Java 似乎把 C++ 的 namespace 特性直接干掉了,这样一来,如果采用了 Common Lisp 的解决方案,那么名字冲突就太可怕了,随便给私有成员变量起个名字就可能跟某个上层基类的同名成员相冲突,这显然是不好的。

后记

敝人的 Java 纯属初学,以上关于 Java 特性的描述如有失当之处,希望有关读者予以指出,深表谢意。同时欢迎广大 Java 程序员们在本文的评论中发表自己的有关观点。
基于STM32L4XX 、HAL库的ATD5984步进电机驱动器驱动程序应用设计 一、简介: ATD5984是一款内部集成了译码器的微特步进电机 驱动器,能使双极步进电机以全、半、1/4、/1/8、1/16 和1/32步进模式工作。步进模式由逻辑输入管脚MSx选 择。其输出驱动能力达到28V±1.6A。 译码器是ATD5984易于使用的关键,通过STEP管脚 输入一个脉冲就可以使电机完成一次步进,省去了相序 表,高频控制线及复杂的编程接口,使其更适于没有复 杂的微处理器或微处理器负担过重的场合。 在步进操作期间,ATD5984的内部电路可以自动 阅读详情

相关推荐

差分逻辑电平——LVDS、CML、LVPECL、HCSL互连

首先了解差分逻辑电平结构,也包括单端逻辑电平常见的逻辑电平_常用的逻辑电平-优快云博客注:ECL >> PECL >> LVPECL演变而来;QDR(Quad Data Rate):四倍数据倍率本文章只涉及差分逻辑电平:LVDS 、LVPECL、CML (高速)(最常用)在任何给定的系统设计中,必须设计驱动器侧和接收器侧之间的时钟逻辑转换。通过在它们之间增加衰减电阻和偏置电路来将一个差分时钟转换为其他类型的差分逻辑,来衰减摆幅电平并重新偏置共模输入接收器。

weixin_45365488的博客 4万+

java lisp,摸索JVM上的LISP[Java编程]

赞助商链接本文“摸索JVM上的LISP[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:当前Java范畴最冲动人心的事情莫过于可答应别的编程语言运行于Java虚拟机上.环绕JRuby、Groovy、Scala还有 Rhino(JavaScript引擎)的谈论已经甚嚣尘上.可为什么要墨守陈规呢?假如你...

weixin_33134753的博客 410

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1259

为什么百度词条"蓝领"的编辑者说Java程序员是蓝领?他错了吗?

Java程序员是蓝领吗? author:BBSee e-mail:ro...

张弈秋的博客 3082

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 461

uniapp+萤石视频监控实战:解决ezuikit.js真机调试不显示的5个关键步骤

本文针对Uniapp集成萤石视频监控时ezuikit.js在真机调试中黑屏不显示的问题,提供了5个关键解决步骤。核心方案是采用Webview加载独立H5播放页,以规避跨平台环境差异,并详细阐述了资源放置、多端适配、通信处理及系统化排查方法,确保视频流稳定播放。

weixin_29001655的博客 287

它被称为“蓝领”的编程语言!90%的财富500强公司都在使用!

黑马程序员视频库播妞微信号:mm7718mm传智播客旗下互联网资讯、学习资源免费分享平台每提及java技术之前都不得不说一下java的发展和java语言近几年在开发语言的...

传智播客的专栏 422

开发者体验度量:构建DevEx评估体系的方法论与工具

在深入讨论度量方法前,我们需要明确什么是开发者体验(DevEx)。许多人将其简化为"开发工具好不好用",这是一个危险的误解。开发者体验是指开发者在完成工作过程中的整体感受和效率,它由三大核心维度组成:工具与基础设施:开发、测试、部署工具链的效能流程与协作:工作流程的顺畅度和团队协作的效率文化与成长:支持实验、学习和专业发展的环境这三个维度相互作用,共同决定了开发者能否高效且愉悦地完成工作。开发者体验不是一个目的地,而是一段持续的旅程。

2401_88760782的博客 1429

Clojure快餐教程(1) - 运行在JVM上的Lisp方言

Clojure快餐教程(1) - 运行在JVM上的Lisp方言 Java作为目前为止被使用最广泛的使用虚拟机的编程语言,带动了JVM上语言族的繁荣。有根红苗正的为JVM设计的动态语言Groovy,目前最主要被用于Gradle编译环境中;也有Jython, JRuby等动态语言在JVM上的实现,也有scala这样强大的混合语言。在这之中,clojure是比...

weixin_33935777的博客 248

NVIDIA DGX Spark实战指南:从开箱到部署200B参数大模型

本文详细介绍了NVIDIA DGX Spark桌面AI超级计算机的开箱体验与实战部署指南。文章深入解析了其Grace Blackwell架构与128GB统一内存的核心优势,并逐步演示了从系统初始化、运行200B参数大模型到进行QLoRA微调的全过程。该设备将高达1 PetaFLOP的AI算力浓缩于桌面,为开发者和研究团队提供了本地化、高性能的AI开发与部署一体化解决方案。

weixin_29274969的博客 2230

OpenClaw一人公司落地案例:本地商家营销智能体月赚3万的秘密

角色:本地商家营销专家## 核心目标为商家生成高转化率的抖音营销策略,最大化 ROI。## 输入数据- 商家名称: "XX奶茶店"- 过去 30 天视频播放量: 12,000- 客单价: 28 元- 竞品平均播放量: 15,000- 市场趋势: rising## 策略生成规则1. **内容类型**:根据客单价推荐- < 30 元:美食探店 + 优惠券- > 30 元:场景化故事 + 会员权益2. **发布时间**:根据历史数据- 18:00-20:00 高峰期。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 542

jvm7 jvm8_在JVM上探索LISP

jvm7 jvm8 目前,Java世界上最激动人心的事情之一就是正在努力使其他编程语言在虚拟机上运行。 关于JRuby,Groovy,Scala和JavaScript引擎Rhino的讨论很多。 但是为什么要停在那里? 如果您真的想跨出主流并涉足与Java完全不同的方面,那么Lisp是一个不错的选择。 而且,有几种针对JVM的Lisp编程语言的开源实现,可供探索。 那么,什么使Lisp值得一看...

cunfu6353的博客 472

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

为什么Java能够持续的受到欢迎呢?原因有这些

回顾过去十五年的成果,Java一直是数一数二的。Java已经占据了曾经C语言所拥有的地位,而C语言在Java开始流行之前一直是最受关注的语言。2015年是Java语言年,而十年之前,Java就已然获此殊荣。

xiaoxijinger的博客 350

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

4个理由告诉你Java为何排行第一

Java已经有20年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式。忽略它的年龄不看,Java依然排行第一。它的实用性、性能和向后兼容性都彰显其价值所在。 2016年伊始,标志着我们已经走过了Java的20年历程。事实上,虽然Java宣称是于1995年5月23日公开发行(HotJava浏览器却并没有获得同样的成功),但第一版官方JDK是在1996年的1月23日才正式发行,因此Java...

DLQFHL的博客 144

Java 一直排名第一的原因

Java已经有20年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式。忽略它的年龄不看,Java依然排行第一。它的实用性、性能和向后兼容性都彰显其价值所在。 2016 年伊始,标志着我们已经走过了Java的20年历程。事实上,虽然Java宣称是于1995年5月23日公开发行(HotJava 浏览器却并没有获得同样的成功),但第一版官方JDK是在1996年的1月23日才正式发行,因此J

Nickname0358的博客 1025

Java持续受欢迎的4个理由

Java 已经有 20 年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式。忽略它的年龄不看,Java 依然排行第一。它的实用性、性能和向后兼容性都彰显其价值所在。       回顾过去的成果,Java 一直是数一数二的。Java 已经占据了曾经C语言所拥有的地位,而C语言在 Java 开始流行之前一直是最受关注的语言。(事情变化多快啊!早在 1986 年 Lisp 语言还是排名

haitun0567的博客 433

Java,你用它的理由

Java已经有20年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式。忽略它的年龄不看,Java依然排行第一。它的实用性、性能和向后兼容性都彰显其价值所在。 2016年伊始,标志着我们已经走过了Java的20年历程。事实上,虽然Java宣称是于1995年5月23日公开发行(HotJava 浏览器却并没有获得同样的成功),但第一版官方JDK是在1996年的1月23日才正式发行,因此Ja

Just Do It 518

Java 排名第一的4个理由

java已经有20年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式。忽略它的年龄不看,Java依然排行第一。它的实用性、性能和向后兼容性都彰显其价值所在。 2016年伊始,标志着我们已经走过了Java的20年历程。事实上,虽然Java宣称是于1995年5月23日公开发行(HotJava 浏览器却并没有获得同样的成功),但第一版官方JDK是在1996年的1月23日才正式发行,因此Java可...

左安青的博客 908

Java为何排行第一的四个理由

java已经有22年的历史了,甚至更久,而这取决于你所询问的人和你的计算方式。忽略它的年龄不看,Java依然排行第一。它的实用性、性能和向后兼容性都彰显其价值所在。本文就列举Java第一的原因。 2018年伊始,标志着我们已经走过了Java的22年历程。事实上,虽然Java宣称是于1995年5月23日公开发行(HotJava 浏览器却并没有获得同样的成功),但第一版官方JDK是在1996年的1月

molihuaya的博客 440

Java仍然排名第一的4个原因

作为衡量受欢迎程度的另一种方法,Oracle经常喜欢引用世界上有900万Java开发人员的统计数据。无论细节如何,我认为我们都可以同意,全世界确实有数以百万计的Java开发人员。 问题是,为什么Java继续如此受欢迎?我认为有很多原因。让我们只强调四个: 1.实用性 James Gosling将Java描述为一种“蓝领”编程语言。它旨在允许开发人员以最少的麻烦完成工作,同时仍使开发人员可以在以后使...

阿志同学 355

你是白领程序员还是蓝领程序员?

http://news.youkuaiyun.com/a/20091117/214862.html

lansky54的专栏 1644

探索JVM上的LISP

导读:   当前Java领域最激动人心的事情莫过于可允许其它编程语言运行于Java虚拟机上。围绕JRuby、Groovy、Scala还有 Rhino(JavaScript引擎)的讨论已经甚嚣尘上。可为什么要墨守陈规呢?如果你真的想跳出主流,投身于一种与Java截然不同的的语言,Lisp就不失为一种很好的选择。现在已有几种可运行于JVM上的Lisp程序设计语言的开源实现,准备好开始我们的探索

xu的blog 1479
上一篇: [翻译Building the Game: Part 5 – Static Level Geometry
下一篇: Seven Languages In Seven Weeks: Week 1 (Ruby) - Day 1
程序员迈克
博客等级 码龄16年 36粉丝 71原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值