标准ML是一种安全的、模块化的、严格的、功能性的、多态的 带有编译时类型检查的程序设计语言 和类型推断, 垃圾收集、异常处理、, 不可变数据类型和可更新引用, 抽象数据类型和参数化模块。 它有高效的实现和正式的定义 以证明其可靠性。
保险柜 ML是安全的,因为它是一个通过类型检查器的程序 无法转储核心,无法访问抽象数据类型的私有字段, 将整数误认为指针,否则“出错” 模块化 标准ML模块系统支持模块(称为 结构 ) 和接口(称为 签名 ); 模块的签名 确定模块中哪些组件和类型可见 从外面。 有一个灵活的结构匹配系统 签名:可以有几个不同的视图(签名) 具有相同的结构,并且可以有几个不同的 匹配相同签名的实现(结构)。 功能 ML具有高阶函数:可以传递函数 作为参数,存储在数据结构中,并作为结果返回 函数调用数。 函数可以静态嵌套在 其他功能; 这种词汇范围机制提供了以下能力 在运行时创建“新”函数。 严格 ML中的函数调用,如C、Pascal、C++、Java等的函数调用 它们的参数,然后再进入函数体。 这种语言叫做 严格的 或 呼叫值 , 与某些函数式编程语言相比 是 懒惰的 或 呼叫需求 .严格评估 程序员更容易推理程序的执行。 多晶的 ML支持多态函数和数据类型。 数据类型多态性 允许使用单个类型声明(例如“list”)来描述 整数列表、字符串列表、整数列表等; 但程序员可以放心,给定一个“int列表”, 每个元素实际上都是一个“int”。 函数多态性允许 要操作的单个函数声明(例如filterlist) 整数列表、字符串列表、整数列表, 等等,避免不必要的代码重复。 编译时类型检查 编译时类型检查语言中的程序员获得 执行速度更快、调试更少的优点: 程序员的许多错误可以在 发展过程; 这些类型可以让我们更清楚地思考 程序的规范。 类型推断 ML程序员不必写下每个 变量和函数参数:编译器通常可以 根据上下文计算类型。 这使得程序更加 简洁易写。 垃圾收集 自动释放无法访问的数据使程序 更简单、更清洁、更可靠。 异常处理 ML的异常处理机制——与之类似 在C++、Java、Ada等语言中——提供处理程序的动态嵌套 并消除了对特殊特殊情况的需要 从函数返回值。 不可变的数据类型 在ML中,大多数变量和 数据结构一旦创建和初始化 不可变的 ,意味着它们从未更改、更新或 存储到中。 这导致了一些强有力的不干涉保证 程序的不同部分对这些数据结构进行操作。 在函数语言(如ML)中,人们倾向于构建新数据 而不是 修改旧的。 可更新的引用 然而,ML确实具有可更新(可分配) 参考 类型, 因此,在破坏性更新最自然的情况下 表达算法的方式,可以直接表达。 抽象数据类型 ML支持信息隐藏,因此可以实现数据 其表示被只导出的接口隐藏的类型 函数来构造和操作类型。 参数化模块 A类 函子 ML程序模块是否接受签名 将另一个模块作为参数。 然后可以将函子应用于 与该签名匹配的任何模块。 该设施类似于 模板 C++或 通用的 Ada或Modula-3, 但在ML中,functor可以完全进行类型检查和编译 在将机器代码应用于其参数之前,先将其应用于机器代码; 这会导致 以更好地实现程序模块化。 高效的实施 诸如多态性、参数化模块和 对垃圾收集的依赖意味着将ML编译为高效的 机器代码需要C编译器中通常不需要的技术。 几个标准ML 编译器生成高质量的机器代码,包括 新泽西州标准ML 和 丑角ML作品 . 形式化定义 ML语言由 标准ML的定义 (修订版) (米尔纳,托夫特,哈珀,麦奎因,麻省理工出版社,1997) , 它用93页数学符号和 英语散文。 这本书不适合普通读者,但 认真学习编程语言和 它的存在和可访问性提供了一种实现依赖性 标准ML的制定。 可靠性证明 语言定义采用形式化表示法的结果 是那个能 证明 语言的重要属性 ,例如 确定性评估或类型检查的可靠性。