《像计算机科学家一样思考Python(第2版)》——1.6 形式语言和自然语言

1.6 形式语言和自然语言

自然语言是指人们所说的语言,如英语、西班牙语和法语。它们不是由人设计而来的(虽然人们会尝试加以语法限制),而是自然演化而来的。

形式语言则是人们为了特殊用途设计的语言。例如,数学上使用的符号体系是一种特别擅于表示数字和符号之间关系的形式语言;化学家则使用另一种形式语言来表示分子的化学结构。而最重要的是:

编程语言是人们为了表达计算过程而设计出来的形式语言。

形式语言倾向于对语法做出严格的限制。例如,3 + 3 = 6是语法正确的数学表达式,但3+ = 3$6则不是。H2O是语法正确的化学方程式,而2Zz则不是。

语法规则有两种,分别适用于记号(token)和结构(structure)。记号是语言的基本元素,如词、数字和化学元素。3+ = 3$6的一个问题就是$在数学表达式中(至少就我所知)不是合法记号。相似地,2Zz不合法是因为并不存在缩写为Zz的化学元素。

第二种语法规则指定记号所组合的方式。数学等式3+ = 3不合法,因为虽然+和=是合法记号,但不能将它们连续放置。相似地,在化学表达式里,下标数字应该出现在元素名称之后,而不是之前。

“This is @ well-structured Engli$h sentence with invalid t*kens in it.”是一个结构良好,但包含非法记号的英语语句。“This sentence all valid tokens has, but invalid structure with.”这句话所有的记号都合法,但是语句结构不合法。

当你阅读英语的句子或形式语言的语句时,需要弄清句子的结构是什么(虽然在自然语言中这个过程是下意识完成的)。这个过程称为语法分析。

虽然形式语言和自然语言有很多共同的特点—记号、结构、语法以及语义,但它们也有一些区别。

歧义性:自然语言充满了歧义,人们通过上下文线索和其他信息来处理这些歧义。形式语言通常设计为几乎或者完全没有歧义,即不论上下文环境如何,任何表达式都只有一个含义。

冗余性:为了弥补歧义,减少误解,自然语言采用大量的冗余。因此,自然语言往往很啰嗦。形式语言则相对不那么冗余,更加简洁。

字面性:自然语言充满了习惯用语和比喻。例如,有人说,“硬币掉了”(The penny dropped[1]),并不一定是硬币,也不一定是有什么掉了。形式语言则严格按照它的字面意思表达含义。

因为我们都说着自然语言长大,有时候很难适应形式语言。在某种意义上,形式语言和自然语言的区别与诗词和散文的区别类似,而且程度更甚。

诗词:字词的使用,既考虑它们的音韵,也考虑到它们的意义,而整首诗合起来表达某种意境或情绪反应。歧义不仅常见,而且常常是刻意为之。

散文:字词的意义更加重要,而且句子的结构也提供更多的意义。散文比诗词更容易分析,但仍然有不少歧义。

程序:计算机程序的意义不含歧义,直接如字面所指。完全可以通过它的记号和结构理解其意义。

形式语言的密度远远大于自然语言,所以阅读起来需要花费更多的时间。还有,结构非常重要,所以直接自顶向下、从左至右的阅读顺序并不一定是最好的。相反,要试着学会在头脑中解析程序,辨别出记号并解析出结构。最后,细节很重要。在自然语言中常常可以忽略的小错误,如拼写错误或者标点符号错误,在形式语言中往往会造成很大的差别。

时间: 2024-10-01 18:25:39

《像计算机科学家一样思考Python(第2版)》——1.6 形式语言和自然语言的相关文章

《像计算机科学家一样思考Python(第2版)》——第1章 程序之道 1.1 什么是程序

第1章 程序之道 本书的目标是教会你像计算机科学家一样思考.这种思考方式综合了数学.工程学以及自然科学的一些最优秀的特性.计算机科学家与数学家类似,他们使用形式语言来描述理念(特别是计算):与工程师类似,他们设计产品,将元件组装成系统,对不同的方案进行评估选择:与自然科学家类似,他们观察复杂系统的行为,构建科学假说,并检验其预测. 作为计算机科学家,最重要的技能就是问题求解.问题求解是发现问题.创造性地思考解决方案以及清晰准确地表达解决方案的能力.实践证明,学习编程的过程,正是训练问题求解能力的

《像计算机科学家一样思考Python》——导读

前 言 本书的奇特历史 1999年,我正在为一门Java的编程入门课程备课.这门课我已经教过3个学期,感到有些灰心.课程的不及格率太高,即使是那些及格的学生,也只获得了很低的成就. 我发现问题之一是教材.它们太厚,有太多冗余的细节,而针对编程技巧的高阶的指导却很不足.并且学生们都受着"陷阱效应"的苦恼:开头时很容易,也能循序渐进,但接着在第5章左右,整个地板就突然陷落了.新资讯来得太多.来得太快,以至于我必须花费一学期剩下的全部时间来帮助他们拾回丢失的片段. 开课前两周,我决定自己来编

