旧语言老矣,尚能饭否?
在 HN 的热榜中,一篇题为《编程语言工具进展缓慢》的文章吸引了不少网友的注意,其写道,「当一个新工具被创新开发时,较新的编程语言就有足够多的机会将这种创新融入到他们的语言工具中,并使之标准化,最终让其自身比旧语言更具优势一些。如果把这些增量逐渐累积起来,那么旧的语言就会显得很痛苦和过时,甚至最终被淘汰。」
放眼编程榜单如 TIOBE,虽然排名靠前依然是我们熟悉的 Python、C、C++、Java 等语言,但是近日来,似乎是看到了文章伊始所述的趋势,我们见证了不少剑指老牌语言的新编程语言诞生,譬如有的是一群 Go 语言爱好者发起的凹语言,也有的是来自大厂的一线员工如 Oracle 核心团队成员创建的 Vely,还有的是科技巨头如 Google 自身研发的 Carbon。
接下来,我们将与大家一起了解一下最新诞生的编程语言,看其能否填补老牌语言们留下的遗憾。
国内 Gopher 发起的「凹语言」
凹语言(凹读 wa),作为一门刚刚起步的实验性编程语言,它是由国内的一群 Go 语言爱好者发起的,主要设计目标之一是「成为 Go 和 Rust 语法外衣的 C++ 语言」。
在创建伊始,柴树杉、丁尔男和史斌三位 Gopher 便决定以开源的方式来推动凹语言的发展,其开源地址为:https://github.com/wa-lang/wa。
具体的安装和测试方法如下:
安装 Clang,确保本地 clang 命令有效
go install github.com/wa-lang/wa@latest
wa init -name=_examples/hi
wa run _examples/hi
目前该项目提供了简单可执行的示例,如“打印 30 以内的素数”:
// 版权 @2021 凹语言™ 作者。保留所有权利。
fn main() {
for n := 2; n <= 30; n = n + 1 {
let isPrime int = 1
for i := 2; i*i <= n; i = i + 1 {
if x := n % i; x == 0 {
isPrime = 0
}
}
if isPrime != 0 {
println(n)
}
}
}
运行并输出结果:
$ go run main.go run _examples/prime
2
3
5
7
11
13
17
19
23
29
另一个 Demo 如下图所示:
现下,凹语言处于非常早期的实验阶段,该团队在凹语言特性和编译器实现方面都进行了预期设定。其中,凹语包含两套相互等价的语法,即凹语法与 WaGo 语法。这里“等价”的含义是:二者可生成相同的 AST 并无损的互相转换。使用凹语法编写的源文件后缀为 .wa,使用 WaGo 语法编写的源文件后缀为 .wa.go。WaGo 语法是 Go 语法的真子集,换句话说:一个合法的 WaGo 包必然是合法的 Go 包。对此,创建者之一柴树杉也在知乎上进一步表示,「等价不是最终目标,只是为了方便习惯 Go 的用户。」
在凹编译器方面,该团队发布了如下工作流程图,希望支持 C/C++、LLVM IR、WASM 等多种输出以满足不同的目标场景。
来源:https://github.com/wa-lang/wa
作为个人业余项目,几位创建者表示,“纵观编程界,没有哪门被广泛使用的通用语言诞生于 KPI 制度之下”,因此当前该项目不存在明确的 KPI 指标,在其个人时间、精力、兴趣的支持下,从成果分类的角度,该团队希望能够在第一阶段完成:
确定凹语言™语法规则;
实现可用的凹语言™编译器;
使用凹语言™创建一个网页应用。
对于设计凹语言的初心,在 GitHub 的 README.md 文件中,该团队也非常直白地写道,「本项目启动时大量借鉴了 Go 的设计思想和具体实现——这是在有限投入下不得不作出的折衷,我们希望随着项目的发展,积累更多原创的设计,为自主创新的大潮贡献一点力量。」
同时,对于凹语言未来的发展,该团队也将「持以开放态度」,希望能够有更多的开发者参与进来,共建凹语言。
以 C 为宿主语言的新嵌入式编程语言——Vely 语言
和凹语言一样,新诞生的 Vely 语言同样属于个人项目。它的作者 Sergio Mijatovic 是一位在 Oracle 核心工程工作超过十年,担任中间件的高级软件工程师。
根据官方介绍(https://vely.dev/)显示,Vely 是一种嵌入式编程语言,以 C 为宿主语言。它被预编译为 C,创建一个本机可执行文件。Vely 的 Logo 是一头可爱的大象,对此,Sergio Mijatovic 给出的解释是,“大象很聪明,尽管它们既不快也不轻,但我知道它们会喜欢 Vely,因为 Vely 两者都兼备。”
为什么创建 Vely?
相比其他编程语言,当谈及 Vely 的优势时,Sergio Mijatovic 表示,性能和简单性是这个问题简短的回答。
从定位上来看,Vely 语言自身就是为了快速构建具有最大性能的服务器端应用程序而生。
Sergio Mijatovic 表示,通过使用 Vely 语言,这意味着生成高效和安全的 C 代码的简单语句。这样的语句是直接用 C 代码编写,所以根据定义,它不是一种新的语言。它是 C 和生成 C 语言的嵌入式语言的合并。因此,Vely 的目标是偏向嵌入式语言的一侧,因为构建应用程序会更安全,更丰富,更快捷,并在需要时编写 C。
简单来看,Vely 语句很简单,是在 C 代码中编写的,因此无需学习有关下面层的任何新知识。大多数 Vely 语句都会生成许多 C 语句。
Vely 功能特性
Vely 应用程序是本地可执行文件,没有解释器或字节码方案,这带来性能高、占用空间小等特点。
此外,Vely 语言可以轻松地使用数据库(MariaDB、PostgreSQL、SQLite),并通过 FastCGI 服务器为网络应用程序编写后端。在命令行上运行相同的代码。
Vely 编码涵盖了 Web、数据库、字符串、文件、流程和执行、编码/加密、时间、错误处理、守护神化代码和其他常见任务。它自带自动内存管理和垃圾回收功能。
使用者也可以将 Vely 用于 Web 应用、命令行程序,还可以作为中间件、数据库应用、服务软件、数据集成、物联网(IOT)和其他地方。由于资源要求低,而且易于容器化,此语言也非常适合云计算应用中。
Hello World 示例
在安装好 Vely 之后,创建 Hello World 源文件(hello.v):
echo '#include "vely.h"void hello()
{ out-header default @Hello World!
}' > hello.v
创建 Hello World 应用程序:
sudo vf -i -u $(whoami) helloworld
制作 Hello World 运行程序:
vv -q helloworld
运行——可以将 Hello World 作为服务运行,也可以从命令行运行。
作为一个服务,首先启动你的 Hello World FastCGI 应用服务器。
vf helloworld
然后连接到它。
export REQUEST_METHOD=GET
export QUERY_STRING="req=hello"
cgi-fcgi -connect /var/lib/vv/helloworld/sock/sock /
从命令行运行:
export REQUEST_METHOD=GET
export QUERY_STRING="req=hello"
export VV_SILENT_HEADER=yes
/var/lib/vv/bld/helloworld/helloworld
预期的结果:
最终结果如下(注意黑体字是来自网络应用程序和命令行的响应):
Sergio Mijatovic 表示,“我不会说 Vely 是优雅的,这当然也不是它的目标,但 Vely 可以称得上很简单,更多的是围绕人们的实际需求来落地的。我们的想法是不牺牲性能,并显著提高生产率和安全性。”
对于 Vely 的创建,Sergio Mijatovic 称,「是在没有资金支持的情况下利用自己的时间创建的」。目前,Vely 不接受公众的贡献,这也是为了能够更聚焦和更少的开销来考虑。
当前,Vely 是一款自由开源软件,根据 GNU 通用公共许可证 v3.0 (GPL 3),开发者可以使用 Vely 编写应用程序(包括专有和商业),而无需发布源代码。
「我为 Vely 断断续续工作了几年,经历了几次完整的重写,主要是为了学习如何把事情做得更好。我也希望它可以帮助你做同样的事情」,Sergio Mijatovic 说道。
对标 C 语言,Hare 语言发布!
另一款对标 C 语言的是于今年 4 月面世的 Hare 语言,由软件开发者 Drew DeVault 创建,它是基于 qbe 编译器后端,在占用空间小的情况下提供了良好的性能,让程序员能够用上好的工具。
在应用场景上,Hare 使用静态类型系统、手动内存管理和最小运行时,由此它非常适合编写操作系统、系统工具、编译器、网络软件和其他低级高性能任务。
据外媒 The Register 报道,Hare 的标准库中还融合了 Google 的 Go 编程语言思想,特别是在标准库以及“电池”中内置了许多功能,以此避免需要导入外部的依赖项。这样做,能避免程序员去寻找依赖项,同时也有一个可管控的范围。
根据作者 Drew DeVault 的解释,其将 Hare 描述为一种避免 C 语言陷阱的方式,并表示道,“许多旨在和 C 语言竞争的语言实则相差太远了。Hare 是一种保守的语言,旨在将过去 30 年的经验教训提炼成一种小型的、简单的、稳健的语言,可以在未来 30 年内让程序员依赖。我们并不关注大胆创新,而是关注精心的工程设计。”
Hello World 示例如下:
use fmt;
export fn main() void = {
fmt::println("Hello world!")!;
};
旨在成为 C++ 继任者,Google 发布 Carbon
不久之前,综合安全因素考虑,也旨在帮助开发者创建“性能关键型软件”,Google 开源并发布了新型语言 Carbon。此前,CSDN 也曾发文剖析了 Carbon 语言的设计目标:
1. 速度快,可与 C++ 一起使用
性能与使用LLVM的C++相匹配,具有对位和地址的低级访问
从“遗产”到模板,实现与现有的 C++ 代码互操作
快速和可扩展的构建,与现有的 C++ 构建系统一起工作
2. 现代化和并且能不断发展
坚实的语言基础,易于学习,特别是对于已经使用过 C++ 的人
简单的、基于工具的 Carbon 版本之间的升级
更安全的基本原理,以及逐步实现内存安全子集的途径
3. 打造受欢迎的开源社区
明确的目标和优先级,具有强大的管理能力
社区致力于成为一个欢迎、包容和友好的社区
包含“电池”的方法:编译器、库、文档、工具、包管理器等
对于其未来发展,Google 表示,Carbon 需要成为一个“独立的并且由社区驱动的项目",而不仅仅是为谷歌自用。
写在最后
除了以上,早在 2012 年,由于在开发大型应用时,处理复杂的 JavaScript 代码带来的种种挑战,微软推出了 TypeScript,作为 JavaScript 的语法超集,面向开发者开放使用;2014 年,苹果推出了 Swift,旨在取代自己推出的另一款语言 Objective-C;2017 年,Google 在 I/O 大会也重磅宣布 Jetbrains 的 Kotlin 成为 Android 开发的官方语言,迅速掀起一波 Kotlin 取代 Java 的技术潮。
在此牵引下,新编程语言推陈出新,快速崛起,其中尤其是对标 C、C++、Java 等老牌语言的最胜。但众人皆知,老牌编程语言能有如今的地位,非一日之功。从上述已推出的几款语言中也不难看出,在两两对标的语言中,最为成功的莫过于苹果的 Swift 了,只因为无论是在开发环境、功能,还是性能、工具包以及社区支持上,苹果从根部推动了旧工具的淘汰,可供 iOS 开发者选择的选项实在有限,也才能有 Swift 的今天。
如今依靠开源,新语言的崛起,也只是一个开始。面对这种趋势的崛起,C++ 之父 Bjarne Stroustrup 在一封电子邮件中评价道,“总是有新的语言试图成为 C++ 的继承者。我欢迎对编程语言和编程风格的实验,但并不希望助长争论。批评已有的语言很容易,因为我们知道它们的问题所在,但通常很难在不产生语言规则、库和管理方面的全新问题的情况下提供替代品。Carbon 是如此之新,而且规范不足,我无法真正做出有意义的技术评论。”
虽然每款新诞生的编程语言势必有着自己的目标,但未来究竟会如何,我们也将拭目以待。
参考链接:
https://github.com/wa-lang/wa
https://vely.dev/
https://devclass.com/2022/07/25/c-inventor-stroustrup-says-googles-carbon-too-new-and-under-specified-for-meaningful-technical-comment/