《UNIX编程艺术》学习笔记

news/发布时间2024/5/14 4:35:35

《UNIX编程艺术》学习笔记

序 摘录

​ 知识和专能差异巨大,凭借知识可以推断出该做什么,而专能让你甚至在无意之间,条件反射似的把事情做好。

​ 这本书确实关于“知识”,但更着眼于”专能“。你将学到那些Unix专家们都不自知的Unix开发知识。少一点技术,多一些共享文化:显见和隐微的,直观和潜流的——这是本书和大多数Unix书籍不同的地方——不至于方法,更重乎理念。

​ 理念于实用大有裨益,有太多设计不良的软件:体积臃肿,难于维护、移植和扩展——这些都是蹩脚设计的症候。我们希望本书读者能品出什么是Unix所教示的良好设计。

​ 本书分为四部分:场景、设计、工具和社群。第一部分(场景)设计哲学和历史,为后续内容埋下伏笔。第二部分(设计)将Unix哲学的原理细分为有关设计和更细致的建议。第三部分(工具)着眼于Unix所提供的工具,可助你解决问题。第四部分(社群)则讲述人与人之间的事物和约定,而这正是Unix文化拥有高效能的原因。

第一部分 场景

1.1 哲学

​ Unix哲学的一个特性(由Xwindow设计者首先明确提出):提供一套机制,而不是策略。

​ Unix的遗风:原本是为技术人员设计的操作系统;同时也表明设计的信念:最终用户永远比操作系统设计人员更清楚他们究竟需要什么。

​ Unix之得:开源软件、跨平台可移植性和开放标准、Internet和万维网、开源社区、灵活性(Unix提供众多的程序粘合手段,这意味着Unix基本工具箱的各种组件连纵开合后,将收到单个工具设计者无法想象的功效)、Hack之趣

​ Unix哲学基础:K.I.S.S :Keep It Simple,Stupid!

  1. 模块原则:使用简洁的接口拼合简单的部件。
  2. 清晰原则:清晰胜于机巧。
  3. 组合原则:设计时考虑拼接组合。
  4. 分离原则:策略同机制分离,接口同引擎分离。
  5. 简洁原则:设计要简洁,复杂度能低则低。
  6. 吝啬原则:除非确无它法,不要编写庞大的程序。
  7. 透明性原则:设计要可见,以便审查和调试。
  8. 健壮原则:健壮源于透明与简洁。
  9. 表示原则:把知识叠入数据以求逻辑质朴而健壮。
  10. 通俗原则:接口设计避免标新立异。
  11. 缄默原则:如果一个程序没什么好说的,就沉默。
  12. 补救原则:出现异常时,马上退出并给出足够错误信息。
  13. 经济原则:宁花机器一分,不花程序员一秒。
  14. 生成原则:避免手工hack,尽量编写程序去生成程序。
  15. 优化原则:雕琢前先要有原型,跑之前先学会走。
  16. 多样原则:决不相信所谓“不二法门”的断言。
  17. 扩展原则:设计着眼未来,未来总比预想来得快。

1.2 历史

起源及历史:1969-1995

  • 创世纪:1696-1971

  • 出埃及记:1971-1980

  • TCP/IP和Unix内战:1980-1990

1.3 对比

操作系统最重要的不同之处

1、操作系统的统一性理念

如UNIX上“一切皆文件”模型及在此基础上建立的管道概念。总的来说,任何特定操作系统的开发风格均受到系统设计者灌注其中的统一性理念的强烈影响——由系统工具和API塑造的模型将反渗到应用编程中。

2、多任务能力:Unix系统拥有抢先式多任务的能力。 多任务和多用户不是一回事。

3、协作进程:UNIX的IPC(进程间通信方式)很灵活。

4、内部边界: Unix是相信程序员的,但是程序员不能破坏其他人的数据,所以Unix设立了内部边界来防范恶意用户或者有缺陷的程序。

5、文件属性和记录结构

6、二进制文件格式

7、首选用户界面风格:CLI、GUI

8、目标受众

