我靠!另一个D语言

qiezi 2006-11-22
http://www.wanfangdata.com.cn/qikan/periodical.Articles/txxb/980315.htm

设计思想很像erlang嘛,不知道有没有实现出来。

引用

通信学报
journal of china
institute of communications
1998年 第3期 No.3 July 1998 科技期刊

学术通信

Correspondence

程控交换软件中多任务系统单任务化研究

邵世雷 郑少仁

(通信工程学院通信网与交换技术研究所 南京 210016)


摘 要 本文在比较了用多任务模型描述一个多任务实时控制系统和用单任务消息驱动的方
式实现这个系统的特点之后指出:只要给多任务模型作适当的修改和限制,那么多任务系统
单任务化是可以自动实现的。这样设计者既可以用多任务模型很方便地描述一个系统,又可
以用自动生成的、可以在单任务操作系统下高效运行的消息驱动程序去实现这个系统。根据
这个思想,本文定义了D语言,并给出了D编译器的主要思想。
关键词 D语言 多任务 单任务 消息驱动

On Transformation from Multi-Task into
Single-Task in SPC Software

Shao Shilei Zheng Shaoren

(Institute of Communication Engineering NSTI Nanjing 210016)


Abstract After the comparison between the features of the description of a multi-task and real-time
control system by using the multi-task model and the features of the implementation the system by
using single-task and message driven technique,it is pointed out that transformation from
multi-task into single-task can be implemented automatically if some modifications and limitations
are applied to themulti-task model.The designers not only can specify a system easily by using the
multi-task model,but also can implement the system efficiently by using the message driven
program generated automatically which can run under a single-task operating system.The
language D is defined according to this opinion.The main point of the D compiler is shown
in this paper.
Key words language D,multi-task,single-task,message driven

1 概述
  因为程控交换的呼叫接续处理过程在逻辑上是一个多进程并发执行的过程,所以选用
实时多任务操作系统是一明智之举。在多任务操作系统的支持下,我们可以为每一个呼叫
创建一个进程,这就使得接续处理的逻辑描述与物理实现能较好地统一起来,程序的编制
较为方便,其正确性也容易得到保证。但有时,由于种种原因,如硬件上的限制,迫使我
们无法选用多任务操作系统,只能使用单任务操作系统。这时,有两种编程技术可供选择
:其一是有限状态机(FSM,Finite State Machine),其二是就是消息驱动
(Message Driven)。
  有限状态机技术与消息驱动技术虽然表现形式不同,但核心内容却是相同的,那就是
把进程的整个生命期划分为若干个状态,每个状态都在等一条或几条指定的消息,消息到
达后,进程处理这些消息,从而进入另一个状态。简单地说,就是在消息的驱动下,进程
从一个状态转至另一个状态。
  如果使用多任务操作系统,用一个进程处理一个呼叫,那就不用给进程的各个状态命
名、编号,因为进程的所有状态都已隐含在处理程序中。但若用有限状态机技术或消息驱
动技术编程,就必须显式地为进程各个状态的命名、编号。这是一项极为重要的工作,一
旦遗漏了一个状态,程序就会出错。以前,这项工作都是由人用手工完成,容易出错,编
程效率低。因此,对进程各个状态命名、编号的形式化、自动化成了我们极为感兴趣的课
题。
  现有的一些程序设计语言虽然可以描述进程的行为,但要实现对进程各状态的自动识
别、自动编号却比较困难,所以我们自己定义了一个既有一定的并发描述能力,又能方便
地实现对进程各个状态自动识别、编号的语言——D语言。D语言的翻译器实际就是从多任
务描述到单任务实现之间的桥梁。

2 D语言的各语法语义要素
2.1 进程的生命期
  一般而言,进程因被创建而生,因被撤消而灭。但在D语言中,为了保证程控交换的实
时性,我们用操作消息的方式达到同样的执行效果,即向一个处于等待消息状态的进程发
送它等待的消息,把它唤醒,这与创建等效;让进程取一条暂时取不到的消息,进入阻塞
态,这与撤消等效。从这个意义上讲,物理上的创建和撤消已失去意义,进程是永生的,
它与系统同在,既不能消灭,也不能产生。进程的阻塞和消亡在执行效果上已没有区别,
因而进程的状态也只剩下两种:运行和阻塞。
2.2 进程的代码
  在程控交换系统中,各进程的代码已装入内存,这样一来,所有进程的代码实际上已
合并成一个完整的代码,那么各进程的代码可以看作是这个完整代码上的某个代码段。因
此我们可以这样认为,系统中所有进程都共享一份程序,只不过由于某种原因,如收到某
条消息,或是进程标识符为某一特定标识符等,导致这些进程执行了这片共享代码上的不
同的分支,不同的程序段。所以,我们定义D语言中所有进程都是在同一程序上的多次执行
,在这个程序中,用适当的条件分支来实现不同的进程执行不同的程序段。
2.3 消息缓冲区
  进程间通信的机制是消息及消息缓冲区,消息缓冲区有时也称通道。严格地讲,应该
允许一个进程可以有若干通道,进程可以读取自己某个指定通道的消息。但D语言的编译结
果是消息驱动程序,总控程序不停地收集消息,调用相应的消息处理程序。目前我们设计
的总控程序把收集的消息放入一个缓冲区,这就使得所有进程都只有一个消息通道,所有
发往某进程的消息不分消息来源地、按照先后顺序放入这个区域。这样,一个进程的行为
就可以概括地描述为从通道中取出消息,然后处理这条消息,以此往复。因为只有一个通
道,所以这里的取消息就不用指明是从哪个通道中取了。
  当然,为每个进程只设置一个通道,其描述能力没有多个通道的描述能力强。考察如
