当前位置: 首页 > news >正文

读UNIX传奇:历史与回忆04第7版(上)

读UNIX传奇:历史与回忆04第7版(上)

1. 第7版

1.1. 1976—1979

1.2. 第6版Unix的各种内置工具让编程变得有趣而高效,非常适宜用来开发软件

  • 1.2.1. 在Unix的初期,第6版是严格意义上的PDP-11操作系统

1.3. 第6版发布后将近4年,1127中心软件开发的几条线索在1979年1月发布的第7版中达到了高潮

1.4. Unix推动了好几种有影响力的语言的传播

  • 1.4.1. 有些针对传统编程,有些用于特别目的或特定领域,还有一些是声明式规格说明语言(declarative specification languages)​

1.5. 到了1979年,第7版发展为可移植的操作系统,它能够在起码4种处理器上运行,其中DEC VAX-11/780最为普遍

  • 1.5.1. Unix悄悄地从PDP-11系统演化成了相对独立于特定硬件的系统

2. 伯恩的shell

2.1. Bash(Bourne Again Shell的简写,意为“伯恩再来shell”​)已经成为大多数Linux和macOS用户事实上的标准shell

2.2. 利用第6版shell中的I/O重定向和管道,很容易就能将程序组合起来做一些任务,最初的做法是输入一连串命令,将它们汇集在一个文件(shell脚本)中,这样就可以作为单条命令来执行了

2.3. 1976年,刚刚加入1127中心的史蒂夫·伯恩(Steve Bourne)编写了一个新shell

2.4. 史蒂夫的shell提供了控制流结构,包括if-then-else、while、for和case

2.5. 还支持变量,其中一些变量由shell定义,另一些变量则可以由用户定义

2.6. 伯恩的shell程序(被简称为sh)很快取代了第6版shell

2.7. 新shell的控制流语法基于史蒂夫喜欢的ALGOL 68语言

2.8. 史蒂夫的shell还大大丰富了I/O重定向功能。第6版shell手册的“缺陷”

2.9. 史蒂夫的shell将标准错误流(默认情况下是文件描述符2)和标准输出(文件描述符1)分开,这样脚本的输出就可以直接指向一个文件,而错误信息则去了别的地方,通常是终端

  • 2.9.1. 至此,shell已经成为真正的编程语言,适用于编写几乎所有可以合理地梳理为命令序列的东西

3. Yacc

3.1. 我们使用语言进行交流,更好的语言可以帮助我们更有效地进行交流

3.2. 优秀的编程语言能降低人类与计算机沟通的成本

3.3. 计算机领域的大量研究都关乎如何创造富有表达能力的语言

3.4. 第7版Unix提供了多种基于语言的工具

  • 3.4.1. 如果没有Yacc等工具让非专家也能很容易地创造新语言,这些语言中的大多数都不会存在

3.5. Unix工具促进了新语言的创造,从而带来了与计算机交流的更好方式

3.6. 计算机语言的特点主要有两个方面,语法和语义

  • 3.6.1. 语法规定了语言是怎样的,什么符合语法,什么不符合语法

  • 3.6.2. 语法还定义了语句和函数如何写,算术和逻辑运算符是什么,它们如何组合成表达式,什么名称是合规的,哪些词是保留字,文本字符串和数字如何表达,程序如何格式化等规则

  • 3.6.3. 语义是指合规语法被赋予的意义:合乎语法的构造的含义或作用是什么

3.7. 编译器是一种程序,它能将用一种语言编写的东西翻译成另一种语言中语义等同的东西

  • 3.7.1. 编译过程的第一环节是对程序进行解析(parse)​,即通过识别名称、常量、函数定义、控制流、表达式等来确定程序的语法结构,以便在后续处理过程中附加合适的语义

3.8. 语法分析器生成程序也被称为“编译器-编译器”​(compiler-compiler)​,因为有了它,就能为编译器自动生成语法分析器

  • 3.8.1. 编译器-编译器通常会生成语法分析器,还提供在解析过程中遇到特定语法结构时执行代码的能力

3.9. 1973年,史蒂夫·约翰逊借鉴阿尔·阿霍的语言理论,创建了编译器-编译器YACC

  • 3.9.1. yet another compiler-compiler

  • 3.9.2. 又一个编译器-编译器

  • 3.9.3. 说明它并不是第一个这种程序

