根据您的工作需要,可能有比Java更好的语言,但我还没有看到任何能吸引我的语言。我记得我是在1997年开始使用Java的,那是在Java1.1发布后不久。从那时起,我就喜欢上了Java编程;尽管我不得不承认,这些天我经常编写Groovy脚本,就像我用Java编写“严肃代码”一样。我有FORTRAN、PL/1、Pascal和C语言的背景,我发现了很多让我爱上Java的东西。Java是我第一次亲身体验面向对象编程。到那时,我已经从事了大约20年的编程工作,我想说我对什么重要什么不重要有了一些看法。调试是一项关键的语言功能,我真的很讨厌浪费时间来追踪由于我的代码意外地迭代到数组末尾而导致的模糊错误,尤其是在IBM大型机上进行FORTRAN编程的时代。另一个不时出现的神秘问题是在需要两个字节时调用带有四字节整数参数的子例程;在小端架构上,这通常是一个良性错误,但在大端机器上,前两个字节的值通常不总是零。在那种批处理环境下调试也很不方便,通过核心转储或插入自己移动错误甚至使错误消失的打印语句。所以我早期使用Pascal的经历,首先是在MTS上,然后是在IBMOS/VS1上,使用相同的MTS编译器,这让我的生活变得轻松多了。Pascal的强静态类型是这一胜利的重要组成部分,我使用的每个Pascal编译器都会插入对数组边界和范围的运行时检查,因此可以在错误发生时检测到它们。当我们在1980年代初期将大部分工作转移到Unix系统时,移植Pascal代码是一项简单的任务。语法的数量恰到好处,但对于我最喜欢的Pascal,我的代码很冗长,语法似乎比代码更重要;例如,使用:if...thenbegin...endelse...end而不是InC或类似的:if(...){...}else{...}此外,还有一些东西在Pascal中很难做到而在C中更容易。然而,随着我开始越来越多地使用C,我发现自己遇到了我以前在FORTRAN中遇到的相同类型的错误,例如超出数组边界。在原始错误点不会检测到数组结束,但它们的不利影响只会在程序执行的后期检测到。幸运的是,我不再生活在那种批处理环境中,并且手头有很好的调试工具。但是,C对我来说有点太灵活了。当我接触到awk时,我发现它与C相比是另一回事。那时候,我的很多工作都涉及到转换字段数据和创建报告。我发现使用awk加上其他Unix命令行工具(如sort、sed、cut、join、paste、comm等)可以做的事情真是太神奇了。本质上,这些工具为我提供了类似于基于文本文件的关系数据库管理器的东西,这些文件具有柱状结构,并且是我们保存大量现场数据的方式。或者,即使不是这种格式,大多数时候您也可以从关系数据库或某种二进制格式导出到列式结构中。awk支持的字符串处理、正则表达式和关联数组,以及awk的基本功能(它实际上是一个数据转换管道)非常适合我的需要。当面对二进制数据文件、复杂的数据结构和性能关键需求时,我仍然会转而使用C;但是随着我越来越多地使用awk,我发现C的非常基本的字符串支持变得越来越没用了。压抑。随着时间的推移,我只在必要时才更频繁地使用C,而在其余时间大量使用awk。Java的抽象级别与Java相当。它看起来相当不错——一种相对干净的语法,让人想起C,或者至少比Pascal或任何其他早期语言更干净。它是强类型的,因此在编译时会发现许多编程错误。它似乎不需要很多面向对象的知识就可以开始,这是一件好事,因为当时我还不熟悉OOP设计模式。但即使在一开始,我就喜欢它简化的继承模型背后的想法。(Java允许通过提供的接口进行单一继承,以在某种程度上丰富范例。)它似乎带有丰富的功能库(即“自带电池”的概念),可以直接满足我的需要。最后,我发现自己很快想到了在对象中结合数据和行为。这似乎是一种明确控制数据之间交互的好方法——比大量参数列表或不受控制地访问全局变量要好得多。从那时起,Java就成了我编程工具箱中的一把Helvetic军刀。我仍然偶尔会用awk编写程序,或使用Linux命令行实用程序,如cut、sort或sed,因为它们显然是手头问题的直接解决方案。我怀疑我在过去20年里没有写过50行C代码;Java正是我所需要的。此外,Java也在不断改进。首先,它变得更有效率。它还添加了一些非常有用的功能,例如尝试测试资源,这对于清理文件I/O期间冗长且有些混乱的错误处理代码非常有用;或lambda,它提供声明式函数和作为参数传递的能力,而旧方法需要创建类或接口来“托管”这些函数;或流将迭代行为封装在函数中,可以创建以链式函数调用形式实现的高效数据转换管道。Java一直在变得更好许多语言设计者都在寻找从根本上改善Java体验的方法。对我来说,其中大部分我都不太感兴趣;同样,这更多地反映了我的典型工作流程,(更多)更少地反映了这些语言带来的好处。但是一个进化步骤已经成为我的编程工具包不可或缺的一部分:Groovy。当我遇到小问题并需要一个简单的解决方案时,Groovy已成为我的首选。而且,它与Java高度兼容。对我来说,Groovy填补了Python为许多其他人所做的同样的利基——它紧凑、DRY(不要重复你自己)和表现力(对列表和字典的完整语言支持)。我还使用Grails,它使用Groovy为非常高效且有用的JavaWeb应用程序提供简化的Web框架。Java仍然是开源的吗?最近,对OpenJDK支持的增加进一步提高了我对Java的熟悉程度。许多公司以各种方式支持OpenJDK,包括AdoptOpenJDK、Amazon和RedHat。在我的一个更大、更长期的项目中,我们使用AdoptOpenJDK在多个桌面平台上生成自定义运行时。有比Java更好的语言吗?我确定有,这取决于您的工作需要。但我一直对Java非常满意,而且我还没有遇到任何可能让我失望的事情。