9、开发的门槛:Unix将编译器和脚本工具放在默认安装中,支持了一种跨越众多机器的玩家开发文化。

第二部分 设计

1、模块性:保持清晰,保持简洁

2、文本化:好协议产生好实践

  • 设计将应用数据存储在永久存储器中的文件格式,和在协作程序中(可能会通过网络)传递数据和命令的应用协议
  • 设计文件格式和应用协议需要考虑的重要方面:互用性、透明性、可扩展性以及经济型
  • 应用协议如果是文本格式的,凭肉眼可以很容易地分析,很多事情变得容易。可以看看SMTP、POP3和IMAP三种经典的应用协议

3、透明性

  • 如果实际上能够预测到程序行为的全部或大部分情况,这个程序就是透明的
  • 如果程序可以帮助人们建立“做什么、怎样做”,这个软件系统就是可显的。比如对用户来说,文档有助于可显性; 对程序员而言,好的命名规范有助于提高可显性。
  • 要追求代码的透明,最有效的方法很简单,就是不要在具体操作的代码上叠放太多的抽象层。

4、多道程序设计:分离进程为独立的功能

5、微型语言

  • UNIX班有个长期传统,存在小型的、为专门应用领域特制、大量减少程序行数的语言。 比如无数Unix排版语言(troff/pic)、shell使用程序(awk/sed/dc/bc)和软件开发工具(make/yacc/lex等)。 微型语言与脚本语言之间的界限都很模糊。

6、生成:提升规格说明的层次

  • 数据比程序逻辑更易驾驭
  • 数据驱动编程,将代码和数据结构划分清楚,在改变程序逻辑时,只要改变数据结构而不用修改代码
  • 专用代码的生成,比如用工具生成HTML代码。尽可能少干活,建设性的懒惰是大师级程序员的基本美德之一

7、配置:环境配置

8、接口:Unix环境下的用户接口设计模式

  • 与其他程序通讯方式的前瞻性;最小立异原则

9、优化

10、复杂度

第三部分 工具

3.1 语言

  • C和C++的中心问题在于它们要求程序员自己完成内存管理——声明变量、显式管理链表、设置缓冲大小、检测或防止缓冲溢出,以及分配和回收动态存储。

  • C语言很厉害、很经济。但是要求程序员自己完成内存管理,很复杂,并且随着硬件设备的性能提升,主要瓶颈集中在I/O事件等待、网络延迟以及缓存列填充等限制上,所以Python、Java等语言慢慢兴起。

C、C++、shell、perl、tcl、python、java、emacs lisp

3.2 工具

编辑器:vi、emacs

专用代码生成器:yacc、lex

编译:gcc、make

3.3 重用

不要重新发明轮子

第四部分 社群

可移植性:软件可移植性与遵循标准

文档规划

开放源码

个人总结

​ 这是一本讲述UNIX文化和哲学的书,通过UNIX历史和UNIX程序实例揭示了UNIX强劲生命力的来源、设计哲学。理念至上,需要深度使用、开发过UNIX才能理解表述的UNIX的设计理念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/YjHX/7897.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

【简写Mybatis】02-注册机的实现以及SqlSession处理

前言 注意: 学习源码一定一定不要太关注代码的编写,而是注意代码实现思想: 通过设问方式来体现代码中的思想;方法:5W1H 源代码:https://gitee.com/xbhog/mybatis-xbhog;https://github.com/xbh…

JavaWeb个人学习01

1:RequestParam(defaultValue "默认的值") 这个可以在一个参数的前面写上 要是前端不传值进来的话 这个形参就是你定义的默认值 2: slf4j 对应的是日志的输出 log.info("参数是 {}", detail); 3: 分页插件 PageHelper 用法: 准备工作: 引入依赖 …

Vue3前端实现一个本地消息队列(MQ), 让消息延迟消费或者做缓存

MQ功能实现的具体代码(TsMQ.ts): import { v4 as uuidx } from uuid;import emitter from /utils/mitt// 消息类 class Message {// 过期时间,0表示马上就消费exp: number;// 消费标识,避免重复消费tag : string;// 消息体body : any;constr…

