HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

微软 Project Springfield 团队的 F#使用心得

  • 2017-01-09
  • 本文字数:1244 字

    阅读完需:约 4 分钟

Project Springfield 是一个用于在软件中查找关键安全错误的模糊测试服务。微软 Springfield 团队首席软件工程经理 William Blum 介绍了他们团队如何利用 F#来构建云服务

简洁性经常被认为是 F#的主要优点之一。Blum 提供了一些 Project Springfield 相关的数据:

为了移除一些旧的依赖,我们将一个 Perl 脚本移植成 F#程序,代码量减少了 37%。在另外一个工作中,我们将 1338 行 PowerShell 脚本移植到 F#只需要 489 行(小了 2.7 倍)。在这两种情况下,除了代码量的减少,最终的 F#程序还在日志记录、可读性和可靠性方面得到了改进(部分由于静态类型检查的原因)。

Jet 的软件工程师 Rachel Reese 在 F#的简洁性方面持有相同的观点,她在“为什么电子商务公司选择 F#”中提到:

所以,我们开始构建两种方案:C#方案和 F#方案,来比较他们的效果。最后,我们选择坚持使用 F#。主要原因在于 F#使我们能够以更少的代码提供相同的功能,这显然更容易维护并减少了错误。

代码正确性也常常被 Springfield 团队和 F#用户提到。例如,空引用,也被称为“十亿美元的错误”,在 F#中是不允许的。在 F#中,缺失的数据使用 Option 类型表示,其中值可以是 Some valueOfAVariable 或 None。

可区分联合并不局限于 Option 类型,它们也可以表示复杂的对象,然后在模式匹配表达式中使用。下面的代码段演示了一个事件类型和调度它的函数。Blum 解释说,代码被授权处理所有情况,因为它是由编译器执行的。

复制代码
type CustomerId = System.Guid
type EventType =
| MsgType1 of CustomerId
| MsgType2 of CustomerId * string * int
| MsgType3 of CustomerId * string * int option
// 用模式匹配来处理信息
let dispatch msg =
match msg with
| MsgType1 -> ...
| MsgType2 -> ...
| MsgType3 -> ...

F#还增加了使用类型提供程序验证动态数据源的可能性。类型提供程序支持对数据源(如 SQL 数据库或 JSON)在编译时完成验证,而不是在执行时。

Springfield 采用动态分配计算资源的方式,因此需要在运行时生成 JSON 参数文件,这是一个容易出错的任务。使用 F#类型提供程序,我们可以在编译时静态验证我们生成的模板参数是否有效。因为我们的 ARM 模板不断发展,这极大地加快了开发和调试过程。

Springfield 团队还采用了 F#来编写脚本。REPL 环境 F# Interactive 提供了一种在没有预先编译的情况下执行 F#脚本的方法,这是脚本语言的一个预期功能。

F#脚本的另一个优点是静态类型检查,这对脚本语言来说是不寻常的!实际上,这将大大节省调试时间。IDE 中的智能感知功能会立即发现错误(如变量名称中的拼写错误或输入错误)。重构代码也会更加方便。这与我们团队以前采用的 PowerShell 脚本的脆弱性形成鲜明对比。

查看英文原文: Testimonial on Using F# by Microsoft’s Project Springfield Team


感谢薛命灯对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-01-09 18:001575

评论

发布
暂无评论
发现更多内容

C# 关于程序退出问题学习

IC00

C# 学习 程序员 上位机 10月月更

2022年元宇宙应用场景发展趋势分析

易观分析

元宇宙

IoTDB 的架构、安装启动方法与数据模式 | 小白教程文档(二)

Apache IoTDB

数据库 IoTDB Apache IoTDB

网络请求:Vue_Axios学习

Studying_swz

Vue 10月月更

Student Management System

David

#架构实战营 极客时间架构训练营

Vue组件入门(十四)依赖注入

Augus

Vue 10月月更

css学习笔记3

虾仁疙瘩汤

CSS css3 10月月更

C++从入门到精通(第十篇) :二叉搜索树

雪芙花

c++ 10月月更

从幻想走向科学:人类操纵大脑的条条大路

脑极体

Python在接口测试中的应用

梦笔生花

学习方法 “程”风破浪的开发者 Python接口测试

如何进行需求分析?

老张

软件工程 需求分析

liunx入门:Linux下基本指令

雪芙花

c++ Liunx 10月月更

【通知】OBCA考试收费调整公告

OceanBase 数据库

CSS学习笔记2

虾仁疙瘩汤

CSS css3 10月月更

概述Spark主要特点

穿过生命散发芬芳

spark 10月月更

威胁网络安全的主要因素

阿泽🧸

网络安全 10月月更

数据共享:VueX学习

Studying_swz

Vue 10月月更

限时免费领票|来云栖大会,看OceanBase 4.0最新进展

OceanBase 数据库

深入浅出Python——Python基础语法全解

何极光

Python 基础 10月月更

深入浅出Python——Python高级语法之函数

何极光

Python 函数 10月月更

Spring Boot「14」MVC 与前端控制器模式

Samson

Java spring 学习笔记 spring-boot 10月月更

Commit之后发生了什么事情

我不吃六安茶

MySQL 事务

【web 开发基础】PHP 快速入门(11)-PHP 运算符之运算符的优先级

迷彩

表达式 10月月更 web开发基础 PHP基础 运算符优先级

对比学习算法在转转的实践

转转技术团队

人工智能 推荐算法 对比学习

2022-10-25:在一个 2 * 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示。一次 移动 定义为选择 0 与一个相邻的数字(上下左右)进行交换.

福大大架构师每日一题

算法 rust 福大大

SAP | 选择屏幕

暮春零贰

SAP 10月月更 屏幕

“程”风破浪的开发者|社交元宇宙的技术挑战与探索

小明Java问道之路

原创 架构 元宇宙 10月月更 “程”风破浪的开发者

DevOps | 如何快速提升团队软件开发成熟度,快速提升研发效能?

laofo

DevOps 研发效能 CMMI 敏捷研发 绩效考核

AAX增添新网关,满足全球用户需求

股市老人

CSS基础1

虾仁疙瘩汤

CSS css3 10月月更

C++精通之路:map和set

雪芙花

c++ 10月月更

微软Project Springfield团队的F#使用心得_.NET_Pierre-Luc Maheu_InfoQ精选文章