C# REPL
REPL
Read-Eval-Print Loop,简称REPL,中文意为“读取-求值-输出”循环,是一个简单的、交互式的编程环境。REPL对于学习一门新的编程语言具有很大的帮助,因为它能立刻对初学者做出回应。
大家第一时间能想到的估计是Python的REPL。默认情况下,Python安装完成后就自带了一个IDE,也即是Python Shell。
最初的REPL都是基于命令行的,Python也是支持的。
Python作为一种脚本语言,支持REPL好像是顺理成章的事情。那么作为编译型的语言,有支持C#的REPL环境吗?答案是肯定的。
C# Interactive
从Visual Studio 2015 Update 1开始,Visual Studio 自带REPL。点击”View -> Other Windows -> C# Interactive”即可打开这个REPL的环境。
![Visual Studio 2015](/images/201712/2017-12-11_ 223825.png)
同时,IntelliSense也是支持的。
从Visual Studio 2015开始,可以在项目上右键,使用如下的菜单项将当前项目引入到C# Interactive中,这样可以更加方便的调试相关的方法和代码。
对于其它旧版本的Visual Studio, 你需要手动的使用#r
加上程序集的全路径,将其引入到C# Interactive。
CSI
如果你习惯于基于命令行的REPL,你可以在Developer Command Prompt for VS2015(或者更高的VS版本)中执行csi.exe这个命令。
关于C# Interactive和CSI的使用,你可以参考这里:C# Interactive Walkthrough
F#也有与此相对应的REPL: fsi.exe。更多信息:Interactive Programming with F#
scriptcs
如果你的Visual Studio不支持C# REPL,你可以使用scriptcs。scriptcs是由社区维护的一个开源项目,先于Visual Studio提供C# REPL。
官方推荐使用 Chocolatey 来安装scriptcs: choco install scriptcs
。安装完成后,在命令行输入scriptcs即可进入REPL。
你也可以在Katacoda这个网站体验scriptcs: ScriptCS Playground
在线C# REPL
除了上面提到的ScriptCS Playground,还有一些网站提供在线的C# REPL。C# Pad是其中体验较好的,而且支持IntelliSense。
像下面这些提供类似本地IDE开发环境的网站,个人认为其不属于REPL。
Roslyn
以上的这些C# REPL,都依赖于Roslyn Compiler。Roslyn实现了C#语言的自举,即使用C#编写、能编译C#代码。Roslyn还提供了C#的API接口,可以理解为Compiler as a Service(编译即服务)。有关Roslyn的内容,这里就不展开叙述了,我会在后续的博客中和大家分享。
C# Script
Visual Studio 2015 Update 1除了带来了C# Interactive和CSI之外,还引入了C# script的概念。将C#语句保存为.csx
文件,即可由csi或scriptcs来执行。这和其他的脚本文件类似,如python脚本、shell脚本。
例如,我们可以用任何的文本编辑器编写如下的C# script来输出斐波那契数列的前10个数字:
1 | IEnumerable<ulong> FibonacciNumbers() |
将其保存为app.csx
,在命令行中即可使用csi或者scriptcs来执行这段代码:
scriptcs for Visual Studio Code
现在最火的编辑器非VS Code莫属了。这里我分享一款插件——scriptcsRunner
,scriptcsRunner依托于scriptcs,可以非常方便的执行当前代码编辑区的全部或部分C#代码。
使用方法为:
- 选中部分代码(不选中任何代码表示执行当前代码编辑区的全部代码)
- 按F1键,输入“execute with scriptcs”(或者直接按Ctrl+Shift+R)
Azure Functions
Azure Functions是一个无服务器计算框架。无服务器计算在云基础设施之上建立新的抽象层,从而保证开发者无需再为服务器乃至云中的各类虚拟资源操心,将精力全部集中在业务逻辑上。这也是当今软件开发行业非常热门的技术。
Azure Functions支持C#、F#、JavaScript以及Java。从下面的这个例子可以看到,Azure Functions对C#的支持正是基于C# script。
上面的这个例子中,我们定义了一个Run方法,接收一个Http request,对其进行了简单的处理,然后回复一个Http Response。代码编写好了之后,保存即可运行,无需编译。需要做任何修改的话,直接改好保存即可。我们不用关心这段程序是运行在Windows上,还是在Linux上,而且应用实例会随着负载的变化自动扩展或收缩。
总结
本文首先介绍了REPL的概念以及一些支持C# REPL的工具和网站,然后谈到了由C# REPL演变而来的C# script,以及使用C# script来实现基于Azure Functions的无服务器计算应用。
现在主流的编程语言都有相应REPL环境。更有一些语言、工具提供了比简单的文本响应更强大的交互式体验,比如Apple为Swift语言提供了一个称为Playground的环境。
有了REPL之后,我们就不需要因为想测试某个类或者API而去创建一个Console Application或者Unit test project了。C# REPL改变了“编写-编译-执行”这种传统的编译型语言的使用体验。基于Roslyn的C# script,极大的释放了C#语言的生产效率,拓展了C#的使用范围。