Swift to JavaScript transpiler – 可能吗?

作为一个在Swift中编写的iOS开发人员,我发现越来越烦恼不得不将编写在Swift中的相同代码与使用JavaScript编码的前端开发人员协调起来。 在一个地方实现通用的功能,然后翻译成JS,会更加简单。

我开始怀疑Swift to JS编译器是否可行? 也许不共享完整的代码,但至少有一些通用的通用功能。

我在网上找到这个transpiler: SwiftJS 。 可悲的是,这个并没有真正削减它。

以下代码:

let a = [1, 2] print(a.count) 

在演示中返回Invalid Swift code 。 没有灌输信心。 不要介意像可选项或函数重载那样更复杂的位。

我想知道启动一个转播器项目,但后来我意识到有很多陷阱。 例如这个代码:

 var a = [1, 2] var b = a b.append(3) 

应该等于[1, 2]b等于[1, 2, 3] 。 在JavaScript中,两者都是[1, 2, 3]因为它们是通过引用而不是按值传递的。

是否可以写一个适当的翻译?

人们不禁要问,编写Swift to JavaScript transpiler是否有意义,因为这些语言不是映射1:1。 除了你提到的那些之外,还有许多缺陷(例如,在参数或函数重载中)。 现在已经有了一些可行的选择,例如使用Haxe / Kotlin将其转换为JavaScript和Swift,或者在Xamarin / React Native中开发跨平台的应用程序。

这就是说,两种语言都有许多共同的最佳实践,并具有相当大的特征重叠(例如关闭/分配变量功能)。 我不认为有任何功能是不可能的,尽管一些由此产生的代码可能相当混乱。

与使用Kotlin相比,还有一个明显的优势 – 您可以抓住现有的Swift项目并将其转换为JS,而不必事先决定在Kotlin中写入。 这是一种你不需要学习的语言。

我已经开始了一个自己动态预览的转换器项目 ,我认为这是对ShiftJS的改进。 它确实会处理你提到的情况(包括按值传递数组/字典)。

不过,这个工作还在进行中,因为我还没有实现对类的支持。 inout参数是困扰我的事情之一,尽管可能有一个(丑陋的)解决方案。

 var a = 2 func incr(_ a: inout Int) { a += 1 } incr(&a)//a now equals 3 

可以被转译成类似的东西

 var a = 2 function incr(a) { a.set(a.get() + 1) } incr({get: a => a, set: val => a = val})//a now equals 3! 

这怎么是一个黑客!

是否有可能写一个1:1的Swift JS转换器? 我倾向于肯定,但是陪审团已经不在了,而且很有可能我最终会遇到一个JS中不可能复制的功能。

任何两种图灵语言之间的转译总是 可能的 。 这并不意味着它很容易,实用或值得

至少,你可以保证Swift to JS transpilation是可能的,因为你可以编译Swift到x64机器代码,并使用JS反汇编/反编译器来生成JS。 但是,由此产生的代码将会真的很糟糕。

为了做出好的转换,你需要考虑到一种语言的所有复杂的最佳实践,以及其他语言中的等价物。 这是一个巨大的任务,必须对任何两对语言进行两次(每个方向一个),你想要传递。 有一个原因,transpilers是如此不寻常,通常是废话。