2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

评论

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

架构实战营毕业总结

唐高为

netty系列之:对聊天进行加密

程序那些事

Java Netty nio

fil币价格行情怎么样?fil币价值和未来在哪?

fil币价格行情怎么样 fil币价值和未来在哪

HarmonyOS组件开发 ScrollView嵌套ListContainer 滑动冲突问题

爱吃土豆丝的打工人

HarmonyOS ScrollView ListContainer 嵌套滑动

架构实战训练营总结

唐江

架构实战营

智能边缘开源框架Baetyl,构建边缘融合智能应用

百度开发者中心

AI 最佳实践 物联网 边缘计算 开源技术

crudapi增删改查接口零代码产品成功案例之商会联盟卡项目

crudapi

Java Vue 零代码 crudapi qusar

【Dubbo3.0 技术专题】总体技术体系介绍及技术指南(目录)

码界西柚

dubbo Dubbo服务 8月日更 Dubbo3

入职新公司后如何快速上手项目

咔咔

php MySQL 数据库

FastApi-13-文件上传-1

Python研究所

FastApi 8月日更

JavaScript 中如何比较变量的相等

devpoint

JavaScript ES6 8月日更

模块五作业

Mr.He

架构实战营

如何设计一个容错的微服务架构

架构精进之路

架构 微服务 8月日更

Vue进阶(三十七):created、mounted等钩子函数整理

No Silver Bullet

Vue 8月日更

docker介绍与安装

Rubble

Docker 8月日更

python爬取下载m3u8加密视频,原来这么简单!

Python研究者

8月日更

LeetCode题解:208. 实现 Trie (前缀树),对象,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

上游思维的三大障碍

石云升

读书笔记 8月日更 上游思维

毕业设计:电商秒杀系统

唐高为

架构实战营毕业总结

Saber

架构实战营 毕业总结

架构实战营模块五作业-微博评论高性能高可用架构

王晓宇

架构实战营

极客大学架构实战0期毕业总结

谢博琛

Vue进阶(三十六):created() 详解

No Silver Bullet

Vue 8月日更

Python开发篇——基于React-Dropzone开发上传组件

吴脑的键客

Python flask React

杂谈:电商平台中的图片资源优化实战

云小梦

CSS JavaScript html5 jpeg 图片处理

Drools 规则属性

LeifChen

drools 规则引擎 8月日更 规则属性

kubernetes/k8s CRI 分析 -kubelet 删除 pod 分析

良凯尔

Kubernetes 源码分析 Kubernetes Plugin #Kubernetes# cri-o

架构实战营 | 毕业总结

架构实战营

Flutter Android 端 FlutterEngine Java 相关流程源码分析

工匠若水

flutter android 面试 8月日更

Python Qt GUI设计简介、环境下载和安装(基础篇—1)

不脱发的程序猿

Python qt GUI设计 Qt Company

如何在二三线城市月薪过万(三)java偏功能实现的面试题,有备无患!!

小鲍侃java

8月日更

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