下情况:若有多个通道,一个进程可以在等待某个通道中某一指定的消息到达的同时,保
留其它通道中比这条消息先期到达的消息。一旦所期望的消息到达,这个进程就可以处理
那些滞留在那些通道中的消息了。若只有一个通道,要实现这种处理效果则要费一番周折
,要由进程自己另外开设一个或几个消息缓冲区,把需要保存的消息存入这些后备消息缓
冲区中,一旦时机成熟,再把保存的消息放回系统消息缓冲区里,重新处理。
2.4 消息结构
  一条消息由三部分组成:消息种别码、消息身份码和消息参数体。消息的种别码和消
息的身份码可以分别用一个整数来标识,但消息参数体却很难统一,有的很短,甚至为空
,有的很长。所以,为了使D语言独立于具体实现时的消息参数体格式和编码,我们没有把
消息参数体的格式与编码定义在D语言中,而只定义了消息的种别码和消息身份码,消息参
数体留给消息驱动支持函数去操作。
2.5 定时器
  定时器的数据结构和使用方法与操作系统关系很大,不同的操作系统,可能有完全不
同的定时机制。因此为了使D语言独立于操作系统,我们没有把定时器的数据结构和使用方
法定义在D语言中,而是把它留给了驱动支持函数中实现。这样做,D可以完全不理会定时
器,定时器到期后,支持函数会向对应的进程发相应的消息,那个进程可以象对待普通消
息那样处理定时器消息。
2.6 进程间互斥、同步及信号量
  D编译器的编译结果是消息驱动子程序,对共享资源访问总是完整地、不被分割地处于
某个或某几个子程序中,总控程序串行地调用这些子程序,在一个子程序返回之前,总控
程序不会调用另一个子程序。这种串行运行机制保证了共享资源访问的完整性和不可分割
性,因此,没有必要为之设置信号量,进程间的互斥与同步可以用共享变量的方法实现,
如共享标志或共享计数器。

3 翻译的主要思想
  D语言的翻译目标是消息驱动函数集。通过上面对D语言概貌的介绍我们知道,一个进
程所执行的程序共有三种操作:一是取消息,根据消息种别码散转;二是对普通变量的判
断、跳转;三是对普通变量的运算、对硬件地址的访问及调用支持子函数。我们可以用一
个有向图来表示执行流程,在这个图中共出现三种结点:第一种是取消息进行散转结点,每
条从这种类型结点射出的边都与一条消息相对应,我们把它称为A类型结点;第二种是对普
通变量的判断分支结点,我们把它称为B类型结点;第三种是普通操作结点,我们把它称为
C类型结点。
  可以想象,系统中的各个进程执行到A类型结点时,都可能会因取不到消息而进入阻塞
态,所以A类型结点是稳定的,而B和C类型结点则是瞬时的,进程不会停留在B或C类型结点
上。从这个意义上讲,从一个A类型结点执行到下一个A类型结点,是进程间的并发穿插执行
的最小单位,没有必要对这个单位进一步细分。
  进程从开始到结束(指重新回到初始态)要经历若干A类型的地点,所以,不同的A类型
结点代表不同的状态。从某个A类型结点出发,到达下一个A类型结点所经历的若干B类型结
点和若干C类型结点所表示的程序段,就是进程在某一状态下收到某消息后所要做的工作。
对流程图中每个A类型结点都作了这样的搜寻之后就会得到一张表,表中含有所有消息在各
个状态下所要做的程序段。对这张表整理之后,就可以生成我们想要得到的消息处理子程
序集了。

4 结束语
  通过本文的讨论我们知道,在多任务描述和单任务消息驱动实现之间确实存在许多障碍
,但只要对多任务系统作适当的限制,这些障碍是可以逾越和克服的。一旦克服了这些障碍
,那么描述和实现就统一起来了。因此,我们在制定D语言的时候,不仅考虑到了它的描述
能力,而且考虑到了转换成单任务消息驱动程序的可行性,在不过多地失去多任务描述能力
的基础上,尽量给从多任务到单任务的转换提供方便,以便得到高效、简捷的代码,最大
程度地提高CPU的执行速度,满足实时系统的要求。
  D语言写成之后,我们用它开发了几个实验性消息处理系统。结果表明,用D语言编程,
不仅概念清楚,思路流畅,而且所编的程序正确性高,调试周期短。D语言不仅可用在程控
交换领域,而且对其它实时控制系统的开发也有积极的意义。

参 考 文 献


  1 CCITT 蓝皮书 建议Z.100 SDL 语法描述.墨尔本 1988

(1996-05-06收到,1997-12-15改定)
cookoo 2006-11-23
好像不止一个呢。。。这名字说实话太没个性了,还不如直接叫digitalmars或者dmars
bigpanda 2006-11-23
八年半前的文章了,估计没做下去。
qiezi 2006-11-27
http://blog.gceclub.sun.com.cn/index.php?op=ViewArticle&articleId=516&blogId=4

这里也提到了一个D语言,语法和C相似,不过看起来不像是DigitalMars D。
cookoo 2006-11-28
根据全知全能的wikipedia, 叫D的大约有7种语言:
http://en.wikipedia.org/wiki/D_%28disambiguation%29
qiezi 2006-11-28
果然是,这个名字太差啦。。。就叫DMD语言算了。
Global site tag (gtag.js) - Google Analytics