读《The Early History of F#》

读《The Early History of F#》

 
24 人赞同了该文章

1,文章来源

此文章即将发表在HOPL IV大会,主要介绍F#发展历史。作者是来自微软的DON SYME ,之前调查微软的跨平台应用框架Fabulous的时候,看到过此作者一些关于F#的演讲。看过Fabulous写出来的代码,F#吸引了我,刚好看到HOPL IV大会上有关F#的历史文档,先睹为快。

2,F#的历史

2.1 微软创建.net及其F#编程语言的产生的背景(70-80s)

1970-80s软硬件蓬勃发展时代 ,各种各样的编程语言和编程范式涌现,BASIC, PASCAL, Prolog, Modula 2 and C。 类似Logo(Lisp语言的一种方言)语言的出现,开启了新的一种编程方式,“fourth generation languages” 编程语言时代到来。

微软作为操作系统和应用软件公司爆炸式增长,从商业上也需要构建编程工具,让开发者在DOS/Windows生态上创建应用软件。培养应用生态,开发者数量是至关重要的。微软创建了Visual Basic满足大部分普通开发者需求,使用C/C++满足“hard-core ”开发者,通过“Mort”和 “Einstein”两种口味的编程语言,快速占领了应用生态和获得了OS垄断地位。

80s年代 “object-oriented” 编程成为新的发展潮流。User interface界面编程是OOP发展主要驱动力。UI里面的 “buttons” 和 “widgets “天生是符合OOP编程思想的。面向过程的语言无法直接表达这种抽象及其他们之间的层级关系。1996年Java语言发布,给微软带来的巨大的挑战:Java是面向对象的现代语言;具备平台无关性“ Write Once Run Anywhere ”;并且可以发布基于浏览器的应用程序;使用了比较新的VM技术,支持GC;并且解决了微软之前一直忽略的academic computer sciencise领域。Java变成了面向对象语言的标杆。微软早期对OOP反应比较迟钝,即使Java出现,仍旧大量产品使用C/汇编进行编写软件。随着Java席卷工业界,微软开始试图拥抱Java,但是因为法律原因导致微软无法扩展这个语言。微软作为当时PC垄断企业不允许在浏览器/Java 市场进行垄断。1997年微软改变策略,准备发展自己新一代的编程语言平台:.Net(早期Lightning->NGWS->.Net)。

.Net核心设计理念:multi-language runtime rather than just a fixed set of languages decided by Microsoft (比尔盖茨钦定)

  • 多语言支持:VB,C++,Java,同时支持新语言C#
  • bytecode, garbage collection, JIT compilation ,stack- based security checks
  • 多平台支持:不仅支持windows开发,支持跟C互操作,内置COM;也支持其他OS
  • 为专业领域提供免费的SDK:1992年微软研究院MSR成立

MSR成立后招募了很多专业的计算机科学家,并且很多人希望对微软的产品带来影响,让投资变成回报。 Robin Milner作为ML语言的发起者之一,MSR剑桥大学的负责人,也希望给微软产品带来受益。 同时 Lightning( multi-language runtime,. net前身)也需要主动的创新。

2.2 1990s Strongly Typed Functional Programming的发展

尽管OOP席卷世界,函数式语言仍旧在小范围内保持前进。函数式编程与“PL research”息息相关。PL主要专注 formal verification, type theory and programming logics,category theory。 FDIV bug at Intel 带来对 formal verification投资的巨大增加,Intel向专业领域求助,通过理论证明( theorem proving)验证data paths of floating point circuits with respect to an IEEE model,引入 Forte FL 就是一种函数式编程语言。 1990s 年代强类型函数编程分裂了几个不同的方向: Haskell(lazy, pure functional programming), Standard ML(统一mixed functional-imperative languages, module system )。

Strongly-typed FP尽管在90s被工业届忽略,但是仍旧在一部分人持续发展,使用者虽然遇到了很多问题,但也获得了的生产率的提升。FP带来生产率提升主要原因:具有type inference 支持safe, compositional 编程;Parametric polymorphism(范型); discriminated union支持描述和操作Domain数据; without pervasive null value; the close correspondence between code and formal models。这些特性带来的优雅和表达力为FP更广泛的使用带来潜力。Java这些方面的缺失也是一种遗憾。

mid-1990中期FP陷入了迷茫和混乱:一些人放弃FP,转向Java,使用Java开展形式化研究;一些人把OO引入到FP中;一些人把FP引入到OO语言中去,如Pizza是Java的一种变种。一些人试图去探寻FP自身潜在的问题(Libraries, Portability, Availability, Packagability, Tools, Training, Popularity,Performance and Ignorance );一些人使用JVM去实现FP语言,把FP编程引入到浏览器/Web中,支持跟Java的互操作。其中代表是MLj ,完全支持跟java生态的互操作,MLi对后来对F#产生了不少对影响。不过当时的学术圈是非常反感OO,OO的反对者宣传OO是缺乏理论依据的或者“ unprincipled nonsense“。作为此篇论文的作者DON SYME 有着丰富的FP,OO,Basic/Logo等编译语言丰富经历。

