《像计算机科学家一样思考Java》—— 1.4 形式语言和自然语言

1.4 形式语言和自然语言

像计算机科学家一样思考Java
自然语言(Natural languages)指人类所说的语言,比如英语、西班牙语、法语等。自然语言并不是由人类设计的,它们是自然演化而形成的。

形式语言(Formal languages)是人类为了某种应用上的需要而设计的。比如,数学中的各种记号便是一种形式语言,这种语言能够很好地描述数字和符号之间的关系。化学家也用形式语言来表示化学分子的结构,而更重要的是:

编程语言是一种用来表达计算的形式语言。

形式语言对于语法有严格的规则。比如,“3+3=6”是一个合法的数学表达式,但“3$=”则不是。同样,H2O是一个正确的化学名,而2Zz则不是。

语法规则有两种:记号规则和结构规则。记号是语言的基本元素,比如单词、数字和化学元素。表达式“3$ =”的问题在于,“$”在数学上不是一个合法的记号(至少据我所知是这样的)。类似地,“2Zz”也不合法,因为没有化学元素的简称为“Zz”。

第二种语法规则表现在表达式的结构上,即怎么编排程序中的记号。表达式“3$ =”在结构上是不合法的,因为等号不能出现在方程的结尾。类似地,在分子表达式中,下标只能出现在元素之后,而不是之前。

当我们在读英语句子或形式语言中的表达式时,我们需要搞清楚这些语句的结构(虽然对于自然语言来说,你是在潜意识里完成这个任务的),这个过程称为解析(parsing)。

虽然形式语言和自然语言有许多相同的特征,比如记号、结构、语法和语义等,但它们也存在不同。

多义性(ambiguity):自然语言充满了多义性,人类可以根据所处环境和其他信息来处理这样的多义性。而形式语言是非歧义的,这意味着不管在什么环境下,一条语句只能表达一种含义。

冗余性(redundancy):为了弥补多义性,同时也为了减少误解,自然语言通常是冗余的,而形式语言则更简洁。

无修饰性(literalness):自然语言中有许多惯用语和隐喻,而形式语言则非常准确。

我们从小就在说自然语言,当转向形式语言时,通常会有一段困难的时间去调整和适应。自然语言和形式语言之间差别在某种程度上就像诗歌和白话文之间的差别一样:

诗歌:词语的发音和意思都是重要的,一首诗作为一个整体营造出一种氛围或情感效果,其中的多义性是常见的,甚至是故意而为的。

白话文:字面上的意思更重要,而结构也承载了更多的语言含义。

程序:计算机程序是非歧义的。我们通过对程序中记号和结构的分析是完全可以理解计算机程序的。

这里有些关于阅读程序(和其他形式语言)的建议。首先,形式语言比自然语言的信息密度更大,由此阅读所花的时间也越长。其次,程序中的结构是很重要的,这样一来,从头到尾、从左向右阅读程序往往不是一个好主意。相反,应该试着在自己的大脑里解析程序,识别记号并且翻译程序中的结构。最后,细节是重要的,像拼写错误和标点错误这样的小错误,虽然在自然语言中不是什么大问题,但是在形式语言中却有很大的影响。

时间: 2024-10-02 20:07:08

《像计算机科学家一样思考Java》—— 1.4 形式语言和自然语言的相关文章

《像计算机科学家一样思考C++》——1.4 形式语言和自然语言

1.4 形式语言和自然语言 像计算机科学家一样思考C++ 自然语言是指人类表达的语言,比如,英语.西班牙语和法语.自然语言不是由人类设计(尽管人类尝试对其强加某些命令)的,而是通过自然演化的. 形式语言则是由人类为了某些特殊应用而设计的语言.例如,数学中使用的记号法就是一种特别擅长表示数字和符号间关系的形式语言.化学家使用某种形式语言来表示分子间的化学结构.而最重要的是: 编程语言是用于表达计算过程的形式语言. 正如我之前提到的,形式语言具有严格的语法规则.例如,3+3=6是一个语法正确的数学表

《像计算机科学家一样思考C++》——1.1 什么是编程语言

