0

使用 JNI 或Java Native Interface,可以在 Java 中使用 c++/c 类型和函数。我想用 Python 做类似的事情。有许多用于从 Java 执行 Python 代码的库,例如 Jython,但我不想使用任何库。

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

在 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");
    }
}
4

1 回答 1

3

问题是图书馆。像 java 和 python 这样的语言是为“包含电池”模式而设计的——整个堆栈的基本设计是基于整个基础设施和核心库集就在那里的想法。例如,在 java(和 python 类似)中,即使是单行System.out.println("Hello, World!")应用程序也会加载到整个 I/O 控制系统堆中,加载到可插拔框架系统中,然后使用它来查询类路径以获取可用的字符集,并且有一个字符集支持系统来渲染那个字符串。从总体上看,考虑到我们生活在 2021 年,而您的普通计算机实际上能够在一秒钟内执行百万台 Commodore 64 计算机在一整天内可以计算的量 - 这是明智的。我们有空间拥有一个可以渲染用各种语言编写的字符串的系统,而不是让那些不能也永远不会真正可以在一个与它所附带的字母不共享字母的地方工作的计算机。

这个概念(“站在巨人的肩膀上”)几乎融入了这些平台。

因此,“翻译”一个只将字符串打印成一个很小的 ​​DLL 并且不编码一半的 python 标准库堆栈的 python 单行器是不可用的。这并不是真的不可能,但它非常困难(需要将几乎每个核心库都重写为独立的东西),而且似乎几乎没有用:这实际上不会让事情变得更快,而且几乎可以保证实际上不会表现得像符合规范的 java 或 python:这种代码不会真正支持 python 或 java 开箱即用的各种功能。正是这样或具有极其(硬 AI 级别)的智能代码可以精确地确定您编写的代码不依赖于这些更高级的功能,因此人们可以理解一组相当简单的不依赖的 C/机器代码完全在复杂的库上 - 如果可用,这个编译器将能够生成它。要点是:很难正确地做到这一点。

制造这种工具的“成本”非常高。好处是微乎其微的。为什么在大火中你想“避开”图书馆?是的,在我们人类看来,仅仅为了打印“你好!”而要求一整兆字节的“库”是完全愚蠢的。- 这是 16 个 Commodore 64 的总内存容量!!!- 但是,仅仅将一粒咖啡洒在您的工作台面上,您浪费的咖啡量对蚂蚁来说似乎同样愚蠢得难以置信。你不是蚂蚁,你的那台电脑也不是 C64。在毫无意义的图书馆上浪费一兆字节而已。做。不是。事情。这就像在海牙附近的海洋里撒尿,然后得出结论,这一定是在提高长岛的海平面。当然,是的。从技术上讲。你'

结论:需要了解自己的东西的人来构建如此复杂的工具。因为他们知道他们的东西,所以他们知道整个“依赖于几个库”的东西并没有加起来任何相关的东西,所以他们不会费心去做。

Real-Time java 和 GraalVM 可能是 Java 世界中最接近的尝试,它们将 Java 代码转换为可以在可靠的 C 风格的简单化、机器代码可翻译的块中运行的东西。

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

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

于 2021-10-30T22:35:25.640 回答