F#对IronPython/IronRuby是否等于C#对VB.NET?

7
我刚刚听了Chris Smith关于F#的播客,他谈到F#是一种可以让你以不同方式解决问题的语言,与C#/VB.NET不同,即不是“推动位”,而是“链接数据转换”,并且F#将成为像XML一样的东西,即您可以在您选择的语言(C#或VB.NET)之外使用它以更有效地解决某些问题。
这让我思考.NET语言之间的关系,以下是我的理解:
- C#和VB.NET在语法上略有不同,但本质上没有区别,即C#程序员不会学习VB.NET以“以新的方式解决问题”。 - 然而,C#或VB.NET程序员将学习F#以“以功能方式解决编程问题”。
那么IronPython和IronRuby呢?Chris提到“F#从Ruby和Python中学到了很多”,因此我认为F#与IronRuby / IronPython之间具有类似于C#与VB.NET之间的关系。然而,通过一些搜索,我发现IronRuby和IronPython都建立在DLR上,但F#不是。
最好如何理解F#,IronRuby和IronPython之间的关系?

2
F# 的起源可以追溯到 OCaml,而它与 IronPython 和 IronRuby 之间的联系则相距甚远……我并没有看出任何直接的关系。 - Mehrdad Afshari
IronPython不就是在.NET中实现的Python吗?F#是一种全新的语言... - Ian G
我想你指的是Chris Smith而不是Chris Sells。 - Robert
@Robert,谢谢,正确的是:Chris Smith。 - Edward Tanguay
6个回答

15

F#和IronPython/IronRuby在语言方面相去甚远。F#是一种功能强大的、高度类型化的编译语言。而IronRuby/IronPython是动态类型的解释型语言。

我认为IronPython可能还支持编译,但我不确定,ruby的情况则更少了。

与此相比,VB.Net和C#之间的关系要密切得多。


1
我敢说,F#比IronRuby/IronPython更接近于VB.NET和C#。 - Bob King
F#只是一种不同的编程范式,正如我们的朋友所说,它是编译型的,这使得它与Iron系列非常不同。 如果你四处看看,你会看到Haskel、Charity、Clean等纯函数式编程的例子。然后还有其他一些允许函数式编程但有自己主要范式的语言,如C/C++/C#、List、Matematica、Python等。 - Oakcool
取决于你所说的“编译”,IronRuby和IronPython都是编译器。 - Curt Hagenlocher
大多数人所说的编译,是指你有一个明显的编译步骤,并发出某种二进制文件,如exe、dll或java类文件。 - Jonathan Allen

6
在许多方面,F#和Ruby / Python表面上很相似。这三种语言都允许您简洁地表达想法,而不会在代码中添加许多类型。然而,F#实际上与Ruby和Python非常不同,因为F#是一种静态类型语言,而Ruby和Python是动态类型语言。习惯用语的F#代码很少提到类型,但编译器可以推断出类型,并且任何类型错误都将在编译期间由编译器标记。对于Ruby和Python,在错误类型的情况下使用值只会在运行时生成错误。Ruby和Python的动态性意味着两者都比F#更容易进行元编程(例如,可以在运行时修改类型)。另一方面,对于大多数任务来说,F#将具有更高的性能(与C#相当),并提供许多漂亮的功能抽象,例如带有模式匹配的判别联合。当然,学习这些语言中的任何一种都将使您以不同于C#或VB.NET的方式思考问题,但您的方法在F#和Python / Ruby之间可能会有很大的差异。

5

我认为F#从OCaml中学到的比从Ruby和Python中学到的更多。唯一的相似之处在于,F#将ML带到了.NET平台,就像IronPython/Ruby将Python/Ruby带到了.NET平台一样。


我认为他们经常混淆F#和IronPython/Ruby,因为它们都有简洁的语法,你不需要明确地声明每个标识符的类型。 - Robert
我能理解,但是它们各自有简洁的语法和不同的原因,不需要显式标识符。相似之处非常肤浅。 - Niki Yoshiuchi

0

注意:这主要是我对这个主题的想法和观察的汇编。我白天是C#程序员,晚上是Python程序员。

是的,我同意已经说过的一些东西,但我有些时间,感觉需要详细阐述并分享我的想法。

F#是一种函数式语言。这意味着你更关心动词,可以这么说。它仍然是静态类型的,并在CLR上运行,但你以不同的方式构建代码并解决问题。通常人们认为函数式语言在结构上更具数学性,并且更容易正式证明。当然,这通常被视为大多数学术性的。

C#和其他静态类型的面向对象语言实际上更专注于名词来进一步说明我的比喻。因此,您根据此结构化代码并解决问题。当然,在面向对象的语言中,还存在保持状态和在对象上具有非确定性方法的自然问题,这些问题往往更常见。

当然,F#也借鉴了一些面向对象语言的特点和思想,而C#则借鉴了一些函数式的思想和特点。

比较Python和C#更多地涉及到动态和静态类型之间的区别(尽管Python提供了一些C#仍然没有的函数特性)。动态类型通常更容易处理内省/反射活动和运行时修改,但增加了由于拼写错误或在“常规”代码中使用不正确对象而导致的运行时错误的风险。
静态语言通常有一些开发人员开销,动态语言没有。这种开销似乎通常是由于必须创建层来抽象事物并创建继承层次结构和接口以与所需/想要的抽象一起工作。因为你试图避免对类型的依赖。
静态语言似乎在更大的团队中管理起来更容易。此外,您可以通过所有检查和工具轻松获得重构的优势。

很好的想法。我正在开发一些越来越大的Python项目,缺乏自动化重构确实会增加额外的工作量。 - gravitation

0

F#更像是一种“工具”语言,适用于采用功能性方法解决特定问题的场景。F#本身天生就是线程安全的,这使得它很有希望在将应用程序扩展到使用多个处理器时发挥作用。我看到F#被用于构建组件,这些组件将被用于VB.NET或C#中,以便于处理特定问题。


F#本质上是线程安全的说法,遗憾的是并不完全正确。F#提供了一些机制来促进线程安全代码的编写,但并不能通过魔法或自动化方式从根本上实现。 - Benjol
我同意这个观点。谢谢你的看法。 - Achilles
在一个项目中完全使用 F# 替换了 C# 后,我不认为它是一个狭隘的“工具”语言,只有在 C# 无法胜任时才会介入。除了一些残留的互操作问题(和缺乏工具支持)之外,功能上来说 F# 在很大程度上是 C# 的超集。 - MichaelGG
哇,这是一个有趣的观点。我听说 F# 的主要问题是商业应用程序更适合面向对象和命令式编程,而这些应用程序传统上不会使用函数式语言进行开发。 "工具" 评论意味着开发人员将问题划分为领域,并在最合适的地方应用 F#。 - Achilles
需要一点时间来掌握它,但你可以在F#中使用类和其他所有内容,而且通常更加简洁。 - RCIX

0

F#有一些与动态语言类似的方面;然而,JaredPar的回答总结得很好。F#属于函数式编程的独立类别,而IronRuby和IronPython是动态语言,C#/VB则是面向对象的语言。它们都可以做同样的事情,只取决于你想如何实现。对于给定的问题,每种语言都有其优缺点。


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