写点什么

微软 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:002111

评论

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

2022“星课堂”直播课,开课啦!

星环科技

答题交互功能深入研究

CRMEB

【直播回顾】OpenHarmony知识赋能五期第四课——子系统音频解读

OpenHarmony开发者

OpenHarmony 多媒体

Apache ShardingSphere 遇上得物“彩虹桥”

SphereEx

数据库 开源 ShardingSphere SphereEx apache 社区

java 中异常类

爱好编程进阶

Java 程序员 后端开发

Java 四种线程池

爱好编程进阶

Java 程序员 后端开发

JMH性能测试,试试你代码的性能如何

爱好编程进阶

程序员 后端开发

web前端培训单元测试入门知识分享

@零度

单元测试 web前端开发

租房开放源码

源字节1号

租房小程序

Java Review(三十九、类加载机制与反射

爱好编程进阶

Java 程序员 后端开发

LeetCode - Easy - 104

爱好编程进阶

Java 程序员 后端开发

封装格式介绍

Loken

音视频 5月月更

java培训Nginx 快速入门

@零度

JAVA开发

Java面试比较---谈谈你对面向对象的理解,什么是面向对象?

爱好编程进阶

Java 程序员 后端开发

探讨企业知识管理的困惑

小炮

企业知识管理

Elasticsearch聚合学习之一:基本操作

爱好编程进阶

Java 程序员 后端开发

20年清华扫地僧,整理的Storm、Spark学习笔记

爱好编程进阶

Java 程序员 后端开发

从服务端生成Excel电子表格(Node.js+SpreadJS)

葡萄城技术团队

SpreadJS 前端表格

从服务端生成Excel电子表格(GcExcel + SpreadJS)

葡萄城技术团队

服务器端开发 前端表格控件 测试比较

IntelliJ IDEA创建基于maven的springboot项目

爱好编程进阶

Java 程序员 后端开发

LeetCode - Easy - 107

爱好编程进阶

Java 程序员 后端开发

C++搭建集群聊天室

爱好编程进阶

Java 程序员 后端开发

Java---多态

爱好编程进阶

Java 程序员 后端开发

基于Saga的分布式事务调度落地

百度Geek说

微服务

Java8--Lambda表达式对List集合操作

爱好编程进阶

Java 程序员 后端开发

Autograd解析|OneFlow学习笔记

OneFlow

人工智能 深度学习 数学原理 Autograd模块

三大特性,多个场景,Serverless 应用引擎 SAE 全面升级

阿里巴巴云原生

阿里云 Serverless SAE 阿里云云原生 应用引擎

JSON和JSONP对比

爱好编程进阶

Java 程序员 后端开发

maven 管理工具学习使用 ——

爱好编程进阶

Java 程序员 后端开发

云原生小课堂 | 如何打造一款软硬兼施、多功能、零损耗的云原生网络方案

York

云原生 性能 智能网卡vpc 容器网络方案

前端生成PDF,让后端刮目相看

葡萄城技术团队

PDF pdf.js

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