自然语言和程序设计语言的某些共通点
对于大多数外语、中文等传统‘文科’背景的人来说,计算机编程设计语言似乎是一个很遥远的领域。其实,从语言学的角度来看,尽管使用领域不同,定义不同:编程语言是人工语言,而中文或外语属于自然语言,但既然是语言,它们之间有许多相同或相似的地方。首先,它们都有词法、句法和语义。 从词法的角度,语素和语素合成单词是有一定规则的。例如中文的‘碧’字,作为一个语素,和其它语素结合成单词时有一个限制条件,必须是单音语素。如:碧空,碧蓝,碧绿;但是,碧天空,碧宝蓝等就不合法了。程序设计语言的单词(称作identifier,标识词)也有着类似的严格规定。例如,任何identifier必须以字母或下划线开头,像 bilan、 _blian等就是合法的identifier,而23bilan、@bilan就属于非法的。任何一个identifier中间不能有空格,否则非法。 从句法的角度,有类似自然语言的条件从句:if x < y then print x +y; 意思是,如果两个identifier所代表的数不相等且x小于y,那么,将x所代表的数和y所代表的数相加,然后将结果打印出来。 从语义的角度,任何一个identifier都可以定义为不同的类型。例如 name可以代表‘张三’,age可以代表25 String name = ‘张三’; int age = 25; 这时我们就可以说,name的含义就是‘张三’,而age的含义是25;前者的词类属于String,后者的词类是‘整数’。然后我们就可以用一个动词短语; print name + "的年龄是" + age; 这里,print是动词,‘+’是连接操作符(concatenator),负责将前后的成分连接起来,成为一个更大的constituent。双引号中的内容是直接内容,没有被其它identifier所代表。整个句子连起来的意思就是:将name所代表的内容和‘的年龄是’这个字符串连接,然后再与age所代表的内容连接,最后打印出这个句子。 程序设计语言中关于语法和语义的定义是非常严格、明确的,不能模棱两可。例如,单复数的定义, 在汉语中,根本就是残缺的,只有在指人类实体是可以‘可选地’用‘们’,而且用法非常复杂。英语简单一些,用加s的方式表达。但有些单词单复数一样,如equipment,有些单词只有复数没有单数,如alms。无法只从形态上判断是单复数。 而程序设计语言就没有这样的问题: 任何定义了品词的identifier都是单数名词。而复数名词则需要一个特定的词类,通常叫做数组,或者叫做’表‘。例如 String 学生=’张三‘; 定义了一个单数名词’学生‘,意指’张三‘;换句话说,这时的学生只能指’张三‘,因此是单数。 如果要定义一个复数名词’学生‘ Array 学生 = {张三,李四,王五}; 这个时候,学生就成为复数,而且是严格的’复数‘,只能指所列举的名称。 这些只是编程语言和自然语言的表面的异同。更本质的共通点,我觉得是二者之间都有一个类型系统。 谈到类型,就要引入另一个术语,自然语言中常用’token',编程语言常用‘instance’。我们经常重复已经说过的话。买了包糖果,请朋友尝尝,说‘请吃块糖’,朋友拿了块吃了。下次打开包,又说同样的话,朋友又吃了。但是你想想,上次你请吃那块糖已经不存在了,这次请吃是另外一块糖。糖变了,你的话却不变,你的朋友也不会误解你。从语义学的角度,你这两次说的其实不是相同内容的话,因为所指并不相同,但人们(你的朋友)通常会忽略这一点。为什么?当你说‘请吃糖’时,这个糖实际上所指的是某种糖的类型,而不是指具体哪一块糖。在语言学中(语义学)中,和类型相对的,是token,暂且译成‘实例’。你朋友吃的每一块糖,都是这种糖类型的一个token(实例)。所以我们日常生活用于中,普通名词通常所指的都是类型。这样的好处是,不必一个token一个对应单词,否则则是灾难,你买的一包糖有50块,就得有50个名词对应,你受得了吗? 当然,我们有时需要区分类型和实例。自然语言的办法是加限定词。你的朋友刚想拿一块糖,你说,不是叫你吃这块糖,而是那块(当然在这种情景下必须有身体语言辅助:你得指着某一特定的糖块)。‘这’和‘那’还是很模糊,一定要明确,恐怕就要加更多的限定、形容成分。甚至要稍稍改变一下状况,例如把包里的糖排排队,然后说,我叫你吃第三块糖,就不会有歧义了。上述的类型和token的对比是从语义角度谈的。从句法和词法的角度(不考虑语义),我们把每一个具体的单词叫做token,而把就有相同形态变化(西语)或相同分布(汉语)的词归纳成一类,叫做词类(品词)。例如,名词就是指一个类别,糖果,就是名词的一个实例。 在编程语言中,类型研究是一门很大的学问。我们知道,计算机是用来处理数据的。我们日常生活中遇到形形色色的数据:姓名是字符类型,年龄是整数类型,身高体重是实数类型,这些类型又分为单数复数,分数不同类型。例如,字符单数类型和字符复数类型就完全是两类不同的类型。 自然语言的中语言对象的类型基本上是心理上的实体,是认知的产物。而编程语言的基本类型则是物理存在:例如,文本类型是单个字符的复数类型,而单个字符的类型是一个字节长的数据类型;整数是四个字节长的数据类型。 忽略这些细节,我们可以认识到,人类对外在世界的感知、理解,是通过类型来区分完成的。 (未完待续)
-
小妖 赞了这篇日记 2018-11-10 17:52:17