本周5个开源Java项目j2cl等

下面是本周Github上5个有趣Java项目:

1、Google/j2cl
Java 到 Closure JavaScript 转译器

J2CL 是一个功能强大、简单且轻量级的从 Java 到 Closure 风格的转译器 JavaScript。

  • 充分利用 Java 和 JavaScript。您不再需要在两者之间进行选择 两者或锁定到特定的框架或语言。选择正确的语言 在正确的地方并聘请最优秀的人才来完成这项工作。
  • 第一次就正确。基于 强大的 Java 类型系统与高级跨语言类型检查相结合 及早发现你的错误。
  • 提供大量代码重用。 J2CL 紧密遵循 Java 语言 语义。这减少了意外,实现了跨领域的重用 不同的平台,并将最流行的 Java 库引入您的工具包 包括 GuavaDagger 和AutoValue.。
  • 现代、清新、速度极快。由 Bazel 提供支持, J2CL 提供快速、现代的开发体验,让您微笑 并让您保持高效。
  • 经过实际测试并值得信赖。J2CL 是最先进的底层技术 由 Google 开发的高级 GSuite 应用程序,包括 GMail、Inbox、Docs、Slides 和日历。

J2CL 与 GWT?
2015 年初,谷歌 GWT 团队做出了一个艰难但必要的决定,即开发一种新的替代产品,以启用 Web Java。

这主要是由于网络生态系统中不断变化的趋势,以及我们新的内部客户将网络 Java 不再视为一个孤立的生态系统,而是其更大堆栈中不可或缺的一部分。这就要求我们以全新的视角从头开始创建与生态系统其他部分紧密集成的工具。一个可靠、快速并能提供快速迭代周期的现代架构

要实现这些目标,完全从 GWT 逐步实现是不现实的。我们利用多年来在 GWT 工作中学到的所有知识,从零开始。在此期间,我们与 GWT 指导委员会成员保持联系,并让贡献者可以尽早访问,以便他们决定在 J2CL 上构建 GWT 的下一个版本。

现在,GWT3 的战略已发展成为一个 SDK,侧重于库和企业工具,而这正是 GWT 一直以来的强项之一。

我们认为,这种关注点的分离是这两个项目成功的关键部分,并将为开源社区带来最好的结果。

网友评论:
虽然我怀疑这可能比 Google Web Toolkit 好得多,但同样的问题将继续存在。主要问题是 Java 开发人员在编译代码时不知道输出在做什么,当他们遇到缺陷或无法实现业务需求时,这就会成为问题。 GWT 的另一个问题是没有 JavaScript 开发人员愿意接触那些垃圾代码。

我过去共事过的许多 Java 开发人员都不了解回调、异步逻辑、事件、递归、作用域、闭包、数组符号(Java 有这些),也不了解通过随机存取哈希映射获取的高速数据(Java 也有这些)。这就成了问题,因为有些 Java 概念在 JavaScript 中并不存在,而有些 JavaScript 概念在 Java 中并不存在。很多时候,Java 开发人员仍然需要 JavaScript 开发人员的帮助才能实现基本的业务需求。

如果作为一名 Java 开发人员,你希望在不牺牲性能的前提下获得更大的表达自由度和更多的功能代码,那么你最好使用 Scala 来编写代码。如果作为 JavaScript 开发人员,您希望编译器根据严格的类型检查来验证您的代码,那么您最好使用 TypeScript 来编写代码。

过去,GWT 背后的唯一商业目标就是解决劳动力短缺问题。Java 开发人员很常见,通常也很能干。JavaScript 开发人员往往不太受信任,或者很难找到。不知道这是否仍是一个因素。

#####################################################
J2CL 专为跨平台代码重用而设计。例如,支持 Google Docs 前端的代码需要为 Web、Android 和 iOS 编写。 J2CL 对 Java 中的所有文档操作和呈现逻辑进行转译 -> JS(并以前所未有的 js 代码大小实现这一点)。 UI仍然是用JS编写的。

  • Java->安卓
  • Java->后端服务器
  • Java-> J2objc-> iOS系统
  • Java-> J2CL-> JS/网络。

#########################################################
GWT 是一个转译器、优化 Java 编译器、优化 JS 编译器(内部有两个后端)、托管开发环境的容器、注释处理器环境(在 Java 注释处理器之前)、具有大量 API 的 SDK、链接器、UI 工具包等等,它基本上是一个端到端的构建环境。

J2CL是一个转译器,从Java到Closure注释的JS。它不做任何优化。它没有 API。它只处理标准 Java 输入,其他所有内容:SDK、调试器、优化器、构建时处理、编辑/刷新等都必须来自工具链的其余部分。

