语义(semantic)是语言的重要组成部分之一。一门语言,仅有词法、语法规则是不够的。虽然语法规则能够描述语言各个符号之间的组合规律,但是始终无法说明各种符号组合的意义及其作用。换句话说,仅有语法规则的语言只不过是一系列符号的有序序列而己,这对于语言本身及其使用者是没有任何意义的。当然,语言的表述能力也根本无从谈起了。如果暂且不考虑形式上的区别,仅从语法角度而言,if语句和for语句是不存在任何差异的。在语法分析器看来,它们只是源语言的合法句子而己。由于语法描述能力的局限性,所以就需要一种元素来补充说明语言的含义,这种元素就是语言的语义。
实际上,语言的语义也是一组规则的集合。它们既可用于描述语言的含义,也对语言本身作了一定的限制。与语法类似,语义同样具有评价语言句子合法性的功能。例如,从语法角度而言,“我走饭。”这个句子是完整正确的。它完全符合汉语“主语十谓语十宾语”的语法规则。不过,在日常生活中,绝不会认为这是一个正确的句子。因为谓语“走”与宾语“饭”的搭配是不符合汉语语义的,所以该句子是不具备任何实际含义的。这里,以汉语句子为例,旨在帮助读者深刻理解语法与语义的关系,实际上,自然语言的语义远比这个例子复杂得多。无论是人类学习语言,还是计算机处理自然语言,主要的障碍就是来自复杂的语义。以英语学习为例,中国学生最精通的可能就是英语语法了,精通程度甚至超过了母语是英语的人,但是习惯表达、固定搭配等却是学习英语的最大障碍。很多时候,中国学生无法写出地道的英语文章绝对不是因为语法不过关,而是由于汉语习惯思维所致。通常,学生会将汉语的习惯表达直接翻译成英语,并不考虑使用英语的习惯表达来描述。由于人类至今也无法精准地描述自然语言的语义,当然,也就无法通过一个算法让计算机理解与处理人类的自然语言。在计算机科学中,自然语言理解是人工智能的一个重要分支,这里,就不再深入讨论。下面,笔者将重点关注程序设计语言的语义与编译器设计的联系。
早在20世纪60年代,语法与语义的概念就被加以区分了。在程序设计语言领域,Algol 60修订报告首次明确了语法、语义的概念,使用BNF定义语言的语法,而使用自然语言说明及实例分析等非形式化方式描述语言的语义。在讨论Algol 60时,BNF的创立者Backus说:现在我们已经有办法严格定义语言的语法了,希望今后不久就能严格定义语言的语义。计算机科学家随即对程序设计语言语义展开了深入的研究,试图开发一种形式化的语义描述方法,以解决程序设计语言语义定义及语义分析器自动生成等一系列问题。经过十多年的努力,形式语义研究取得了重大的进展,提出了指称语义、操作语义、代数语义、公理语义等理论与方法。虽然形式语义研究硕果累累,但是迄今为止还没有开发出一种完美、功能强大、易于理解与使用的语义定义系统。因此,在目前状况下,形式语义理论对编译器设计的意义是有限的。不过,在不久的将来,有理由相信形式语义学的发展会给编译器的设计与自动生成带来质的飞跃。(www.daowen.com)
当然,读者不要将语法与语义视作两个完全孤立的范畴。就像计算机科学中许多经典问题一样,语法与语义之间并不存在非常严格的界线。在一些特殊情况下,两者是可以互相转化的,这主要是取决于文法的定义。一些宽泛的文法可能将语法问题滞留到语义分析阶段。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。