2.7 语言理论与底层
← 2.6 DevOps 实践 | 首页 | 下一节: 2.8 领域专项知识 →
编译型 vs 解释型
- 编译型语言(C、C++、Rust、Go):源代码先被编译器翻译为机器码(或中间码),生成可执行文件后独立运行。执行速度快,但开发-编译-运行周期较长。
- 解释型语言(Python、Ruby、传统 JavaScript):由解释器逐行读取并执行源代码,无需编译步骤。开发反馈快,但执行速度慢于编译型。
- 混合型(Java、C#):先编译为中间码(bytecode/IL),再由虚拟机(JVM/CLR)通过 JIT(Just-In-Time)编译为机器码。兼顾可移植性和性能。
类型系统
静态 vs 动态指类型检查的时机;强 vs 弱指类型规则的严格程度。两个维度构成四象限:
| 静态检查(编译时) | 动态检查(运行时) | |
|---|---|---|
| 强类型 | Java, C#, Rust, TypeScript | Python, Ruby, Elixir |
| 弱类型 | C, C++ | JavaScript, PHP, Perl |
具体含义:
- 静态类型:类型在编译时检查。TypeScript 中 function foo(a: number) 在编译时阻止传入字符串。
- 动态类型:类型在运行时检查。PHP 中 function foo($a) 只有执行时才知道类型。
- 强类型:从不隐式转换。Python 中 1 + "2" 抛出 TypeError。
- 弱类型:编译器/解释器尽力自动转换。JavaScript 中 1 + "2" 返回 "12"(自动将数字转字符串拼接)。
注意:许多语言在象限中的位置不是绝对的。C 是静态弱类型(编译时检查但允许隐式 void* 转换),Python 是动态强类型(运行时检查但绝不允许隐式类型自动转换)。
正则表达式(Regex)
正则表达式是一种描述字符串匹配模式的语法,几乎所有编程语言原生支持。核心元素:
- 字面字符:abc 匹配精确字符串 "abc"。
- 字符类:[a-z] 匹配任一小写字母,\d 匹配任意数字。
- 量词:* 零次或多次、+ 一次或多次、? 零次或一次、{n,m} n 到 m 次。
- 锚点:^ 行首、$ 行尾、\b 单词边界。
- 分组与捕获:(pattern) 提取匹配的子串。
- 常用场景:表单验证、日志解析、数据提取、搜索替换。
懒加载(Lazy Loading)
推迟对象的创建、数据的加载或资源的初始化,直到真正需要使用时才执行。核心价值: - 减少启动时间:只加载首屏需要的内容。 - 节省内存:不使用时根本不加载。 - 改善用户体验:按需加载,避免长时间等待。 - 典型实现:前端路由级别的代码拆分、ORM 的延迟加载关联、图片的滚动加载、虚拟列表。
性能剖析(Profiling)
性能剖析是动态程序分析的一种形式,测量程序的运行时行为——时间花在哪、内存用在哪、函数调用频率如何。
三种类型: - Flat Profiler:列出每个函数的总耗时,不区分调用者。 - Call-Graph Profiler:展示调用链和每个函数在特定调用上下文中的耗时。 - Input-Sensitive Profiler:关联性能指标与输入特征(输入大小、输入值)。
两种数据采集方式: - 事件型(Event-based):在每个函数入口/出口插入钩子,精确但开销大、可能产生观察者效应。 - 统计型(Statistical/Sampling):定时采样调用栈,近似但有统计意义,开销极小、几乎不影响目标程序行为。
原则:先测量,再优化。不基于猜测做性能优化。
并发编程核心概念
- 竞态条件(Race Condition):多个线程/进程同时访问共享资源,且最终结果依赖于执行顺序。最危险的并发 bug——难以复现、难以调试。对策:锁、原子操作、不可变数据结构。
- 死锁(Deadlock):线程 A 持有锁 1 等待锁 2,线程 B 持有锁 2 等待锁 1——互相等待,永远阻塞。四个必要条件:互斥、持有并等待、不可抢占、循环等待。对策:统一加锁顺序、超时机制、死锁检测。
- 互斥(Mutual Exclusion):确保同一时刻只有一个线程访问临界区。实现方式:互斥锁(Mutex)、信号量(Semaphore)、读写锁(Read-Write Lock)。粒度越细并发度越高,但复杂度也越高。
来源
- Cameron Pavey — Understanding Types; Static vs Dynamic, Strong vs Weak: https://medium.com/@cpave3/understanding-types-static-vs-dynamic-strong-vs-weak-88a4e1f0ed5f
- Wikipedia — Profiling (computer programming): https://en.wikipedia.org/wiki/Profiling_(computer_programming)
← 2.6 DevOps 实践 | 首页 | 下一节: 2.8 领域专项知识 →