它们至少已经成为实际六个月了。Project Panama 是让我们能够使用长期以来被拒之门外的 C 和 C++ 代码的星系。回想起来,如果它支持 ELF,我想象。例如 Rust 和 Go 程序可以编译成与 C 兼容的二进制文件,所以我想象(但没有尝试过)这意味着与这些语言的互操作也充足容易。在本节中,当我提到“原生代码”时,我指的是以某种方式编译的二进制文件,它们可以像 C 库那样被调用。
从历史上看,Java 一直是孤立的。对于 Java 开发人员来说,重新使用原生 C 和 C++ 代码并不容易。这是有道理的。原生、特定于操作系统的代码只会破坏 Java 的“一次编写,随处运行”的承诺。它一直是有点禁忌的。但我不明白为什么会如许。公平地说,尽管缺乏易用的原生代码互操作功能,我们也做得不错。几乎任何你想要做的事情,可能都有一个纯 Java 解决方案存在,它可以在 Java 运行的任何地方运行。它运行得很好,直到它不再运行。Java 在这里错过了关键的时机。想象一下:
如果 Kubernetes 是用 Java 构建的?
如果当前的 AI 革命是由 Java 驱动的?
这两个概念会不可思议,当 Numpy、Scipy 和 Kubernetes 最初创建时,但是今天?今天,他们发布了 Panama 项目。
Panama 项目引入了一种容易连接原生代码的方法。支持两个级别。你可以以相当低级的方式操纵内存,并将数据在原生代码中往返传递。我说“往返”,但我可能应该说“向下和向上”到原生代码。Panama 项目支持“向下调用”,即从 Java 调用原生代码,以及“向上调用”,即从原生代码调用 Java。你可以调用函数、分配和开释内存、读取和更新 struct 中的字段等等。
让我们来看一个简单的例子。代码使用新的 java.lang.foreign.* API 查找一个叫做 printf 的符号(基本上就是 System.out.print()),分配内存(有点像 malloc)缓冲区,然后将该缓冲区传递给 printf 函数。