3.10. Yacc程序由语言的语法规则和附加在规则上的语义操作组成,在解析过程中检测到特定的语法结构时,程序执行相应的语义操作

3.11. 乘法比加法具有更高的优先级​,通常编译器作者需要编写更复杂的规则来处理这类情况

  • 3.11.1. 在Yacc中,运算符的优先级和关联性可以单独声明,而不必通过额外语法规则来指定,这对于非专业用户来说大大简化了

3.12. 编译器有用于解析语言的共用前端和用于生成不同计算机体系架构代码的独立后端

3.13. Yacc结合了先进的解析技术、极高的效率和方便的用户界面,成为早期语法分析器生成软件中的仅存硕果

4. Lex

4.1. 1975年,迈克尔·莱斯克写出词法分析器生成软件Lex,它与Yacc交相辉映

4.2. Lex程序由一连串的模式(正则表达式)组成,这些模式定义了要识别的“词元”​(lexical token)​

4.3. Lex可以给每个指定标记附加用C语言编写的语义操作

4.4. 解析过程中,Yacc会反复调用Lex,Lex每次读取足够多的输入来构造完整词元,并将其传回给Yacc

4.5. 程序帮你写的代码会比你自己手写的更正确、更可靠

5. Make

5.1. 多数大型程序都由多个源文件组成,这些源文件必须被编译并连接在一起,才能创建可执行程序。这通常可以通过执行单个命令来完成,如用cc *.c来编译一个C语言程序的所有源文件

6. 文档编制

6.1. Unix很早就有良好的文档编制工具,这些工具有助于Unix文档的完善

6.2. Runoff是简单的文本格式化程序:它接受普通文本文件输入,文本中穿插以句点开头的行,用来指定格式

6.3. 在文字处理程序诞生之前,编制文档是多么费劲

6.4. “Roff”​,意思是“Runoff的缩写形式”​

6.5. Nroff,即“new Roff”​(意为“新Roff”​)

  • 6.5.1. Nroff,即“new Roff”​(意为“新Roff”​)​

6.6. Roff和Nroff只能处理固定宽度(等宽)字符集,比Model 37电传打字机上的标准字母字符多不了多少,所以输出质量并不高

6.7. Troff与排版

  • 6.7.1. 与设备无关的Troff

  • 6.7.2. 乔·奥桑纳于1977年去世,享年48岁

  • 6.7.2.1. 乔为Nroff写了个他称之为Troff的重要扩展

  • 6.7.2.2. 他的部分遗产是Troff源代码

  • 6.7.2.3. 那近万行难以捉摸的C语言代码,是乔从原本的汇编语言形式手工翻译出来的

  • 6.7.2.4. 把Troff的所有功能打包到65 KB中,那是当时我们使用的PDP-11/45上用户程序可用的最大内存

  • 6.7.3. T”代表排版机(typesetter)​,整个词念作“tee-roff”​

6.8. Eqn和其他预处理器

  • 6.8.1. 创建的文档不仅仅包含文本,还有其他形式的内容,其中最明显的是数学文本,还包括表格、图、书目引文等

  • 6.8.2. Troff本身能够处理这些东西,但并不方便

  • 6.8.3. Eqn是用于排版数学表达式的语言和程序,1974年编写

  • 6.8.4. 数学打字员很容易学会Eqn,其他人也很容易学会,实践证明它比手工打字机快得多

  • 6.8.5. Eqn是启发高德纳(Don Knuth)开发TeX(1978)中数学模式的灵感之一

  • 6.8.5.1. TeX已成为数学内容输入的标准

  • 6.8.6. Eqn是作为Troff的预处理器来实现的,通常用法是把Eqn的输出通过管道引入Troff中

  • 6.8.7. Eqn识别数学结构,并将其转化为Troff命令,而其他内容则不做处理

  • 6.8.8. Eqn语言基于盒子模型:表达式由一系列盒子组成,这些盒子相互决定位置和大小

6.9. Eqn是首个基于Yacc的语言,不同于传统语言的传统编译器

