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

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.Guidtype 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脚本的脆弱性形成鲜明对比。

原文地址:http://www.infoq.com/cn/news/2017/01/fsharp-project-springfield


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式中各种字符的含义

转载自 正则表达式中各种字符的含义 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 列目录时, dir *.txt或ls *.txt中的*.txt就不是一…

WRF文件打开方式

今天有幸接触了下.WRF文件,百度了一下: WRF是使用WebEx录制器生成的新格式文件,WebEx 设计这种格式是为了便于以后提供强大的WebEx 录制器和播放器新功能。 哦哦,既然是这样的话,那就一般的播放器肯定是不能打开&…

Java:出生日期转年龄

private int getAge(Date birthDay) {Calendar cal Calendar.getInstance();//出生日期晚于当前时间,无法计算if (cal.before(birthDay)) {throw new IllegalArgumentException("The birthDay is before Now.Its unbelievable!");}//当前年份int yearNow…

实现BUG自动检测 - ASP.NET Core依赖注入

我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评。 如果以后有时间的话,我打算写一个系列的【实现BUG自动检测】,本文将是…

java语音播报案例

在做项目的过程中,我们往往会用到语音播报——把文字转换成语音播放出来,自动识别语言进行播报,那么我们现在来看看怎么操作: 1.下载jacob.jar,下载地址:这里 2.32位操作系统下载:jacob-…

玩转SpringBoot之定时任务详解

玩转SpringBoot之定时任务详解 https://www.cnblogs.com/mmzs/p/10161936.html 玩转SpringBoot之定时任务详解 阅读目录: 序言一、静态:基于注解二、动态:基于接口三、多线程定时任务阅读正文: 回到顶部 序言 使用SpringBoot创…

Java开发人员必知必会的20种常用类库和API

转载自 Java开发人员必知必会的20种常用类库和API 一个有经验的Java开发人员特征之一就是善于使用已有的轮子来造车。《Effective Java》的作者Joshua Bloch曾经说过:“建议使用现有的API来开发,而不是重复造轮子”。在本文中,我将分享一些Java开发人员应…

sql server操作案例

今天没事做,总结了下sql server的些知识: --创建表 CREATE TABLE users (id INT ,name VARCHAR(50),age INT )--添加数据 SELECT * FROM users INSERT INTO users VALUES(2,张三1,13); INSERT INTO users VALUES(4,王五,12,山西省吕梁市,DEFAULT); --默…

左耳朵耗子:不灌鸡汤,说真的年龄渐长,技术人的发展之路该怎么走

技术圈中的很多人,最初都坚定地认为coding能改变世界。然而三五年过去后,还能不忘初心的人,少之又少。随着年龄的增长,梦想已被束之高阁,面包慢慢占据生活的大部分。对于个人发展,很多成功学者会给你灌各种…

集合中重写equals方法删除new的对象

COPYOverride public boolean equals(Object obj) {//1.是否为同一对象if (thisobj) {return true;}//2.判断是否为空if (objnull) {return false;}//3.判断是否是Student类型if (obj instanceof Student) {Student student(Student) obj;//4.比较属性if(this.name.equals(stud…

Java开发必须掌握的5种加密策略

转载自 Java开发必须掌握的5种加密策略 本文总结自《大型电商分布式系统实践——第四课》。文末给出获取全套PPT及视频的方式。 一、数字摘要 数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash函数对消息进行计算而产生。如果消息在传…

Java String格式日期加1秒(分钟或小时) java时间减一分钟,并且进行比较-时间相关的处理

https://blog.csdn.net/java0311/article/details/78047878 Java String格式日期加1秒(分钟或小时) chuan9966 2017-09-21 09:15:07 17101 收藏 6 文章标签: String格式日期加1秒 data日期加1秒 日期加1秒 版权 需求: 将如下…

sql server案例总结

--通过insert select 插入数据到已存在的表中 create table grade1 ( id int , name varchar(50) )insert into grade1 select * from grade select * from grade1--通过select into 语句将现有表中的数据添加到新表中,执行两边的话(数据库中已存在名为…

聊下JVM内存模型

转载自 聊下JVM内存模型 1. JVM内存模型 2. 程序计数器(PC) 每个线程都会有自己私有的程序计数器(PC)。可以看作是当前线程所执行的字节码的行号指示器。 也可以理解为下一条将要执行的指令的地址或者行号。字节码解释器就是通过改变这个计数器的值来选取下一条需要执行的字节码…

泛型集合

作用 它是一个泛型类,而之前使用的时候并没有传递,说明java语法是允许的,这个时候传递的类型是Object类,虽然它是所有类的父类,可以存储任意的类型,但是在遍历、获取元素时需要原来的类型就要进行强制转换。…

ASP.NET Core + Angular 2 Template for Visual Studio

多个月以来,我和多个Github上的社区贡献者一起建立支持库、包,我们最终的目的是希望完成这样一个作为起点的模板,也就是基于把Typescript代码和Angular2宿主在ASP.NET Core项目中,这个模板包含一下这些方面: 服务端预加…

MyBatis中if - else if - else 的使用

http://www.leftso.com/blog/765.html 不过有他的替代 choose,写法如下&#xff1a; <choose><when test"params!null">right JOIN</when><otherwise>LEFT JOIN</otherwise></choose> 复制 <choose><when test…

Servlet使用适配器模式进行增删改查案例(Emp.java)

package org.entity;/*** * * 项目名称&#xff1a;test_BaseDao * 类名称&#xff1a;Emp * 类描述&#xff1a; 员工实体类 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-9-13 上午8:45:47 * 修改人&#xff1a;Mu Xiongxiong * 修改…