软件工程师手册/语言词典/ToonTalk
Ken Kahn 发明并实现了 ToonTalk,并建议将其用于儿童。它可以从ToonTalk 网站免费获得,可在 Intel 架构的 Windows 系统上运行。我不知道是否有人尝试在类 Unix 系统上的 Windows 模拟器上运行它。
ToonTalk 具有细粒度的并发性,并且可以说是一种声明式解释,作为一种并发约束(逻辑)语言。参数是对象,不是“面向对象”编程意义上的“对象”,而是更日常的意义,即如果我把一个对象给你,我就没有它了。
程序员通过执行操作来触发执行。这没有特定的限制。
ToonTalk 的语法是动画,就像卡通一样。程序员扮演一个角色,通过示例向机器人展示要做什么。程序员(或机器人)可以将机器人组装成机器人团队。为一个团队提供一个盒子(一个数组/元组容器)将启动一个进程。团队中的顺序很重要。在进程的每个执行周期,机器人依次尝试将一个模式(每个机器人一个模式)与盒子匹配。第一个匹配项触发。
程序员或机器人可以将一个对象放入盒子中的一个“洞”(隔间)中,或者可以将其取出来。您可以将其视为类似于赋值。洞可以是空的。
可以使用魔杖复制东西,可以使用吸尘器使东西消失。
存在一个参考和通信结构,由鸟巢对(或家庭)组成。一只鸟飞到一个巢里,在最简单的情况下(也可以有多只鸟飞到同一个巢里,一只鸟飞到多个巢里,或者多对多,但是为了描述,我会继续假设最简单的通信)。当程序员或机器人将一个对象交给一只鸟时,这只鸟(她;所有的鸟都是雌性,所有的机器人都是雄性)飞到她的巢里并将对象放在那里。如果巢里已经有了一些对象,这只鸟会把新对象放在它们下面。
当一个机器人等待一个特定类型的对象出现在盒子中的一个洞里时,如果那个洞里确实有一个未覆盖的巢,机器人会一直等待,直到一只鸟应该把东西放到巢里。然后,对机器人来说,盒子看起来就像是在那里放置了交付的对象而不是巢穴。因此,您可以传递结构(作为带有可能嵌套的盒子的盒子),实际上,这些参数的值还不知道,用巢穴表示。当程序的另一部分弄清楚参数的值应该是什么时,它可以将表示该值的物体交给飞往相关巢穴的鸟。
您可以将将一个对象交给一只鸟视为类似于赋值。
实际上,我撒谎了;鸟巢不是唯一的引用结构。还有“传感器”对象与其他对象链接为它们的“外观”,一个对象的更改会立即反映在另一个对象中。然而,这些不能是盒子,只能是文本、数字或图片。我认为传感器在 Lisp 中与赋值一样脏,您可以将“纯 Lisp”视为不包含这种脏东西的方言。但是,传感器似乎在 ToonTalk 实践中是必要的,作为一种输出机制(动画的“图片”),如果用鸟来驱动会很尴尬;卡恩博士尝试过只将鸟作为 I/O,最终改为使用传感器。
程序员或机器人可以在洞、鸟巢和机器人上键入标签。标签对执行没有影响,但可以帮助程序员更好地记住设计中洞的作用。此外,对象的集合还包括“笔记本”,在笔记本上,通常将文档作为放置在左页上的文本垫来编写,以记录存储在右侧下一页上的任何对象。整个笔记本也可以标记。
一个盒子包含多个洞。您可以将任何对象放入一个未被占用的洞中。您也可以将一个“矩形”对象(例如一个盒子、一个数字垫或一个文本垫)交给一只鸟。洞或鸟的存在可以被视为构成一个变量的声明。这种想法背后的逻辑会认为,您可以将对象放入洞中视为分配值,因此洞代表了确定该值的可能性,而这正是变量的本质;它是一个实体,我们可能还不知道它的值,但一旦我们弄清楚它的值应该是什么,就可以给它分配值。从这个角度来看,一只鸟的值可以被认为是最终将交给这只鸟的一系列对象。
另一方面,如果我们选择将 ToonTalk 中任何被修改的对象视为两个不同的对象,一个是在修改之前,另一个是在修改之后,那么我们可以将该语言视为声明式语言,因此当然没有要声明的赋值或变量,除了逻辑变量,而一只鸟/巢对可以被视为一个逻辑变量。当您从 Tooly 工具箱中提取鸟巢对时,您就在声明变量。
这取决于观点。
程序员和所有上下文中的所有机器人可以使用“工具箱”(实际上是一个供应箱)。程序员从工具箱中取一个新机器人,并将其交给一个示例盒子。每个机器人始终都有一个漫画风格的“思维泡泡”,它揭示了机器人将尝试匹配的模式(始终是一个盒子)(一个新机器人有一个没有盒子的思维泡泡;这被称为“没有思维的机器人”)。程序员(在这种情况下,机器人不能这样做)将一个示例盒子交给一个新机器人,就像从 Tooly 工具箱中取出的一样(所有工具都有可爱的名称;魔杖是 Maggie,吸尘器是 Dusty)。然后,动画扩展机器人的思维泡泡以填充屏幕。它包含一个示例盒子的副本、工具箱以及与鼠标连接作为光标的机器人的图像。程序员使用此光标来模拟机器人每次触发时应该执行的操作。为了完成编写方法,程序员有两个选择。一个是按下 ESC 键。当机器人执行此操作时,它所属的进程将继续存在并继续进行下一个执行周期。另一个退出语法是拿起一个炸弹并将其引爆。这会在执行时销毁进程。请注意,编程会话不是执行,除非在有限的意义上,可见对象的计算结果将很明显。
在程序员如此指定机器人的动作(或者我称之为身体或尾巴,将机器人视为逻辑语言中的规则)之后,程序员(或者机器人,我认为)可以根据软件设计的要求对机器人的模式进行泛化。
机器人可以操控方便拿取的物体。机器人会在其“我的箱子”中找到这些物体,并可以暂时将它们放在地板上。“我的箱子”也可以被操控(例如,交给一只鸟)。
机器人不会四处游荡。
存在三种远程操作形式。一种是上面已经描述过的鸟巢机制。第二种是生成新进程。第三种涉及具有对远程对应物立即影响的特殊“传感器”物体;我不喜欢谈论它们;它们很脏。
当机器人或程序员将一条消息(任何“矩形”物体)交给一只鸟时,在鸟将物体送到她的巢穴后,鸟会飞回来,并且可以将额外的消息交给她,或者将她交给其他人(例如,把她放进一个箱子的洞里,然后把箱子交给另一只鸟)。
唯一的条件是上面描述的机器人模式匹配机制检查的那些条件。机器人的主体是直线代码,没有条件、循环或子例程调用。因此,执行不需要堆栈,并且触发机器人的时间是可预测的且很短。
模式可以直接检查物体类型(例如,数字、字符串、N孔箱子(可能对孔中可以放什么有模式限制)、一般来说不考虑孔数的箱子、鸟、空巢),并且可以检查数字和字符串的常数值(因此,字符串可以作为消息选择器)。为了进行大小比较(<,>),必须使用天平。天平比较箱子两侧的两个数字或字符串,并且模式可以寻找天平的特定倾斜角度(小于、等于或大于)。
每个没有爆炸的进程始终处于循环状态。通过生成额外的进程也可以实现递归,这些进程可以包含生成它们的机器人团队的副本,或任何其他机器人团队。没有其他循环机制。特别是,如上所述,机器人的主体是直线代码。
假设你得到了一只鸟,并且你理解你应该使用这只鸟作为你的输出通道。然后从 Tooly 中提取一个文本板。在握住或指向文本板的同时,按下退格键删除“A”(所有新的文本板都有一个单字符“A”)。然后输入“Hello world”。如果你想包含回车符,请按回车键。将修改后的文本板交给鸟。
还存在“图片”,它们可以在背面有机器人作为进程执行,并使用与图片关联的传感器物体使图片改变外观(包括显示文本)。因此,程序员可以制作动画角色。
程序员可以环绕系统,观察任何进程或物体,并进行操作。
本机容器是箱子。箱子是 0 到 64K-1 个孔的线性排列。一个孔可以包含任何物体或为空。注意,箱子可以包含另一个箱子。箱子可以相互追加或拆分。零孔箱子是可能且有用的。
请注意,可以构建由两孔箱子组成的列表结构。这与 Lisp 列表不同,因为列表之间不能共享任何物体(实际上,除了鸟和巢穴)。
请注意,进程可以用来包含东西(每个进程都围绕一个单独的箱子,称为“我的箱子”),并且可以通过鸟和巢穴进行通信的进程来构建链接结构。
算法往往是递归的。
没有自动垃圾回收。每个进程(除了图片背面的进程)都占据一个“房子”。程序员负责决定何时不再需要这些进程并安排它们自爆。
用户/程序员运行和修改系统的动态空间称为“城市”。城市由一个包含城市街区的二维数组组成,街道和大道在街区之间穿过。每个街区可以建造四栋房子。直升机可用于让程序员进行概览并支持在城市周围快速移动。进入一栋房子(步行)后,程序员可以观察里面的内容,通常是一个进程。程序员也可以在房子里留下物体(甚至在房子外面的草地上,但这是没有用处的,因为并非所有操作都能从那里完成)。进程对程序员可能留在它们各自房子里的任何物体都是盲目的,并且一个进程的执行周期也不能留下任何东西(除了“我的箱子”及其内容)。当一个进程生成另一个进程时,机器人会从 Tooly 中提取一辆新鲜的卡车(它看起来像一辆玩具卡车),并将一队机器人(单个机器人实际上是一个单机器人团队,并且无法构建一个零机器人团队)和一个箱子放在上面。一旦卡车装载了这两个物体并放在房子的地板上,它就会驶离。一旦在外面,它会变成一辆真正的卡车大小(所以它会在动画中出现,无论如何)并四处寻找建造房子的地方。一支看不见的建筑工人队伍从卡车中出来,很快地建造了房子。然后卡车再次缩小到玩具大小,驶入房子。然后卡车消失,留下机器人团队处理箱子。
程序员可以将城市保存在 Windows 文件中,并使用该城市的副本恢复执行。程序员可以导出或导入任何物体(导出格式为 XML)。存在可以飞越互联网到 ToonTalk 不同运行实例的远程鸟类。存在在其页面上保存物体副本的“笔记本”(其中可能包括笔记本)。每个程序员都有一个主笔记本,该笔记本在 ToonTalk 会话之间持续存在。通常,人们会在定义机器人后立即将它们保存到此处。除了远程鸟类外,这些机制只能通过直接操作供程序员使用;机器人无法执行这些操作。机器人无法访问持久性机制,除非通过“外国鸟类”(不要与远程鸟类混淆),它们构成语言之间的接口。
<请包含使从其他语言切换到本语言更轻松的提示。>
最好不要接触过其他编程语言。
但是,一些基本的计算机科学仍然适用。递归仍然是递归,数据结构仍然是数据结构。
如果你想使用堆栈进行编程,可以自己创建一个。
http://groups.yahoo.com/group/ToonTalk/links
<列出可能会有帮助的其他书籍和文章。请包括参考文献适合哪个级别的读者。(初级/中级/高级)>
Morgado, Leonel; Kahn, Ken (2008). ToonTalk 语言规范, 可视化语言与计算杂志, 19 (2008), 574-597.
主要论文列表: [1]