计算机基础总结

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.
    • 函数式语言
  • 交叉训练
    • “语言不重要论”纯扯淡
      • 这些人只会一门语言
      • 或者其它语言hello world
    • 不同的语言有不同的设计理念和代码风格
      • 语言决定思考问题的模式
      • 自然语言:汉语vs英语
      • RxJava vs RxJs; TypeScript的出现
  • 作为使用者,大胆评判
    • 工具的使用者不需要了解工具的原理
    • 你的直观感受?
    • 只需要吃菜,不需要做饭

编程语言的进化

  • 纸带打孔:Debug & 重写
  • 汇编:CPU指令集的映射,不具有可移植性
  • C语言
  • 高级语言:面向对象,函数式
  • 语言的设计目标:
    • 跨平台
    • 执行高效
    • 省内存
    • 易于学习
    • 高级特性,可读性强

语言也需要营销,你会的不代表好,只是你恰巧会。Java大量借鉴了smalltalk,由于缺少宣传smalltalk已经泯然众人。