是否可以使用 python 制作纯 Java 的本地语言?

Is it possible to make a native in pure Java using python?

使用 JNI,或 Java 本地接口,可以在 Java 中使用 c++/c 类型和函数。我想用 Python 做一些类似的事情。有许多库可用于执行来自 Java 的 Python 代码,例如 Jython,但我不想使用任何库。

从技术上讲,dll 文件只是编译后的机器码,所以如果 c/c++ 可以编译成那个,那么 Python 也可以。是否可以使用 Python 的类型和函数使用 Java 的内置本地接口?这是我要完成的示例:

在Python中:(一个名为hello.py的文件)

import math

class ATestClass:
    def run_something_very_important(self, a: float, b: float) -> float:
        print("Hello!")
        return math.cos(a * b)

生成的 DLL 文件将是 hello.dll

然后这将是 Java 中的代码:(在名为 hello.java 的文件中)

public class hello {
    public native float run_something_very_important(float a, float b);

    static {
        System.loadLibrary("hello.dll");
    }
}

问题出在图书馆。 java 和 python 等语言是为 'batteries included' 模式设计的—— 整个堆栈 从根本上是基于整个基础架构和核心库集就在那里。例如,在 java(和 python 类似)中,即使是单行 System.out.println("Hello, World!") 应用程序也会加载整个 I/O 控制系统堆,加载到可插入框架中系统然后使用它来查询可用字符集的类路径,并且有一个字符集支持系统只是为了呈现该字符串。从大局来看,考虑到我们生活在 2021 年,而您的普通计算机确实能够在一秒钟内执行一百万台 Commodore 64 计算机一整天的计算——这是明智的。我们 DO 有足够的空间来拥有一个可以呈现以各种语言编写的字符串的系统,而不是让那些不能也永远无法真正在不共享的地方工作的计算机随附的字母表。

('standing on the shoulders of giants' 的)这个概念几乎融入了这些平台。

因此,'translating' 一个 python 单行代码,它只是将一个字符串打印到一个很小的 ​​DLL 中,并且不对 python 标准库堆栈的一半进行编码 只是不可用。这并不是真的 不可能 ,但它非常困难(需要将几乎每个核心库重写成独立的东西),而且似乎几乎没有用:这实际上不会使东西变得更快,并且几乎可以保证不会实际上表现得像适当的符合规格的java或python:那种代码不会真正支持各种python 或 java 具有开箱即用的功能。就是这样或拥有极其(硬 AI 级别)的智能代码,可以准确地计算出您编写的代码不依赖于这些更高级的功能,因此人们可以理解相当简单的 C/machine 代码批次根本不依赖复杂的库——如果可用的话,这个编译器将能够生成它。重点是:要正确地做到这一点非常困难。

制作这样一个工具的 'cost' 非常高。好处很小。为什么要 'avoid' 图书馆?是的,对我们人类来说,要求一整兆字节的 'libraries' 只是 来打印 'Hello!' 是非常愚蠢的——这就是 16 个 Commodore 64 的总内存容量! ! - 但是仅仅通过将一粒咖啡洒在台面上而浪费的咖啡量对于蚂蚁来说似乎同样愚蠢。你不是蚂蚁,你的电脑也不是 C64。在毫无意义的库上浪费一兆字节只是。做。不是。事情。这就像在海牙附近的海洋中撒尿,并得出结论认为这一定是在提高长岛的海平面。当然,是的。从技术上讲。你永远无法测量它,担心这种事情是疯了。

结论: 需要精通知识的人才能构建如此复杂的工具。因为他们知道自己的东西,所以他们知道整个 'depends on a few libraries' 东西加起来没有任何相关性,所以他们不会费心去做。

实时 java 和 GraalVM 可能是 java 世界中将 java 代码转换为 运行 可靠 C 风格代码的最接近尝试简单的、机器代码可翻译的块。

还有一些语言不是 java 或 python,而是复制了 java 或 python 的大部分语法,而 打算 运行 处理极其简单的事情。在遥远的过去,java 有不同的 'profiles'(定义您可以依赖的行为、核心库可用性和其他一些东西),特别是包括 运行ning 的微配置文件当时的小型直板手机和智能卡等,但 java 的那部分似乎大部分已经消失(是的,不幸的是,你想要的似乎很少有人感兴趣)。不过,我不知道 python 有任何此类库。

TL;DR:不,不存在,永远不会。你担心错了。