开源软件架构总结之——Bash(readline做输入交互式,词法语法分析,进程交互)
第3章 The Bourne-Again Shell
Bash的主要组件:输入处理,解析,单词展开(word expansion)和其他命令处理,管道(pipeline)中的命令执行。这些组件构成一个流水线(pipeline),从键盘或脚本中获取字符,然后逐步转化为命令。
图3.1 Bash组件结构
3.7. 经验教训
3.7.1. 什么是重要的
参与到Bash项目中已经有20多年,在这期间我也获益良多。最重要的一点是一定要保留详细的修改日志,其重要性怎么强调都不过份。通过阅读修改日志来回忆起当初的想法,感觉是很好的。甚至你还可以将某个修改与一个bug报告联系起来,然后编写一个重现bug的测试用例或提出一些建议。
如果条件允许,我建议在项目之初就考虑全面的回归测试。Bash拥有数千个测试用例,覆盖了差不多所有的非交互性功能。我考虑过测试交互式功能,其实Posix标准的一致性测试套件中就有交互性测试,只是并没有将这个测试框架发布出来(我认为很有必要)。
标准很重要,Bash受益于它是一个标准的实现。参与到你正在实现的软件的标准化过程中来也是非常重要的。在讨论相关功能和行为时,标准往往是最终的参考依据。当然,前提是这是一个好的标准。
外部标准重要,内部标准同样重要。我很幸运地接触到了GNU项目的诸多标准,它们包含了大量关于设计和实现方面的好且实用的建议。
好的文档同样非常关键。如果你希望别人使用你的软件,全面并清晰的文档就是必要的。一个成功的软件必须拥有大量的文档,因而开发者提供权威的版本就显得非常重要。
优秀的软件随处可见,那就充分利用起来吧。比如,gnulib中包含了大量的有用的函数,你尽可以把它们"抠"出来。BSD各个版本和Mac OS X就是这么干的。Picasso说过:好的艺术家靠的是偷,说的就是这个道理。
参与用户社区,但是准备挨骂,有时候这并不好受。活跃的用户社区好处是显然的,但是这些人可能会非常情绪化,不要太当真就好。
3.7.2. 如果可以重来
Bash拥有数百万用户,我知道后向兼容有多么地重要。在某种意义上,后向兼容意味着永远不用向用户说抱歉。但是,这个世界远不是这么简单。事实上,我不得不一直做一些破坏兼容性的修改,比如修正一个不好的决定,修改一个错误的设计,或者更正shell不同部分之间的不兼容性,这些都是情有可原的修改,但是几乎都会引起一些用户的抱怨。我早就应该对当兼容性分级处理的。
Bash的发展一直都没有特别的开放,我已经习惯于里程碑发布形式(比如 bash-4.2)并由个人提交补丁。我的理由是:我需要适应开发商们更长的发布周期(相对于自由软件和开源世界),而且我也有过beta版本传播地过于广泛的不快回忆。当然,如果一切都要重来,我还是会考虑更快的发布频率,比如可以使用一个公开的源码仓库。
不真正动手去做是完不成任何事的。有一件事我已经考虑了很久,却一直没去做,那就是将Bash的解析器重写为递归下降(recursive-descent)的方式,以取代bison。以前,我以为为了遵守Posix标准,这件事就非得做,但是后来我只需要少量修改就解决了这个问题。如果当时就从头写起,大概现在我已经实现了一个新的解析器,那么很多问题都会变得简单得多。
摘自:http://www.ituring.com.cn/article/6220
开源软件架构总结之——Bash(readline做输入交互式,词法语法分析,进程交互)的更多相关文章
- [语法]C语言中二维数组做输入参数
C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...
- 使用TortoiseGit和Git Bash不需要输入RSA密码(passphrase)的方法
1. 安装和配置Putty 安装 官网下载Putty并安装. 生成ppk密钥 打开puttygen.exe(C:\Program Files\PuTTY\puttygen.exe), 点Convers ...
- <摘录>开源软件架构-ZeroMQ
原文链接:http://www.aosabook.org/en/zeromq.html ØMQ是一个消息通信系统,如果你愿意的话也可以称其为“面向消息的中间件”.ØMQ的应用环境很广泛,包括金融服务. ...
- 开源软件架构总结之——Asterisk(DSL、组件、多线程)
Asterisk 1是基于GPLv2协议发布的一款开源电话应用平台.简单地说,这是一个服务端程序,用于处理电话的拨出.接入以及自定义流程. 一个人使用电话A呼叫另一个使用电话B的人.在此场景下,连接到 ...
- 记录JavaScript中使用keyup事件做输入验证(附event.keyCode表)
input的blur事件 $("#input-name").blur(function () { var value = $(this).val(); if (value === ...
- MapReduce (hive表SequenceFile的结果做输入)、MultipleOutputs和Reduce端迭代iterable的一些说明
很长时间以来一直写hive,嵌套脚本.偶尔写UDF. 最近用Hive的dynamic partition和多路插入做一些事情,很遗憾的结果是非常不稳定,有时能成功,有时失败.(可能是因为hive版本 ...
- [RN] React Native 删除第三方开源组件依赖包 后 还要做的 (以 删除 react-native-video为例)
近期测试使用了下 react-native-video 使用一直不成功,后来想着删除掉, 使用命令: npm uninstall react-native-video 重新编译后,还是一直报错 后来 ...
- 表单 用jquery做输入脱离焦点 进行正则验证
<!-- 账号登录块 --> <form class="form1" action="" method="get&quo ...
- homework 11 2016 5 13 读入文件做输入
#include <iostream>#include <fstream> using namespace std; int main(){ string x, y, z; c ...
随机推荐
- Ubuntu Install Chrome Brwoser
在ubuntu下安装chrome浏览器,可以直接从官网下载:http://www.google.cn/intl/zh-CN/chrome/browser/thankyou.html?platform= ...
- MQ使用几个命令
一.MQ常见基本指令: MQ现在使用的比较常见,但是在测试过程中,使用命令行直接查询,有时候事半功倍. activemq-admin stop activemq-admin list activemq ...
- 关于Android构建
“IDE都是给小白程序员的,大牛级别的程序员一定是命令行控,终端控,你看大牛都是使用vim,emacs 就一切搞定” 这话说的虽然有些绝对,但是也不无道理,做开发这行要想效率高,自动化还真是缺少不了命 ...
- css 背景色渐变---和背景色透明
1 背景色渐变 background:#fb0000; background: -webkit-gradient(linear, left top, left bottom, color-stop(0 ...
- Python学习(10)元组
目录 Python 元组 访问元组 修改元组 删除元组 元组运算符 元组索引,截取 无关闭分隔符 元组内置函数 Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组 ...
- iOS开发之 Xcode 5 下让你的应用在不同状态(debug, release)有不同的图标
http://nickcheng.com/post/unique-icons-for-your-app-in-different-state-in-xcode5-debug-release 应用在发布 ...
- Pexpect模块的安装
Pexpect模块的安装 下载地址:https://pypi.python.org/pypi/pexpect/ 解压后在目录下运行:python ./setup.py install (必须是root ...
- 转!数据库连接池概念、种类、配置(DBCP\C3P0\JndI与Tomact配置连接池)
数据库连接池概念.种类.配置(DBCP\C3P0\JndI与Tomact配置连接池) 一.DBCP 连接:DBCP 连接池是 Apache 软件基金组织下的一个开源连接池实现. 需要的 java 包c ...
- 如何从NFS文件系统启动
笔记,备忘! 步骤: 1.设置好NFS服务器 2.修改uboot启动参数bootarg setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=19 ...
- hiho1122_二分图匈牙利算法
题目 给定一个图的N个节点和节点之间的M条边,数据保证该图可以构成一个二分图.求该二分图最大匹配. 题目链接:二分图最大匹配 首先通过染色法,将图的N个节点分成两个部分:然后通过匈牙利算法求二 ...