从更友好的WebAssembly编写方式到机器学习的可视化语言,这11种编程工具可以重新定义你编写软件的方式。
是亚历山大-波普说的吗?"人类的希望是永恒的"?波普是个诗人,不是黑客,但我相信他能理解发现一种新的编程语言时的期待。他知道,软件开发人员永远希望这种语言,以其独特的Unicode字符组合,将最终解决我们所有的问题,使编码变得简单,只需点击几下。
教皇肯定会理解人们对一种新的语法的渴望,它是如此直观,以至于我们只需要想象一个答案,并看到它被呈现为奇妙的、精致的、最重要的是正确的逻辑规则。他会理解我们的手指对旋转新代码的渴望,它看起来就像一个三段式(Triple Axel)、一个向内的三段半(Pike)姿势或奥运会上的大回转跑那样毫不费力和优雅。
然而,大多数现代语言并不是为了异想天开或展示我们的编码能力而建立的。它们是针对创造者急于解决的一个共同问题而制造的。虽然大多数开发者会继续用一种或多种更古老、更成熟的语言进行日常编码,但我们永远在寻找新的工具来帮助我们解决编码问题。我们可以看到这种趋势,特别是在特定领域的语言,或DSLs的崛起。这些语言是紧凑和集中的。它们并不打算用于通用的用途。但是有些语言可以在你的工具箱中赢得一个特殊的位置,正是因为这个原因。
这里有11种较新的语言,它们已经找到了自己的位置。有些是DSL,旨在做一件事,并把它做好。其他的,似乎是要拯救世界。即使它们不是你现在所需要的,它们都有一些关于让我们的计算机做他们所做的事情,但要做得更好。
反应式Clojure
当你把Clojure和React结合起来的时候,你会得到这样的结果:一个结合了反应式前端的所有可能性和Clojure坚实的功能优势的系统。在最好的情况下,Reactive Clojure可以让你布置一个复杂的前端组件集合,并用函数把它们串起来。Reactive框架填补了这些细节,并确保应用程序数据在组件和数据库之间顺利流动。Clojure带来了功能基础,使超出常规的用例成为可能,并且可以调试。
这是一个天作之合吗?时间会告诉我们。反应式Clojure是编写连接前端组件的胶水代码的一个好选择。它的多线程模型与同时报告多个任务的复杂和反应式仪表盘是天然匹配的。
Nickel
程序员们玩的一个比较讽刺的游戏是把我们的大部分工作推给配置文件。这些文件通常以JSON、YAML甚至是XML编码,是一个好的编码想法,但却转移到了精心设计的仪式上。在某些情况下,你甚至不需要写实际的代码;只需要无休止地跳动各种配置文件来做你需要的事情。
因此,我们有了Nickel:一种用于创建配置文件的编程语言,这很有意义。Nickel就像一个内嵌逻辑的模板,你可以用它来制作非静态的配置文件。一个参数在一周内可以是一个值,而在周末则是一个不同的值。当它运行时,Nickel会创建一个新的配置文件,以适应它所收到的所有参数。
Nickel的结构在很大程度上是功能性的,而且类型检查是可用的,如果它恰好有帮助的话。一个很大的主题是 "正确性",因为一段写得很好的Nickel代码几乎可以保证输出将遵守句法规则和任何其他你需要执行的规则。Nickel的编译器让你写契约,然后检查输出是否遵守它们。当然,写代码来创建配置文件,然后对你的代码进行管理,这是很有趣的事情。但对于现代架构来说,这是一个非常实用的解决方案。
Kobra
Kobra的创造者希望有一种语言能够向工程师、科学家和其他不那么专业的编码人员开放机器学习。其结果是他们称之为机器学习的视觉语言。Kobra的编辑器用拖放瓦片组成了类似代码的序列,代表了统计分析和机器学习的常见内置程序。这个过程给人的感觉就像R一样,有从表格数据中构建的数据框架,以及用于创建仪表盘和论文的图形显示功能集合。
Bicep
云计算最有用的功能之一是能够启动和拆除服务器以处理数据激增。数据中心的硬件团队曾经需要花费数周时间来申购、安装、测试和配置一台机器。现在,云让你在几分钟甚至几秒钟内完成所有这些工作。
许多开发团队已经开始为不同云支持的各种API编写代码。微软决定更进一步,为在Azure中启动机器创建一种简化的语言,作为其基础设施即代码理念的一部分。
这种语言被称为Bicep,它提供了一种高效的声明性格式,以阐明开发人员可能想要在新实例中翻转的大多数不同位。一些基本的类型安全可以帮助防止错误,而且在VS Code中还有一个语法感知的编辑器。该语言本身是为基础设施的高阶思考而设计的,具有强烈的声明性结构,允许你以任何顺序包含指令,然后让Azure的资源管理器优化执行。
Frink
一位朋友声称,他选择银行的一个要求是确保银行的会计软件使用整数来计算便士,而不是用浮点数来计算一美元的分数。用浮点数出错的危险是众所周知的,而且是太大的危险。有多少bug是由于不注意折腾数字而造成的?
Frink是一种 "单位意识 "语言,正是为这个问题而创造的。Frink中的每个变量不只是持有一个数字,而且还表明了计量单位,无论是吨、瓦、英尺还是米。由于Frink配置文件的存在,单位转换很容易。Frink的核心机制也使用任意精度的数字来减少四舍五入的问题。这就像类型检查,但对于数字测量单位来说。
Faust
声音合成似乎是一个狭窄的焦点,但它对游戏开发、虚拟现实和任何依赖良好声音质量的应用都非常有用。进入Faust,一种特定领域的语言,它的名字来自于功能性音频流的混合体。Faust的结构是纯功能的,它所有的功能都建立了一个声音处理管道。它的后端将传入的声音分解成数字表示,而代码本身是一组可以组成或结合成最终结果的函数。举个例子,你可以通过分割你的代码输出并引入延迟来创造一个回声或混响。Faust的代码可以转译成C++、C、LLVM位代码、WebAssembly、Rust和其他一些语言,所以你几乎可以将其用于任何项目。
Melrōse和Glicol
任何写代码的人都知道程序员会如何组建一个乐队。与其发布广告寻找鼓手,然后面试每一个回应的人,不如写一些代码,为鼓机拼出节奏。一旦完成,你就可以用子程序取代所有其他乐队成员。你甚至可以用这种方式建立一个完整的交响乐团。
Melrōse和Glicol是两种音乐编程语言,是为这种音乐创作方式设计的。这两种语言都允许你只用几个按键就能创造出精心制作的作品。Melrōse是围绕西方音乐中常见的标准十二音度的高水平工作,音符被分组为序列,软件处理许多细节工作,如移调。输出到任何具有MIDI功能的乐器上,代码也可以对通过MIDI端口进入的信号做出反应,因此Melrōse代码可以成为一个乐队成员。
Glicol是一个基于Rust的工具,它完成了许多相同的任务,但级别较低。该代码与数字信号处理相结合,提供了广泛的音乐选择。该工具旨在通过其开源的音频引擎产生可用于浏览器的声音。Glicol的开发者说,这种语言 "入门费低,上限高",以鼓励与各种技能水平的人合作。
WebAssembly和Wase
向计算机发送指令的最有效方式是将其编码为二进制,并将其限制在CPU使用的基本操作集上。每个芯片都有自己喜欢的二进制语法,有些语言如Pascal或Java有一个中性的二进制格式,目的是在本地虚拟机上运行。WebAssembly(Wasm)跟随这些脚步,为网络浏览器提供预先消化的二进制代码,并以标准格式与文本相结合。WebAssembly的目标是用更容易运行的、接近原生速度的东西来取代构成网络应用骨干的最小化的JavaScript代码。
许多开发者将使用WebAssembly而不直接编写,而是使用编译器将高级语言转换成WebAssembly并在浏览器中运行。还有一个举措是创建低级语言,以人类可读的形式展示WebAssembly的大部分基本结构。Wase就是这样一种选择,它提供了一种类似于C语言的语法和强类型。
WebAssembly也在网络浏览器之外找到了用武之地,作为一种通用的编码指令的方式,其堆栈机类似于Java的JVM。例如,Redpanda是一个流媒体数据平台,它为开发者提供了调整或修改数据的机会,因为它是用WebAssembly编写的代码从管道下来的。
Java 17
从技术上讲,Java并不是一种新的语言。事实上,Java最伟大的地方之一是,它的开发者在保持与旧版本的兼容性方面做得很好。通常很容易为最新的JVM编译10年甚至20年的代码。这些代码不能保证正常工作,但它仍然比几乎任何其他语言更容易编译。Java团队有一套数以百万计的集成测试,这一点很明显。
我把Java 17列入这个名单,因为它已经被现代化了,以至于90年代的时间旅行者几乎都认不出它了。Java 17有许多额外的功能和扩展,改变了我们的编码方式。
有些功能,如增强的随机数发生器或更严格的浮点数学语义,解决了编写非常复杂的数字代码的难题。编写会计系统的开发人员可以使用整数来保存美分的数量,但那些处理人工智能算法和复杂的线性代数的开发人员需要浮点。
其他的,如强封装和扩展的开关语义,给核心语言带来了纪律性和灵活性的混合。总而言之,由于所有这些改进,编写更强大、更安全、更有保障的代码比以往任何时候都要容易。它的核心仍然是Java,但额外的东西使它变得不同。