没有合适的资源?快使用搜索试试~ 我知道了~
Curry:嵌入式系统的声明性多范式语言及机器人编程应用
178理论计算机科学电子笔记76(2002)网址:http://www.elsevier.nl/locate/entcs/volume76.html19页Programming Autonomous Robots in Curry1我的家乡KlausHöoppnerInstitutfurInformatik,CAUKiel,D-24098Kiel,Germany@ informatik.uni-kiel.de摘要在本文中,我们提出了一个框架,自主机器人程序的声明性多范式语言咖喱。这是一个使用高级声明式编程语言进行嵌入式系统编程我们的编程模型是基于最近的一项提案,即在Curry中集成面向过程的规范语言。我们展示了我们的框架的基本思想,并展示了其应用程序的机器人编程。1动机虽然声明性编程语言(例如,函数、逻辑或函数逻辑语言)是众所周知的,但是这种语言对许多现实世界应用的影响是非常有限的。其中一个原因可能是这样一个事实,即许多现实世界的应用程序不仅有一个逻辑(声明)组件,但也需要一个适当的建模系统的动态行为。例如,在我们的日常生活中,嵌入式系统比通用计算机上的传统软件系统变得更加重要,但这种系统的反应性似乎使其相当困难使用声明性语言来实现它们。 我们认为这 这只是部分正确,因为有许多方法可以扩展声明性语言的响应式编程特性。在本文中,我们试图将这样一种方法,扩展声明式多范式语言Curry [13,17]与面向过程的功能[6,7],具体的嵌入式系统的编程。我们在本文中考虑的嵌入式系统是乐高头脑风暴1这项工作得到了德国研究委员会(DFG)的部分支持,基金Ha 2457/1-2、DAAD/NSF基金INT-9981317和DAAD PROCOPE方案。2002年由ElsevierScienceB. V. 操作访问根据C CB Y-NC-N D许可证进行。肛门,HOPPNER179图1.一、RCX,Mindstorm机器人的机器人虽然这些玩具旨在向儿童介绍机器人的构造和编程,但它们具有嵌入式系统的所有典型特征。它们自主行动,即,没有任何连接到一个强大的主机计算机,有一个有限的内存量(32兆字节的操作系统和应用程序)和一个专门的处理器(日立H8 16兆赫8位微控制器),这是不强大的相比,目前的通用计算机。为了理解本文简要介绍了这类机器人的结构机器人发明系统(RIS)是一个用于制造各种机器人的工具包。 RIS套件的核心是机器人命令浏览器(RCX,参见图1),其包含微处理器、ROM、RAM、到传感器和致动器的连接等。为了对外部世界作出反应,RCX包含三个输入端口,各种传感器(例如,触摸、光、温度、旋转)。为了与外部世界保持联系,RCX有三个输出端口用于连接致动器(例如,电机,灯),一个简单的扬声器播放声音,和一个小的液晶显示器。 此外,其具有用于与主机计算机(例如,用于下载程序)或使用其他RCX砖。由于RCX没有键盘(除了四个控制按钮),只有一个小的单线显示器,RCX的程序通常在标准主机(PC,工作站)上开发,交叉编译成RCX的代码,然后通过IR接口传输到RCX。RIS与一种简单的可视化编程语言(RCX代码)一起分发,以简化儿童程序开发。这种编程语言是基于彩色砖块放在一起,以产生控制程序的RCX。不同类型的模块包括命令(如执行器打开/关闭、等待、设置电机方向、设置功率等)、传感器监视器(在传感器事件的情况下执行的代码块)、控制和宏块。与传统的编程语言相比,该语言具有有趣的扩展(多线程,传感器和执行器控制,延迟和超时原语)。然而,该语言同时也相当有限:没有变量的概念(只有一个简单的计数器),没有表达式,没有参数化函数,没有任意嵌套的控制结构,没有与受保护资源的同步等。因此,进行了各种尝试2http://mindstorms.lego.com/请注意,这些名称是注册商标,尽管我们不会在每次出现时都使用商标符号肛门,HOPPNER180用更先进的系统取代标准的程序开发环境。一方面,人们可以找到更先进的视觉语言(例如,Robolab3)。另一方面,也有命令式语言(例如, “Not Quite C” 后一种流行的代表是基于用新的操作系统legOS5替换默认的Lego RCX固件,并用特定的库和编译器gcc的RCX控制器的特殊后端。由此产生的程序是相当有效的(机器代码而不是字节代码),并提供了充分利用RCX在本文中,我们将使用声明式多范式编程语言(咖喱)与同步和面向过程的功能来编程的RCX。Curry语言[13,17]可以被认为是一种通用的声明式编程语言,因为它以无缝的方式结合了函数、逻辑、约束和并发编程范式。为了将其用于反应式编程任务,已经提出了不同的扩展。[14]包含了一个用端口概念扩展Curry的建议(类似的概念也存在于其他语言中,如Erlang [2],Oz [21]等),以支持分布式系统的高级实现。这些思想已经在[6]中被应用于实现面向过程编程的领域特定语言,其灵感来自[7]中将过程与声明式编程相结合的建议。后者的目标是应用程序的咖喱的反应式和嵌入式系统的实施。[6]中所示的示例应用是人工系统的模拟器,例如,电梯控制器。在本文中,我们将这个框架应用到一个真正的嵌入式系统:上述Mindstorms机器人。本文的结构如下。在下一节中,我们将简要介绍Curry的特性,这对于理解本文是必要的。第3节概述了Curry中面向过程编程的框架我们在第4节中将附录包含Curry中面向过程编程框架的操作语义的定义。2咖喱在这一节中,我们将概述理解本文示例所关于Curry计算的更多信息3http://www.lego.com/dacta/robolab第http://www.enteract.com/~dbaum/nqc/5http://www.legos.sourceforge.net/肛门,HOPPNER181模型和所有语言特征的完整描述可以在[13,17]中找到。Curry是一种多范式声明性语言,以无缝的方式结合了函数式、逻辑和并发编程的功能,并支持具有特定功能(类型、模块、封装搜索)的大型编程。从语法的角度来看,Curry程序是一个函数程序,通过在条件和定义规则的右侧可能包含自由(逻辑)变量而扩展。因此,咖喱计划包括函数的定义和函数操作的数据类型。函数是以懒惰的方式计算的。为了提供逻辑编程的全部功能,可以使用部分实例化的参数调用函数,并通过条件中具有约束的条件方程定义函数。带有自由变量的函数调用的行为取决于函数的求值注释,这些注释可以是灵活的,也可以是严格的。对可执行函数的调用由所需参数的可能不确定的实例化来评估(即,其值对于确定规则的适用性是必要的参数)转换为所需的值,以便应用规则(调用刚性函数(例如,外部函数,如算术运算符[5]或实现并发对象的函数[16]),如果所需的参数未实例化(例2.1下面的Curry程序定义了布尔值和多态列表的数据类型(前两行)以及一个计算两个列表的连接的函数:数据Bool=真|错误数据列表a=[]|a:清单aconc::[a]->[a]->[a]conc [] ys = ysconc(x:xs)ys = x:conc xs ys数据类型声明引入True和False作为Bool类型的常量,[](空列表)和:(非空列表)作为多态列表的构造函数(a是一个覆盖所有类型的类型变量,类型conc函数的(可选的)类型声明(7由于Curry的逻辑编程特征,等式“conc ys [x] =:= xs“可以通过将第一个参数ys实例化到列表xs而无需最后一个参数来6 Curry有一个类似Haskell的语法[19],即,(类型)变量和函数名通常以类型和数据构造函数的名称以小写字母开头。f到e的应用由并置(“f e“)表示7Curry使用curried函数类型,其中α->β表示将α类型的元素映射到β类型的元素的所有函数的类型。肛门,HOPPNER182对于给定的xs,这个方程的唯一解满足x是xs的最后一个元素。函数通常由形式为“f t 1.”的(条件)规则定义。t n|其中f是函数,t1,.,是数据项,每个变量在左侧仅出现一次,条件C(可以省略)是约束(即,一个内置类型Success的表达式),而e是一个格式良好的表达式,它也可能包含函数调用,lambda抽象等。如果一个条件规则的左侧与当前调用匹配,并且其条件是满足的,则可以应用该条件规则。Curry的操作语义,在[13,17]中详细描述,基于最优求值策略[1],可以被认为是惰性函数编程(如果程序和初始目标中没有自由变量并发编程由约束上的并发合取运算符““支持 形式为“c 1 c 2“的约束&同时约束C1和C2此外,分布式编程由端口[14]支持,允许发送任意数据项(also包括逻辑变量)在可能运行在经由因特网连接的不同机器上的3工艺系统规范在本节中,我们回顾了Curry中最初在[6]中提出的面向过程编程的框架。在这里,我们将介绍一个稍微修改和改进的版本。下一节将讨论这个框架在自主机器人Curry面向过程扩展的动机是这样一个事实,即纯声明性语言通常不足以对动态(反应)行为很重要的系统(如嵌入式系统)进行建模和编程。为此,提出了一种面向过程的语言,它通过将过程描述为不同类型的表达式而嵌入到Curry在这个框架中,一个进程系统由一组进程(p1,p2,.)组成。)、全局状态(即,对于组件内的所有进程可见但从外部不可见的数据),以及邮箱(发送到该组件的消息队列),参见图2。8例如,嵌入式控制系统对应于通过向致动器发送消息来对从外部传感器进程的行为系统由每个进程的行为定义。可以根据全局状态和邮箱的条件激活进程。 如果过程被激活(例如,因为特定的消息到达邮箱),它8在最初的框架[7]中,这样的过程系统是动态系统的组成部分它由通过交换消息进行协作的几个组件组成,也参见[8]。肛门,HOPPNER183P2传入消息P3传出消息P1全局状态P4P5图二、动态系统的组成部分执行动作并且可以启动其他进程(由于系统基于交错语义,因此至多一个进程可以执行动作,使得动作是原子实体)。与Erlang [2]类似,邮箱是所有当前可用消息的有限列表。由于进程可以访问完整的邮箱(而不仅仅是第一条消息),因此很容易实现“报警”进程,它可以立即对包含的重要消息做出反应 在邮箱里的任何位置过程对外部环境变化的反应(即,邮箱或全局状态)由一系列动作组成。 可能的动作是将全局状态改变为值s(sagem(10组件的全局状态可以由该组件的所有进程访问和操作。因此,它也可以作为进程同步的工具。一般来说,全局状态只是数据项的元组。 由于这些项可以是任意类型,因此它们也可以存储动态演化的数据结构。如上所述,进程根据邮箱和全局状态的特定条件被激活,并执行操作,然后创建新进程。因此,每个进程的行为由• 一个条件(关于邮箱和状态),• 一系列动作(当满足条件并选择执行过程时执行),以及• 一个过程术语,描述执行操作后的进一步活动。为了以适当的方式构造动态系统规范,我们允许参数化进程,因为这支持局部状态和全局状态之间的区别:进程参数只能在进程内部访问9为简单起见,所有外发信息都通过同一通道发送这是这对于嵌入式系统是足够的,其中消息可以被解释为控制所连接的致动器的命令。10请注意,消息在阅读后不会自动删除,因为可能有几个必须对同一消息作出反应的进程肛门,HOPPNER184因此,它们对应于进程的局部状态,而全局状态对组件内的所有进程可见。对本地状态的更改可以简单地通过带有新参数的递归进程调用来实现。因此,进程项p的语言非常类似于进程代数[9],并由以下语法定义:p::=终止成功终止|Proc(p t1... tn)运行进程p,参数为t1.tn|p1>>> p2sequential composition|>p2平行组合<|> p2parallel composition|p1<+> p2nondeterministic choice|p1<%> p2nondeterministic choice with priority|p1<~> p2parallelcomposition with priority运算符“>“、“<|><“和“+>“是进程代数中的标准操作符,而最后两个操作符不是很常见,但在简单的非确定性选择不合适的应用程序中很有用。“p1%> p2“的含义<否则,如果可能的话,执行进程p2(并删除p1“p1 ~> p2“的含义<是:“并行执行进程p1和p2(像“p1<|>p2“),但只有当p 1不能执行时才执行p 2;如果p 1终止,则p 2也终止后一个组合子对于空闲的后台进程(如并发垃圾收集器)很有用。例如,我们使用它在我们的一些ap-用于从邮箱中删除未使用的传感器消息的后台进程的应用程序过程术语的操作语义的详细说明可以在附录中找到。为了按照上述思想在Curry中指定进程,有一些数据类型来定义动作和进程的结构。 下面的数据类型声明表示可能的操作,其中inmsg、outmsg和state是类型变量,分别表示传入消息、传出消息和具体应用程序的全局状态的类型。data Actioninmsg outmsg state =发送消息| 设置状态--设置全局状态| Deq inmsg--从邮箱中删除邮件对于类型“ProcExp inmsg outmsg state“存在类似的定义,其然后,过程组合子(例如,>,<|>)是对该数据类型的操作。此外,我们将一个受保护的进程定义为一对动作列表和一个进程项:data GuardedProcinmsg outmsg state =肛门,HOPPNER185GuardedProc [Actioninmsg outmsg state](ProcExpinmsg outmsg状态)为了可读性,我们定义了一个infix操作符来构造守护进程:行为|> pexp = GuardedProc acts pexp为了利用Curry的语言特性来规范进程系统,我们将进程规范视为一个映射,它为每个邮箱(传入消息列表)和全局状态分配一个受保护的进程(类似于Haskell,类型定义在Curry中引入了类型同义词):类型Processinmsg outmsg state =[inmsg] ->state-> GuardedProcinmsg outmsg state该定义的优点在于,可以通过模式匹配使用标准函数定义来指定过程,即, 我们可以用参数x1,...,x n的形式如下:px1...xn邮箱状态| <条件x1,.,xn, 邮箱, state>= [actions]|>工艺术语因此,该条件只是对参数x1,.,xn、邮箱和状态,从而我们不需要全局变量或辅助构造来访问当前全局状态和邮箱。 如果满足条件,进程可以在当前系统状态下运行。在这种情况下,其动作序列作为一个原子操作从左到右执行(具有动作序列而不是单个动作对于在许多应用中指定较大的关键区域是有用的,例如,参见下面的用餐哲学家示例),并且该过程被动作列表之后的新过程项所替换如果一个过程指定了多个规则或条件,这些规则可以被认为是与“%>“运算符组合在一起<选择具有有效条件的第一备选方案来执行该过程。作为一个例子,我们展示了古典哲学家用餐的一个具体例子本例中的全局状态是一个fork列表,其中每个fork的值为Avail(整个系统由思考和进食的过程组成,这些过程由哲学家的数字参数化 这些进程的行为确定如下 (“l!!idataForkStatus =可用|使用n = 5--这里我们有五个哲学家在思考::Int->Process__[ForkStatus]肛门,HOPPNER186思考i_forks|forks!!i == Avail forks!!((i+1)=[Set(rpl(rpl forks i Used)((i+1)|>Proc(eating i)eating::Int-> Process__[ForkStatus]eating i _forks=[Set(rpl(rpl forks i Avail)((i+1)|>Proc(思维i)在这个简单的示例中没有使用mailbox参数。因此,我们使用匿名类型变量最初,所有的哲学家都在思考,这与最初的过程项相思考0(Thinking 0)<|>···<|> Proc(思考4)它可以简单地定义为1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000<|>)(map(\i->Proc(thinking i))[0.. n-1])利用咖喱的高阶特征。此外,所有分叉都可用,这由初始状态表示take n(repeat Avail)(其评估为长度n和元素Avail的列表)。上述规范描述了以下行为。如果哲学家i正在思考,这对应于一个过程的存在(思考i),并且两个叉子都可用,那么他可以使用两个叉子并变成吃的过程。注意,全局状态的改变,即,如果两个分叉都确实可用,则只能(以原子方式)执行两个分叉的使用。这是由于成功检查条件和执行是一个不可中断的原子单位其他方法(参见[6])。因此,在没有低级别同步的情况下避免了经典的死锁情况(例如,信号量)或附加构造(例如,门票)。将面向过程的语言嵌入Curry的一个优点是可以重用Curry的抽象功能来定义过程。例如,我们可以通过作为一个原子操作执行的一系列动作),定义如下:atomic::[Actioninmsg outmsg state]-> ProcExpinmsg outmsg state原子操作= Proc(\__-> actions|>终止)在下一节中,我们将把这个框架应用到非盟的编程中肛门,HOPPNER187第1节中描述的机器人。4自主机器人编程反应系统编程中的一个困难是描述它们应该如何同步语言[10]是一种可能的编程模型,因为人们可以用它们来描述对传感器值的即时反应另一方面,异步编程风格可以更容易地集成到通用语言中。为了使用我们的异步编程模型,如第3节所述的机器人编程,我们建议将整个编程任务分为两部分。对响应于某些传感器事件而要执行的动作的描述将以异步方式描述为处理系统,其中我们假设传感器在测量到某个相关值时发送消息。这些“相关事件”的描述将在同步组件中指定,该组件始终控制传感器输入并将相关值作为消息发送到过程系统。例如,对于试图避开障碍物的移动机器人,唯一相关的事件是来自触摸传感器的信号,以便记录对障碍物的碰撞。 的移动机器人 试图跟随黑线的人必须仅对(光传感器的)暗光值和亮光值之间的变化做出反应。为了测量时间间隔(例如,超时、等待),时钟事件变得相关。我们不描述该同步组件的实现(例如,比较[4]的功能逻辑语言与同步编程的特征的组合),但是在下文中假设这样的传感器事件作为消息发送到过程系统,过程系统以适当的动作对它们做出反应。如第1节所述,有三个输出端口连接actua,对RCX的贡献我们将这些端口描述为:数据输出端口= Out_A|输出_B |Out_C标准执行器是连接到这些端口的电机和灯。这些致动器的控制可以通过由过程系统发送到机器人的以下消息来描述:data RobotCmd = MotorDirOutPort MotorDirection|电机速度输出端口输入| 灯输出端口布尔--真=开/假=关数据电机方向=正|Rev|关闭这些信息将改变执行器的状态例如,如果一个...tor正在向前转动,它将在收到消息后向后转动(MotorDirportRev)。如果电机接收到消息(MotorDir端口关闭),则电机关闭。肛门,HOPPNER188图三. 避障机器人如上所述,我们假设机器人由同步组件通知传感器事件。因此,我们无法一般地指定可能的事件,但这些事件取决于连接的传感器、应用程序相关的传感器值等。我们仅假设始终存在一个进程(等待n),该进程在首次激活后n毫秒终止(原则上,这可以通过发送和等待来自同步子系统的适当消息来描述)。在接下来的部分中,我们将展示在实践中应用此框架的具体示例5示例作为第一个例子,我们希望实现一个自主机器人,它在地面上移动,并试图避开它通过安装在机器人左右前部的两个触摸传感器检测到的障碍物。图3示出了示例性我们称之为“漫游者”我们假设当漫游车用左或右传感器接触障碍物dataTouchEvent = TouchLeft |TouchRight漫游车的控制系统包含go、waitEvent和turn进程。初始过程go只是通过将两个电机(分别用于连接在端口Out_A和Out_C处的左轮和右轮)设置为向前方向(这也启动了它们的引擎)来启动漫游器,然后等待来自触摸传感器的事件:go__=[Send(MotorDir Out_A Fwd),发送(MotorDir Out_C Fwd)]|>Proc waitEventwaitEvent进程在来自其中一个触摸传感器的事件上被激活它的反应是向后行驶2秒,并通过将其中一个电机设置为向前方向来转动漫游车,然后是初始过程状态go:waitEvent(touchmsg:_)_=[Deqtouchmsg]|> Proc(turn touchmsg)肛门,HOPPNER189turn touch__=[Send(MotorDir Out_A Rev),发送(MotorDir Out_CRev)]|>处理(等待500)>原子[发送(MotorDir(iftouch==TouchLeft then Out_A else Out_C)Fwd)]>Proc(wait 500)>处理go第二个例子是“直线跟随器”漫游器,即,一个类似于前一个的机器人,但是具有测量地面上的光的光传感器而不是触摸传感器。我们假设同步传感器子系统以规则的间隔向控制系统发送形式为(Lighti)的消息,指示由光传感器测量的电流值i(暗度对应于小值,亮度对应于大值)。常数dark_thresh和bright_thresh是将黑线与亮地分开的阈值。然后,控制系统可以通过以下过程来指定(首先,漫游者试图通过移动到黑暗区域来定位一条线,然后每当它转向时,它留下了暗线):locateLine__=[Send(MotorDir Out_A Fwd),发送(MotorDir Out_C Fwd)]|>处理等待黑暗waitDark(Light i:_)_= [Deq(Lighti)]|>Proc(if i dark_thresh then go else waitDark)go__=[Send(MotorDir Out_A Fwd),发送(MotorDir Out_C Fwd)]|>处理等待BrightwaitBright(Light i:_)_= [Deq(Light i)]|>Proc(if i>bright_thresh then turn elsewaitBright)turn__=[Send(MotorDir Out_A Rev)]|>处理waitDark这些简单的例子只展示了我们框架的基本功能,克自主机器人。它们既没有显示使用多个并行过程,也没有显示使用全局状态来同步它们(但是我们也实现了一个带有传送带和机器人臂的小型生产线,其中这些功能很重要)。然而,从第3节的描述中应该清楚如何使用这些特征来对更复杂的机器人控制系统(例如,包括规划能力、若干传感器的并行控制)。肛门,HOPPNER1906执行我们目前的实现还没有包括一个完整的编译器来将Curry规范转换为可以在RCX上运行的二进制代码(这是在实现中,因此我们目前的示例是手动翻译的)。为了在RCX上翻译和运行程序之前测试程序的行为,我们在Curry中为上述框架实现了一个模拟器。基本上,模拟器是遵循进程代数的操作语义的进程表达式的解释器[6,7](参见附录)。 为了运行第5节所示的典型机器人程序,程序需要来自传感器的一些输入,并且必须显示发送到致动器的消息。为此,模拟器还包含两个进一步的组件,一个虚拟传感器套件和一个命令日志,用于记录发送到执行器的消息。虚拟传感器套件是为机器人程序生成传感器消息的过程。该过程控制具有按钮和滑块的图形用户界面(GUI),这些按钮和滑块表示机器人的传感器。 用户 可以通过这个GUI模拟机器人的传感器输入,系统将如何反应。由于外部唯一可观察到的反应是发送给执行器的消息,因此还有另一个过程,即命令日志,用于显示所有这些消息。这个过程只是等待发送到执行器的消息,并在终端窗口中打印出带有时间戳的我们目前的模拟器非常简单,因此,对于每个具有不同传感器的新机器人,必须设计具有适当按钮和滑块的新虚拟传感器套件(其对应于用于控制传感器事件的同步组件的实现)。由于使用Curry库Tk进行高级GUI编程,这项任务相当容易[15]。然而,人们也可以编写一个函数,从连接到输入端口的传感器的指定生成这样的虚拟传感器套件。 在 类似地,还可以通过添加示出致动器的当前状态的致动器的图形表示来改进纯基于文本的命令日志(例如,表示电机是向前、向后还是反向旋转的符号)。这种表示也可以从所连接的致动器的类型的描述中生成。我们的最终目标是将Curry程序编译成RCX的代码。为此,必须通过指定用于控制传感器的同步组件来完成第5节中所示的描述我们计划将这些描述编译成C代码,这些C代码可以通过第1节中提到的legOS编译器进一步编译成RCX代码。由于RCX的(速度和时间)限制,一个简单的方法,如将Curry实现移植到RCX,将无法工作(这与[18]相反,其中提出了一种功能机器人控制语言,该语言在强大的Linux系统上运行的Haskell之上执行特别是,解释-肛门,HOPPNER191在RCX上的进程表达式会导致太多的开销,因此需要将进程直接编译成更原始的代码。幸运的是,legOS是一个类似POSIX的操作系统,它提供了适当的基础设施,如多线程、同步信号量等。然而,需要进行许多优化,才能将Curry的操作语义映射到legOS中可用的功能中。我们计划从Curry的一个受限制的子集开始,这对我们当前的应用程序是足够的,可以以简单的方式进行翻译,并与适当的优化工具一起扩展它。通过这种方式,我们将研究将高级语言编译成具有有限功能的专用系统的一般原则。7结论和相关工作我们已经提出了一个框架,以程序自主机器人的声明性语言扩展的过程概念。为此,我们提出了一种面向过程编程的领域特定语言。该语言基于进程代数和操作系统、参数化进程(具有优先级)以及用于进程间数据同步和交换的全局存储。可以根据特定消息的到达以及全局存储中的值的出现(由其他进程设置)来激活进程。由于该语言嵌入在声明式多范式语言Curry中,因此可以利用声明式编程的高级特性来实现嵌入式系统。一个原型的实现已经进行了模拟器。通过编译成可直接执行的代码的完整实现是目前开发的。上面已经提到了一些与用于编程嵌入式或面向过程的系统的高级语言相关的工作。对于嵌入式系统编程,通常使用同步语言,如Esterel [3]或Lustre [11]因此,人们也可以应用这些语言来编程嵌入式系统,如乐高Mindstorms机器人。实际上,已经存在将这些语言编译成C11的编译器,因此可以使用legOS编译器来生成RCX代码。 同步语言的翻译通常通过以扩展有限自动机的形式合成目标代码的控制结构来产生顺序代码[12]。这是一个主要的缺点,因为人们对生成的C程序的大小没有太多的控制。在某些情况下,仅对机器人规范进行轻微修改就可能导致生成的代码大小大幅增加。 另一个缺点是大型程序的状态爆炸,这可能是一个问题,因为Mindstorms机器人的内存量在第6节中已经提到了一些未来的工作。 首先,我们将开发一种语言来指定同步组件,该组件控制传感器并通过发送消息通知过程系统然后我们第11http://www.emn.fr/x-info/lego/肛门,HOPPNER192将研究产生高效可执行代码的编译技术另一个有趣的主题是开发一个图形化工具来指定具有可视元素的流程结构,其中自动生成相应的Curry代码。最后,在一个系统中描述几个机器人的行为,并自动生成各个机器人及其通信的代码也很有趣。这将使得能够实现具有许多传感器和致动器的更复杂的系统致谢。作者感谢Frank Huch富有成效的讨论和改进本文的建议。引用[1] S.安图瓦河Echahed和M.哈纳斯一个必要的缩小战略。ACM杂志,卷。47,不。第4页。776[2] J. Armstrong,M.威廉斯角,澳-地Wikstrom和R. Virding. Erlang中的并发编程Prentice Hall,1996年。[3] G. Berry和G.贡蒂尔Esterel同步编程语言:设计,语义,实现。计算机编程科学,卷。19,No. 2,pp. 87[4] Blanc和R.埃查赫德增加函数逻辑程序的时间。函数和(约束)逻辑程序设计国际研讨会(WFLP 2001),pp。31-44.第2017号报告,基尔大学,2001年。[5] S. Bonnier和J.Maluszynski。逻辑程序与外部过程的干净融合。第五届逻辑程序设计会议(Seattle),第五届逻辑程序设计研讨会(Seattle)。311-326麻省理工学院出版社,1988年。[6] B. Braßel,M. Hanus和F.斯泰纳在声明式编程语言中嵌入进程。程序设计语言和程序设计基础研讨会,pp。61-73. Aachener Informatik Berichte Nr.AIB-2001-11,亚琛工业大学,2001年。[7] R. Echahed和W. Serwe结合移动进程和声明式编程。第一届国际计算逻辑会议(CL 2000),第100页。300-314 Springer LNAI 1861,2000年。[8] R. Echahed和W. Serwe一种基于并发的声明式编程方法。 函数和(约束)逻辑程序设计国际研讨会(WFLP 2001),pp。285-298.号报告2017年,基尔大学,2001年。[9] W. Fokkink. 进程代数导论。斯普林格,2000年。肛门,HOPPNER193[10] N.哈布瓦克斯。反应系统的同步编程。第十届计算机辅助验证国际会议(CAV1-16. Springer LNCS 1427,1998年。[11] N. Halbwachs,P.Caspi,P.Raymond和D.皮劳同步数据流程序设计语言Lustre.IEEE会议录,第79卷,第9期,第100页。1305[12] N. Halbwachs,P. Raymond和C.拉特尔从数据流程序生成高效代码。在第三届编程语言实现和逻辑编程上,pp。207-218 Springer LNCS 528,1991年。[13] M.哈纳斯 函数式和逻辑程序设计的统一计算模型。在第24届ACM程序设计语言原理研讨会(巴黎)上,pp。80[14] M.哈纳斯多范式声明性语言中的分布式编程。声明式编程的原则和实践国际会议(PPDP'99),第10 376-395. Springer LNCS 1702,1999年。[15] M.哈纳斯图形用户界面的函数逻辑程序设计方法。在声明性语言的实践方面的国际研讨会(PADL四十七比六十二Springer LNCS 1753,2000年。[16] M. Hanus,F. Huch,and P. Niederau.一个面向对象的扩展声明式多范式语言Curry。第12届函数式语言实现国际研讨会(IFL 2000),pp。89-106.Springer LNCS 2011,2001年。[17] M. Hanus ( ed. ) .Curry : An Integrated Functional Logic Language(Curry: AnIntegrated Functional0.7) 。见 http://www.informatik.uni-kiel.de/~curry,2000年。[18] J. Peterson、P. Hudak和C.艾略特Lambda in Motion:用Haskell控制机器人第一届国际声明性语言论文集,pp.91比105 Springer LNCS 1551,1999年。[19] S.L. 佩 顿 · 琼 斯 和 J· 休 斯 Haskell 98 : 一 种 非 严 格 的 函 数 式 语 言 。http://www.haskell.org,1999年。[20] A. Podelski和G.斯莫尔卡约束逻辑程序的协同运行语义。第十二届逻辑编程国际会议(ICLP'95),第10449-463 MIT Press,1995.[21] G.斯莫尔卡Oz编程模型在J.van Leeuwen,编辑,计算机科学今天:最近的趋势和发展,pp。324-343. Springer LNCS 1000,1995年。肛门,HOPPNER194S≡⟨ ⟩ → ⟨⟩→≡一操作语义在本节中,我们定义动态系统的操作行为。为了简化演示,我们只描述动态系统的单个组件的行为一个完整的系统,包括几个组件,可以推导出的操作行为,从单个组件的迁移关系扩展的组件之间的消息队列的消息交换我们假设这是一个系统规范,即,第3节中介绍的一组过程摘要。我们描述了一个组件的执行由一个过渡关系S,P SJ,PJ,其中P,PJ是进程的条款和S,SJ是组件的状态。组件状态由全局状态以及传入和传出消息的列表组成。每个动作操纵组件状态,即,动作是组件状态之间的映射。为了简单起见,我们不指定动作的精确含义,而是用a(S)表示通过应用动作a而获得的新组件状态到组件状态S。组件的转换关系由图A.1中的推理规则集定义。为了简化转移关系的定义,我们通过引入过程项上的同余关系来分离基本转移步骤和过程项的简化,类似于[20]。这避免了为过程简化引入特定的过渡规则,而这些规则不会产生操作效果。为此,我们定义满足以下定律的最小同余关系:终止>p≡p终止<|> p≡pp<|>终止≡p终止+>p≡终止p+>终止≡终止终止%>p≡终止p%>终止≡终止终止~>p≡终止p~>终止≡p我们假设所有的推理规则都是w.r.t. 一致性形式上,这可以通过将图A.1中定义的基本转换关系扩展为转换关系模全等过程项“M”来表示,定义如下:p1<$pJ1 p2<$pJ2 <$S,pJ1<$→ <$SJ,pJ2<$S,p1初始组件状态和过程项由程序员指定(参见第3节),最终配置是那些带有过程项的[12]实际上,将这些定律解释为重写规则会产生一个一致的、有终结性的重写系统,因此,通过项重写可以很容易地判定同余关系肛门,HOPPNER195►R1PURES,Proc(p t1. tn)→ σan(···(a1(S))·· ·),σ(pi)如果px1... X n|. c1= ac1|> p1.| c k= ac k|> pk是S中定义的变体,σ={x1<$→ t1,., x n<$→ t n},S <$σ(c i),S/<$σ(c j)对所有j p2S,P1第1页<|> p 2 → S J,pJ1<|> p 2S,P1S,p1<+>p2S,P1S,p1%<>p2R3'S,P 2第1页<|> p 2 → S J,p1<|> p J 2R4R4'S,P 2S,p1<+>p2R5R5'S,P 2S,p1%<>p2S,P1如果/SJJ,pJ,其中S,p→SJJ,pj111R6R6'p1<~>p2π →p1~> p2π→p1<~>p2 πS,P 2p1<~>p2π →p3 π → p4 π → p3如果/SJJ,pJ,其中S,p→SJJ,pj111图A.1. 过程术语终止一致。13规则R1描述了过程抽象对过程的应用,其中“Sc“表示条件c的有效性在组件状态S中(因此
下载后可阅读完整内容,剩余1页未读,立即下载
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 京瓷TASKalfa系列维修手册:安全与操作指南
- 小波变换在视频压缩中的应用
- Microsoft OfficeXP详解:WordXP、ExcelXP和PowerPointXP
- 雀巢在线媒介投放策划:门户网站与广告效果分析
- 用友NC-V56供应链功能升级详解(84页)
- 计算机病毒与防御策略探索
- 企业网NAT技术实践:2022年部署互联网出口策略
- 软件测试面试必备:概念、原则与常见问题解析
- 2022年Windows IIS服务器内外网配置详解与Serv-U FTP服务器安装
- 中国联通:企业级ICT转型与创新实践
- C#图形图像编程深入解析:GDI+与多媒体应用
- Xilinx AXI Interconnect v2.1用户指南
- DIY编程电缆全攻略:接口类型与自制指南
- 电脑维护与硬盘数据恢复指南
- 计算机网络技术专业剖析:人才培养与改革
- 量化多因子指数增强策略:微观视角的实证分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)