有没有可能使用python在纯Java中制作一个本机



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

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

这种概念("站在巨人的肩膀上")几乎直接融入了这些平台。

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

制造这种工具的"成本"高得令人难以置信。好处很小。你为什么要"避开"图书馆?是的,在我们人类看来,要求一整兆字节的"库">来打印"你好!"是完全愚蠢的这是16个Commodore 64的总内存容量!!!-但是,对于蚂蚁来说,你仅仅把一粒咖啡洒在台面上就浪费了那么多咖啡,这似乎同样愚蠢至极。你不是蚂蚁,你的电脑也不是C64。在一个毫无意义的库上浪费了一兆字节。做不课题这就像在海牙附近的海里撒尿,然后得出结论,这一定会抬高长岛的海平面。当然,是的。从技术上讲你永远无法测量它,担心这种事情简直是疯了。

结论:那些知道自己的东西的人需要来构建这样一个复杂的工具。因为他们知道自己的东西,他们知道整个"依赖几个图书馆"的事情加起来并没有任何相关的东西,所以他们不会这么做。

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

还有一些语言不是java或python,而是复制了java或python的大部分语法,旨在运行在极其简单的东西上。在遥远的过去,java有不同的"概要文件"(定义你可以依赖的行为、核心库的可用性以及其他一些东西),特别是包括一个用于运行当时的小型candybar手机和智能卡等的微概要文件,但java的这一部分似乎已经基本消亡了(是的,不幸的是,你想要的是似乎很少有人感兴趣的东西)。不过,我不知道有任何这样的python库。

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

相关内容

  • 没有找到相关文章

最新更新