*指定行为所依赖的行为定义。例如JavaScript中的排序,可以指定排序过程。
**作为通用行为,必须传入行为具体过程与参考数据。例如Win32 SDK中的EnumWindows()的列举。***返回同时包括数据与行为的一个结构。例如JavaScript中的闭包。
通过“定义”,我们确定系统中的元素必然只存在数据、行为。这种定义通常是语法性质的,但最终总是可以表达为一个“名/值”映射——虽然这并非实现上的必需。需要留意的是,尽管表2-6中刻意从“数据”中把“行为”分离出来,并将后者进一步地分解为:计算()→值这样两种,而事实上它们都可以视作数据,用相同的方法定义,并施以相同的行为。
所以我常说,程序是“被定义出来”的。因而我们可以通过思维完成全部程序,而它在执行过程中的排错、修正与优化等,是出于我们在工具使用上的、熟练度训练的必需,而非编程思维训练的必需。
必须在这里指出的是,无论我们的编程语言如何变化,上述都是语义完整性的需求,即最大可能的集合。当然,其前提在于我们对“定义”的假设,如果所定义的语法元素更多,那么这一组合的空间就会变得更大,在语言的语义表达上会趋于丰富,进而可能无法控制;如果所定义的语法元素变小,例如将数据与行为统一为数据,则语义表达上会更简洁,但也可能出现(用自然语言来理解时的)歧义①。
最后,我们也可以推论出:既然“找到(逻辑与数据)”本质上也是一个行为——或称之为计算,那么它必然也满足上述的2~3的全部约束,亦即它可能实现的全部方法2。yipindushu.com
①也许有人会说“元素更少,则更易理解”,但并不全然如此。抽象概念过少的时候,我们的表达是倾向于重叠指代的,例如“船”,既是名词也作动词。在编程语言中,这通过ship与ship()来表达,便已经具备了两个符号(与其组合)——这使得我们在抽象概念上,至少已经分出了数据与行为。
②在《数据结构》中,这被称为“检索”,它与下一小节要讨论的“排序”是两个非常关键的“(计算)行为"。
【四】
所谓翻译(编译与解释)无非是将一系列的源代码文本(所对应的计算行为)排列成一个顺序序列,而最终的执行器—无论是机器还是解释器—只是从这个顺序序列的起始位置开始处理,一直到结束①。正是因为这个缘故,所以依据什么排序才会是翻译中的一个关键问题。
语法树是对语法元素进行排序的一个方案。这一方案将语法元素解析为不同类型的树结点,例如操作符结点、操作数结点等。以下面的代码为例:a,i = 100,v = i+100;它可能被解析的语法树?。
在该语法树中,所有叶子结点都是标识或直接的值——它们代表数据,而非叶子结点则是操作,亦即逻辑;如果是逻辑,则计算的结果可以作为其他计算所需的数据,例如图中的结点8的计算结果是结点4操作数。
当如上的语法树形成之后,顺序扫描树中所有结点的方法有两个:深度优先遍历与广度优先遍历——理论上说存在无数种可能的方法,这取决于形成该树时所使用的①这种结束有两种可能,其一是序列完全计算完毕,我们通常理解为“退出”;其二是序列进入一个无休止的循环过程,我们通常理解为“等待-就绪”。对于执行器来说,这个顺序的代码序列(静态文本的翻译结果)所代表的执行逻辑(动态的处理)既可能是操作系统所调度的CPU执行权限的入口,也可能是一个解释器的执行片段的起始——不幸的是两种情况都被称为process,只是前者通常译为进程,后者则译为处理。
②本例是JavaScript解释器引擎的一个实际解析结果。需要留意的是:不同的语言以及其翻译器在解析细节上可能会有不同,因而可能产生别的结果。
算法。以使用深度优先遍历算法为例,我们将得到下面这样一个处理顺序:2,5,6,3,7,9,10,8,4,1去除掉标识和数据部分,我们看到的是:_,_,_,3,_,_,_,8,4,1这几个操作的顺序,即我们对"顺序计算(逻辑)"在语法树上的重现。那么,以数据排序又会是怎样的一种情形呢?例如,下面的代码:1i:= 1002y :="hi";3x := 5;4 i:= x*2 + i;可以产生一个类似的语法树,
版权声明
本站素材均来源与互联网和网友投稿,欢迎学习分享
【节数以及对数据的性质的思考23:http://www.yipindushu.com/xuexifangfa/16458.html
推荐文章
09-11
1 成语与俗语的区别09-13
2 看正能量,让你的生活更有滋味!09-03
3 关于哲理人生的句子09-11
4 彻彻私语09-13
5 励志的正能量语录,成就辉煌人生