OCaml开始使用OCaml


备注

本节概述了ocaml是什么,以及开发人员为什么要使用它。

它还应该提到ocaml中的任何大型主题,并链接到相关主题。由于ocaml的文档是新的,您可能需要创建这些相关主题的初始版本。

在Windows上安装(本机)

前提

这些说明显示了在Windows中安装本机OCaml二进制文件的过程。如果你的操作系统是Windows 10 (Insider Preview) build 14316 或更高版本,你也可以在Windows上的Ubuntu上通过Bash安装OCaml。在这种情况下,请按照说明在Ubuntu上安装OCaml。

安装OCaml和Opam

下载OCaml官方发行版 。它包含OCaml编译器和Opam数据包管理器。假设您已在C:/OCaml 安装了该软件。为了确保你已经正确安装了OCaml open cmd.exe 并输入ocaml

如果您看到消息'ocaml' is not recognized as an internal or external command, operable program or batch file ,则需要将C:/OCaml/bin 到路径(环境变量)。

将OCaml二进制文件添加到路径

Control Panel > System and Security > System > Advanced system settings (on the left) > Environment Variables ,然后选择System Variable 选项卡中的Path ,然后选择Edit

添加C:/OCaml/bin; 到列表。

安装Cygwin

没有Cygwin你就不能使用Opam。事实上,如果你尝试在cmd.exe 打开Opam输入opam ,它会显示一条消息: Fatal error: exception Unix.Unix_error(20, "create_process", "cygcheck")

下载Cygwin并启动安装程序。请务必检查以下包裹:

  • automake的
  • diffutils的
  • libreadline
  • 使
  • M4
  • mingw64-x86_64的-GCC核心
  • mingw64-x86_64的-GMP
  • mingw64-x86_64的,OpenSSL的
  • mingw64-x86_64的-pkg配置
  • mingw64-x86_64的-sqlite3的
  • 补丁
  • rlwrap
  • 拉开拉链
  • wget的

假设您已在C:/cygwinC:/cygwin64 for 64bit版本)中安装了该软件。打开cmd 并键入wget (或C:/cygwin/bin 存在的可执行文件之一)以检查是否可以使用Cygwin可执行文件。如果可执行文件无法打开,请将C:/cygwin/bin 到Path(环境变量)。

配置Opam

打开cmd.exe 并键入opam init 以配置Opam。

然后安装ocamlfind (OCaml编译器的一部分)

opam install ocamlfind
opam config env
 

检查是否安装了ocamlfind ,在cmd.exe 键入它。

命令opam config env 用于将opam 的可执行文件目录添加到环境路径。如果在注销后你无法再访问ocamlfind ,你可以手动添加它添加到路径中的以下行: C:/Users/<your user>/Documents/.opam/system/bin/

安装包

使用命令opam install xyz 通过Opam安装软件包,其中xyz 是软件包的名称。

安装UTop

尝试运行命令opam install utop 。如果没有错误,则键入utop 将打开可执行文件。

如果你看到了这条消息

[ERROR] The compilation of zed failed at "ocaml setup.ml -build".
 

你必须手动安装单个包。再试一次输入:

opam install zed
opam install lambda-term
opam install utop
 

lambda-termutop 可能无法安装。请参阅“疑难解答”部分。

安装Core

您可以使用opam install core 安装core 软件包。在Windows 64位版本(和64位Cygwin)上,您将看到以下错误:

[ERROR] core is not available because your system doesn't comply with os != "win32" & ocaml-version = "4.02.3".
 

疑难解答:无法创建常规文件

如果名称为xyz.10.1 软件包无法安装(其中xyz是软件包的名称,其版本为10.1),并显示以下消息:

install: cannot create regular file '/cygdrive/c/Users/<your user>/Documents/.opam/system/bin/<something>': File exists
 

你必须进入这个目录:

C:\Users\<your user>\Documents\.opam\repo\default\packages\<xyz>\<xyz.10.1>\files 
 

并删除文件xyz.10.1.install

疑难解答:无法加载共享库

如果你试图打开一些Opam的包(例如: utop ),你会看到这个错误:

Fatal error: cannot load shared library dlllwt-unix_stubs
Reason: The specified module could not be found.
 

再次运行opam config env 并尝试重新打开可执行文件。

安装或设置

安装OPAM

OPAM是OCaml的包管理器。它可以轻松地为您构建和管理编译器版本和OCaml库。