GWT 是整体的。 J2CL 是构建文件中的一个步骤。

J2CL 生成的代码也比 GWT 更小,编译速度更快,并且更好地适应现有的 JS 生态系统。不难说,将 J2CL 代码与任意 TS 或 JS 节点模块连接起来。


2、nvim-java
- 用于 java 开发的全新插件


3、Jactl
非阻塞脚本语言,现已向后移植到 Java 8

Jactl 是一种功能强大的脚本语言,适用于 JVM 平台,其语法综合了 Java、Groovy 和 Perl 的各种语法。它可以从 REPL 运行,也可以从命令行运行命令行脚本,但其主要目标是集成到 Java 应用程序中,并提供一个安全、锁定的机制,供客户/用户用来定制应用程序的行为。

它特别适用于事件循环/反应式应用程序,因为它内置了基于连续性的挂起/恢复机制,可确保不会阻塞正在运行的执行线程。

从不阻塞

  • Jactl 永远不会阻塞正在运行脚本的执行线程。 这是为了支持基于反应式或事件循环的应用程序中的执行。
  • Jactl 中的阻塞操作只能在调用阻塞/异步函数时发生。 当执行这样的函数时,脚本将被挂起,当阻塞函数完成时, 脚本执行状态将从暂停的点恢复。 这是通过内部延续机制完成的。
  • 脚本编写者可以像阻塞一样编写代码,而不必关心哪些函数被调用 异步和同步或必须跳过正常的异步编程环 使用在长时间运行的操作完成后调用的回调。
  • 当调用阻塞操作时,Jactl 创建一个 Continuation 对象来捕获正在运行的操作的状态 脚本,例如所有局部变量的值和当前调用堆栈。 当长时间运行的操作完成时,脚本状态将恢复并且脚本继续 从它停止的地方开始。


语言特点

  • 闭包
  • 具有继承性的类
  • 强/弱类型
  • 具有默认值的参数
  • 函数调用的命名参数
  • 多行字符串
  • 带有内插表达式的字符串
  • 函数式编程惯用法(map、filter、collect、each 等)
  • 正则表达式匹配语法
  • 正则表达式捕获变量


4、sd4j
使用 ONNX Runtime 在 Java 中实现稳定的扩散管道
该 repo 包含运行于 ONNX Runtime 之上的稳定扩散推理的实现,使用 Java 编写。它是 C# 实现的修改移植,带有用于重复生成的图形用户界面,并支持负文本输入。它旨在演示如何从 Java 使用 ONNX Runtime,以及 ONNX Runtime 获得良好性能的最佳实践。我们将根据 ONNX Runtime 的最新版本保持更新,并在 ONNX Runtime Java API 提供与性能相关的新功能时进行适当更新。由于这只是一个代码示例,因此所有代码都可能发生变化,其中的任何 API 都不应被视为稳定的。

本版本库以 ONNX Runtime 1.14 为目标。版本号分为两部分 <sd4j-版本>-<onnxruntime-版本>,sd4j 的初始版本为 v1.0-1.14.0。如果 sd4j 增添了新功能,我们将提升其版本号,而 ONNX Runtime 版本号则会随着我们对 ONNX Runtime 更新版本的依赖而提升。

该项目支持 txt2img 生成,目前还没有实现 img2img、缩放或内绘功能。

默认情况下,它使用 fp32 模型,在 6 核 2019 16 英寸英特尔 Macbook Pro 上运行时,每个扩散步骤大约需要 5 秒钟。在更好的硬件上运行、启用 CoreML EP 或使用 CUDA GPU 将大大缩短生成图像的时间。


5、sigbla-pds
Java 和 Kotlin 的持久(不可变)集合

Sigbla PDS 是 Scala 的不可变、持久集合类到纯 Java 的端口。

在函数数据结构的上下文中,持久性意味着数据结构保留以前的版本 修改时本身。这意味着对集合的任何引用实际上都是不可变的。然而,修改可以是 通过返回新版本的数据结构,保持原始结构不变。

这是一个使用 Sigbla PDS 集的示例(为了简洁起见,示例位于 Kotlin 中,但 集合是纯Java):

val set1 = Sets.of(1, 2, 3)
val set2 = set1.add(4)
val set3 = set1.remove(1)
println(set1) // Prints Set(1, 2, 3)
println(set2)
// Prints Set(1, 2, 3, 4)
println(set3)
// Prints Set(2, 3)

从上面的例子中我们可以看到,虽然我们对set1进行了修改,创建了set2和set3、 set1 的内容保持不变。