如何在Ubuntu18.04上安装F
作为 Write for DOnations 计划的一部分,作者选择了 自由软件基金会 来接受捐赠。
介绍
F# 是一种开源编程语言,最初由 Microsoft Research 开发,用于扩展 .NET,这是 Microsoft 用于构建应用程序和服务的工具、库和语言集。 除了非常简洁的语法外,F# 还支持多种 范式,这意味着它可以进行不同类型的代码结构,尽管它主要是为了利用函数式编程方法而设计的。
采用特定的 范式 或代码风格,决定了我们思考和组织编程问题解决的方式。 使用 势在必行的方法 ,在 C++ 或 Java 等语言中使用的设计模型,开发人员逐步描述计算机必须如何完成任务。 它是关于编写一系列语句,这些语句将在程序执行时改变内存状态。 在我们遇到一些不正常的情况之前,这可以正常工作。 例如,考虑一个 共享对象 ,它被多个应用程序同时使用。 我们可能希望在另一个组件正在修改它的同时读取它的值。 这些是内存位置上的 并发操作 ,可能会产生数据不一致和未定义的行为。
在 功能代码设计 中,我们通过最小化 可变状态 的使用来防止此类问题,或者在我们制作它们之后可以更改的状态。 函数是这里的关键字,指的是作为参数提供的某些信息的数学变换。 功能代码通过将解决方案组合为一组要执行的功能来表达程序是什么。 通常,我们使用可以返回另一个函数或将其他函数作为输入的函数来构建逻辑层。
使用 F# 进行函数式编程带来了许多好处:
- 一种更具可读性和表现力的语法,可提高程序的可维护性。
- 由于可以隔离用于测试的无状态函数,代码不易损坏且更易于调试。
- 促进异步编程和更安全并发的本机构造。
- 访问 .NET 世界中的所有现有工具,包括社区共享包。
选择运行时
由于 F# 是跨平台的,因此通过不同的操作系统保持相似的执行模型行为是必不可少的。 .NET 通过运行时实现了这一点。 运行时系统 是一种软件,它协调使用特定编程语言编写的程序的执行,处理与操作系统的接口和内存管理等。
Linux 上实际上有两种 .NET 运行时实现:.NET Core 和 Mono。 从历史上看,.NET 只能在 Windows 上运行。 在那些日子里,人们可以求助于社区 Mono 项目在 Linux 和 macOS 等其他平台上运行 .NET 应用程序。 微软随后推出了 .NET Core,它是原始 .NET 框架的更快、模块化的子集,面向多个平台。
在本教程发布时,它们都可用于构建 Web 应用程序或命令行实用程序。 也就是说,.NET Core 不提供在 Linux 和 macOS 上创建 GUI 桌面应用程序的模型,而 Mono 是唯一支持移动和游戏平台的模型。 了解这些差异很重要,因为您选择的运行时将影响您将构建的程序。 您还可以选择同时安装 .NET Core 和 Mono,以适应所有用例并提高堆栈的效率。
在本教程中,您将使用 .NET Core 和 Mono 运行时在 Ubuntu 18.04 上设置 F# 编程环境。 然后,您将编写一些代码示例来测试和审查构建和编译方法。
先决条件
要完成本教程,您将需要基本熟悉命令行和运行 Ubuntu 18.04 的计算机,该计算机具有 非 root 用户和 sudo 权限 。
第 1 步 — 使用 .NET Core 安装 F#
Microsoft 为 F# 开发人员提供 .NET Core 软件开发工具包 (SDK)。 软件开发工具包是一组编程工具,允许程序员生成专门的应用程序并使其适应各种操作系统。 它传统上包括文本编辑器、语言支持、运行时和编译器以及其他组件。 在此步骤中,您将安装此 SDK。 但首先,您将注册 Microsoft 存储库并获取一些依赖项。
您将在命令行上完成安装和设置,这是一种与计算机交互的非图形方式。 也就是说,您将输入文本并通过文本从计算机接收反馈,而不是单击按钮。
命令行,也称为 shell 或 终端 ,可以帮助修改和自动化您每天在计算机上执行的许多任务,是软件开发人员必不可少的工具。 有许多终端命令需要学习,可以让你做更强大的事情。 有关命令行的更多信息,请查看 Linux 终端简介 教程。
在 Ubuntu 18.04 上,您可以通过单击屏幕左上角的 Ubuntu 图标并在搜索栏中输入 terminal
来找到终端应用程序。 单击终端应用程序图标将其打开。 或者,您可以同时按下键盘上的 CTRL
、ALT
和 T
键以自动打开终端应用程序。
打开终端后,使用 wget
命令下载包含一些所需文件、Microsoft 存储库配置和服务器通信密钥的包。
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
现在,添加 Microsoft 存储库并使用 dpkg -i
指令将软件包安装到您的系统中。
sudo dpkg -i packages-microsoft-prod.deb
接下来,激活 Universe 存储库,它在 Ubuntu 上是一个由社区维护的免费开源软件存档。 这将使您能够访问 apt-transport-https
,这是一个通过 HTTPS 启用 Ubuntu 包管理器 APT 传输的依赖项。
sudo add-apt-repository universe sudo apt install apt-transport-https
接下来,更新可用的下载:
sudo apt update
最后,安装.NET SDK的当前版本。 本教程将使用 2.2 版本:
sudo apt install dotnet-sdk-2.2
现在您已经安装了 .NET SDK,检查一切是否顺利的快速方法是尝试 .NET Core 命令行界面 (CLI),下载并安装 SDK 后,该界面将在 shell 中可用。 通过在终端中键入以下内容来显示有关 .NET 设置的信息:
dotnet --info
首次运行 dotnet
命令时,会显示如下所示的文本部分:
OutputWelcome to .NET Core! --------------------- Learn more about .NET Core: https://aka.ms/dotnet-docs Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs Telemetry --------- The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell. Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry ...
此通知与收集的数据有关,并说明某些 .NET CLI 命令会将使用信息发送给 Microsoft。 稍后您将禁用此功能; 现在,看看 dotnet --info
的输出。
片刻之后,终端将列出有关您的 .NET 安装的信息:
Output.NET Core SDK (reflecting any global.json): Version: 2.2.101 Commit: 236713b0b7 Runtime Environment: OS Name: ubuntu OS Version: 18.04 OS Platform: Linux RID: ubuntu.18.04-x64 Base Path: /usr/share/dotnet/sdk/2.2.101/ Host (useful for support): Version: 2.2.0 Commit: 1249f08fed .NET Core SDKs installed: 2.2.101 [/usr/share/dotnet/sdk] .NET Core runtimes installed: Microsoft.AspNetCore.All 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All] Microsoft.AspNetCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App] To install additional .NET Core runtimes or SDKs: https://aka.ms/dotnet-download
根据 SDK 版本,输出可能略有不同,但这确认 .NET Core 已准备好使用。
如前所述,遥测功能允许某些 .NET CLI 命令向 Microsoft 发送使用信息。 它默认启用,可以通过将 DOTNET\_CLI\_TELEMETRY_OPTOUT
环境变量设置为 1
来禁用它。 为此,请通过在文本编辑器中打开 .profile
环境自定义文件添加新行。 对于本教程,我们将使用 nano
:
nano ~/.profile
将以下行添加到 .profile
的末尾:
~/.profile
. . . export DOTNET_CLI_TELEMETRY_OPTOUT=1
按 CTRL
和 X
键退出 nano
。 当提示保存文件时,按 Y
,然后按 ENTER
。
您可以使用 source
命令激活新配置:
source ~/.profile
从现在开始,遥测将在启动时关闭。
此时,您已经安装了 .NET Core 运行时、语言支持和库,允许您运行和构建一些 .NET 应用程序。 dotnet
CLI 也可用于管理 .NET 源代码和二进制文件。 您可以开始构建 F# 项目,但如前所述,.NET Core 环境并未提供完全跨平台所需的所有构造。 例如,现在你不能用它来开发移动应用程序。
为了解决这个问题,在下一步中您将再次安装 F#,但这次使用 Mono。
第 2 步 — 使用 Mono 安装 F#
您可以使用 Mono 来填补 .NET Core 留下的剩余功能空白。 Mono 和 .NET Core 都基于相同的标准库,并且都支持 .NET 语言,但这就是相似之处。 它们使用不同的运行时、不同的 CLI 和不同的编译器,这使得它们可以并排安装以创建更可靠的编程环境。 在本节中,您将使用用于 .NET 编程的 Mono 工具来补充您的环境,并从命令行运行 F# 程序。
Ubuntu 存储库中提供了一个 Mono 版本,但这可能已经过时。 相反,将 官方 Mono 包存储库 添加到您的包管理器中:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
在前面的命令中,您使用 apt-key
检索密钥以保护从 Mono 官方存储库传输的包的安全。 然后,您将 Mono 包源添加到您的存储库列表中。
为 APT 添加新的源列表后,更新您的存储库:
sudo apt update
接下来,下载 Mono 工具。 与 .NET Core 不同,Mono 不包含 F# 工具,因此您将其作为单独的包下载。 使用以下命令安装 fsharp
和 mono-complete
元包:
sudo apt install mono-complete fsharp
注意:由于本次下载的大小,mono-complete
的安装过程可能需要一段时间。
完成后,您将拥有编译器 fsharpc
和一个名为 fsharpi
或简称为 FSI 的交互式 shell。 FSI 是外壳内部的一个环境,它以表达式的形式接收用户的输入,对其进行评估,然后输出结果并等待另一个输入。 这就像在传统的 shell 中键入命令并查看结果,除了这里,输入是 F# 表达式。 FSI 提供了一种快速的方法来测试代码或运行脚本。
使用以下命令激活 FSI:
fsharpi
这将启动交互式会话并将常规提示替换为 fsharpi
提示:
OutputMicrosoft (R) F# Interactive version 4.1 Copyright (c) Microsoft Corporation. All Rights Reserved. For help type #help;; >
您可以通过运行 #quit;;
返回到默认 shell。 在 fsharpi
中,每个命令行都以双分号结束。
让我们尝试使用 printfn
函数来呈现作为参数传递的消息的简单操作:
printfn "Hello World!";;
您将收到以下输出:
OutputHello World! val it : unit = () >
从前面的交互中,fsharpi
将表达式计算为 单位类型 值。 然后执行代码并打印结果及其类型。
fsharpi
也可以运行包含 F# 代码的文件。 该脚本必须以 .fsx
扩展名命名,并使用以下命令从 shell 执行:
fsharpi some_script.fsx
既然您知道 F# 安装正在运行,请留下 shell:
> #quit;;
安装 Mono 和 .NET Core 后,您现在可以编写任何类型的 F# 程序。 FSI 将允许您测试您的代码并在需要时运行一些脚本,但执行速度会很慢。 对于要执行的 F# 脚本,需要执行额外的步骤来将源代码转换为处理器可以理解的工件,因此速度很慢。 为了解决这个问题,在下一节中,您将使用 .NET Core 编译代码,创建可以立即由机器运行的独立二进制文件。
第 3 步 — 使用 .NET Core 编写和编译 F# 程序
在此步骤中,您将通过 .NET Core 提供的命令行编译器编译 F# 源代码。 这将使您的应用程序更快,并为特定系统生成预设的可执行包,使您的程序更易于分发。
编译是将源代码转换为二进制文件的转换过程。 完成这种转换的软件称为编译器。 .NET Core 依赖 dotnet
CLI 执行编译。 为了演示这一点,您将创建一个基本的 F# 源代码来查看编译案例。
dotnet
CLI 提供了完整的应用程序构建工具链。 通常,在 shell 中使用命令和 dotnet
驱动程序的关联来完成任务。 例如:
dotnet new
将创建一个项目dotnet build
将构建一个项目及其所有依赖项dotnet add package
将包引用添加到项目文件
下面将创建一个名为 FSharpHello
的新控制台项目。 -lang
选项设置您将使用的编程语言,而 -o
选项创建放置输出的目录。
dotnet new console -lang F# -o FSharpHello
完成后,导航到新创建的项目目录:
cd FSharpHello
该目录包含FSharpHello.fsproj
工程配置文件和用于存放临时对象文件的obj
文件夹。 您的默认源代码所在的 Program.fs
文件也存在。 在文本编辑器中打开它:
nano Program.fs
该文件已自动填充了 Hello World 程序:
程序.fs
// Learn more about F# at http://fsharp.org open System [<EntryPoint>] let main argv = printfn "Hello World from F#!" 0 // return an integer exit code
在这段代码中,您开始使用 open System
导入 System
模块,然后定义程序入口点,即程序从 shell 启动时的启动位置。 main
函数将调用 Hello World
消息打印到控制台并停止程序 (return an integer exit code
)。
退出文件。
要编译和运行此代码,请使用项目目录 ~/FSharpHello
中的以下内容:
dotnet run
程序将运行,将以下输出打印到屏幕上:
OutputHello World from F#!
请注意,与 FSI 一样,该程序需要一段时间才能运行。 正如我们之前提到的,可以通过生成可执行文件来更快地运行它,即可以由操作系统直接运行的二进制文件。 以下是如何实现这一点:
dotnet publish -c release -r linux-x64
这将生成可执行的 bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll
文件。 这是一个将在 64 位 Linux 架构上运行的共享库。 要为 macOS 系统导出通用可执行文件,您可以将 linux-x64
运行时标识符 (RID) 替换为 osx-x64
。
现在使用以下命令执行文件:
dotnet bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll
这一次,您将更快地收到输出,因为程序已经被翻译成二进制。
现在您知道如何在 .NET Core 中编译了,让我们看看 Mono 如何使用专用的 fsharpc
命令编译程序。
第 4 步 — 使用 Mono 编写和编译 F# 程序
Mono 的编译过程与 .NET Core 类似,但这次有一个特定的命令用于编译程序。 fsharpc
命令是工具,它是为编译而创建的。
这次,创建一个 hello.fs
文件并编写一些 F# 代码。 首先,返回您的主目录:
cd
接下来,打开一个名为 hello.fs
的新文件:
nano hello.fs
将以下行添加到文件中:
你好.fs
open System
如前所述,这会导入 System
模块或命名空间,让您可以访问内置的系统函数和对象,如 Console
。
现在,添加更多代码行:
你好.fs
open System let hello() = printf "Who are you? " let name = Console.ReadLine() printfn "Oh, Hello %s!\nI'm F#." name
这些新行定义了 hello()
函数来读取用户输入并打印反馈消息。
现在您可以添加最后几行:
你好.fs
open System let hello() = printf "Who are you? " let name = Console.ReadLine() printfn "Oh, Hello %s!\nI'm F#." name hello() Console.ReadKey() |> ignore
在这里,您调用函数 hello()
,然后使用 ReadKey()
方法以最后一次击键结束程序。
保存并退出文件。
现在使用 fsharpc
命令,使用 -o
标志来定义输出文件名并像这样编译 hello.fs
源代码:
fsharpc hello.fs -o hello
上述命令将生成一个 hello
可执行文件,您可以使用 mono
命令运行:
mono hello
这将为您提供以下输出并等待用户输入:
OutputWho are you?
如果您输入 Sammy
,您将得到以下信息。
OutputOh, Hello Sammy! I'm F#.
按最后一个键,程序将结束。
恭喜! 您已经使用 Mono 和 .NET Core 编写并编译了您的第一个 F# 程序。
结论
在本教程中,您安装了用于 F# 编程的工具,涵盖 .NET Core 和 Mono 环境。 您还测试了 F# 代码示例并构建了可执行文件。 这些是学习这种实用的函数式语言的第一步。
下一步可能是 学习 语言 并与 社区 取得联系。 此外,随着项目变得越来越复杂,您可能需要更有效地管理代码和资源。 NuGet 或 Paket 等包管理器是通向围绕 .NET 构建的强大生态系统的桥梁,也是组织大型程序的首选工具。