把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

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

评论

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

物联网场景中灵活实施对设备的控制管理

亚马逊云科技 (Amazon Web Services)

analytics

【网络安全】2022年第一次靶场渗透实战学习

H

网络安全 渗透测试

恒源云(GPUSHARE)_实例关机后如何操作迁移?

恒源云

gpu 运维 实例

Linux下玩转nginx系列(一)——初识nginx及其使用入门

anyRTC开发者

nginx Linux 音视频 WebRTC 服务器

第二节:SpingBoot单元测试

入门小站

java 编程

4 种高速安全混合云解决方案,助力您的云迁移之旅!

亚马逊云科技 (Amazon Web Services)

网络

在字节,A/B 实验是这么做的!

字节跳动数据平台

大数据 字节跳动 AB testing实战 ab测试

深入解析Apache Pulsar系列: Broker消息确认的管理

博文视点Broadview

2022年RPA行业发展十大趋势,六千字长文助你看懂RPA

王吉伟频道

RPA 机器人流程自动化 RPAaaS 超自动化 自动化优先

LeetCode 每日一题 No.1220 统计元音字母序列的数目

DawnMagnet

rust LeetCode 力扣

打造手淘极简包的轻量化框架

阿里巴巴终端技术

ios android 框架设计 移动开发 包大小

这8个JS 新功能,你应该去尝试一下

华为云开发者联盟

JavaScript 前端 开发 索引 开发语言

数据安全是指什么?有什么意义?

行云管家

防火墙 信息安全 数据安全 堡垒机

17 Prometheus之服务发现介绍

穿过生命散发芬芳

Prometheus 1月月更

java开发之Redis数据结构

@零度

redis JAVA开发

带你玩转Flink流批一体分布式实时处理引擎

华为云开发者联盟

flink 分布式 实时计算 批处理 流处理框架

实战 MongoDB Aggregate

PingCode研发中心

mongo pipeline Expression

60岁代码匠的几篇小作文,解决了大多数程序的迷茫(下)

图灵社区

java 编程

改进企业CRM系统实施的方法

低代码小观

企业管理 CRM 企业管理系统 CRM系统 企业管理工具

腾讯自选股如何实现单位小时内完成千万级数据运算

ninetyhe

腾讯 海量数据 分布式,

复盘和反思一个被全公司邮件通报的漏测

LynnYang

测试 Postman Mock

IT运维人员日常工作包含哪些?核心任务是什么?工作量多吗?

行云管家

运维 IT运维 服务器运维

iOS——解密RunLoop原理

iOSer

ios iOS面试 ios开发 RunLoop

Flink是如何支持批流一体的

编程江湖

flink

前端开发之Vue事件修饰符和按键修饰符

@零度

Vue 前端开发

阿里云视频云「 vPaaS 」演绎了怎样的音视频应用开发「未来图景」?

阿里云CloudImagine

阿里云 音视频 低代码 低代码开发平台 视频云

建木持续集成平台v2.2.0发布

Jianmu

开源 持续集成 CI/CD

手把手教程|通过部署 Apache Superset 实现 Amazon S3 的数据可视化

亚马逊云科技 (Amazon Web Services)

analytics

无服务器应用DevOps最新实践(内附完整演讲+视频)

亚马逊云科技 (Amazon Web Services)

计算

大数据平台中的企业级数仓建设

五分钟学大数据

数据仓库 1月月更

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