Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java j2ObjC的工作原理_Java_J2objc - Fatal编程技术网

Java j2ObjC的工作原理

Java j2ObjC的工作原理,java,j2objc,Java,J2objc,我来这里是想澄清一下j2ObjC是如何工作的。我已经在android上开发了自己的应用程序,现在我正试图以尽可能少的问题进入IOS世界。我听说过j2objc,在使用它之前我就知道它的机制了。我知道j2objc将UI的创建留给开发人员,但是如果我尝试转换一个包含文本视图、回收器视图及其适配器等声明的java文件,它是如何工作的呢?这样就无法转换整个文件,删除有问题的部分,或者可能试图找到它们的等效项?最后,我应该使用它来转换活动的所有Java文件,或者只转换最简单的Java文件(比如带有构造函数、

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

J2ObjC是一种transpiler,或“”

普通编译器接受源代码作为输入,并生成可执行二进制文件作为输出。另一方面,transpiler以与输入不同的形式输出源代码。在本例中,J2ObjC输入Java源代码并输出目标C源代码

编译器通常构建源代码的内部中间结构表示,称为“抽象语法树”。构建此树的过程称为“解析”,其中一部分包括查找可能阻止代码编译的错误,例如引用从未声明过的变量。每种语言的AST看起来都有点不同,这取决于该语言所具有的功能,并且每种AST都是原始源文件的直接一对一反射(这意味着它可以反转)

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

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


作为一个简单的思维练习,想象一个将C代码转换为Python代码的transpiler。考虑到C提供了一个<代码>转换用例语句,但是Python没有这样的语言构造。在这种情况下,C-to-Python transpiler可能会用一系列
if
elif
语句替换
开关大小写

普通编译器接受源代码作为输入,并生成可执行二进制文件作为输出。另一方面,transpiler以与输入不同的形式输出源代码。在本例中,J2ObjC输入Java源代码并输出目标C源代码

编译器通常构建源代码的内部中间结构表示,称为“抽象语法树”。构建此树的过程称为“解析”,其中一部分包括查找可能阻止代码编译的错误,例如引用从未声明过的变量。每种语言的AST看起来都有点不同,这取决于该语言所具有的功能,并且每种AST都是原始源文件的直接一对一反射(这意味着它可以反转)

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

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


作为一个简单的思维练习,想象一个将C代码转换为Python代码的transpiler。考虑到C提供了一个<代码>转换用例语句,但是Python没有这样的语言构造。在这种情况下,C-to-Python transpiler可能会用一系列
if
elif
语句取代
switch case
。我们选择源代码对源代码,因为当项目开始时,苹果似乎非常希望在iOS上不允许使用Java或类似Java的语言:例如,不允许GC或动态代码执行。为了避免任何AppStore阻塞,我们生成的源代码可以在必要时进行目视检查以确保符合性。当输出是另一种语言而不是目标代码时,这也有助于开发人员更容易地查找和报告编译错误

不过,我认为你要问的真正问题是,J2ObjC在翻译现有Android应用程序时有多有用。不幸的是,答案是“很少”。J2ObjC的第一个客户是Gmail的Inbox,它的设计目的是让服务器和Android客户端共享Java代码,然后让web客户端使用。它的UI代码都没有被共享,但是当它发布时,仍然有大约70%的Java代码被共享,因为它从一开始就被设计为共享代码。专门为Android编写的小型应用程序可能很少有可共享的代码,因为数据模型和业务逻辑嵌入到控制UI的类中

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