F# 是否可以将F代码转换为C代码?
我问这个问题的原因是我正在学习F#,并且想参加TopCoder竞赛。但是,F#不在那里支持的语言列表中。但C#也在名单上(老实说,除了谷歌代码堵塞和Facebook黑客杯,几乎所有在线编码比赛都是如此) 目前我能想到的可能的解决办法是 1) 找一个能将F#源代码直接翻译成C语言的翻译器# 2) 首先将F#代码编译成.net可执行文件,然后将其反汇编回C#代码 最低要求是生成的C#必须能够编译成可运行的.net可执行文件,最好尽量减少外部依赖 第一种方法似乎不太可能,快速的谷歌搜索结果与此无关。 方法二看起来更有希望,存在.net反汇编程序 我试过最流行的一种——红门的反射器。虽然它可以完美地分解C#可执行文件,但从F#编译的可执行文件似乎有问题:它可以愉快地进行反汇编,但由此产生的C#代码有一些特殊字符,例如在类名和其他奇怪的东西中添加前导$符号,因此无法编译。我使用的是Visual Studio 2010 Professional,最新的Reflector测试版(免费) 我有什么遗漏吗?可能吗 更新:F# 是否可以将F代码转换为C代码?,f#,disassembly,F#,Disassembly,我问这个问题的原因是我正在学习F#,并且想参加TopCoder竞赛。但是,F#不在那里支持的语言列表中。但C#也在名单上(老实说,除了谷歌代码堵塞和Facebook黑客杯,几乎所有在线编码比赛都是如此) 目前我能想到的可能的解决办法是 1) 找一个能将F#源代码直接翻译成C语言的翻译器# 2) 首先将F#代码编译成.net可执行文件,然后将其反汇编回C#代码 最低要求是生成的C#必须能够编译成可运行的.net可执行文件,最好尽量减少外部依赖 第一种方法似乎不太可能,快速的谷歌搜索结果与此无关。
看来这还是不可能的。现在,我将使用C#来代替。正如其他人在评论中已经指出的那样-如果有某种方法可以做到这一点,将会有相当多的恶劣情况,它可能不太管用,而且会非常脆弱 (对你来说)解决这个问题的一种方法是用F#写解决方案,然后把它重写成C#。这听起来可能很愚蠢,但也有一些好处:
- 在F#中,您可以轻松地对解决方案进行原型化,因此您可以更快地找到正确的解决方案
- 在将代码翻译成C#时,您可能会发现自己更经常地使用诸如lambda表达式之类的功能,因此它甚至可能提高您的C#技能
- 如果您依赖.NET库,那么这部分代码将很容易翻译
当然,最好的办法是说服组织者他们应该支持F#(如果他们已经允许C#,这可能不会太困难),但我知道这可能是一个挑战。即使可能,输出源也可能看起来。。。不太好。更不用说它是否地道了。从L1到L2的自动转换具有人类可读的结果是非常困难的。老实说,代码可读性不是我关心的问题。如果你看一下那些TopCoder在C/C++中的代码,大部分都是使用索引为i、j、k的数组完成的。TopCoder需要加入21世纪。你试过这个吗?它可能仍然无法工作,因为在反编译F#编译器生成的IL时,Reflector经常崩溃。然而,我不知道FileDiscormerser是否有自己的反编译逻辑,或者是否使用Reflector的反编译逻辑。@Daniel,我知道FileDiscormerser,但它似乎在很久以前就停止了(最近一次是在2007年),我找不到与之匹配的Reflector版本。虽然在3hr比赛中用F#和C#编写两个解决方案可能是一个挑战,但它确实符合我与TopCoder的目的之一——用他们的问题集训练自己。我完全同意你的观点,我们应该推动他们支持更多的语言。@Cygwin98:啊,我不知道有这样的时间限制!这无疑使事情变得困难(可能比修复从Reflector获得的代码更容易…)