同步式编程
同步式(synchronous)编程,也叫做同步式响应式编程或缩写为SRP,是为响应式系统编程而优化的一种计算机编程范型。同步式编程语言,是支持同步式编程范型的计算机编程语言。
响应式系统
计算机系统可以归入三大类别:
- 变换式系统,接受输入、对其进行处理、递送出输出、并终止它们的执行,典型例子是编译器;
- 交互式系统,按自己的速度、连续的与它们的环境进行交互,典型的例子是web;
- 响应式系统,按照它们的环境所施加的速度、连续的与它们的环境进行交互,典型的例子是现代飞机上的自动飞行控制系统。响应式系统因此必须在严格的时间界限内,对来自环境的刺激(stimuli)进行响应。为此它们经常叫做实时系统,并经常见于嵌入式系统。
编程范型
同步式编程的原理是对编程语言做同步抽象,使之同样于在数字电路中的那种同步抽象。同步电路实际上是在高层抽象上设计的,这里的电子晶体管的时序特征被忽略了。因此每个逻辑门(或门、与门等)都被假定为瞬时计算出结果,每条连线都被假定为瞬时传输信号。同步电路是有时钟的,在它的时钟的每个时间标记(tick)上,它瞬时从它的输入值,和它的记忆单元(锁存器)的当前值,计算出它的输出值,和它的记忆单元的新的值。换句话说,电路表现的如同电子流动得无限的快速。第一批同步式编程语言在1980年代于法国发明:Esterel、Lustre和SIGNAL。此后又出现了很多其他的同步式语言。
同步与异步比较
同步抽象,使得关于时间的推理,比在异步式程序中更加容易,这得益于逻辑“时间标记”的概念:同步式程序在一序列的时间标记中对它的环境进行响应,而在一个时间标记之内的计算被假定为瞬时的,就是说,如同处理器以无限快的速度执行了它们。
语句a||b
因此抽象为包(package)ab
,这里的a
和b
是同时的。举个具体例子,Esterel语句every 60 second emit minute
,规定了信号minute
(分钟)精确的同步于信号second
(秒)的第60次出现。在更基础的层面,同步抽象消去了由于交错的(interleave)并发行为而导致的非确定性。这允许了确定性(deterministic)语义,因此使得同步式程序经受得起形式分析、验证和有保证的代码生成,并可用作形式规定形式化。
相反的,在计算的异步模型中,在一个顺序的处理器上,语句a||b
可以实现为要么a;b
要么b;a
。这叫做“基于交错的非确定性”。异步模型的缺点是它在根本上不允许确定性语义(例如有竞争条件),这使得形式推理比如分析和验证更加复杂。尽管如此,异步式形式化对于建模、设计和验证分布式系统是非常有用的,因为它们本质上是异步的。
同步模型还对立于具有基本上“同步交互”进程的系统。一个例子是基于通信顺序进程(CSP)模型建造的系统,它还允许非确定性选择。
同步式编程语言
参见
引用
- ^ G. Berry and G. Gonthier. The synchronous programming language ESTEREL: Design, semantics, implementation. Science of Computer Programming, 19(2), 1992.
- ^ Lucid Synchrone. [2021-03-03]. (原始内容存档于2019-10-14).
参考
- Nicolas Halbwachs. "Synchronous programming of reactive systems". Kluwer Academic Publishers, 1993. http://www-verimag.imag.fr/~halbwach/newbook.pdf (页面存档备份,存于互联网档案馆)
外部链接
- The Synchronous group (页面存档备份,存于互联网档案馆) at Verimag lab.
- The SIGNAL programming language (页面存档备份,存于互联网档案馆).