☰
OCaml 系统
5.2 版
2024 年 2 月
选择其他版本
OCaml 手册
目录
前言
关键字索引
OCaml API
OCaml 编译器 API
目录
第一部分 OCaml 简介
第 1 章
核心语言
1
基础知识
2
数据类型
3
函数作为值
4
记录和变体
4.1
记录和变体消歧
5
命令式特性
6
异常
7
惰性表达式
8
表达式的符号处理
9
格式化输出
10
Printf 格式
11
独立的 OCaml 程序
第 2 章
模块系统
1
结构
2
签名
3
函子
4
函子和类型抽象
5
模块和独立编译
第 3 章
OCaml 中的对象
1
类和对象
2
瞬时对象
3
自我引用
4
初始化器
5
虚方法
6
私有方法
7
类接口
8
继承
9
多重继承
10
参数化类
11
多态方法
12
使用强制转换
13
函数式对象
14
克隆对象
15
递归类
16
二元方法
17
友元
第 4 章
带标签参数
1
可选参数
2
标签和类型推断
3
标签建议
第 5 章
多态变体
1
基本用法
2
高级用法
3
多态变体的弱点
第 6 章
多态及其局限性
1
弱多态和变异
1.1
弱多态类型
1.2
值限制
1.3
放松的值限制
1.4
方差和值限制
1.5
抽象数据类型
2
多态递归
2.1
显式多态注释
2.2
更多示例
3
高阶多态函数
第 7 章
广义代数数据类型
1
递归函数
2
类型推断
3
反证情况
4
高级示例
5
错误消息中的存在类型名
6
存在类型的显式命名
7
非局部抽象类型的方程
第 8 章
类和模块的高级示例
1
扩展示例:银行账户
2
将简单模块用作类
2.1
字符串
2.2
Hashtbl
2.3
集合
3
主题/观察者模式
第 9 章
并行编程
1
域
1.1
加入域
2
Domainslib:一个用于嵌套并行编程的库
2.1
使用 domainslib 并行化斐波那契
2.2
并行迭代结构
3
并行垃圾收集
4
内存模型:简单部分
5
阻塞同步
5.1
与 systhreads 的交互
6
与 C 绑定交互
7
原子操作
7.1
无锁堆栈
第 10 章
内存模型:困难部分
1
为什么是弱一致性内存?
1.1
编译器优化
1.2
硬件优化
2
数据竞争自由意味着顺序一致性
2.1
内存位置
2.2
发生之前关系
2.3
数据竞争
2.4
DRF-SC
3
使用 DRF-SC 推理
4
局部数据竞争自由
5
内存模型的操作视图
5.1
非原子位置
5.2
域
5.3
非原子访问
5.4
原子访问
5.5
使用语义推理
6
不兼容操作
第二部分 OCaml 语言
第 11 章
OCaml 语言
1
词法约定
2
值
2.1
基本值
2.2
元组
2.3
记录
2.4
数组
2.5
变体值
2.6
多态变体
2.7
函数
2.8
对象
3
名称
4
类型表达式
5
常量
6
模式
7
表达式
7.1
优先级和结合性
7.2
基本表达式
7.3
控制结构
7.4
数据结构操作
7.5
运算符
7.6
对象
7.7
强制转换
7.8
其他
8
类型和异常定义
8.1
类型定义
8.2
异常定义
9
类
9.1
类类型
9.2
类表达式
9.3
类定义
9.4
类规范
9.5
类类型定义
10
模块类型(模块规范)
10.1
简单模块类型
10.2
签名
10.3
函子类型
10.4
with
运算符
11
模块表达式(模块实现)
11.1
简单模块表达式
11.2
结构
11.3
函子
12
编译单元
第 12 章
语言扩展
1
值的递归定义
2
递归模块
3
私有类型
3.1
私有变体和记录类型
3.2
私有类型缩写
3.3
私有行类型
4
局部抽象类型
5
一级模块
6
恢复模块的类型
7
在签名内进行替换
7.1
销毁性替换
7.2
局部替换声明
7.3
模块类型替换
8
类型级模块别名
9
在 open 语句中覆盖
10
广义代数数据类型
11
Bigarray 访问的语法
12
属性
12.1
内置属性
13
扩展节点
13.1
内置扩展节点
14
可扩展变体类型
14.1
私有可扩展变体类型
15
生成函子
16
仅扩展语法
16.1
扩展运算符
16.2
扩展字面量
17
内联记录
18
文档注释
18.1
浮动注释
18.2
项目注释
18.3
标签注释
19
扩展索引运算符
19.1
多索引符号
20
空变体类型
21
警报
22
广义 open 语句
23
绑定运算符
23.1
示例
23.2
约定
23.3
通用反糖化规则
23.4
变量绑定的简短符号(let-punning)
24
效应处理器
24.1
基础知识
24.2
并发
24.3
用户级线程
24.4
控制反转
24.5
语义
24.6
浅层处理器
第三部分 OCaml 工具
第 13 章
批处理编译 (ocamlc)
1
编译器概述
2
选项
3
模块和文件系统
4
常见错误
5
警告参考
5.1
警告 6:函数应用中省略标签
5.2
警告 9:记录模式中缺少字段
5.3
警告 52:脆弱的常量模式
5.4
警告 57:保护下的模棱两可的或模式变量
第 14 章
顶层系统或 REPL (ocaml)
1
选项
2
顶层指令
3
顶层和模块系统
4
常见错误
5
构建自定义顶层系统:
ocamlmktop
5.1
选项
6
原生顶层:
ocamlnat
(实验性)
第 15 章
运行时系统 (ocamlrun)
1
概述
2
选项
3
动态加载共享库
4
常见错误
第 16 章
本机代码编译 (ocamlopt)
1
编译器概述
2
选项
3
常见错误
4
运行由 ocamlopt 生成的可执行文件
5
与字节码编译器的兼容性
第 17 章
词法分析器和语法分析器生成器 (ocamllex, ocamlyacc)
1
ocamllex
概述
1.1
选项
2
词法分析器定义的语法
2.1
头部和尾部
2.2
命名正则表达式
2.3
入口点
2.4
正则表达式
2.5
动作
2.6
正则表达式中的变量
2.7
填充处理程序
2.8
保留标识符
3
ocamlyacc
概述
4
语法定义的语法
4.1
头部和尾部
4.2
声明
4.3
规则
4.4
错误处理
5
选项
6
一个完整的示例
7
常见错误
第 18 章
依赖生成器 (ocamldep)
1
选项
2
一个典型的 Makefile
第 19 章
文档生成器 (ocamldoc)
1
用法
1.1
调用
1.2
模块信息的合并
1.3
编码规则
2
文档注释的语法
2.1
文档注释的位置
2.2
Stop 特殊注释
2.3
文档注释的语法
2.4
文本格式
2.5
文档标签 (@-标签)
3
自定义生成器
3.1
生成器模块
3.2
处理自定义标签
4
添加命令行选项
4.1
编译和使用
第 20 章
调试器 (ocamldebug)
1
编译以进行调试
2
调用
2.1
启动调试器
2.2
初始化文件
2.3
退出调试器
3
命令
3.1
获取帮助
3.2
访问调试器状态
4
执行程序
4.1
事件
4.2
启动被调试程序
4.3
运行程序
4.4
时间旅行
4.5
杀死程序
5
断点
6
调用栈
7
检查变量值
8
控制调试器
8.1
设置程序名称和参数
8.2
程序的加载方式
8.3
文件搜索路径
8.4
工作目录
8.5
打开和关闭反向执行
8.6
调试器对
fork
的行为
8.7
加载新代码时停止执行
8.8
调试器和程序之间的通信
8.9
微调调试器
8.10
用户定义的打印机
9
其他命令
10
在 Emacs 下运行调试器
第 21 章
分析 (ocamlprof)
1
编译以进行分析
2
分析执行
3
打印分析信息
4
时间分析
第 22 章
OCaml 与 C 的接口
1
概述和编译信息
1.1
声明原语
1.2
实现原语
1.3
将 C 代码与 OCaml 代码静态链接
1.4
将 C 代码与 OCaml 代码动态链接
1.5
在静态链接和动态链接之间选择
1.6
构建独立的自定义运行时系统
2
value
类型
2.1
整数
2.2
块
2.3
堆之外的指针
3
OCaml 数据类型的表示
3.1
原子类型
3.2
元组和记录
3.3
数组
3.4
具体数据类型
3.5
对象
3.6
多态变体
4
对值的运算
4.1
类型测试
4.2
对整数的运算
4.3
访问块
4.4
分配块
4.5
抛出异常
5
与垃圾收集器和谐相处
5.1
简单接口
5.2
低级接口
5.3
延迟操作和异步异常
6
一个完整的示例
7
高级主题:从 C 到 OCaml 的回调
7.1
从 C 应用 OCaml 闭包
7.2
获取或注册 OCaml 闭包以供 C 函数使用
7.3
注册 OCaml 异常以供 C 函数使用
7.4
C 中的主程序
7.5
将 OCaml 代码嵌入 C 代码
8
带有回调的高级示例
9
高级主题:自定义块
9.1
struct custom_operations
9.2
分配自定义块
9.3
访问自定义块
9.4
编写自定义序列化和反序列化函数
9.5
选择标识符
9.6
终结块
10
高级主题:Bigarrays 和 OCaml-C 接口
10.1
包含文件
10.2
从 C 或 Fortran 访问 OCaml Bigarray
10.3
将 C 或 Fortran 数组包装为 OCaml Bigarray
11
高级主题:更便宜的 C 调用
11.1
传递未装箱的值
11.2
直接 C 调用
11.3
示例:调用 C 库函数而无需间接调用
12
高级主题:多线程
12.1
注册从 C 创建的线程
12.2
使用 systhreads 并行执行长时间运行的 C 代码
13
高级主题:与 Windows Unicode API 接口
14
构建混合 C/OCaml 库:
ocamlmklib
15
警告:内部运行时 API
15.1
内部变量和 CAML_INTERNALS
15.2
OCaml 版本宏
第 23 章
使用 Flambda 进行优化
1
概述
2
命令行标志
2.1
按轮次指定优化参数
3
内联
3.1
经典内联启发式算法
3.2
“Flambda” 内联启发式算法概述
3.3
处理特定的语言结构
3.4
内联报告
3.5
内联收益评估
3.6
推测控制
4
特化
4.1
特化收益评估
5
参数的默认设置
5.1
-O2 优化级别的设置
5.2
-O3 优化级别的设置
6
手动控制内联和特化
7
简化
8
其他代码移动转换
8.1
常量提升
8.2
顶层 let 绑定提升
9
拆箱转换
9.1
闭包变量的拆箱
9.2
特化参数的拆箱
9.3
闭包的拆箱
10
删除未使用的代码和值
10.1
删除冗余的 let 表达式
10.2
删除冗余的程序结构
10.3
删除未使用的参数
10.4
删除未使用的闭包变量
11
其他代码转换
11.1
将非逃逸引用转换为可变变量
11.2
用特化参数替换闭包变量
12
效果处理
13
静态分配模块的编译
14
抑制优化
15
使用不安全的操作
16
术语表
第 24 章
使用 afl-fuzz 进行模糊测试
1
概述
2
生成 instrumentation
2.1
高级选项
3
示例
第 25 章
使用运行时事件进行运行时跟踪
1
概述
2
架构
2.1
事件源
2.2
事件传输
3
用法
3.1
使用 OCaml API
3.2
使用工具
4
自定义事件
4.1
概述
4.2
跟踪自定义事件:示例
第 26 章
“尾模构造器” 程序转换
1
消歧
2
危险:脱离尾模构造器
3
转换的详细信息
4
当前限制
第 27 章
使用 ThreadSanitizer 运行时检测数据竞争
1
概述和用法
2
性能影响
3
假阴性和假阳性
4
运行时选项
5
链接指南
6
信号传递的变化
第四部分 OCaml 库
第 28 章
核心库
1
内置类型和预定义异常
2
模块
Stdlib
: 初始打开的模块
第 29 章
标准库
第 30 章
编译器前端
第 31 章
Unix 库:Unix 系统调用
第 32 章
Str 库:正则表达式和字符串处理
第 33 章
Runtime_events 库
第 34 章
线程库
第 35 章
Dynlink 库:动态加载和链接目标文件
第 36 章
最近删除或移动的库(Graphics、Bigarray、Num、LablTk)
1
Graphics 库
2
Bigarray 库
3
Num 库
4
Labltk 库和 OCamlBrowser
第五部分 索引
首页
前言 »
版权所有 © 2024 法国国家信息与自动化研究院