HarmonyOS—低代码开发Demo示例

接下来为大家展示一个低代码开发的JS工程的Demo示例,使用低代码开发如下华为手机介绍列表的HarmonyOS应用/服务示例。 1.删除模板页面中的控件后,选中组件栏中的List组件,将其拖至中央画布区域,松开鼠标,实现一个List组…

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

CAD怎么绘制建筑平面图纸?

CAD沪指图纸很简单,想要绘制一个简单的建筑图纸,该怎么绘制建筑平面图呢?下面我们就来看看详细的教程。 1、首先,运用绘图功能中的直线按照比例尺寸绘制出轴网。轴网绘制我们一般将轴网的颜色选择为红色,轴网的线型选择…

win11家庭版安装Docker启动一直Starting the Docker Engine...

越多越多的应用通过Docker方式来运行,确实Docker方式运行也很方便,都是一个独立的运行环境,部署也很方便。于是决定安装下Docker试试,之前用Docker的时候还是win10,现在win11了。 安装倒是可以安装上,但是…

常见的音频与视频格式

本专栏是汇集了一些HTML常常被遗忘的知识,这里算是温故而知新,往往这些零碎的知识点,在你开发中能起到炸惊效果。我们每个人都没有过目不忘,过久不忘的本事,就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

打印水仙花数---c语言刷题

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 题述 求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153&#…

Acwing周赛记录

很难得参加一次周赛hhhhh这次参加的是第144场周赛,一共有三道题 AcWing 5473. 简单数对推理 给定两个整数数对,每个数对都包含两个 1∼9 之间的不同整数。 这两个数对恰好包含一个公共数,即恰好有一个整数同时包含于这两个数对。 给定这两…

安全防御综合实验

需求: 1、办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 2、分公司设备可以通过总公司的移动链路和电信链路访问DMZ区的http服务器 3、分公司内部的客户端可以通过公网地址访问到…

SQL进阶(三):Join 小技巧:提升数据的处理速度

复杂数据结构处理:Join 小技巧:提升数据的处理速度 本文是在原本sql闯关的基础上总结得来,加入了自己的理解以及疑问解答(by GPT4) 原活动链接 用到的数据:链接 提取码:l03e 目录 1. 课前小问…

No matching version found for get-symbol-description@^1.0.2前端项目报错解决(亲测可用)

目录 一、问题详情 二、解决方案 一、问题详情 拉取一个新的项目的时候,前端进行install依赖的时候,报了如下的错误。 6120 verbose node v16.15.1 6121 verbose npm v8.11.0 6122 error code ETARGET 6123 error notarget No matching version foun…

基于qt的图书管理系统----04sql功能开发

参考b站:视频连接 源码github:github 目录 1 封装一个全局的对象2 设计所有接口2.1 初始化数据库接口2.2 登陆接口2.3 条件查询用户接口 1 封装一个全局的对象 新建一个cclass,sqlmange,并且在.pro文件中添加上sql 使用c单例模…

基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

ChatGPT/GPT4科研应用与AI绘图及论文写作

2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

接口自动化测试用例如何设计

说到自动化测试,或者说接口自动化测试,多数人的第一反应是该用什么工具,比如:Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀,甚至出现“ 做平台的 &…

C++ //练习 9.16 重写上一题的程序,比较一个list<int>中的元素和一个vector<int>中的元素。

C Primer(第5版) 练习 9.16 练习 9.16 重写上一题的程序,比较一个list中的元素和一个vector中的元素。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /**********************************…

(九)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建ant-framework核心代码Base封装

今天重点讲解的是ant-framework核心代码Base封装过程。 因为涉及到springmvc、mybatis的集成,为了使项目编码更简洁易用,这边将基础的BASE进行封装,其中包括:BaseBean、BaseDao、BaseService、CRUD的基础封装、分页组件的封装、m…

【数据结构】深入探讨二叉树的遍历和分治思想(一)

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章主要讲述二叉树的递归结构及分治算法的思想。 目录: 🌍前言:🌍…
推荐文章