1.6 形式语言和自然语言

自然语言 (natural language) 是人们交流所使用的语言,例如英语、西班牙语和法语。它们不是人为设计出来的(尽管有人试图这样做);而是自然演变而来。

形式语言(formal languages) 是人类为了特殊用途而设计出来的。例如,数学家使用的记号(notation) 就是形式语言,特别擅长表示数字和符号之间的关系。化学家使用形式语言表示分子的化学结构。最重要的是:

编程语言是被设计用于表达计算的形式语言。

形式语言通常拥有严格的语法规则,规定了详细的语句结构。例如,3 + 3 = 6 是语法正确的数学表达式,而 3+ = 3$6 则不是;H2O 是语法正确的化学式,而 2Zz 则不是。

语法规则有两种类型,分别涉及记号 (tokens) 和结构。记号是语言的基本元素,例如单词、数字和化学元素。3+ = 3$6 这个式子的问题之一,就是 $ 在数学中不是一个合法的记号(至少据我所知)。类似的,2Zz 也不合法,因为没有一个元素的简写是 Zz 。

6 第一章 程序之道

第二种语法规则与标记的组合方式有关。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. 3

当你读一个用英语写的句子或者用形式语言写的语句时,你都必须要理清各自的结构

(尽管在阅读自然语言时,你是下意识地进行的)。这个过程被称为解析 (parsing)。虽然形式语言和自然语言有很多共同点— 标记、结构和语法,它们也有一些不同:

歧义性 (ambiguity): 自然语言充满歧义,人们使用上下文线索以及其它信息处理这些歧义。形式语言被设计成几乎或者完全没有歧义,这意味着不管上下文是什么, 任何语句都只有一个意义。

冗余性 (redundancy): 为了弥补歧义性并减少误解,自然语言使用很多冗余。结果, 自然语言经常很冗长。形式语言则冗余较少,更简洁。

字面性 (literalness): 自然语言充满成语和隐喻。如果我说 “The penny dropped’’,可能根本没有便士、也没什么东西掉下来(这个成语的意思是,经过一段时间的困 惑后终于理解某事)。形式语言的含义,与它们字面的意思完全一致。

由于我们都是说着自然语言长大的,我们有时候很难适应形式语言。形式语言与自然语 言之间的不同,类似诗歌与散文之间的差异,而且更加明显:

诗歌 (Poetry): 单词的含义和声音都有作用,整首诗作为一个整理,会对人产生影响, 或是引发情感上的共鸣。歧义不但常见,而且经常是故意为之。

散文 (Prose): 单词表面的含义更重要,句子结构背后的寓意更深。散文比诗歌更适合分析,但仍然经常有歧义。

程序 (Programs): 计算机程序的含义是无歧义、无引申义的,通过分析程序的标记和结构,即可完全理解。

形式语言要比自然语言更加稠密,因此阅读起来花的时间会更长。另外,形式语言的结 构也很重要,所以从上往下、从左往右阅读,并不总是最好的策略。相反,你得学会在 脑海里分析一个程序,识别不同的标记并理解其结构。最后,注重细节。拼写和标点方 面的小错误在自然语言中无伤大雅,但是在形式语言中却会产生很大的影响。

3译注:上面两句英文都是不符合语法的,一个包含非法标记,另一个结构不符合语法。

[云炬ThinkPython阅读笔记]1.6 形式语言和自然语言相关推荐

  1. [云炬ThinkPython阅读笔记]2.6 字符串运算

    [云炬ThinkPython阅读笔记]1.8 术语表

  2. [云炬ThinkPython阅读笔记]2.3 表达式和语句

    [云炬ThinkPython阅读笔记]1.8 术语表

  3. [云炬ThinkPython阅读笔记]1.5 值和类型

    1.5 值和类型 值(value) 是程序处理的基本数据之一,一个单词或一个数字都是值的实例.我们目前已经接触到的值有:2 ,42.0 ,和 'Hello␣World!' . 这些值又属于不同的类型 ...

  4. [云炬ThinkPython阅读笔记]2.7 注释

    2.7 注释 随着程序变得越写越长,越来越复杂,它们的可读性也越来越差.形式语言是稠密的, 通常很难在读一段代码后,说出其做什么或者为什么这样做. 1string concatenation , # ...

  5. [云炬ThinkPython阅读笔记]2.9 术语表

    变量(variable): 变量是指向某个值的名称. 赋值语句(assignment): 将某个值赋给变量的语句. 状态图 (state diagram): 变量及其所指的值的图形化表示. 关键字 ( ...

  6. [云炬ThinkPython阅读笔记]1.4 算术运算符

    最后,运算符 * 执行乘方运算:也就是说,它将某个数字乘以自身相应的次数: ✞ >>> 6**2 + 6 42 ✆ 某些语言使用 ^ 运算符执行乘方运算,但是在 Python 中,它 ...

  7. [云炬ThinkPython阅读笔记]第一章 程序之道

    本书的目标是教你像计算机科学家一样思考.这一思考方式集成了数学.工程以及自然科学的一些最好的特点.像数学家一样,计算机科学家使用形式语言表示思想(具体来说是计算).像工程师一样,计算机科学家设计东西, ...

  8. [云炬ThinkPython阅读笔记]3.4 增加新函数

    3.4 增加新函数 目前为止,我们只使用了Python 自带的函数,但是增加新函数也是可能的.一个函数定义(function definition) 指定了新函数的名称以及当函数被调用时执行的语句序列 ...

  9. [云炬ThinkPython阅读笔记]3.3 构建

最新文章

  1. iOS 学习记录----动画
  2. ubuntu 运行c++_06_Linux下VSCode简单编程(远程开发WSL_Ubuntu_18.04) | C语言入门
  3. html向后端发送请求
  4. hibernate session 新增、删除,修改、查询样例
  5. java sha1hash 算法_javaweb使用sha1算法登录加密的整个过程
  6. 文本聚类分析算法_常用的聚类分析算法综述
  7. Debug模式启动tomcat超时
  8. C++调用yolov3模型-opencv3.4.2
  9. 关于MATLAB中使用latex语法
  10. CSS的行内样式与内联样式,看这篇就够了
  11. 外贸个人自建站有哪些比较友好的收款方式?
  12. docker-bridge如何通信
  13. HTML技术(基础/列表/表格/表单)
  14. used in key specification without a key length
  15. 寒假收获(2015.1.16)
  16. 计算机科学家事迹,【CCF会员故事-14】计算机软件科学家谢涛:星辰大海,求思进取...
  17. cdb取得死循环进程的调用栈
  18. 51单片机开发问题之不能直接对端口管脚输出高低点电平
  19. 流行创意风格教师求职简历免费word模板
  20. Matlab拟合椭圆

热门文章

  1. Postman接口测试神器从安装到精通
  2. 《F4+2》—团队项目系统设计改进与详细设计
  3. QA seven's blog
  4. 【leetcode】56. Merge Intervals 相邻线段归并
  5. jquery插件分类与编写详细讲解
  6. Spark 个人实战系列(1)--Spark 集群安装
  7. FTP服务器之pure-ftpd常见问题及解决方法
  8. eclipse 3.6的VE配置 Visual Editor for eclipse3.6
  9. vsftp配置文件详解
  10. hdu 3172(并查集+hash)