《像计算机科学家一样思考Python(第2版)》——导读

前 言 本书以培养读者以计算机科学家一样的思维方式来理解Python语言编程.贯穿全书的主体是如何思考.设计.开发的方法,而具体的编程语言,只是提供了一个具体场景方便介绍的媒介. 全书共21章,详细介绍Python语言编程的方方面面.本书从最基本的编程概念开始讲起,包括语言的语法和语义,而且每个编程概念都有清晰的定义,引领读者循序渐进地学习变量.表达式.语句.函数和数据结构.书中还探讨了如何处理文件和数据库,如何理解对象.方法和面向对象编程,如何使用调试技巧来修正语法错误.运行时错误和语义错误.

《像计算机科学家一样思考Python(第2版)》——1.8 术语表

1.8 术语表 问题求解(problem solving):总结问题.寻找解决方案以及表达解决方案的过程. 高级语言(high-level language):设计来方便人们读写的编程语言,如Python. 低级语言(low-level language):设计来方便计算机执行的编程语言,也被称为"机器语言"或"汇编语言". 可移植性(portability):程序的一种属性:可以在多种类型的计算机上运行. 解释器(interpreter):一个读取其他程序并执行其

《像计算机科学家一样思考Python(第2版)》——1.9 练习

1.9 练习 练习 1-1 在计算机前阅读本书是一个好主意,因为你可以边看边试验书中的示例. 每当你试验新的语言特性时,应当试着故意犯错.例如,在"Hello,World!"程序中,如果少写一个引号,会发生什么?如果两个引号都不写,会怎么样?如果把print拼写错了,会如何? 这种试验会帮你记住所读的内容,也能帮你学会调试,因为这样能看到不同的出错消息代表着什么.现在故意犯错总比今后在编码中意外出错好. 在print语句中,如果漏掉一个括号,或者两个都漏掉,会发生什么? 如果正尝试打印

《像计算机科学家一样思考Python》——4.3 练习

4.3 练习 下面是一系列使用TurtleWorld的练习.它们力求有趣,但也包含着某些寓意.当你做这些练习时,可以猜想一下其寓意. 在接下来的章节中有这些练习的解答,所以在完成(或着至少尝试过)之前,请先别继续阅读. 1.写一个函数square,接受一个形参t,用来表示一只乌龟.利用乌龟来画一个正方形.写一个函数调用传入bob作为实参来调用square函数,并再运行一遍程序. 2.给square函数再添加一个形参length.修改函数内容,保证正方形的长度是length,并修改函数调用以提供这

《像计算机科学家一样思考Python》——3.5 添加新函数

3.5 添加新函数 至此,我们都只是在使用Python提供的函数,其实我们也可以自己添加新的函数.函数定义指定新函数的名称,并提供一系列程序语句.当函数被调用时,这些语句会顺序执行. 下面是一个例子: def print_lyrics(): print "I'm a lumberjack,and I'm okay." print "I sleep all night and I work all day." def是关键字,表示接下来是一个函数定义.这个函数的名称是

《像计算机科学家一样思考Python》——3.3 数学函数

3.3 数学函数 Python有一个数学计算模块,提供了大多数常用的数学函数.模块是指包含一组相关的函数的文件. 要想使用一个模块,需要先将它导入(import)运行环境: >>> import math 这个语句将会建立一个名为math的模块对象(module object).如果打印这个对象,可以看到它的一些信息: >>> print math <module 'math' (built-in)> 模块对象包含了这个模块中定义的函数和变量.若要访问其中的

《像计算机科学家一样思考Python(第2版)》——1.2 运行Python

1.2 运行Python Python入门的挑战之一在于你可能需要自己在电脑上安装Python及相关软件.如果你熟悉自己的操作系统,而且习惯于命令行界面,那么安装Python不是什么问题.但对于初学者来说,同时学习编程和系统管理命令两件事,有时候是非常痛苦的. 为了避免这个问题,我推荐你开始先在浏览器中运行Python,等熟悉了Python语言之后,我再向你介绍如何在电脑上安装Python. 用于运行Python的网站有不少.如果你已经找到一个喜欢的,就可以直接去用.如果没有,我推荐Python

《像计算机科学家一样思考Python》——3.2 类型转换函数

3.2 类型转换函数 Python提供了一些可将某个值从一种类型转换为另一种类型的内置函数.int函数可以把任何可以转换为整型的值转换为整型:如果转换失败,则会报错: >>> int('32') 32 >>> int('Hello') ValueError: invalid literal for int(): Hello int可以将浮点数转换为整数,但不会做四舍五入操作,而是直接舍弃小数部分. >>> int(3.99999) 3 >>