j2ObjC 是如何工作的

How j2ObjC works

我来这里是为了澄清 j2ObjC 的工作原理。我已经在 android 上开发了自己的应用程序,现在我正在尝试以尽可能少的问题进入 IOS 的世界。我听说过 j2objc,在使用它之前我会知道它的机制。我知道 j2objc 将 UI 创建留给了开发人员,但是如果我应该尝试转换带有 Text views 、 Recycler views 及其适配器等声明的 java 文件,它是如何工作的?它不可能转换整个文件,删除有问题的部分或者可能试图找到它们的等价物?最后,我应该使用它来转换活动的所有 Java 文件,还是只转换最简单的 java 文件(比如带有构造函数、getter 和 setter 等的文件)。 感谢所有愿意花时间帮助我的人:)

J2ObjC 是一个转译器,或“source-to-source compiler”。

普通编译器接受源代码作为输入并生成可执行二进制文件作为输出。另一方面,转译器输出与输入形式不同的源代码。在这种情况下,J2ObjC 输入 Java 源代码并输出 Objective C 源代码。

编译器通常构建源代码的内部中间结构表示,称为 "abstract syntax tree"。构建这棵树的过程称为 "parsing",其中一部分包括查找会阻止代码编译的错误——例如引用从未声明的变量。每种语言的 AST 根据语言所具有的特性看起来略有不同,并且每个 AST 都是原始源文件的直接一对一反映(这意味着它可以反转)。

J2ObjC 的工作方式是解析您的 Java 源代码,从源代码构建一个 Java 抽象语法树,然后对该树进行一系列转换以将其转换为 Objective-C抽象语法树。然后它将树反向解析为 Objective-C 个源代码文件。

转译器最复杂的部分通常是将一种语言的 AST 翻译成另一种语言所需的规则。通常这是通过在每种语言中寻找等效的语法特性并替换它们来完成的,但有时它涉及重写大量代码甚至省略对输入语言的某些特性的支持。

作为一个简单的脑力练习,想象一个将 C 代码转换为 Python 代码的转译器。考虑到 C 提供了一个 switch-case 语句,但是 Python 没有这样的语言结构。在这种情况下,C-to-Python 转译器可能会用一系列 if...elif 语句替换 switch-case

+1 伍德罗关于 J2ObjC 工作原理的回答。我们选择源到源是因为当项目开始时,Apple 似乎非常有意不允许在 iOS 上使用 Java 或类似 Java 的语言:没有 GC 或动态代码执行,例如。为避免任何 AppStore 阻塞,我们生成了源代码,如有必要,可以目视检查其合规性。当输出是另一种语言而不是目标代码时,它还有助于开发人员更轻松地查找和报告编译错误。

不过,我认为您要问的真正问题是 J2ObjC 在翻译现有 Android 应用程序方面有多大用处。不幸的是,答案是 "rarely"。 J2ObjC 的第一个客户是 Gmail 的收件箱,它已经被设计成 Java 代码可以由其服务器和 Android 客户端共享,然后由其 Web 客户端使用 GWT 共享。 None 的 UI 代码已共享,但该应用在发布时仍有约 70% 共享 Java 代码,因为它从一开始就设计为共享代码。专门为 Android 编写的较小的应用程序可能只有很少的可共享代码,因为数据模型和业务逻辑嵌入在控制 UI.

的 类 中

因此,如果您有一个较小的应用程序,尤其是业务逻辑和数据模型都保存在服务器上的应用程序(或者您的应用程序没有服务器组件),那么最好的方法是完全重写iOS。这听起来很难,但设计应用程序的困难部分已经在您的 Android 应用程序中完成了。