在操作系统上安装OPAM的最简单方法是使用系统的软件包管理器。例如apt-get,yum或homebrew。

Mac OSX安装说明

更新自制程序并安装OPAM。

brew update
brew install opam
 

Ubuntu安装说明

add-apt-repository ppa:avsm/ppa
apt-get update
apt-get install ocaml opam
 

从源代码编译

wget http://caml.inria.fr/pub/distrib/ocaml-4.03/ocaml-4.03.0.tar.gz
tar xf ocaml-4.03.0.tar.gz
cd ocaml-4.03.0
./configure -prefix installation_path
make world.opt
make install
 

初始化OPAM

安装OPAM后,运行opam init 并按照说明操作。

完成后,您应该能够从shell运行OCaml解释器。

$ ocaml
        OCaml version 4.03.0

#
 

你在OCaml的第一个项目

既然OCaml发行版可以在您最喜欢的操作系统上使用,我们可以在OCaml中创建您的第一个程序:Hello World!

我们有不同的方式来启动OCaml程序。

REPL(顶级)

您可以使用顶层以 交互方式执行代码。使用OCaml toplevel ,您可以编写和执行OCaml代码,作为UNIX shell。之后, 顶层会立即检查您的代码类型。因此,您可以快速轻松地测试代码的某些部分,而无需编译和执行。

您可以使用ocaml 命令启动顶层 。然后,你可以写一个OCaml 句子结束;; 立即评估。 toplevel显示表达式的类型和值, 紧接着

# "Hello Worlds!";;
- : string = "Hello Worlds!"
 

也可以在文件上启动顶层 。你可以看到这个解释

为了方便您在顶层输入,你可以像使用工具leditrlwrap 提供了一些功能(如输入历史):

 $ ledit ocaml

 $ rlwrap ocaml
 

编译为字节码

我们有两个不同的编译器,一个编译为字节码 ,另一个编译为本机代码。第一个与Java虚拟机的字节码相同。因此, 字节码效率较低,但更便携。

我们有一些OCaml编译器使用的扩展文件:

延期定义
.ml 源代码(以C表示.c
.mli 接口(如C中的.h
.cmo ocamlc字节码中编译的源代码
.cmi 接口代码由ocamlc 编译
.cmx.o ocamlopt 在本机代码中编译的源代码
.cma 字节码中的库(一些*.cmo 桶)
.cmxa.a 本机代码中的库
.cmxs 本机代码中的库(加载动态)

字节码编译器是ocamlc

您有不同的常见选项:

  • -c :编译没有链接过程的源文件(生成可执行文件)。因此,命令ocaml -c foo.ml 生成.cmo 文件。与不需要编译头文件的C不同,在OCaml中编译.mli 文件是必要的: ocaml -c foo.mli

您需要先编译接口。之后编译源文件时,OCaml会尝试检查实现是否与接口匹配。

.mli 文件不是强制性的。如果编译没有.ml 文件的.mli 文件,OCaml将自动生成.cmi 文件。

  • -o :将一些.cmo 文件编译为可执行文件。例如: ocamlc -o program foo.cmo bar.cmo 。这些文件需要由第一个文件没有依赖关系的依赖项排列。

  • -I :表示编译器可以找到编译所需文件的其他目录(如接口或源代码)。它与C编译器中的-I 相同。

我们还有很多其他选择。您可以查看手册以获取更多信息。

因此,您现在可以编写hello.ml ,并使用ocamlc -o hello hello.ml 编译此文件以生成字节码程序:

let () = print_endline "Hello World!"
 

let () = ... 是程序的第一个条目(就像C中的main 一样)。之后,我们使用函数print_endline (由标准库提供)和参数"Hello World!" 使用标准输出中的换行符打印Hello Worlds

编译之后,您将获得编译器和程序hello 自动生成的.cmo 文件和.cmi 文件。您可以打开您的程序,在此文件的顶部,您可以看到:

#!/usr/local/bin/ocamlrun
 

这意味着您的程序需要ocamlrun 程序(由发行版提供)来执行字节码 (如JVM)。

编译到本机代码

我们有另一个生成本机代码的编译器。编译器是: ocamlopt 。但是,生成的可执行文件无法在大多数其他体系结构上运行。

ocamlopt 使用与ocamlc 相同的选项,因此您可以执行ocamlopt -o hello hello.ml 。之后,您可以看到.cmx.o 文件。

最后,从您的字节码 /本机代码程序中,您可以执行:

$ ./hello
Hello World!
$