安装 OCaml
如果您只需要跟随本书中的代码示例,您实际上不需要安装 OCaml!每页上的代码在浏览器中可执行,如前面在这本前言中所述。
如果您想进一步,但还不准备花时间安装 OCaml 自己,我们提供了一个带有预安装的 OCaml 虚拟机,运行在 Linux 操作系统中。
但是如果你想自己做 OCaml 开发,你需要在机器上安装它。没有一种通用的“正确”方法来实现这个目标。下面提供的指南是 Cornell CS 3110 课程的一部分,这个课程有其自己的目标和需求,远远超出了只是 OCaml。但是,即使你不是这个课程的学生,你也可能会发现这些指南很有用。
我们将要安装:
- Unix 开发环境
- OPAM,OCaml 软件包管理器
- 一个 OPAM 开关带有 OCaml 编译器和一些包
- Visual Studio Code 编辑器,具有 OCaml 支持
安装过程将主要依赖于计算机的终端或文本界面。如果您不太熟悉它,您可能想学习一下终端教程。
如果这是你第一次安装开发软件,那么值得注意的是,“关闭”不算:尝试继续执行错误通常只会导致更糟糕的错误,并且感到沮丧。这是因为我们正在安装一座软件塔,每层塔都基于前一个。如果你没有建立在坚实的基础上,这整个结构可能会塌陷。好消息是,如果你遇到错误,你可能不是唯一的人。快速搜索一下 Google 通常可以找到他人已经发现的解决方案。当然,也要对互联网上的随机陌生人的建议进行批判性思考。
让我们开始!
Unix 开发环境
首先,升级您的操作系统。如果您计划进行任何主要的操作系统升级,请现在做。否则,当您实际升级时,您可能需要重复部分或全部安装过程。事先处理更好。
Linux
如果您已经在运行 Linux 了,那么这个步骤就完成了。请继续到下面的安装 OPAM步骤。
Mac
以下面层面,macOS 实际上已经是一个基于 Unix 的操作系统。但是,您需要一些开发工具和一个 Unix 包管理器。有两个选择:Homebrew 和 MacPorts。从本书籍和 CS 3110 的角度来说,这并不重要:
- 如果你已经习惯使用某个编辑器,随时继续使用它。确保在继续这些指令之前运行其更新命令。
- 否则,选择一个,然后按照其网站上的安装说明进行安装。Homebrew 的安装过程通常更简单、更快,这可能会使您朝这个方向发展。如果您选择 MacPorts,确保遵循其页面上的所有详细说明,包括 XCode 和 X11 服务器。不要同时安装 Homebrew 和 MacPorts;它们不能共存。如果您后来改变主意,请在安装另一个之前卸载其中的一个。
安装完成 Homebrew 或 MacPorts 更新后,请继续安装 OPAM,以下。
Windows
Unix 开发在 Windows 中是由 WindowsSubsystem for Linux(WSL)所可能的。如果您拥有 Windows 的最新版本(20262,2020 年 11 月发布或更新),那么 WSL 安装起来很容易。如果您没有那么新的版本,可以尝试运行 Windows 更新以获取它。
如果您在安装 WSL 时遇到关于“虚拟机”的错误,您可能需要在机器的 BIOS 中启用虚拟化。该操作步骤取决于您的机器制造商。尝试搜索“启用虚拟化 [制造商] [型号]”,将制造商和型号替换为您的机器信息。这一页可能也会有助于您。
使用最新版本的 Windows,并假设您从未安装过 WSL,以下是您需要做的事情:
- 打开 Windows PowerShell 以管理员身份。要做到这一点,请点击“开始”,输入“PowerShell”,它应该显示为最佳匹配。点击“以管理员身份运行”,然后单击“允许更改”以允许更改。
- 运行
wsl --install
。(如果您已经安装了 WSL,但之前没有安装 Ubuntu,那么请运行wsl --install -d Ubuntu
。)当 Ubuntu 下载完成后,它可能会询问您是否需要重新启动。请重新启动。安装将在重新启动后自动恢复。 - 你将被提示创建一个 Unix 用户名和密码。你可以使用任何用户名和密码,你愿意。它与你的 Windows 用户名和密码无关(虽然你可以重复使用它们)。不要在用户名中输入空格。不要忘记你的密码。你将需要它未来。
不要继续执行这些指令,如果您没有被提示创建 Unix 用户名和密码。可能 Ubuntu 安装未完成正确。尝试从 Windows 开始菜单中卸载 Ubuntu 并重新安装它。
现在跳到下面的“Ubuntu 设置”段落。
没有最新版本的 Windows,您需要遵循 Microsoft 的手动安装指南。WSL2 是 OCaml 所 prefer 的选择(WSL2 还提供了性能和功能改进),因此,如果可以,请安装 WSL2。
Ubuntu 安装。这些剩余的指令假设您安装了 Ubuntu(22.04)作为 Linux 发行版。这是 WSL 中的默认发行版。在原则上,其他发行版也应该可以工作,但是可能需要从现在开始使用不同的命令。
打开 Ubuntu 应用程序。(可能已经打开,如果你刚刚安装了 WSL。)你将在 Bash 提示符下,这个界面看起来像这样:
user@machine:~$
如果该提示看起来像
root@...#
,那么出了问题。您在上一步中为 Ubuntu 创建了 Unix 用户名和密码吗?如果是这样,那么这个提示中的用户名应该是您之前选择的那个,而不是root
。如果您的提示看起来像root@...#
,不要继续执行这些指令。可能需要卸载 Ubuntu 并重新安装它。
在 Windows 终端的当前版本中,Ctrl+Shift+C 将复制到终端,而 Ctrl+Shift+V 将粘贴到终端。请注意,您需要将 Shift 作为该快捷键的一部分。在 older 版本的终端中,您可能需要在终端设置中找到一个选项以启用这些键盘快捷键。
更新 APT 包管理器,这是安装 Unix 软件包的工具,可以使用以下命令:
sudo apt update
你将被提示输入你选择的 Unix 密码。前缀 sudo
表示以管理员身份运行命令,也就是所谓的“超级用户”。换言之,这个命令应该以超级用户身份执行,因此是“sudo”。
运行命令时使用
sudo
可能危险,应该谨慎。不要养成将sudo
加在命令前面的习惯,也不要随意尝试没有原因的操作。
现在运行这个命令来升级所有 APT 软件包:
sudo apt upgrade -y
然后安装一些有用的包,我们将需要它们:
文件系统。WSL 拥有自己的文件系统,这与 Windows 文件系统不同,虽然存在访问每个的方法。
- 当你启动 Ubuntu 并获得 $ 提示符时,你就在 WSL 文件系统中。你的家目录在那里被命名为
~
,这是对/home/your_ubuntu_user_name
的内置别名。你可以运行explorer.exe
. (注意最后的点)以在 Windows 探索器中打开你的 Ubuntu 家目录。 - 从 Ubuntu 中,您可以访问您的 Windows 主目录在路径
/mnt/c/Users/your_windows_user_name/
- 从 Windows 资源管理器,您可以在左侧列表中找到 Linux 图标,访问 Ubuntu 主目录(靠近“这个计算机”和“网络”),然后导航到 Ubuntu →
home
→your_ubuntu_user_name
。或者,您可以直接输入 Windows 资源管理器路径栏: \wsl$\Ubuntu\home\your_ubuntu_user_name 。
实践访问您的 Ubuntu 和 Windows 主目录现在,并确保您可以识别当前是哪一个。对于高级信息,请查看 Microsoft 关于 Windows 和 Linux 文件系统的指南。
我们建议将 OCaml 开发工作存储在 Ubuntu 主目录中,而不是 Windows 主目录中。由此,微软也推荐这样做,如上链接中的指南所示。
安装 OPAM
Linux。遵循您的发行版说明。
Mac。如果您使用 Homebrew,运行以下命令:
brew install opam
如果您使用 MacPorts,运行以下命令:
sudo port install opam
Windows。从 Ubuntu 运行以下命令:
sudo apt install opam
初始化 OPAM
不要在任何
opam
命令前面加上sudo
。那样将会破坏您的 OCaml 安装。
Linux、Mac 和 WSL2。运行:
opam init --bare -a -y
不要担心如果您收到一条关于确保 .profile
在 .bashrc
中“充分来源”的提示。您不需要对此进行任何操作。
WSL1。希望您正在运行 WSL2,而不是 WSL1。但是在 WSL1 中,请运行:
opam init --bare -a -y --disable-sandboxing
因为 OPAM 和 WSL1 存在问题,需要禁用沙盒。
创建 OPAM 切换
A switch 是 OCaml 的一个命名安装,它具有特定的编译器版本和一组包。您可以拥有多个开关,并且可以在它们之间切换——因此得名。为本学期的 CS 3110 创建一个开关,运行以下命令:
opam switch create cs3110-2024sp ocaml-base-compiler.5.1.1
如果那个命令失败说 5.1.1 编译器找不到,你可能以前安装过 OPAM 现在需要更新它。使用
opam update
进行更新。
你可能会被提示运行下一个命令。无论你是否执行它,因为我们即将做的下一步操作(即,登出)都无关紧要。
现在我们需要确保您的 OCaml 环境正确配置。退出操作系统(或直接重启)。然后重新打开终端,运行以下命令:
opam switch list
你应该获得输出类似这样
# switch compiler description
→ cs3110-2024sp ocaml-base-compiler.5.1.1 cs3110-2024sp
如果您之前有过 OCaml 开发经验,那可能会出现其他行。下面是需要检查的内容:
- 你不能收到警告“环境不与当前开关同步。你应该运行
eval $(opam env)
”。如果以下两个问题也出现,你需要先解决这个问题。 - 必须在
cs3110-2024sp
开关旁边的第一列中有一个正确的箭头。 - 那个开关必须具有正确的名称和正确的编译器版本,5.1.1。
如果你收到关于
opam env
的警告,事情出了错。你的 shell 可能没有运行opam init
所安装的 OPAM 配置命令。你可以尝试opam init --reinit
来看是否能解决问题。另外,请确保你真的退出了操作系统(或重新启动)。
继续安装我们需要的 OPAM 包:
opam install -y utop odoc ounit2 qcheck bisect_ppx menhir ocaml-lsp-server ocamlformat
确保复制整个行。您将获得关于编辑器配置的输出,除非您打算使用 Emacs 或 Vim 进行 OCaml 开发,可以安全地忽略该输出。我们将在这些说明中使用 VS Code 作为编辑器,所以让我们忽略它。
你现在应该能够启动 utop,OCaml 通用终端。
utop
您应该看到一条消息“欢迎使用 utop 版本…(使用 OCaml 版本 5.1.1)!”如果 OCaml 版本不正确,那么你可能遇到环境问题。见上面的
opam env
命令提示。
输入 3110 后跟两个分号。按回车键。#是 utop 提示符;你自己不需要输入它。
# 3110;;
- : int = 3110
停止欣赏 3110 多么美丽。然后退出 utop。注意这次你必须在 quit 指令前添加额外的#符号。
# #quit;;
退出的更快方法是键入 Control+D。
双重检查 OCaml
如果您遇到安装问题,请遵循以下检查指南。其中一些重复了我们之前提供的提示,但我们将它们都放在一起,以帮助诊断任何问题。
首先,重新启动您的计算机。我们需要一个干净的白板来进行这个双重检查程序。
第二,运行 utop,并确保它工作正常。如果不工作,请查看以下常见问题:
-
你在正确的 Unix 提示符中吗? 在 Mac 上,确保你在 Terminal 中的默认 Unix shell 中,不要手动运行 bash 或 zsh 或其他 shell。 在 Windows 上,确保你在 Ubuntu 应用程序中,而不是 PowerShell 或 Cmd。
-
OPAM 环境是否已经设置?如果 utop 不是 recognized 命令,运行
eval $(opam env)
然后再次尝试运行 utop。如果 utop 现在工作正常,那么你的登录 shell 可能没有正确地激活 OPAM 环境;你不需要手动使用eval
命令激活环境。可能是之前执行了opam init
命令时出了问题。要解决这个问题,请按照以下“redo”指令进行操作。 -
您的开关列表了吗?运行
opam switch list
,确保有一个名为cs3110-2024sp
的开关,它具有 5.1.1 编译器,并且是活动开关(以箭头旁边表示)。如果该开关存在但不是活动开关,请运行opam switch cs3110-2024sp
,然后查看 utop 是否工作。如果该开关不存在,请遵循以下“redo”指令。
红色重做指令:使用 rm -r ~/.opam
删除 OPAM 目录。然后,返回上面的 OPAM 初始化步骤,并继续前进。特别注意在执行上述 OPAM 命令时不要遗漏任何部分,因为有时会出现错误。最后,重新启动并检查 utop 是否仍然可用。
你想让 utop 在重启后立即工作,不需要输入任何额外命令。
Visual Studio Code
Visual Studio Code 是一款适合 OCaml 代码编辑器的不错选择。(如果您已经是 Emacs 或 Vim 的高级用户,那么它们也很不错。)
首先,下载并安装 Visual Studio Code(以下简称 VS Code)。启动 VS Code。打开扩展面板,可以通过“视图”→“扩展”,或者单击左侧图标栏中的四个小方块图标,其中右上角的方块与其他三个方块分离。
在以下指令中,您将被要求“打开命令面板”。要做到这一点,请转到视图→命令面板。同时,也有操作系统特定的键盘快捷键,您将看到该快捷键的右侧,在该视图菜单中的“命令面板”字样下方。
第二步,如果您使用的是 Windows 或 Mac,请遵循以下一步骤:
- Windows-only:安装“WSL”扩展。
- Mac 仅:打开命令面板,输入“shell command”,找到“Shell Command: 安装‘code’命令到 PATH 中”命令。运行它。
第三,無論你使用的是哪种操作系统,请先关闭所有打开的终端窗口或直接注销或重启,以便让新的路径设置生效,然后你将能够从终端中启动 VS 代码。
第四,仅在 Windows 上,打开命令面板并运行“WSL:连接到 WSL”命令。(如果您使用 Mac,则跳过下一步。)第一次执行此操作时,它将安装一些额外的软件。完成后,您将看到 VS Code 窗口底部左侧的“WSL:Ubuntu”指示符。确保在继续下一步之前,您已经看到“WSL:Ubuntu”。如果您只看到一个 > < 图标,请点击它,然后从打开的命令面板中选择“连接到 WSL”。
五、再次打开 VS Code 扩展面板。搜索并安装来自 OCaml Labs 的“OCaml 平台”扩展。确保安装该扩展时名称与“OCaml 平台”完全匹配。
OCaml 名为“OCaml”或“OCaml 和 ReasonIDE”的扩展不是正确的。它们都是老旧的,已经不再由开发者维护了。
双重检查 VS Code
让我们确保 VS 代码的 OCaml 支持正在工作。
- 重新启动你的计算机一次。(是的,这真的不应该必要。但现在它会检测许多潜在错误,因此这笔努力值得。)
- 开启一个新的 Unix 壳。Windows:记住这是 Ubuntu,而不是 PowerShell 或 Cmd。Mac:记住你不应该手动切换到不同的 shell,输入
zsh
或bash
。 - 导航到您选择的目录,尽量是一个家目录的子目录。例如,您可能在家目录中创建一个用于您的 3110 工作的目录:
mkdir ~/3110
cd ~/3110
在那个目录中运行以打开 VS 代码:
code .
去到“文件”→“新建文件”。将文件以名称 test.ml
保存。VS Code 应该为其添加橙色骆驼图标。
- 类型以下 OCaml 代码,然后按 Return/Enter 键:
let x : int = 3110
当你输入代码时,VS Code 应该将语法着色、建议一些完成项,并在代码行上添加一个小注释。尝试将你输入的 int
改为 string
。下面 3110
应该出现一条波浪线。鼠标悬浮在它上面可以看到错误信息。同时,在“视图”→“问题”中也可以看到它。将整数加上双引号,使其变成字符串,这个问题就解决了。
如果您不观察这些行为,安装出了问题。下面是解决方法:
- 确保从您启动 VS Code 的同一个 Unix 提示符下,可以成功完成 OPAM 开关的双重检查指令:您可以运行 utop 吗?当前是否激活了正确的开关?如果不是,那么这是你需要解决的问题。然后返回到 VS Code 问题。如果现在已经修复了。
- 如果您在 WSL 中运行 VS Code,但它并没有添加上述描述的语法高亮和 squiggles,那么请检查 VS Code 窗口底部左侧是否显示“WSL”指示符。如果您不见到,请确保安装了“WSL”扩展,并且从 Ubuntu 启动 VS Code,而不是从 PowerShell 或 Windows GUI 启动。如果您已经看到,请确保安装了“OCaml 平台”扩展。
如果您仍然遇到问题,请尝试卸载 VS Code,重新启动,然后从头开始执行上述安装指令。请注意任何警告或错误信息。
VS Code 中遇到任何问题时,不管您在线找到什么建议,请不要在 VS Code 设置文件中硬编码路径。这只是解决问题的 Band-Aid,而不是真正问题的根源。实际上,真正的问题可能是 OCaml 环境问题,您可以使用上述 OCaml 双重检查指令来调查。
VS Code 设置
我们建议调整一些编辑器设置。打开用户设置 JSON 文件,方法如下:(一)转到视图→命令面板,(二)输入“用户设置 json”,(三)选择打开用户设置(JSON)。将这些设置粘贴到窗口中:
{
"editor.tabSize": 2,
"editor.rulers": [ 80 ],
"editor.formatOnSave": true
}
保存文件并关闭标签。
使用 VS 代码协作
VS Code 的 Live Share 扩展使得与其他人类一起编写代码变得轻松和有趣。您可以像在 Google 文档中协作一样编辑代码。它甚至支持共享语音通道,因此不需要单独启动 Zoom 会议。要安装和使用 Live Share,请遵循 Microsoft 的教程。
如果您是康奈尔学生,请使用您的 Microsoft 账户登录,而不是 GitHub。输入您的康奈尔 NetID 电子邮件,例如 your_netid@cornell.edu
。这将带您到康奈尔的登录网站。使用与您的 NetID 相关联的密码。