2.3 微软的 Project 7 and .NET Generics

Project 7 是.NET项目的前身。Project 7是微软的一个语言研究项目,里面包括了很多语言的研究,这个项目并不成功,大部分并没有什么用处并且维护成本也非常高。Project 7主要产生的技术影响: 引入tailcalls( “tail.” .net bytecode)区别与jvm字节码,从而带来了技术创新和差异化路径; 引发了 “language interoperability 讨论,targeting a common substrate, another to get them to interoperate.

.NET Generics 设计目标是将Generics引入到.net中,并且能够支持C#,及其Eiffel, OCaml and Haskell语言。.NET Generics与Java Generics是非常不同的,.Net保留了精确的运行时类型信息,也是C#和Java的关键区别之一。
为什么要创造F#? MLj ->  (Project 7)->.NET。  实现了一个具备OO的标准ML语言但是一直无法对外发布;并且SML .net并不计划采用.NET Generics的实现,SML .net主要目的是希望通过 whole-program compilation and pervasive和monomorphization 获取性能和compact code。因此实验室内部产生了分歧。最初作者希望把Haskell在.Net平台进行实现:把Haskell 中间表示IR->.Net bytecode。但是发现了很多问题,最终停止了尝试。其中作者讨论了一个深层次的问题: should a language have its own runtime and interoperate indirectly with .NET and/or the JVM, or should it target those runtimes directly? 其实就是说一个语言是否要有自己的runtime还是复用已有的runtime。复用虚拟机需要考虑的主要问题: Threads / exceptions /object models /garbage collectors 。经过反复思考讨论,在October 10, 2001决定的技术路线:将OCaml一个变体引入到.NET,F#就此产生。

2.4 F# 历史及其对其他语言的影响
F#是将OCaml和.Net联姻到产物, .NET types are F# types, .NET values are F# value,确保F#跟其他.net语言保持无缝的互操作性。F#从0.5到1.0,2.0,3.0以此类推保证了比较好的演进性。并且目前也是开源的方式进行运作。现在也应用了各种领域。

对C#影响: C# 3.0 (“var x = ...”), C# 5.0 (tasks/async), C# 7.0 (tuples, pattern matching) and C# 8.0 (non-null pointers as the default)

对TypeScript, Kotlin等影响:async/await feature

失败的经验: 没有采用open source or using open engineering导致工作的discontinuity,一些人的离开后不能继续为F#做贡献;还有一些技术上的失误。

3. F#设计理念

1970年,Robin Milner 和他的同事希望构造一种简洁的( succinct),完全基于类型推导的函数式编程语言,用于处理结构化信息。 最早的函数式语言是LISP,被称为 ML – Meta Language ,是所有强类型函数式语言的鼻祖(Root),以LISP发展起来的ML语言家族包括Haskell, Standard ML, OCaml, Elm, ReasonML and PureScript,F#等。 ML语言核心思想是: type-safe, succinct, accurate, domain-oriented functional programming 。
Robin Milner和他的同事主要站在实用主义角度来设计F#:F#支持 mutable state 和 type inference system,一些纯函数语言是不允许mutable state的。F#语言设计核心理念:

  • Strongly typed functional programming;
  • F# 的核心编程活动:defining types (type X) and functions (let f x = ...) ,其他自动产生
  • F#支持Domain编程:聚集Domain Driven,而非编程本身的细节

F#语言主要特性:

  • functions and modules
  • pipelines and composition
  • lists, arrays, sequences
  • pattern matching
  • active patterns
  • type inference
  • recursive functions
  • quotations
  • record types, discriminated union types
  • option types
  • units of measure
  • object programming
  • asynchronous programming
  • computation expressions
  • type providers

参考:

posted on   漫思  阅读(3)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2023-03-03 Microsoft Visual Studio 2010 Service Pack 1官方下载版(ISO)
2023-03-03 Visual Studio2010保姆式安装教程(VS2010 旗舰版),以及如何运行第一个C语言程序,超详细
2023-03-03 最热的前端Web组态工具(可视化)
2023-03-03 10 个值得掌握的 reduce 技巧
2023-03-03 一个程序员的成功故事:从开源工具到 75 亿美元的软件帝国
2023-03-03 串口通信原理详解232、422、485,入门必看!
2023-03-03 QT 做的优秀软件

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示