“SCADE"为"高安全应用开发环境”(Safety Critical Application Development Environment)的缩写。本文的详细内容,可参考 TASE 17 《Scade 6: A Formal Language for Embedded Critical Software Development》。
摘要
SCADE 提供了面向高安全嵌入式控制软件的高级语言和开发环境。在过去逾20年里,被应用于航空、核能、铁路、汽车等行业。SCADE 技术最初基于 Capsi 与 Halbwachs 所设计的同步数据流语言 Lustre 。在 SCADE 发展初期,其主要被当作是 Lustre 的图形化标记法,并搭配了能应用于安全关键应用研发的代码生成器。
在2008年,基于新语言Scade 6
的 SCADE 主要改版发布。新的语言组合了来自 Lustre 的数据流风格的部分、来自 Esterel 与 SyncCharts 的控制结构、来自 Lucid Synchrone 的编译及静态分析技术。在语言表达能力方面的拓展,及配套 KCG 代码生成器,使得该技术能被应用的领域范围得到了显著地拓展。
在过去的发表物中,部分讨论了语言的语言结构和编译器算法,但没有参考材料直接针对Scade 6
语言进行讨论。在本文中,将回顾在 Scade 6 语言设计中所作的选择、阐述主要语言特性、静态分析方法、编译器架构等。
概述
同步语言提出可追溯到30年前同期发展的3种语言:Signal、Esterel、Lustre。这些语言的共同点,都是作为领域特定语言面向实时控制软件。通过这类语言,可以模块、数学级精确地描述系统规约,对所描述应用进行仿真、测试、验证,并自动化地将这些语言翻译为嵌入式可执行代码。这些工作都是基于同步方法
理论。同步方法
认为如果系统被理想地建模,即通讯与计算会在瞬间完成。同步方法
还包括对模型中的重要功能安全性质的形式化检查,如确定性、无死锁足够快;以及生成具备时间与空间约束限制的实现代码。
这些基础工作立即引起了从事高安全应用研发的产业界方面的兴趣,尤其是需要使软件符合认证标准,需要由第三方认证机构评估的产业界机构。在这个背景下,SCADE在90年代中期诞生,由空客、Merlin Gerin、Verimag 与 Verilog 合力支持。从2000年起,SCADE 由 ANSYS/Esterel-Technologies 继续研发。
在早期,SCADE 背后的语言基本是Lustre V3 及一些增补的特殊特性。该状况一直持续到 SCADE 5。为了在安全关键应用研发中,不再验证SCADE 模型与生成代码之间的一致性,研发了KCG(qualified code generator)。KCG 在1999年首次发布。KCG被用于对 DO-178C、IEC 61508、EN 50128、IEC 60880 和 ISO 26262 有需要的软件研发中。代码生成器证明了语义定义明确的语言对认证过程的重要性。这一点在嵌入式软件领域非常独特,并支撑了SCADE在产业中的成功。
SCADE 6 的设计目标为拓展SCADE支持的应用范围而新增语言特性。在选择语言特性的过程中,也小心地选择,保持原有的质量,使 SCADE 仍然被安全关键应用研发所接受。新语言特性之一为不同类型模型的混合使用。包括已经进行较好覆盖的纯数据流模型,以及被 Esterel 与 SyncChart 较好覆盖的控制流模型,及两者复杂的互操作。另一个要改进的原有局限是 SCADE 对数组的缺失。Lustre V4 提供的递归数组定义适合对硬件进行设计,但其静态展开的风格,但表达能力不适用于软件设计。最后对若干语言拓展也是新语言设计时所考虑的,包括模块化概念、更具有表达能力的类型、编译器优化等。为实现这些设计目标,参考了下面几类工作:
- 由层次化状态机表达的控制主导的 Esterel 与 SyncChart 的工作。
- Lustre 中数组与迭代器的工作。
- Lucid Synchrone 中对数据流与控制流的集成,及基于类型的分析的工作。
- 其他参考工作,包括 ARGOS 层次化自动机与 Lustre 子集的模型混用;Esterel V7 面向硬件设计的数据流与控制流集成等。
在构建语言与编译器时,主要设计选择遵循了下面两项思路。第一,定义一个最小化的内核语言,设计与之相关的静态和动态语义。该语言作为类型化的汇编语言的作用,用于顺序化代码的生成。第二,通过源代码到源代码的翻译,使用基本语言去表达结构更加丰富的语言。其中的内核语言,为一种时钟化的数据流语言,与 Lustre 类似,但与该语言有部分不同。
对该设计思想的实践,最初在 Reluc 编译器中进行了实现。在该项目中,设计的原型语言与编译器由 OCaml 开发,用来试验新的编程结构及编译技术。该原型在2000年到2006年间持续演化。在2006年,SCADE 6 项目启动,该项目在2008年发布。
在《Scade 6: A Formal Language for Embedded Critical Software Development》中,将讨论上文提到的设计思想的实现、阐述主要语言特性、编译期静态分析、及编译器架构等。其中,将使用 Lustre 指代 SCADE V5 及以前的技术,而用 SCADE 6 指代新版本。