译者 | 翟珂
亚历山大-波普说过“人类的希望是永恒的”,虽然波普是个诗人,不是极客,但我相信他能够理解发现一种新的编程语言时的期待感。他知道软件开发人员永远期待一种语言,能够以其独特的Unicode字符组合,解决我们所有的问题,使编码变得更简单,甚至只需点击几下即可。
他也肯定会理解我们对一种新的语法的渴望,这种语法是如此直观,以至于我们只需要想象要做什么,然后就能够使用语法清晰的表达出其中的逻辑。这是一种对新代码的渴望,这种代码看起来就像三段式(Triple axel)、梭鱼式(inward three and a half)或奥运会上的大回转跑那样毫不费力和优雅。
然而,大多数现代编程语言建立的初衷并不是创作者异想天开或为了展示他们的编码能力。它们是针对创作者需要解决的一个常见问题而产生的。虽然大多数开发者会继续使用一种或多种更老、更成熟的语言进行日常编码,但我们永远在寻找新的语言来帮助我们解决编码问题。我们可以看到这种趋势,尤其是在特定领域语言或 DSL 的崛起。这些语言紧凑且集中,它们不适用于通用用途,但是正是出于这个原因,可能会在你的工具箱赢得一席之地。
这里有 11 种较新的语言,并且都已经找到了自己的用途。有些是 DSL,旨在做好一件事。其他的,似乎要拯救世界。即使你现在不需要它们,但它们都能让我们的计算机把要做的事情做得更好。
Reactive Clojure是Clojure和React的结合体:一个将反应式前端的所有可能性与 Clojure 坚实的功能优势相结合的系统。你可以使用Reactive Clojure布置一个复杂的前端组件集合,并使用函数将它们串连起来。反应式框架能够处理这些细节,并且确保应用数据在组件和数据库之间流通。Clojure则提供功能基础,使非常规的用例成为可能,并且可调试。
这看起来简直是天作之合,但还需要通过时间的检验。Reactive Clojure是一个将前端组件结合在一起的好选择。它的多线程模型与多任务的复杂性和反应式仪表板自然匹配。
有时,程序员会将大部分工作花费在配置文件上,这些文件通常用JSON、YAML甚至XML编码。在某些情况下,你甚至不需要写具体的代码,只要不停地切换各种配置文件来完成工作。
Nickel的诞生就是为了解决这一问题,它是一种用于创建配置文件的编程语言。你可以用Nickel来创建非静态的配置文件。一个参数的值可以发生变化,在一周内可以是一个值,在周末则是一个不同的值。在运行Nickel时,它会创建一个新的配置文件,以适应它收到的所有参数。
Nickel的结构在很大程度上是功能性的,而且可以使用类型检查。一段非常好的Nickel代码几乎可以保证输出遵守句法规则和任何其他需要执行的规则。你可以编写代码来创建配置文件,然后再对其他代码进行管理,这听起来有些滑稽。但对于现代架构来说,这是一个非常实用的解决方案。
Kobra的创造者希望有一种语言能够为工程师、科学家和其他不那么专业的编码者开放机器学习,于是这个机器学习的视觉语言就诞生了。Kobra的编辑器用拖放块组成了类似代码的序列,这些块用于统计分析和机器学习的常见内置例程。这个过程感觉就像R语言,它的数据框由表格数据和一组用于创建仪表板和论文的图形显示函数而组成。
这是云计算最有用的功能之一,能够启动和关闭服务器,用以处理数据激增。数据中心的硬件团队曾经需要花费数周时间来申购、安装、测试和配置一台机器。现在,云让你在几分钟甚至几秒钟内完成所有这些工作。
许多敏捷开发团队已经开始为不同云支持的各种API编写代码。微软为在Azure中启动机器创建了一种简化的语言,作为其基础架构即代码理念的一部分。
Bicep 语言提供了一种高效的声明式格式,可以编码出开发人员希望在新实例中的应用。一些基本的类型安全可以帮助防止错误,并且 VS Code 中提供了一个语法感知编辑器。该语言本身是为对基础架构进行高阶思考而设计的,具有强声明性结构,允许你以任何顺序包含指令,让 Azure 的资源管理器优化执行。
使用浮点数出现错误带来的开发风险是众所周知的,相当多的Bug是由于不注意的数字格式造成的。
Frink正是为解决这一问题而创造的,它是一种有“单位意识”的语言。Frink中的每个变量不只是持有一个数字,而且还标明了计量单位(几乎所有的计量单位),比如吨、瓦、英尺或者米。这使单位转换变得很容易,Frink的核心机制在于使用任意精度的数字来减少四舍五入的问题。这就像一种对于测量单位来说的类型检查。
声音合成对于游戏开发、VR和任何依赖良好音质的应用都非常有用。而Faust就是这种特定领域的语言,它的结构是纯功能的,并且每一个功能都建立了一个声音处理管道。它的后端将传入的声音分解为数字表示,而代码本身是一组可以组成最终结果的函数。比如,你可以通过分割代码输出并引入延迟来创造一个回声和混响。另外,Faust的代码可以转译成C++、C、LLVM Bitcode、WebAssembly、Rust和其他一些语言,因此你几乎可以在任何项目中使用它。
任何编写代码的人都知道程序员如何组建一个乐队。写一些代码,为鼓机拼出节奏,然后用子程序取代所有其他的乐队成员,用这种方式甚至能建立一个完整的交响乐团。
Melrōse和Glicol就是为这种音乐创作方式而生的编程语言。使用这两种语言你只需要用几个按键就能创造出一个看上去精心制作的作品。Melrōse围绕西方音乐中常见的标准十二音度的高层次工作。音符被分组为序列,软件处理大部分的细节工作,如移调。输出到任何具有MIDI功能的乐器上,代码也可以对通过MIDI端口进入的信号作出反应,因此运行Melrōse代码可以代替一个乐队成员。
Glicol是一个基于Rust的工具,它能完成许多和Melrōse相同的任务,但级别较低。Glicol可以与数字信号处理相结合,可以提供广泛的音乐类型选择。该工具旨在通过其开源的音频引擎产生可用于浏览器的声音。正如其开发者所说:“入门费用低,上限高。”,用于鼓励与所有会此技能的人合作。
将指令传送到计算机的最有效方法是将它们编码为二进制并将它们限定为 CPU 使用的基本操作集。每个芯片都有自己喜欢的二进制语法,Pascal 或 JAVA 等一些语言有一种中性的二进制格式,可以在本地虚拟机上运行。WebAssembly为Web浏览器提供预先处理的二进制代码,并以标准格式与文本相结合。其目标是用更容易运行的、接近本地速度二进制格式来代替构建Web应用程序的JavaScript代码。
许多开发者使用WebAssembly但不直接编写,而是用编译器将高级语言转化成WebAssembly,并在浏览器中运行。还有一个举措就是创建低级语言,以人类可读的形式公开WebAssembly的大部分基本结构。Wase就是这样的一种选择,它提供了一种类似C的语法和强类型。
在Web浏览器之外,也有WebAssembly的用武之地,作为一种通用的编码指令方式,其堆栈机类似于Java的JVM。例如,Redpanda是一个流媒体数据平台,它为开发者提供了一个机会,当数据通过WebAssembly编写的代码进入管道时,可以对其进行调整或修改。
从某种意义上来说,Java并不能算是一种新的语言。Java最伟大的地方之一就是,它的开发者在维护与旧版本的兼容性方面做得很好,对于最新的JVM来说,编译10年甚至20年前的代码通常很容易。虽然这些代码不能保证能正常运行,但它仍然比几乎任何其他语言更容易编译。并且Java团队拥有一套包含数百万个集成测试的套件。
将Java 17列入这个名单是因为它已经非常现代化了,以至于1990年代的开发者肯定认不出是Java。它有许多额外的功能和扩展,能够改变开发者的编码方式。
比如增强的随机数发生器或更严格的浮点数学语义,解决了编写非常复杂的数字代码的难题。编写会计系统的开发人员可以使用整数来保存钱的数量,但那些处理AI算法和复杂线性代数的开发人员则需要浮点数。
其他的,如强封装和扩展的switch语义,为核心语言带来了规范性和灵活性。总而言之,由于所有这些改进,使编写更强大、更安全的代码比以往任何时候都容易。它的核心仍然是Java,但附加功能有所不同。
原文链接:https://www.infoworld.com/article/3658204/11-new-programming-languages-to-make-a-coders-heart-sing.html