计算机基础总结
Free talking about Programming
meetting room 810
什么是计算机
- 计算机器
- 古人的结绳法
- 算盘
- 古代的码农
- CPU人脑 磁盘账本 内存算盘不具有记忆功能
- 没有代码,无法做到自动化,人力驱动
- 现代计算机
- 冯诺伊曼体系结构的计算机
- 组成:CPU 存储 IO 总线
- 量子计算
- IBM大型机到现在的小型机
- 制作工艺的提升,体积变小运算速度变快
- 为什么是二进制
- 模拟电路数字电路
- 高底电平两种状态 一分钱~10块 五千万~一亿
- 不一定非要是二进制
- 需要发现新材料
- 代码和电力驱动
- 本质上还是人脑驱动
- 人生产代码
- 冯诺伊曼体系结构的计算机
编程的内功
- 操作系统
- 进程管理
- 内存管理
- 文件系统
- IO/设备驱动
- 定时器/中断
- 数据结构与算法
- 数据的组成方式和操作方式
- 链表,数组,堆,栈
- 散列表
- 树,搜索树,红黑树,B+树
- 图,路径搜索,广度遍历,深度遍历
- 提升具体场景下的增删改查性能
- 堆,最大堆最小堆,最值在顶部,优先队列
- 栈,语法检查括号匹配
- 散列表,O(1)
- 红黑树, Linux内核进程调度算法
- B+树,数据库索引,存储在磁盘
- 图:路由器,Cocoapods依赖
- 数据的组成方式和操作方式
- 计算机组成原理
- 存储金字塔结构,经济角度,折衷设计
- 有效的原因:局部原理
- volatile
- 防止指令重排
- 防止缓存变量
- SDWebImage/Glide
- 计算机网络
- 编译原理
计算机体系结构
编程的维度
- 一维编程
- 烂代码生产者
- 面条逻辑,缺少设计感
- 打字员,嘛也不懂
- 二维编程
- 可读性
- 可维护性
- 不知道计算机的基本原理
- 三维编程
- 内功,多线程场景考虑,缓存的使用等等
- 大智若愚,懂得取舍,不浮夸
进程
- copy on write
进程,厨师cpu菜谱程序,原材料外设,炒菜的动作就是进程。
内存
- 虚拟内存
- 页面置换算法
- 内存抖动
- 内存对齐
hello.c是如何运行的
- 编译
- 预处理,去除注释,宏替换
- 词法分割,token
- 抽象语法树生成
- 语法分析,语义分析
- 前端:编译成为中间产物
- 后端:编译成为目标平台的汇编代码
- 汇编器生成二进制代码
- .so文件
- iOS的胖安装包 bitcode
- ABI稳定
- 链接
- 静态链接
- 查找缺失的符号
- 重定位
- libffmpeg的例子
- 动态链接
- 为什么要动态链接:省内存
- 启动的时候链接
- 第一次使用的时候链接
- 手动链接
- dlopen()
- dlsyml()
- dlclose()
- System.load()
- 静态链接
- 装载
- ELF/PE/Mach-O/.dex
- 分析文件头
- Magic-Number
- 元数据
- .code .data .bss .rodata .debug .dynamic等等
- SMT iOS debug模式上线/fishhook
- 动态链接所需要的库,至少需要官方的运行时库
- 查找路径
- *NIX系统下
- 手动指定/Xcode配置
- 查找路径
- 执行:
- main()数是入口
- mian()最先执行?
- attribute(constructor)
- .init
- .deinit
- 静态变量初始化
- mian()数只是被runtime封装了而已!
- 运行时内存布局
- 内核空间/用户空间
- 代码段,数据段,堆,栈
- 函数调用示例子
- 寄存器:PC ESP EBP EAX
- StackFrame
- 系统调用
printf
- 软中断,硬中断
- 可变参数
- 内核陷入int 0x80,内核栈
- StackOverflow/栈攻击
- 多线程切换
- 多线程必要性,IO密集
- 吞吐量
编程语言的选择
- 我们至少应该会什么?
- C/
C++: “高级汇编语言”,接近机器,更直观的感受- 内存分配,管理
- 指针:引用类型,值类型就是玩具
- 编译相关
- JVM,JNI,CoreFoundation, Kernel
- 面向对象语言
- Java: 脱离C++那些繁杂的特性,让开发者更关注设计和面向对象的思维方式
- Swift/Kotlin:现代的语言,现代的特性,更加简洁
- 动态语言:Js Python Ruby.
函数式语言:
- C/
- 交叉训练
- “语言不重要论”纯扯淡
- 这些人只会一门语言
- 或者其它语言hello world
- 不同的语言有不同的设计理念和代码风格
- 语言决定思考问题的模式
- 自然语言:汉语vs英语
- RxJava vs RxJs; TypeScript的出现
- “语言不重要论”纯扯淡
- 作为使用者,大胆评判
- 工具的使用者不需要了解工具的原理
- 你的直观感受?
- 只需要吃菜,不需要做饭
编程语言的进化
- 纸带打孔:Debug & 重写
- 汇编:CPU指令集的映射,不具有可移植性
- C语言
- 高级语言:面向对象,函数式
- 语言的设计目标:
- 跨平台
- 执行高效
- 省内存
- 易于学习
- 高级特性,可读性强
语言也需要营销,你会的不代表好,只是你恰巧会。Java大量借鉴了smalltalk,由于缺少宣传smalltalk已经泯然众人。