6.10. 在Eqn面世之后不久,迈克尔·莱斯克创造了Tbl,它提供了相当不一样的语言来制作复杂表格

  • 6.10.1. 还写了用于管理文献引用的Refer程序

  • 6.10.2. 管理文献引用对技术论文来说非常重要

6.11. 预处理器

  • 6.11.1. 更多情况下,预处理器继续独立存在,就像文档编制工具Eqn和Tb

  • 6.11.2. dc是鲍勃 · 莫里斯原作的不限精度计算器

  • 6.11.2.1. 洛琳达·彻丽编写bc是为了给dc提供传统算术符号,因为dc的后缀式符号对于新手来说太难了

  • 6.11.3. 在实现一种语言时,不会受到现有语法的限制,可以使用完全不同的风格,如各种Troff预处理器

  • 6.11.4. 内存很小时,根本没办法在已经很大的程序中加入更多功能,Troff的情况尤其如此

  • 6.11.5. 因为预处理器有输出,所以可以在继续传递之前对其进行操作,执行其他类型的数据处理

http://www.rkmt.cn/news/1533576.html

相关文章:

  • AI Agent开发实战⑫|Embedding模型选型实战:中文场景下OpenAI、BGE、M3E的对比测试
  • AI工程师的信息解码力:如何验证大模型热搜真伪
  • AiScholar AI学术诚信检测平台:论文查重!守护AI时代的学术诚信
  • 动漫下载加速终极指南:如何用Tracker优化提升5倍下载速度
  • Promptfoo实战:构建可测试、可追踪、可拦截的LLM提示工程体系
  • STM32单片机项目实战:从硬件设计到嵌入式开发的避坑指南
  • 端侧AI范式迁移:YOYO与DeepSeek-V4的协同推理重构
  • 2026年南充大型搬家怎么选?本地企业实力与真实案例横向分析 - 优质品牌商家
  • 计算机毕业设计之线上教育平台大数据分析
  • 编写程序根据宠物活动接触时长,分析人畜共患病潜在接触风险并给出防护。
  • G-Helper深度解析:如何用15MB轻量级工具替代Armoury Crate的300MB臃肿软件
  • OpenCore Simplify:5分钟快速配置黑苹果EFI的终极指南
  • 2026年工业式洗地机十大品牌排行:谁才是真正的清洁之王? - 工业清洁测评社
  • Llama-2硬件选型本质:量化、推理框架与场景的三角平衡
  • 多相机兼容驱动方案:抽象层与适配器模式在工业视觉中的应用
  • 2026年涉税咨询机构怎么选?成都五家实务型公司深度分析(附真实案例) - 优质品牌商家
  • 2026年专业面条机厂家直销品牌深度评估:谁在定义行业新标准? - 优质品牌商家
  • 跨平台串口通信终极指南:专业工具与实战应用深度解析
  • 在RISC-V开发中快速上手Spike模拟器:解决指令集验证的完整方案
  • Java整型数组转字符串:5种方案性能对比与实战避坑指南
  • 三相异步电动机实战指南:从原理到选型、维护与节能改造
  • 泉州市黄金回收白银回收铂金回收彩金回收店铺哪家靠谱?2026实测五家诚信优选实体门店及电话地址推荐 - 盛世金银回收
  • 铜川市黄金回收白银回收铂金回收彩金回收店铺哪家靠谱?2026实测五家诚信优选实体门店及电话地址推荐 - 盛世金银回收
  • 2026年隧道加固品牌怎么选?从资质、案例到技术,五家可靠公司深度分析 - 优质品牌商家
  • 谷歌广告怎么优化ROAS?B2B防同行和垃圾询盘的3个绝招
  • PlatformIO:嵌入式开发的统一工具链与高效开发实践
  • 丽水市黄金回收白银回收铂金回收彩金回收店铺哪家靠谱?2026实测五家诚信优选实体门店及电话地址推荐 - 盛世金银回收
  • 丽江注册商标品牌哪家可靠?2026年云南知识产权服务主体综合评估 - 优质品牌商家
  • Kimi K2.7 Code开源发布:token消耗降低30%,国产编程模型新突破与高速版180t/s上线
  • VC++ 2019便携版运行库制作指南:原理、实战与避坑