这本书将教你如何使用TLA+语言编写计算机系统的specification。全文篇幅比较长,但大多数人只需要读Part Ⅰ,即前83页的内容的就够了,这部分包含了大多数工程师需要了解的编写specification有关的知识;至于学习它所需要的知识背景,假定为工程学或计算机科学的本科生所期望掌握的的数学和计算机知识。PartⅡ将为期望精进的读者提供更深入的内容。本书的其余部分是参考手册——Part Ⅲ介绍TLA+工具,Part Ⅳ介绍TLA+语言本身。
TLA官网http://lamport.org提供了随书资源,包括TLA+工具、练习、参考资料和更正清单。你也可以在搜索引擎上,用下面这21个字母的字符串uidlamporttlahomepage找到上述页面,但不要把这个字符串放在会出现在网上的任何文档里面。
What Is a Specification?
Writing is nature's way of letting you
known how sloppy your thinking is.
——Guindon
Specification是系统应该做什么的书面定义。定义一个系统有助于我们更好地理解它。在建立一个系统之前先了解它,在实现之前先写一个Specification是个好主意。
本书是关于如何定义系统的行为属性,也可称其为功能或逻辑属性。这些属性定义系统应该执行什么操作。还有其他重要的属性类型,我们不考虑,包括性能属性。最差情况的性能通常可以表示为行为属性,例如,第9章说明如何定义系统必须在一定时间内做出反应。不过,定义平均性能也超出了此处描述的方法的范围。
我们编写specification的基本工具是数学。数学是让你知道你的书写有多不严谨的最自然方式,因为用不精确的语言(例如英语或中文)很难做到精确。 在工程实践中,不精确会导致很多错误,所以科学和工程学采用数学作为基本语言。
本书中用到的数学会比你从小到大使用的的数学更正式一些。形式数学让你能很自然地知道你从小使用的数学有多马虎。 大多数数学家和科学家写作中用到的数学并不十分精确,只能说小规模情况下精确,但大规模情况下不精确。每个方程式都是一个精确的断言,但您必须阅读随附的文字才能理解方程式之间的关系以及定理的确切含义。逻辑学家已经发展出了消除这些解释性的文字并使数学完全形式化,从而完全精确的方法。
大多数数学家和科学家都认为形式数学很长,很乏味,我认为他们错了,普通数学也可以用一种精确的,完全形式化的语言紧凑地表达。在第11章的DierentialEquations模块中,只需要花费大约20多行就可以确定一个任意的微分方程的解。但是很少有specification需要用到如此复杂的数学,大多数只需要简单应用一些标准数学概念即可。
Why TLA+?
我们通过描述其在执行过程中可能会发生的行为来定义系统。 1977年,Amir Pnueli引入了时态逻辑来描述系统行为。从理论上来讲,可以用单个时态逻辑公式来描述系统,但在实际运用中却行不通。 他的时态逻辑是描述系统某些属性的理想选择,但用在其他属性上却很尴尬。因此,通常将它与更传统的系统描述方式结合在一起。
在1980年代后期,我发明了TLA,即基于Action的时态逻辑——这是Pnueli原始逻辑的简单变体。 TLA使得通过单个公式描述系统变得切实可行。TLA specification的大部分可以用一般的、非时态逻辑的数学公式组成。时态逻辑仅在描述那些擅长描述的属性时才发挥重要作用。 TLA还提供了一种很好的方式来规范系统的推理模式,这种模式被称为断言推理,在实践中被证明是最有效的。不过,本书是关于specification的,在其中几乎不带证明。
时态逻辑设定了用于表达普通数学的基本逻辑。有许多方法可以使普通数学形式化, 大多数计算机科学家都喜欢使用近似于他们熟悉的编程语言的方法。 相反的,我选择了大多数数学家更喜欢的“逻辑”——通常逻辑学家将其称为一阶逻辑和集合论。
TLA为描述系统提供了数学基础。要编写specification,我们需要在该基础之上构建完整的语言体系。我最初认为该语言应该是某种抽象的编程语言,其语义将基于TLA。 一开始我不知道用哪种编程语言结构最好,所以决定直接用TLA编写specification,然后在需要的时候再引入编程语言。令我惊讶的是,到后来我发现我不需要这么做了,我需要的只是一种用于书写数学公式的健壮语言。
尽管数学家已经发展了书写公式的科学,但是他们还没有将其转化为工程应用。他们为小型数学应用开发了符号,但对于大型数学模型却没有。真实系统的specification可能长达数十甚至数百页,数学家知道如何编写20行的公式,而不是长达20页的公式。因此,我不得不在语言中引入书写长公式的符号方法, 这些方法得益于我从编程语言中学到的将大型specification模块化的技能。
我将这种语言称之为TLA +。在编写不同系统的specification时,我对TLA +逐步进行了提炼。但是在最近几年中,它变化不大。我发现TLA +可以很好地定义从程序接口(API)到分布式系统的各种系统。它可以用来为几乎任何种类的离散系统编写精确的形式化描述。尤其适合描述异步系统,即具有不严格执行lock-step组件的系统。
About this Book
本书的Part I包括第1至第7章,是本书的核心,需要在从头到尾阅读。它描述了如何定义称为安全属性(safety properties)的属性类别,这也是大多数工程师在编写specification时需要知道的,定义这些属性几乎不需要使用任何时态逻辑。
阅读Part I后,您可以根据自己的需要阅读 Part II。它的每一章都是独立的。第8章详细介绍了时态逻辑,时态逻辑被用来定义活动属性(liveness properties)。第9章介绍了如何定义实时属性(realtime properties),第10章介绍了如何编写合成specification。第11章则包含更多高级示例。
Part III是下面三种TLA +工具的参考手册:Syntactic Analyzer语法分析器,TLATEX排版程序和TLC模型检查器。使用TLA +,需要使用这些工具。你可从TLA网页获得它们。 TLC是其中最复杂的。 Web上的示例可以帮助你熟悉使用TLC,但如果要深入学习有效运用TLC必须阅读第14章。
PartⅣ是TLA +语言的参考手册。PartⅠ已经为大多数用途提供了足够实用的语言知识,仅在对语法和语义的关键点有疑问时才需要看PartⅣ。第15章介绍TLA +的语法。第16章介绍了TLA +所有内置运算符的确切含义和一般形式;第17章介绍了所有更高级别的TLA +构成(例如定义)的确切含义。这两章共同说明了TLA+的语义。第18章介绍了标准模块,除了第9章中介绍的RealTime模块和第14章中介绍的TLC模块之外, 如果您对如何使用TLA +将标准的基础数学形式化有兴趣,不妨参阅本章。
第四部分确实有一些您可能需要经常翻阅的内容:一份mini手册,紧凑地介绍了许多有用的信息。268 -273页列出了所有TLA +运算符,所有用户可定义的符号,所有运算符的优先级,标准模块中定义的所有运算符,以及诸如⊕这样符号的ascii表示。