作为一名使用Swift编写代码的iOS开发人员,我发现必须协调使用Swift编写的相同代码和使用JavaScript编写代码的前端开发人员越来越烦人。在一个地方实现通用功能,然后转换为JS会更简洁,对吗?
我开始怀疑Swift到JS编译器是否可行?也许不需要共享全部代码,但至少可以共享一些通用函数。
我在网上找到了这个转发器:SwiftJS.可惜的是,这一个并不真正削减它。
下面的代码:
let a = [1, 2]
print(a.count)
在演示中返回Invalid Swift code
。这并不能让人产生信心。更不用说像可选项或函数重载这样复杂的部分了。
我想开始一个transpiler项目,但后来我意识到有很多陷阱。例如下面的代码:
var a = [1, 2]
var b = a
b.append(3)
应该使a
等于[1, 2]
,b
等于[1, 2, 3]
。在JavaScript中,两者都是[1, 2, 3]
,因为它们是通过引用而不是通过值传递的。
有没有可能写出一个合适的transpiler?
4条答案
按热度按时间axr492tv1#
任何两个图灵完备语言之间的转译器总是可能的,但这并不意味着它容易,实用,或者值得。
最起码,你可以保证Swift到JS的转换是可能的,因为你可以把Swift编译成x64机器码,然后使用JS反汇编器/反编译器生成JS。
为了做出好的转换,你需要考虑一种语言的所有复杂的最佳实践,以及它们在另一种语言中的等价物。这是一项艰巨的任务,对于你想转换的任何两对语言,必须做两次(每个方向一次)。这是一个原因,转换器如此罕见,而且通常是垃圾。
4ngedf3f2#
人们不得不怀疑编写Swift到JavaScript的转换器是否有意义,因为这两种语言并不是1:1Map的。除了你提到的陷阱之外,还有很多陷阱(例如inout参数或函数重载)。已经有一些可行的替代方案,例如使用Haex/Kotlin同时转换到JavaScript和Swift,或者使用Xamarin/React Native开发跨平台应用程序。
也就是说,这两种语言共享了许多共同的最佳实践,也有相当多的特性重叠(例如闭包/将函数分配给变量)。我不认为有任何特性是不可能实现的,尽管一些最终的代码可能会相当混乱。
与使用Kotlin相比,它还有一个明显的优势--你可以抓取一个现有的Swift项目并将其转化为JS,而不必事先决定使用Kotlin编写,而且你需要学习的语言也少了一门。
我自己用live preview创建了一个transpiler project,我认为它比ShiftJS有了很大的改进,它确实可以处理你提到的情况(包括通过值传递数组/字典)。
尽管如此,它仍在进行中,因为我甚至还没有抽出时间来实现对类的支持,
inout
参数是困扰我的事情之一,尽管可能有一个(丑陋的)解决方案。可能会演变成
怎么样的黑客!
有可能写一个1:1 Swift到JS的转发器吗?我倾向于是的,但是陪审团已经出来了-而且很有可能我最终会遇到一个不可能在JS中复制的特性。
ar5n3qh53#
Swift编译为LLVM,LLVM可以转换为Javascript:https://github.com/emscripten-core/emscripten
tsm1rwdh4#
可以设计一个编译器,通过WebAssembly将Swift转换为JavaScript,因为已经有两个编译器可以用于此目的: