针对F#的情况如何?

use*_*807 8 c# java f# multithreading multicore

简单的C#/ Java代码非常难以并行化,多线程等.因此,简单的C#/ Java代码将在一个盒子上使用越来越少的总处理能力(因为现在所有东西都将是多核的) ).

在C#和Java中解决这个问题并不简单.可变性和副作用是在C#和Java中完成工作的关键,但这正是使多核,多线程编程变得如此困难的原因.

因此,函数式编程将变得越来越重要.

鉴于J2EE/Ruby世界将在许多功能/多核方法之间分裂(就像它几乎所有其他方式一样),而.NET人员都将使用F#,这种思路表明F#将是巨大的两个年份.

这种思路有什么问题?F#为什么不是很明显?

(编辑)Larry O'Brien在这篇博客文章中指出:"语言方面,在我看来,这是一套C和C++闪耀的练习 - 至少在多线程的东西之前.列表处理习语的语言也会最初做得很好,但可能有内存消耗问题(特别是函数式语言).最后,我认为托管的C派生语言(Java和C#)有最简单的练习9的路径,然后在练习10中面临严重的缺点,其中并发问题起主要作用.在我看来,并发性将成为未来五年专业发展的核心问题,因此这些缺点非常重要.

Rob*_*vey 11

简单的C#/ Java代码非常难以并行化

如果您使用任务并行库,则不会.

F#是否变得巨大取决于成本/收益是否存在,这一点并不明显.如果.NET开发人员发现他们可以在1/3的时间内使用功能而不是命令式的方法编写一些程序(我认为对于某些类型的程序可能是这样),那么F#采用应该有一些动机.

保罗·格雷厄姆关于他在一家创业公司中使用Lisp的故事说明了这一过程.Lisp为他们提供了巨大的竞争优势,但Lisp没有接管世界,不是因为它不强大,而是出于其他原因,比如缺乏图书馆支持.F#可以访问.NET框架,这给了它一个战斗机会.

http://www.paulgraham.com/avg.html


Gre*_*ech 6

函数式编程比命令式编程更难理解.F#在很多方面都比C#更难.大多数"开发人员"不了解函数式编程概念,甚至无法在C#中编写非常好的命令式代码.那么他们有什么希望在F#中编写好的功能代码?

当你考虑团队中的每个人都需要能够理解,编写,调试,修复等等你选择的语言代码时,这意味着你需要一个非常强大的团队 - 而不仅仅是一个非常强大的人 -能够使用F#,因为它意味着使用.周围的人并不多.

加入混合的事实是,有8年的C#/ VB代码不可能被迁移,并且在C#/ VB中创建外观和感觉像BCL的库更容易,因为它不容易泄漏像通过公共接口,元组等等,我认为F#很难获得比强大的团队在新的内部项目中使用更多的东西.

  • @unknown - 这个行业已经存在了很多年,许多所谓的开发人员几乎不知道他们的肘部屁股(只需查看thedailywtf.com).在很大程度上,中高级管理人员对这些问题都没有任何线索,并且仍然雇用垃圾开发人员来制作垃圾代码.事实上,它只运行在10%的硬件上,这可能是任何人担心的最少. (11认同)
  • 此外,即使您使用像F#这样的函数语言,很多东西也不容易并行化,有些东西根本不需要并行化. (2认同)

ric*_*ent 5

  1. 在SO上询问编程问题,并指明您正在使用F#.
  2. 问同样的问题,并说明你正在使用C#.
  3. 比较答案.

使用新颖的编程语言是一种计算风险 - 您可能会获得更多内置功能和语法糖,但您将失去社区支持,雇用程序员的能力以及解决语言中的盲点问题.

我不是在选择F# - 编程语言的每个决定都是你需要解决的风险等式.如果人们没有承担C#的风险,我们现在仍然使用VB6和C++.这些语言与他们的前辈相同.您必须为您的项目决定优势是否超过风险.

  • 两年后,这**真的**适得其反.F#问题在stackoverflow上有一些最佳答案.大多数时候,即使是微软F#团队的成员,真正的专家,也是由常规语言用户. (5认同)

Kev*_*ose 3

  1. 命令式代码比函数式代码更容易编写。(至少,与功能性代码相比,更容易找到能够正确接受命令性代码的人)
  2. 有些东西本质上是单线程的(UI* 是最著名的例子)。
  3. 已经有大量的 C#/C/C++ 代码,并且同一项目中的多种语言使得该项目的管理变得更加困难。

就我个人而言,我认为函数式语言将变得越来越主流(哎呀,F# 本身就是证明),但可能永远不会像 C/C++/Java/C# 等那样获得通用语言的地位。已经或将会。


*这显然是一个有些争议的观点,所以我将对其进行扩展。

在多线程 UI 中,每个 UI 事件都是在其自己的线程上异步分派(线程的实际管理可能比仅仅启动一个新线程更复杂,但这与讨论并不真正相关)。

想象一下如果是这种情况,并且您正在渲染窗口。

  1. 窗口管理器要求您绘制每个元素(需要一条消息或每个元素的函数调用)。
  2. 每个元素读取其状态(隐式读取应用程序状态)
  3. 每个元素都会绘制自己。

在步骤 2 中,每个元素必须锁定应用程序状态(或影响显示的子集)。否则,如果应用程序状态被更新,则呈现窗口的最终结果可能包括反映两个不同应用程序状态的元素。

这是一个锁车队。每个渲染线程都会加锁、渲染、然后释放;因此他们会串行执行。

现在,假设您正在处理用户输入。首先,用户的速度相当慢,因此除非您在(多个)UI 线程上做大量工作,否则好处将不存在;所以我假设情况就是如此。

  1. 窗口管理器通知您的应用程序用户输入(再次,消息、函数调用等)。
  2. 从应用程序状态中读取需要的内容。(这里需要锁)
  3. 花大量时间处理一些数字。
  4. 更新应用程序状态。(这里也需要锁)

您所完成的只是从显式启动工作线程更改为隐式启动工作线程;如果您不锁定状态,则会以潜在的 heisenbug 和死锁为代价。

UI api 的根本问题是您正在处理多对一(或一对多,具体取决于您如何看待它)关系。许多窗口、许多元素或许多“输入类型”,所有这些都会影响单个窗口/表面。某种类型的同步必须发生,而当它发生时,多线程就不再有任何好处,只是有坏处。

  • UI 只是“本质上是单线程的”,因为 Microsoft 的实现为所有内容提供了线程关联性。 (4认同)
  • Microsoft 将其 ui 设计为单线程是有充分理由的 - 在用户可能能够同时执行许多操作的环境中,多线程很容易使最简单的 ui 成为并发噩梦! (2认同)