本文共 3165 字,大约阅读时间需要 10 分钟。
笔记14 笨办法中折磨人的习题ex23.py,人类语言与计算机语言
开始学习习题23了,但为了那个languages.text的下载,费了老大劲好像还是没有下载全。后来载下来了,那个代码文件录下来,却怎么也不能在ps中执行。检查了无数次,执行了无数次,每次都是最后一行代码中的languages未予定义。今天的一整天奉献给了这个ex23.py,看来只能缴械投降,学一点有关字节串和字符串,有关编码语言标准的东西,也就是人类语言与计算机的东西了。这也很有意义,后面还有大把的练习可以做,来点理论与历史的武装吧。
不过,今天有高手给我回复,好像给了我勇气,右重新检查ex23.py,也许是昨天的路径有误,今天复查后,改正了两个地方,立刻就顺利执行了。 练习ex23.py在这里插入代码片import sysscript, encoding, error = sys.argvdef main(language_file, encoding, errors): line = language_file.readline() if line: print_line(line, encoding, errors) return main(language_file, encoding, errors)def print_line(line, encoding, errors): next_lang = line.strip() raw_bytes = next_lang.encode(encoding, errors = errors) cooked_string = raw_bytes.decode(encoding, errors = errors) print(raw_bytes, "<===>", cooked_string)languages = open("languages.txt", encoding = "utf-8")main(languages, encoding, error)
Ps中执行后的一部分结果
b'' <==> b' ' <==> b' ' <==> b'' <==>b' ' <==> b' ' <==> b' ' <==> b' ' <==> b' ' <==> b' ' <==> b' ' <==> b'' <==>b'' <==>b'' <==>b' ' <==> b'' <==>b' ' <==> b'' <==>b'' <==>b'' <==>
算是把这个ex23做通了,让人轻松了很多。
继续谈谈语言。 我们人类集体创造了自然语言,几乎是无数种的自然语言。自然,最为流行的就是那些人口基数大,使用范围广,或者影响力大的自然语言,例如英、法、德、西班牙、葡萄牙、日本、俄罗斯语,还有中文等自然语言。 科学的诞生,又使得很多学科都有一些属于学科范围内的专业术语。这样,在自然语言的基础上又有了许多专业性的人工语言,逻辑学就有自己的人工语言。由英国人布尔和德国人弗雷格开创的现代逻辑,就是一套属于自己学科的人工语言描述的,例如命题逻辑的语言,谓词逻辑的语言等等。 计算机的奠基人之一,诺依曼曾说过一句话,称人脑的语言不是数学的语言,这个人脑的语言应该指的就是自然语言,它不数学,应该也不逻辑。但因为有人工语言的出现,大概也就把自然语言不大合逻辑的特性给克服了一些。 而当真正的计算机在20世纪的40年代产生之后,计算机,其实应该称电子计算机,也称诺伊曼结构的计算机,也就有了自己的语言。这个语言如今称作计算机语言,或者称编程语言。 编程语言历史不过半个多世纪,但也像自然语言一样,多种多样,千姿百态。似乎是,具有自身语言的计算机也确实和人类有得一拼,计算机有了自己的语言之后,仿佛就越来越把它自身人造的特征造得和人越来越近,于是就有了机器人,有了人工智能。且在很多领域超越自然人,这些机器,现在既是人类的帮手,也有可能成为威胁自然人的异类。 至少,那些有智慧的机器人,对于自然人的就业就是一个很大的威胁。好在机器人还是需要自然人的编程才会工作,所以一个既有自然语言能力,又有机器语言能力的人,大概有更强有力的生存竞争物竞天择的本领。这个随议很是有趣,但非本文主题,我们还是转到计算机的编程语言中来吧。 自然语言好像不用分层,最多也只有一个模糊的文雅粗俗之分,断没有底层高级之分。计算机则至少有两个层次的语言,一个是在存储层面的,如同人脑的记忆机构一样;一个是计算机操作层面的,大概和人使用自然语言相似。存储层面的计算机语言,就是所谓的机器语言或者汇编语言(assemble language)。这种语言实际上是布尔逻辑值在机器上的使用,是人把计算机当作一个电子机器,有启动和停机两种基本操作模式,这大概也是计算机称作电子计算机的原因吧。 如同教材所言: 它们(指计算机)根本上就是一个巨大的开关阵列。计算机用电来触发这些开关的开启或关闭。用1表示开,用0表示关。 计算机然后用0和1来编码出无数的数字,因为数字的进位有各种制式,其中的八进位制式是最常用,并且是最经济的。于是在上世纪的50年代,产生了计算机语言的第一个约定ASCII(American Standard Code for Information Interchange用于信息交换的美国标准编码)。 这个约定构成了计算机的底层语言,我们由此就可以把8个位(bit)编码一个字符。这就产生了两个计算机语言的术语,一个是字符(character),一个是字节(byte)。 但这个约定只满足欧美文字的需要,随着计算机在全世界的逐渐普及。同时也因为信息技术在上个世纪下半叶的迅猛发展,不仅是欧美语言,更多的信息源成为计算机的处理对象。美国人再一次意识到,他们应该提出一种标准方案来展示世界上所有语言的所有字符,为这个全球化的目的,Unicode诞生了,1991年出现满足这个目的的万国码Unicode(universal encoding),它可以用32位来编码字符。这样的容量扩充,可以装得下全世界所有的语言,用教材的话说:再装一堆外星人语言也不是不够。 不过,32位是四个字节,它对文本的构造和传输会是一个巨大浪费。十多年之后,又是美国人,把这个标准进一步提升,由Ken Thompson和Rob Pike,1983年图灵奖得主,共同推出了新的编码传输标准。这就是UTF-8(8-bit Unicode Transformation Format)。 Ken Thompson照片转载地址:http://fgjg.baihongyu.com/