1.1 什么是编程语言 像计算机科学家一样思考C++ 你即将学习的编程语言是C++.自1998年起的AP考试都以C++为基础.在这之前,采用的是Pascal.C++和Pascal都是高级编程语言,你可能听说过的其他高级语言有Java.C和FORTRAN. 你可能从"高级编程语言"这个名字中得知还有低级编程语言.低级编程语言一般指的是机器语言或者汇编语言.一般来说,计算机只能执行用低级语言编写的程序.因此,高级语言编写的程序需要先转换成低级语言再执行.高级语言的一个小缺点就是这一转换过程

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

前言 像计算机科学家一样思考Java 我们从别人的发明中享受了很大益处,我们也应该乐于以我们的任何一种发明为别人服务,并且这种事我们应该自愿地和慷慨地去做. --本杰明·富兰克林,引用自Edmund S. Morgan所著的<本杰明·富兰克林传> 我为什么写这本书 1999年,当我还在科尔比学院教书的时候,我便开始写这本书了.现在,这已经是第5个版本了.那时,我正使用Java程序设计语言来教授计算机科学导论课程,但始终没有找到一本合适的教材.一方面,这些书的内容太多,让学生去阅读一本800页的

《像计算机科学家一样思考Java》—— 1.1 什么是编程语言

1.1 什么是编程语言 像计算机科学家一样思考Java你即将学习的语言是Java,这是一种相对较新的语言(Sun公司于1995年5月发布了Java的第一个版本).Java是一种高级语言(high-level language),你可能听过的其他高级语言还有Python.C.C++和Perl. 有了"高级语言",还有低级语言(low-level language),有时候也叫做机器语言或者汇编语言.粗略地说,计算机只能够执行由低级语言编写的程序.因此,由高级语言编写的程序必须先被翻译成低

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

1.7 练习 像计算机科学家一样思考Java练习1.1 计算机科学家有一个烦人的习惯,他们会用一些常用的英语单词来表示其他的意思.比如,在英语中,statement和comment的意思是相同的,但是在程序中就不同了. 在本书中,每个章节的最后都附有术语表,列出这些单词和短语的目的是强调它们在计算机科学中的特殊含义.虽然你可能很熟悉某些单词,但它们的意思却有可能和你先前所知道的完全不一样. 1.在计算机行业中,语句(statement)和注释(comment)的区别是什么? 2.说一个程序是可移

《像计算机科学家一样思考Java》—— 1.2 什么是程序

1.2 什么是程序 像计算机科学家一样思考Java程序是说明如何执行计算的一个指令序列1.计算可能是数学计算,比如求解方程组或者寻找多项式的根等:但计算也可以是符号型计算,比如查找和替换文档中的文本或者编译一个程序(够奇怪的). 指令也称作语句(statement),它的格式因不同的编程语言而有所不同.但多数语言都包括一些基本的操作. 输入:从键盘.文件或其他设备获取数据. 输出:在屏幕上显示数据,或者向一个文件或其他设备写入数据. 数学:完成基本的数学运算,比如加法和乘法. 测试:检测特定条件

《像计算机科学家一样思考Java》—— 1.6 术语表

1.6 术语表 像计算机科学家一样思考Java问题解决(problem-solving):对问题进行建模,寻求解决方案并表达解决方案的过程. 高级语言(high-level language):便于人类阅读和编写的编程语言,比如Java. 低级语言(low-level language):便于计算机运行的编程语言.也叫做机器语言或汇编语言. 形式语言(formal language):人类为了特殊用途(比如表达数学理论或计算机程序)而设计的语言.所有的编程语言都是形式语言. 自然语言(natur

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

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

《像计算机科学家一样思考C++》导读

作者简介 像计算机科学家一样思考C++Allen B. Downey是美国Olin工程学院的计算机科学副教授.他曾经在Wellesley College.Colby College和U.C. Berkeley教授计算机科学课程.他在MIT获得学士和硕士学位,并且从U.C. Berkeley获得计算机科学博士学位.Allen基于自己教授计算机程序设计课程的经验,开创了"像计算机科学家一样思考(How to Think Like a Computer Scientist)"的教学理念和方法