Public Notes
Recently
最近更新与正在整理的公开笔记。
Rust-学习笔记
Rust 语言机制、工程实践与学习笔记。
浏览器架构和原理
浏览器进程模型、渲染管线与 JavaScript 引擎。
大前端笔记
跨端框架、前端运行时与 UI 工程。
编程语言和范式
语言模型、类型系统、范式与编译期设计。
数学与编程的学习笔记
数学、算法、图形与机器学习基础。
操作系统
内存、线程、链接与底层系统知识。
全部公开笔记
按更新时间倒序排列Hippy 跨端架构源码解析
发现飞书比 Notion 的阅读体验要好:
并发编程向协程的进化 In Swift 6
为了行文顺畅,需要先解释清楚并发和并行:
对比 RN 和 JS,深入聊聊 Flutter 和 Dart,以及未来的 AI 跨端编程
最近几年我个人的编码领域,好像被有意无意的框进跨端开发中;最早我做 iOS 开发,后来接触了前端开发和 Android 开发,再后来做低码开发、AI D2C 开发,接触和研究了很多和底层 VDOM 相关的开发,有些较为复杂的项目,还涉及到自定义视图树指令集、微型语法解释器相关的开发工作,这些项目都让我学到了很多开发框架上的知识。
Vue 2/3 Optional Composition
最讨厌 vue 的地方,就是 API 太灵活,并且多变,没有很好的可推导性。使用者的心智模型负担很重,需要记忆很多零碎的语法。所以做个笔记区别一下,总结如下:
Swift 编译期泛型T/Boxed协议类型 any /Opaque不透明类型 some
Swift 在设计上,主要设计了三种多态类型,类型设计的基础是 Protocol,先定义一个 Protocol:
FRP Functional Reactive Programming
需要先理解下边几个基本名词的概念
Enum 成为 Swfit 语言的一条独立设计分支
Swift 的枚举设计,比较能体现这门语言的设计哲学:
Dart/Swift/JS 不同的语言模型设计
最近又想玩一玩 flutter,再次回忆了一下 Dart 语言,随着接触的编程语言越来越多,渐渐习惯了通过比较不同编程语言的设计,视图了解语言背后的设计思路。我不是很喜欢一条一条的看语法,我认为语法是一个字典,使用到的时候,查一查,查着查着就记住了。
JS 作用域 & 相关设计
js 这个语言从设计上看,是比较精简的,例如作用域,js 中理论上只有4中作用域:
Event Loop 异步编程模型 (By Node.js)
最早在 iOS 开发中接触到 Runloop (也是一种 Event loop),后来发现 Android 也有自己的 Event loop,
渲染进程和 v8 引擎的协同
现代浏览器的多进程架构中,主要有两个核心进程:
Chrome 多线程和多进程架构
渲染进程-设计为多进程的好处
现代浏览器内部的一次 Navigation 流程
当在地址栏输入一个 URL 后,会发生什么,分别被哪些流程处理?
渲染进程的内部工作
渲染进程:Render Process,是浏览器的内容的核心进程。可以说,一个 tab 内的每一个内容,都需要 Render Process 处理。
结合Rust生命周期类型说说协变/逆变
上一篇文章:Rust 生命周期基础 提到,Rust 中生命周期也是一种类型。类型系统是一个编程语言的基础,Rust 也是一样,甚至更激进:
Rust 生命周期基础
Rust 除了所有权机制外,另一大特色就是生命周期,虽然每个编程语言必须处理生命周期,但是基本都不用程序员关心。Rust 中生命周期则非常重要,几乎和所有权机制一样,不理解生命周期就无法愉快的编写 Rust 代码。
模式匹配
可辩驳和不可辩驳
迭代器
和所有权三大原则匹配:
模块与包
包管理几乎是现代语言的标配,Rust 自带包管理工具;简单说,包管理工具就是组织、整理代码的一种工具;Rust 中有关包管理有 4 个概念:
编译期计算
编译期计算
函数和闭包的语法糖实现
Rust 语言的函数具有明确的语义,方便静态检查器对其进行编译期检查,Rust 也支持函数指针,类似于 C。但一般情况,Rust 都使用函数项对函数指针进行优化,这样可以做零大小的类型优化。
语法篇-面向表达式
Rust 在编程范式上基本不做限制,Rust 没有继承,但是依然可以实现面向对象 (OOP),也支持函数式编程(FP),也支持泛型。在语法上 Rust 更多的借鉴了函数式编程的概念(FP)。可以认为,Rust 是一门面向表达式的语句,由于表达式总会返回某种类型的值,所以 Rust 是面向类型推断的。
语法篇-表达式绑定
Rust 中给一个变量赋值这件事情上,和其他语言的差别很大:
Rc 和 RefCell
这两者都只能在单线程中使用。
const static 与 inline
几乎每门编程语言都有 const (常量)、static(静态)、inline(内联) 的概念,之前我在:
所有权与引用及生命周期
对于普通的标量类型,赋值(=) 执行的是栈拷贝。但是对于对象类型(String),默认情况,赋值会变为转移所有权。
Box 智能指针和隐式自动解引用
Rust 中常规的引用(reference 就是一种指针类型),指针就是一个指向具体值存储区域的箭头 →。
Rust中的数据类型
先来熟悉 Rust 中所有的标量类型(Scale Types):
个人开发产品经历
刚刚完成个人项目的上线 www.feezfi.com ,从产品设计到落地实现和部署上线,用时一个月左右。期间遇到了很多阻碍,做一些记录。
AWS ECS 到阿里云人工处理过程的部署体验
软件开发中,CI/CD 往往也扮演着重要的职责,写再多的代码,最终的目的是变成可交付的产品。全称 Continuous Integration/Continuous Delivery,即持续的集成,持续的交付。集成简单讲就是把代码的构建、打包做好。可以简单做如下拆分:
Javascript 原型链
在大部分的面向对象语言中,都会有继承,代码关键字上体现为 superclass (不同的语言命名不同),但是 js 中并没有这样的概念。js 实现继承是通过原型链。
内存管理基础
我个人的认知,学习一门编程语言,开始阶段,语法规则可以粗枝大叶的学习,剩下的可以在实践中去慢慢掌握;但是语言的内存管理模型,还是需要提早去深入研究的;这好比是练武的内功心法,只要对一门语言的内存管理比较了解,那么后续学习其他的就游刃有余。对我来说以前学习 javascript ,就是这样:
逻辑回归与最大似然估计
很多机器学习的教程中,只管给出公式,但公式如何得来,读者并不知晓。这是我个人机器学习的第二篇博客,专门来详细的推导和解释逻辑回归,后文会有详细的数学推导过程。由于机器学习中数学符号太多,用纯文本写博客非常麻烦,索性我将自己的笔记截图贴了上来。
编程求解线段交点-克拉默法则
作为数学问题来讲,并不复杂,只需建立二元一次方程组,求解未知数即可,但如何编码实现呢 ? 一般来说有以下几种方法:
空间向量代数-求解交点
上一篇:克拉默法则求解交&向量积求解的证明
Core Graphics 使用技巧
在 Apple 平台 (iOS/macOS) 上绘图,有三套方案:
机器学习
什么是机器学习,目前并没有明确的学术定义,一般有两个比较认可的定义:
剖析操作系统虚拟内存一
从编程的角度看,虚拟内存可能是内存管理中最抽象、最重要的概念,但国内的教科书在内存管理相关章节,普遍对虚拟内存的知识一笔带过,相关的内容仅仅涉及到逻辑地址到物理地址的转换(事实上这部分属于 MMU),以及本地磁盘与内存的对换区(swap),该区域,在空闲内存达到门限值(threshold)时,用来与内存进行页面置换,但在 iOS 系统上没有该区域。
剖析操作系统虚拟内存 二
这是第二篇,第一篇解刨操作系统虚拟内存一已经详细的介绍了虚拟内存已经计算机内存管理的基本概念。本篇将重点结合XNU内核源码、部分dyld和cctools源码进行深入探测虚拟内存。为了结构清晰,我会尽量避免贴大段的源码,如果有需要可自行下载上述三个源码库,结合阅读。
使用 Clang 深入分析 C 内存
内存管理和进程管理是操作系统的两大核心功能,二者密不可分,进程管理,除了做好 CPU 的调度,剩下的主要就是如何分配和管理进程内存。现代的操作系统主要还是基于请求分页(段)与虚拟内存进行内存分配和回收;而不管哪个操作系统,对内存都有基本的划分,例如 Text 段,Stack、Heap 等。但不同的编程语言与编译器会对内存做更细的划分,比如对 C 语言的粗略内存布局结构:
链接 Linking
在现代的计算机技术中,linking 其实非常重要,伴随该技术,产生了符号表、静态库、动态库等技术。在借助 Clang/汇编/Mach-O 进行C基本内存分析一文中,介绍了一个项目在生成二进制之前,大致可以概括为 3 个步骤,编译、汇编、链接。这一节对链接进行全面的分析。
多线程一
原文链接:A gentle introduction to multithreading 副标题:一步一步,走进的并发的世界。
多线程二 线程同步
译者:Xiaobo 原文链接:introduction-thread-synchronization 推荐:之前读《程序员的自我修养》一书中有关于多线程的讲解非常好;但最近读到这几篇文章对于多线程的讲解,个人认为比前者(书)更加的清晰、易懂、全面。每篇文章的内容安排也很合理,非常感谢作者TRIANGLES和他优秀的文章,这里是他的个人站点。
多线程三 原子性
翻译:Xiaobo 原文链接: Lock-free multithreading with atomic operations 推荐:之前读《程序员的自我修养》一书中有关于多线程的讲解非常好;但最近读到这几篇文章对于多线程的讲解,个人认为比前者(书)更加的清晰、易懂、全面。每篇文章的内容安排也很合理,非常感谢作者TRIANGLES和他优秀的文章,这里是他的个人站点。
多线程四
翻译:Xiaobo 原文链接: Understanding memory reordering 推荐:之前读《程序员的自我修养》一书中有关于多线程的讲解非常好;但最近读到这几篇文章对于多线程的讲解,个人认为比前者(书)更加的清晰、易懂、全面。每篇文章的内容安排也很合理,非常感谢作者TRIANGLES和他优秀的文章,这里是他的个人站点。
筛选结果
45 notesHippy 跨端架构源码解析
发现飞书比 Notion 的阅读体验要好:
并发编程向协程的进化 In Swift 6
为了行文顺畅,需要先解释清楚并发和并行:
对比 RN 和 JS,深入聊聊 Flutter 和 Dart,以及未来的 AI 跨端编程
最近几年我个人的编码领域,好像被有意无意的框进跨端开发中;最早我做 iOS 开发,后来接触了前端开发和 Android 开发,再后来做低码开发、AI D2C 开发,接触和研究了很多和底层 VDOM 相关的开发,有些较为复杂的项目,还涉及到自定义视图树指令集、微型语法解释器相关的开发工作,这些项目都让我学到了很多开发框架上的知识。
Vue 2/3 Optional Composition
最讨厌 vue 的地方,就是 API 太灵活,并且多变,没有很好的可推导性。使用者的心智模型负担很重,需要记忆很多零碎的语法。所以做个笔记区别一下,总结如下:
Swift 编译期泛型T/Boxed协议类型 any /Opaque不透明类型 some
Swift 在设计上,主要设计了三种多态类型,类型设计的基础是 Protocol,先定义一个 Protocol:
FRP Functional Reactive Programming
需要先理解下边几个基本名词的概念
Enum 成为 Swfit 语言的一条独立设计分支
Swift 的枚举设计,比较能体现这门语言的设计哲学:
Dart/Swift/JS 不同的语言模型设计
最近又想玩一玩 flutter,再次回忆了一下 Dart 语言,随着接触的编程语言越来越多,渐渐习惯了通过比较不同编程语言的设计,视图了解语言背后的设计思路。我不是很喜欢一条一条的看语法,我认为语法是一个字典,使用到的时候,查一查,查着查着就记住了。
JS 作用域 & 相关设计
js 这个语言从设计上看,是比较精简的,例如作用域,js 中理论上只有4中作用域:
Event Loop 异步编程模型 (By Node.js)
最早在 iOS 开发中接触到 Runloop (也是一种 Event loop),后来发现 Android 也有自己的 Event loop,
渲染进程和 v8 引擎的协同
现代浏览器的多进程架构中,主要有两个核心进程:
Chrome 多线程和多进程架构
渲染进程-设计为多进程的好处
现代浏览器内部的一次 Navigation 流程
当在地址栏输入一个 URL 后,会发生什么,分别被哪些流程处理?
渲染进程的内部工作
渲染进程:Render Process,是浏览器的内容的核心进程。可以说,一个 tab 内的每一个内容,都需要 Render Process 处理。
结合Rust生命周期类型说说协变/逆变
上一篇文章:Rust 生命周期基础 提到,Rust 中生命周期也是一种类型。类型系统是一个编程语言的基础,Rust 也是一样,甚至更激进:
Rust 生命周期基础
Rust 除了所有权机制外,另一大特色就是生命周期,虽然每个编程语言必须处理生命周期,但是基本都不用程序员关心。Rust 中生命周期则非常重要,几乎和所有权机制一样,不理解生命周期就无法愉快的编写 Rust 代码。
模式匹配
可辩驳和不可辩驳
迭代器
和所有权三大原则匹配:
模块与包
包管理几乎是现代语言的标配,Rust 自带包管理工具;简单说,包管理工具就是组织、整理代码的一种工具;Rust 中有关包管理有 4 个概念:
编译期计算
编译期计算
函数和闭包的语法糖实现
Rust 语言的函数具有明确的语义,方便静态检查器对其进行编译期检查,Rust 也支持函数指针,类似于 C。但一般情况,Rust 都使用函数项对函数指针进行优化,这样可以做零大小的类型优化。
语法篇-面向表达式
Rust 在编程范式上基本不做限制,Rust 没有继承,但是依然可以实现面向对象 (OOP),也支持函数式编程(FP),也支持泛型。在语法上 Rust 更多的借鉴了函数式编程的概念(FP)。可以认为,Rust 是一门面向表达式的语句,由于表达式总会返回某种类型的值,所以 Rust 是面向类型推断的。
语法篇-表达式绑定
Rust 中给一个变量赋值这件事情上,和其他语言的差别很大:
Rc 和 RefCell
这两者都只能在单线程中使用。
const static 与 inline
几乎每门编程语言都有 const (常量)、static(静态)、inline(内联) 的概念,之前我在:
所有权与引用及生命周期
对于普通的标量类型,赋值(=) 执行的是栈拷贝。但是对于对象类型(String),默认情况,赋值会变为转移所有权。
Box 智能指针和隐式自动解引用
Rust 中常规的引用(reference 就是一种指针类型),指针就是一个指向具体值存储区域的箭头 →。
Rust中的数据类型
先来熟悉 Rust 中所有的标量类型(Scale Types):
个人开发产品经历
刚刚完成个人项目的上线 www.feezfi.com ,从产品设计到落地实现和部署上线,用时一个月左右。期间遇到了很多阻碍,做一些记录。
AWS ECS 到阿里云人工处理过程的部署体验
软件开发中,CI/CD 往往也扮演着重要的职责,写再多的代码,最终的目的是变成可交付的产品。全称 Continuous Integration/Continuous Delivery,即持续的集成,持续的交付。集成简单讲就是把代码的构建、打包做好。可以简单做如下拆分:
Javascript 原型链
在大部分的面向对象语言中,都会有继承,代码关键字上体现为 superclass (不同的语言命名不同),但是 js 中并没有这样的概念。js 实现继承是通过原型链。
内存管理基础
我个人的认知,学习一门编程语言,开始阶段,语法规则可以粗枝大叶的学习,剩下的可以在实践中去慢慢掌握;但是语言的内存管理模型,还是需要提早去深入研究的;这好比是练武的内功心法,只要对一门语言的内存管理比较了解,那么后续学习其他的就游刃有余。对我来说以前学习 javascript ,就是这样:
逻辑回归与最大似然估计
很多机器学习的教程中,只管给出公式,但公式如何得来,读者并不知晓。这是我个人机器学习的第二篇博客,专门来详细的推导和解释逻辑回归,后文会有详细的数学推导过程。由于机器学习中数学符号太多,用纯文本写博客非常麻烦,索性我将自己的笔记截图贴了上来。
编程求解线段交点-克拉默法则
作为数学问题来讲,并不复杂,只需建立二元一次方程组,求解未知数即可,但如何编码实现呢 ? 一般来说有以下几种方法:
空间向量代数-求解交点
上一篇:克拉默法则求解交&向量积求解的证明
Core Graphics 使用技巧
在 Apple 平台 (iOS/macOS) 上绘图,有三套方案:
机器学习
什么是机器学习,目前并没有明确的学术定义,一般有两个比较认可的定义:
剖析操作系统虚拟内存一
从编程的角度看,虚拟内存可能是内存管理中最抽象、最重要的概念,但国内的教科书在内存管理相关章节,普遍对虚拟内存的知识一笔带过,相关的内容仅仅涉及到逻辑地址到物理地址的转换(事实上这部分属于 MMU),以及本地磁盘与内存的对换区(swap),该区域,在空闲内存达到门限值(threshold)时,用来与内存进行页面置换,但在 iOS 系统上没有该区域。
剖析操作系统虚拟内存 二
这是第二篇,第一篇解刨操作系统虚拟内存一已经详细的介绍了虚拟内存已经计算机内存管理的基本概念。本篇将重点结合XNU内核源码、部分dyld和cctools源码进行深入探测虚拟内存。为了结构清晰,我会尽量避免贴大段的源码,如果有需要可自行下载上述三个源码库,结合阅读。
使用 Clang 深入分析 C 内存
内存管理和进程管理是操作系统的两大核心功能,二者密不可分,进程管理,除了做好 CPU 的调度,剩下的主要就是如何分配和管理进程内存。现代的操作系统主要还是基于请求分页(段)与虚拟内存进行内存分配和回收;而不管哪个操作系统,对内存都有基本的划分,例如 Text 段,Stack、Heap 等。但不同的编程语言与编译器会对内存做更细的划分,比如对 C 语言的粗略内存布局结构:
链接 Linking
在现代的计算机技术中,linking 其实非常重要,伴随该技术,产生了符号表、静态库、动态库等技术。在借助 Clang/汇编/Mach-O 进行C基本内存分析一文中,介绍了一个项目在生成二进制之前,大致可以概括为 3 个步骤,编译、汇编、链接。这一节对链接进行全面的分析。
多线程一
原文链接:A gentle introduction to multithreading 副标题:一步一步,走进的并发的世界。
多线程二 线程同步
译者:Xiaobo 原文链接:introduction-thread-synchronization 推荐:之前读《程序员的自我修养》一书中有关于多线程的讲解非常好;但最近读到这几篇文章对于多线程的讲解,个人认为比前者(书)更加的清晰、易懂、全面。每篇文章的内容安排也很合理,非常感谢作者TRIANGLES和他优秀的文章,这里是他的个人站点。
多线程三 原子性
翻译:Xiaobo 原文链接: Lock-free multithreading with atomic operations 推荐:之前读《程序员的自我修养》一书中有关于多线程的讲解非常好;但最近读到这几篇文章对于多线程的讲解,个人认为比前者(书)更加的清晰、易懂、全面。每篇文章的内容安排也很合理,非常感谢作者TRIANGLES和他优秀的文章,这里是他的个人站点。
多线程四
翻译:Xiaobo 原文链接: Understanding memory reordering 推荐:之前读《程序员的自我修养》一书中有关于多线程的讲解非常好;但最近读到这几篇文章对于多线程的讲解,个人认为比前者(书)更加的清晰、易懂、全面。每篇文章的内容安排也很合理,非常感谢作者TRIANGLES和他优秀的文章,这里是他的个人站点。
没有找到匹配的公开笔记。