【问题标题】:Is it possible to make a native in pure Java using python?是否可以使用 python 在纯 Java 中制作本机?
【发布时间】:2021-12-15 07:40:31
【问题描述】:

使用 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");
    }
}

【问题讨论】:

  • 这个问题并不完全清楚。你为什么提出dll 的例子?您想将 Java 代码编译成 dll 并在 Python 中加载它吗?你想把你的 Python 代码编译成 dll 并用 Java 加载吗?您是否有“只想加载”的现有dll?您想从 Java 程序运行 Python 脚本吗?你想从 Python 脚本执行字节码吗?请edit发帖并澄清。
  • 如果问题的核心围绕着 Python 和 Java 之间的交互,那么GraalVM 可能是一个选项。有关详细信息,请参阅 Wildhammerthis answer。 GraalVM 也使用库,但做得更多。它使用truffle将python代码转换为字节码。

标签: python java java-native-interface native java-native-library


【解决方案1】:

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

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

因此,“翻译”一个 python 单行器,它只是将一个字符串打印到一个很小的 ​​DLL 中,并且不编码一半的 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:不,不存在,永远不会。你担心错了。

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2011-05-23
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多