跨平台功能语言适用于Objective-C

4
EDIT:经过几个小时的调查研究,我认为我将找不到任何实际能够节省时间的东西,与寻找合适的语言、适当的绑定和在所有这些平台上维护该环境所需的时间和精力相比。我接受看起来最现实的答案,因为它对大多数人来说都是最好的主意。从这些对话和我正在进行的其他对话中得出的观点是,唯一真正向前发展的方式是要么使用可以在没有外部绑定的情况下运行的函数式语言,要么使用由商业实体(如 F#)维护的绑定。这太费力而且需求太小,野外可用资源的状态反映了这一点。我希望某天会有所改变。
我想在我的软件中使用一个函数式语言,除了我的主要语言 Objective-C 之外(C 可以作为绑定工作?)。必须跨平台,即 Windows、Linux、OSX(x86)和 iOS(ARM)。我应该使用什么和如何实现?
如果这有任何区别,我计划很快切换到 LLVM 后端和 Clang 作为我的 Objective-C。
我没有投资于任何函数式语言的知识,尽管我已经胡乱尝试了一些。我要从头学习一个,所以如果可能的话,我想学习一些非奥妙莫测的东西。
解决方案必须是实际的,已经完成了大量的初步或原型工作...因为我正在使用 Objective-C,我确实需要 Cocoa 绑定;因为我的大量数据使用 Cocoa 类型,否则会一团糟。此外,Objective-C 消息传递将防止我需要在静态 C 函数和我的 Objective-C 对象实例之间创建粘合代码(这已经是内置的 Objective-C 方法调用正在做的事情)。
解决方案必须保证许可证安全地进行静态链接(iOS 要求)。
以下是我想做的例子:
处理字节语言,例如网络协议
输入:字节和长度以及“调用”Objective-C 方法实例
输出:返回给调用的 Objective-C 方法实例,发送它的可可容器参数
在棋盘游戏中做出最好的“移动”决策
输入:可可包含的状态数据,“调用”Objective-C 方法实例
输出:可能改变状态数据,可能调用任意的 Objective-C 方法,然后返回到调用的 Objective-C 方法实例,发送它的可可容器参数

你是说你真的使用Objective-C来制作Windows程序吗? - Chuck
请注意,开发者协议的3.3.1节可能会导致苹果否决您的应用程序。我建议在投入数月的开发之前先试水。 - sarnold
3
那篇文章已经过时了。苹果公司后来放宽了规定。查看当前指南中的第3.3.1节,你会发现它的表述不同了。 - Chuck
5个回答

6
作为Daniel Bünzli提到的,我们有一个OCaml iPhone应用程序正在iPhone应用商店出售。(如果您想寻找它,它是一个名为Cassino的纸牌游戏。)苹果在2010年9月放弃了他们的语言限制,我们没有遇到任何抵抗(尽管我们是一个非常小的参与者)。
我为编写iOS应用程序的OCaml编写了一些教程示例,您可以在我们的网站上找到:

http://psellos.com/ocaml/example-app-portland.html
http://psellos.com/ocaml/example-app-slide24.html

您没有提及是否需要跨平台GUI代码。这是一个更困难的问题。我们的代码使用薄包装器来访问本机Cocoa Touch库,这些库无法在Linux或Windows上工作。它们可以在OS X上工作(至少是子集)。您可以在教程示例中看到一些自定义(简化的)Cocoa Touch包装器。
OCaml在您提到的所有系统上都可以很好地工作。对我来说,这似乎是一个相当不错的选择(有点偏爱OCaml的人)。

嗨Jeffrey,感谢您提供的ocaml资源和回复。我没有使用Cocoa的任何GUI功能。我的使用方式是编写Objective-C代码并使用数据类型例如NSArray。相比在C ++中使用STL。我使用Cocotron,它允许我跨平台编译Cocoa实现以用于Linux和Windows。我已经调查了您的代码,并请确认或纠正我是否正确,基本上它似乎包装了对UIKit等的调用。似乎您的解决方案不允许自由传递Cocoa类型,请确认或更正。 - Nektarios
1
OCaml 的一个好处是它与 C 的接口(FFI)非常不错,一旦熟悉起来就很方便。这使得你可以在 ObjC 的 C 子集中传递原始值,并在两种语言之间进行函数调用,而几乎没有什么麻烦。要接口 OO 部分,你需要一个更谨慎的计划。我们内部的代码可以做到这一点(有限制),而教程则有一个简化的方案。构建一个通用的系统来传递对象和其他复合值将是一个大项目。 - Jeffrey Scofield
仔细看了你所做的事情,我可以看出在我的情况下与ObjC接口似乎会变得混乱,因为我的cocoa/objc运行时实现不使用字符串作为选择器值,而是使用整数。然而,我可能可以使用C FFI简单地进行接口。 - Nektarios

4

感谢您澄清许可证问题,我现在认为基本上任何解决方案都不需要担心许可证问题。 - Nektarios

3

我不太清楚“Objective-C或C的函数式语言”是什么意思,但是GHC(Haskell)是BSD许可证,并且具有良好的C FFI。此外,已经有很多关于在iPhone上使用GHC的工作。


不幸的是,我已经深入研究了一下,GHC可能不支持ARM架构,HOC项目已经死亡了一年,另一个名为“direct-cocoa”的项目据说即将开始解决这个问题... #haskell中没有人知道任何与此相关的发货情况。 - Nektarios

2
Gambit或Chicken Scheme可能是您最好的选择,它们可以编译成C代码。

@Chuck,这些能和C软件混合使用吗?看起来一旦它们启动,它们就在自己的托管运行时中运行并“接管”了...我找不到任何文档或信息,告诉我如何创建一个仅包含函数库的例子,当执行时,运行直到完成,然后返回到我的代码。我有什么遗漏吗? - Nektarios
@Nektarios 你找到了你的问题的答案了吗(它们是否在托管运行时中运行)?这些实际上会生成纯C库吗? - kizzx2
@kizzx2,由于多种原因,我已经完全放弃了函数式语言,并且已经忘记了所有这些细节。但是我知道,在我放弃之前,Haskell是最好的选择,因为它的C FFI显示出提供我所要求的功能的最大潜力。 - Nektarios
@Nektarios 我知道这不是正题,但我非常好奇你为什么“完全放弃”函数式语言。是因为像这样的互操作问题还是其他原因? - kizzx2
@kizzx2 这是因为在我所做的任何事情中都没有它的位置,我也不认为支持它的论点在实际意义上是有效的。虽然函数式语言被认为是节约时间的工具,但很明显要花费多年的时间才能正确地学习它们。我经常看到它们被用于“重型”任务,但它们比命令式语言(明显)更慢,而且难以预测性能。Interop 不是不可能,但最终即使是内置的函数式语言我也不会使用。我发现学习函数式语言唯一的好处是它让你以新的方式来解决问题。 - Nektarios
@kizzx2 我知道我的评论可能不会得到函数语言爱好者的欢迎,但这是一个没有偏见的观点,来自一个想要学习这个领域并投入了大量时间的人。是的,我通过冒险学到了很多东西,但我也很快意识到这是一条死路。只需浏览SO以了解人们遇到的问题即可总结出这一点。有很多人花费了非常长的时间学习,仍然不理解,并且仍然存在非常基本的问题。对于像我这样的小众人群,函数语言太小众了。除非你在金融机构工作... - Nektarios

0

截至2014年中期,XamarinF#的支持相当不错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接