C# REPL

REPL

Read-Eval-Print Loop,简称REPL,中文意为“读取-求值-输出”循环,是一个简单的、交互式的编程环境。REPL对于学习一门新的编程语言具有很大的帮助,因为它能立刻对初学者做出回应。
大家第一时间能想到的估计是Python的REPL。默认情况下,Python安装完成后就自带了一个IDE,也即是Python Shell。
Python Shell

最初的REPL都是基于命令行的,Python也是支持的。
Python command

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也是支持的。
C# Interactive

从Visual Studio 2015开始,可以在项目上右键,使用如下的菜单项将当前项目引入到C# Interactive中,这样可以更加方便的调试相关的方法和代码。
Bring custom libraries to C# Interactive
对于其它旧版本的Visual Studio, 你需要手动的使用#r 加上程序集的全路径,将其引入到C# Interactive。
Bring custom libraries manually

CSI

如果你习惯于基于命令行的REPL,你可以在Developer Command Prompt for VS2015(或者更高的VS版本)中执行csi.exe这个命令。
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。
scriptcs

你也可以在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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IEnumerable<ulongFibonacciNumbers()
{
    yield return 1;
    yield return 1;
    ulong previous = 1, current = 1;
    while (true)
    {
        ulong next = checked(previous + current);
        yield return next;
        previous = current;
        current = next;
    }
}

var nums = FibonacciNumbers().Take(10);

foreach (var num in nums)
{
Console.WriteLine(num);
}

将其保存为app.csx,在命令行中即可使用csi或者scriptcs来执行这段代码:
app.csx

scriptcs for Visual Studio Code

现在最火的编辑器非VS Code莫属了。这里我分享一款插件——scriptcsRunner,scriptcsRunner依托于scriptcs,可以非常方便的执行当前代码编辑区的全部或部分C#代码。
scriptcsRunner

使用方法为:

  1. 选中部分代码(不选中任何代码表示执行当前代码编辑区的全部代码)
  2. 按F1键,输入“execute with scriptcs”(或者直接按Ctrl+Shift+R)

execute with scriptcs

Azure Functions

Azure Functions是一个无服务器计算框架。无服务器计算在云基础设施之上建立新的抽象层,从而保证开发者无需再为服务器乃至云中的各类虚拟资源操心,将精力全部集中在业务逻辑上。这也是当今软件开发行业非常热门的技术。

Azure Functions支持C#、F#、JavaScript以及Java。从下面的这个例子可以看到,Azure Functions对C#的支持正是基于C# script。
Azure Functions

上面的这个例子中,我们定义了一个Run方法,接收一个Http request,对其进行了简单的处理,然后回复一个Http Response。代码编写好了之后,保存即可运行,无需编译。需要做任何修改的话,直接改好保存即可。我们不用关心这段程序是运行在Windows上,还是在Linux上,而且应用实例会随着负载的变化自动扩展或收缩。

总结

本文首先介绍了REPL的概念以及一些支持C# REPL的工具和网站,然后谈到了由C# REPL演变而来的C# script,以及使用C# script来实现基于Azure Functions的无服务器计算应用。

现在主流的编程语言都有相应REPL环境。更有一些语言、工具提供了比简单的文本响应更强大的交互式体验,比如Apple为Swift语言提供了一个称为Playground的环境。
Swift Playground

有了REPL之后,我们就不需要因为想测试某个类或者API而去创建一个Console Application或者Unit test project了。C# REPL改变了“编写-编译-执行”这种传统的编译型语言的使用体验。基于Roslyn的C# script,极大的释放了C#语言的生产效率,拓展了C#的使用范围。

相关链接