代码之家  ›  专栏  ›  技术社区  ›  Erlend

在哪些方面,使用F比C更合适?[关闭]

f# c#
  •  206
  • Erlend  · 技术社区  · 6 年前

    在过去的几年里,F已经发展成为微软完全支持的语言之一,它使用了许多在ocaml、ml和haskell中孵化的思想。

    在过去的几年中,C通过引入越来越多的功能语言特性来扩展其通用功能:linq(列表理解)、lambda、闭包、匿名委托等等…

    鉴于C采用了这些功能特性,F的分类法是一种不纯的功能语言(它允许您在调用函数时访问框架库或更改共享状态,如果您愿意的话),这两种语言之间有很强的相似性,尽管每种语言都有自己的极性相反的主要重点。

    我对任何成功的模式感兴趣,在你的生产多语言程序中使用这两种语言,也对你在过去一年中用F编写的生产软件(Web应用程序、客户端应用程序、服务器应用程序)的领域感兴趣,或者你以前用C编写的。

    11 回复  |  直到 11 年前
        1
  •  253
  •   simon cousins    15 年前

    我已经写了一份申请,以平衡国家发电计划中的发电站组合与能源公司的交易头寸。客户机和服务器组件在C中,但计算引擎是用F编写的。

    使用f来解决这个应用程序核心的复杂性,清楚地展示了企业软件中语言的一个优势,即对大型数据集的算法复杂分析。我的经历是非常积极的。特别地:

    计量单位 我工作的行业到处都是单位。我实现的方程(通常是几何性质的)处理时间、功率和能量的单位。让类型系统验证功能输入和输出单元的正确性是一个巨大的节省时间的方法,无论是在测试和读取/理解代码方面。它消除了以前系统容易出现的一类错误。

    探索性程序设计 与更传统的编辑/编译/运行/测试循环相比,使用脚本文件和repl(f interactive)允许我在提交实现之前更有效地探索解决方案空间。对于程序员来说,建立他们对问题和设计紧张关系的理解是非常自然的方式。

    单元测试 使用非副作用函数和不可变数据结构编写的代码是一种测试的乐趣。没有复杂的依赖时间的交互来把事情搞砸,也没有大量的依赖项被模仿。

    互操作 我在C中定义了与计算引擎的接口,并在F中实现了计算。然后可以将计算引擎注入到任何需要使用它的C模块中,而完全不考虑互操作性。无缝的。C程序员永远不需要知道。

    代码约简 许多输入计算引擎的数据都是以向量和矩阵的形式出现的。高阶函数在早餐吃这些,只需最少的繁琐和最少的代码。美丽的。

    缺少虫子 函数式编程会让人感觉很奇怪。我可以研究一个算法,努力让代码通过类型检查程序,但一旦类型检查程序满意,它就可以工作了。它几乎是二进制的,要么不编译,要么是正确的。奇怪的边缘大小写错误被最小化,递归和高阶函数删除了大量导致边缘大小写错误的簿记代码。

    平行性 结果实现的功能纯度使得充分利用数据处理向量中固有的并行性成为可能。也许这就是我下一步要去的地方,因为.NET 4已经不在了。

        2
  •  76
  •   Tomas Petricek    15 年前

    在我在微软研究院实习期间,我曾为F(它本身是用F写的)的Visual Studio IntelliSense的一些部分工作。我已经有了一些早期C项目的智能感知经验,所以我想我可以比较两者。

    • Visual Studio扩展性仍然基于COM,因此您需要处理不太好的.NET对象(而且肯定不起作用),但我觉得C和F之间没有任何主要区别(从F开始,它工作得很顺利)

    • 用F表示程序代码的数据结构主要是 别联合 (C中不以任何合理方式支持)这使得 巨大的 这类应用程序的区别(需要处理树结构,如程序代码)。有区别的联合和模式匹配允许您更好地构造代码(将相关功能放在一个地方,而不是放在虚拟方法中的所有地方)

    早些时候,我还为f_(也用f_编写)工作过codedom提供者。实际上,我在C中做了第一次实验,但后来将代码转换为F。

    • codedom提供程序需要遍历一些使用.NET对象表示的结构,因此没有足够的空间来发明您自己的数据表示(这是f可以提供很好好处的领域)。

    • 然而,有许多小的F功能使任务更容易。因为您需要生成一个字符串,所以我定义了用于构建字符串的自定义运算符(使用 StringBuilder )并使用它们和高阶函数实现了代码(例如,格式化使用指定字符串分隔的对象列表等),消除了大量重复(和冗长的 foreach 循环)。

    这是两个相对特定的示例,但这两个示例都与处理程序、表达式或更一般的复杂树型数据结构的表示有关。我认为在这个领域,F绝对是一个不错的选择(不管C中的功能特性如何)。

        3
  •  42
  •   Jon Harrop    15 年前

    我们用F语言发布了世界上第一个商业产品。#( F# for Visualization )第二个( F# for Numerics )以及第一篇关于F的商业文献#( The F#.NET Journal )写并出版了唯一一本关于当前版本F的书#( Visual F# 2010 for Technical Computing )

    我们一直在沿着用C(例如 this )但我们在OCAML的商业应用方面也有很强的背景。早在2006年,我们就热衷于F的早期应用,当时F还是一个研究原型,因为我们认识到在工业实力.NET平台上拥有一种像样的现代OCAML语言的潜力,因此,我们推动了F的生产。其结果是令人难以置信的成功,F远远超出了我们的远大期望。

    对于我们来说,F有许多不同的优点,我们将其用于各种应用。我们在生产中有数十万行F代码。我们现在用F_ 全部的 关于我们的LOB应用程序:我们的信用卡交易使用F代码处理,我们的产品通知使用F代码发送,我们的订阅使用F代码处理,我们的帐户使用F代码完成等。也许支付红利的主要语言特性是模式匹配。我们甚至用F来突出我们最新的书的颜色语法…

    我们的可视化库是一个大卖家,其功能主要集中在在在Visual Studio中运行的F_Interactive上。我们的图书馆增强了这种能力,能够以最小的努力(例如 Plot([Function sin], (-6., 6.)) 绘制正弦波)。特别是,所有线程问题都是完全自动化的,因此用户不必担心UI线程和调度。在编写库的这一部分时,第一类函数和惰性是非常有价值的,代数数据类型在其他地方被广泛使用。当我们的客户在WPF的命中测试中遇到性能错误,并且能够轻松地在F中重新实现相关代码以获得10000_的性能改进时,可预测的性能在这里也很有价值。由于该产品的图形用户界面是自由形式的,因此图形用户界面设计者和C将不会是有益的。

    我们的大部分工作都围绕着数字方法展开,包括商业图书馆和书籍。F在这个领域比C强得多,因为它提供了高层次的抽象(例如高阶函数),并且性能惩罚最小。在这种情况下,我们最引人注目的结果是创建了一个简单但通用的线性代数QR分解实现,它比LAPACK参考实现中的Fortran代码短20_,比供应商调优的英特尔数学内核库快3_,而且更通用,因为我们的代码可以处理mat任何类型的矩阵,甚至符号矩阵!

    我们目前正在开发混合了f(用于Guts)和c(用于Shim)的wpf/silverlight组件,构建wpf应用程序作为我们软件产品的交互手册,我正在写一本新书,多核f,这将是在.net上共享内存并行编程的最终指南。

        4
  •  25
  •   JaredPar    15 年前

    在过去6个月左右的时间里,我一直在为Visual Studio 2010开发VIM仿真层。这是一个免费的产品,有所有的来源,它在Github上免费提供

    该项目分为3个DLL,表示一个不同的层。每个层都有一个对应的单元测试DLL。

    1. VIM引擎
    2. 用于装饰和编辑器集成的WPF层:c#
    3. Visual Studio集成层:C#

    这是我与F合作过的第一个主要项目,我不得不说我喜欢这门语言。在许多方面,我使用这个项目作为学习f_的一种方法(如果你浏览项目的历史,这个学习曲线是非常明显的)。

    我觉得最令人惊奇的是,F语言是多么简洁。VIM引擎包含大量的逻辑,但它只占整个代码库的30%。

        5
  •  13
  •   Brian    15 年前

    许多F Visual Studio组件的单元测试都是用F编写的。它们在vs外面运行,模拟各种Visual Studio位。实现接口的匿名对象的能力对于代替模拟框架/工具很有用。我可以写

    let owpe : string list ref = ref []
    let vsOutputWindowPane = 
        { new IVsOutputWindowPane with
            member this.Activate () = err(__LINE__)
            member this.Clear () = owpe := []; 0
            member this.FlushToTaskList () = VSConstants.S_OK
            member this.GetName(pbstrPaneName) = err(__LINE__)
            member this.Hide () = err(__LINE__)
            member this.OutputString(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
            member this.OutputStringThreadSafe(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
            member this.OutputTaskItemString(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText) = err(__LINE__)
            member this.OutputTaskItemStringEx(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText, pszLookupKwd) = err(__LINE__)
            member this.SetName(pszPaneName) = err(__LINE__)
        }            
    DoSomethingThatNeedsA(vsOutputWindowPane)
    assert( !owpe = expectedOutputStringList )
    

    当我需要例如 IVsOutputWindowPane 传递到最终将调用的其他组件 OutputString Clear ,然后检查 string list ref 对象,以查看是否写入了预期的输出。

        6
  •  9
  •   johnc    8 年前

    我们使用f中的lex yacc实现编写了一个自定义规则引擎语言。#

    编辑以包含评论回复

    在C_中没有lex/yacc实现。(据我们所知,F一号是)

    这本来是可能的,但构建解析本身是一种彻头彻尾的痛苦。

    This topic 显示了一些其他的建议,例如外部库,但是我们的首席架构师在功能语言方面是个老手,所以使用f_的选择是不需要考虑的。

        7
  •  7
  •   Rune FS    15 年前

    我目前正在为一种编程语言编写编译程序。编译器完全用F编写。编译器(除了lex和parser用lex/yacc构建)基本上是作为复杂树型结构的大量转换构建的。

    正如其他人所指出的那样,区分联合和模式匹配使得使用这种数据结构比将代码“到处”转储到虚拟方法中容易得多。

    在我开始编写编译器之前,我没有做过任何F工作(不过,我在另一个ocaml变种moscowml中使用了buld编译器),正如jared所说,从代码中可以看到我首先做了哪些部分,但总的来说,我发现F很容易学习,在编写完主要是OO的代码之后,重新进入FP的思维模式需要更长的时间。不过。

    使用旁边的树,我发现编写声明性代码的能力是FP(包括F)的主要好处,它的代码描述了我试图实现的算法,而不是C描述的算法。 怎样 我已经实现了algortihm是一个巨大的优势。

        8
  •  6
  •   Igor Zevaka    15 年前

    不是个人经验,但你可以听一集dnr(我想是 this one )他们和微软人谈论F。他们使用f编写了大部分Xbox Live评分系统,这远远不是一个简单的系统。该系统在数百台机器上大规模扩展,他们对此非常满意。

        9
  •  6
  •   Brian    15 年前

    这个 WebSharper 人们已经构建了一个以f为中心的Web编程的完整产品。下面是一篇关于它的文章:

    http://www.sdtimes.com/content/article.aspx?ArticleID=34075

        10
  •  6
  •   Brian    15 年前

    这里有一个案例,是关于一个银行,它使用F**和C++/COM来处理:

    http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000006794

        11
  •  5
  •   Brian    15 年前

    我不知道它是否在生产中,但是“前进之路”的人工智能是用f写的:

    http://research.microsoft.com/en-us/events/techvista2010/demolist.aspx#ThePathofGo

    前进之路:微软研究 Xbox 360游戏

    这个演示展示了一个Xbox 360游戏, 基于围棋,制作 微软研究院内部 剑桥。Go是其中一个 东亚著名的棋类运动会 起源于4000年前的中国。 在欺骗的简单背后 游戏隐藏着巨大的复杂性。只有它 学习需要几分钟,但需要 终身掌握。尽管计算机 在国际象棋方面超越了人类的技术, 实施竞争性人工智能 仍然是一个研究挑战。游戏 由三种技术提供动力 在Microsoft Research开发 剑桥:一个能玩的人工智能 去吧,F语言,和Trueskill来 匹配在线玩家。人工智能是 在F中实施并满足 高效磨合的挑战 Xbox上的.NET Compact框架 360。这个游戏让你在许多视觉上惊人的三维场景。它是 在托管代码中使用 XNA环境。

    (其他人已经提到了“Trueskill”。)