知识库

先学知识点,再做题检验。当前:程序语言基础

01. 计算机系统知识 (13个) 02. 程序语言基础 (3个) 03. 操作系统 (8个) 04. 软件工程 (8个) 05. 数据结构与算法 (23个) 06. 数据库系统 (11个) 07. 计算机网络 (12个) 08. 面向对象技术 (10个) 09. 信息安全 (4个) 10. 知识产权与标准化 (4个) 11. 多媒体基础 (2个) 12. 项目管理 (4个)
编译过程
编译全过程 重点 难度 2/3
通俗理解
编译就是把"人话"翻译成"机器话"的过程。就像你把一篇中文文章翻译成英文——先认识每个单词(词法分析),再理解句子结构(语法分析),然后搞懂意思(语义分析),最后组织成优美的英文(中间代码生成+优化+目标代码生成)。
想象你是一个翻译官,老板给你一封中文信:
1️⃣ 词法分析:先看信上有哪些"词"——"我"、"爱"、"北京"、"天安门",去掉空格和标点
2️⃣ 语法分析:把这些词组成句子——"主语+谓语+宾语",判断"我爱北京天安门"语法正确
3️⃣ 语义分析:检查意思是否合理——"我爱北京天安门"有逻辑,"天安门爱我"就不对
4️⃣ 中间代码生成:把中文意思先写成"中英混杂的草稿"
5️⃣ 代码优化:把"我非常非常非常爱你"简化为"我深爱你"
6️⃣ 目标代码生成:最终输出漂亮的英文——"I love Tiananmen, Beijing"
核心公式/考点
编译程序工作阶段(必考流程图):
源代码 → [词法分析] → 单词串 → [语法分析] → 语法树 → [语义分析] → 标注语法树 → [中间代码生成] → 中间代码 → [代码优化] → 优化代码 → [目标代码生成] → 目标代码
辅佐机构:符号表(贯穿始终,记录标识符信息)|错误处理(贯穿始终,发现和报告错误)
表格对比:编译 vs 解释
对比项编译方式解释方式
处理方式全部翻译后再执行翻译一句执行一句
执行速度快(已全部翻译成机器码)慢(每次都要翻译)
修改便利性修改后需重新编译修改后立即运行
典型代表C/C++、Go、RustPython、JavaScript、Ruby
运行环境需要编译器和运行环境只需要解释器
可移植性目标代码依赖平台脚本本身跨平台
表格对比:编译各阶段核心任务
阶段输入输出核心任务
词法分析源程序字符流单词符号(Token串)识别关键字、标识符、常量、运算符
语法分析Token串语法树/推导树检查表达式、语句结构是否符合文法
语义分析语法树标注语法树类型检查、作用域分析、语义规则
中间代码生成标注语法树中间代码(三地址码等)生成与机器无关的中间表示
代码优化中间代码优化后的中间代码常数折叠、删除死代码、循环优化
目标代码生成中间代码目标机器代码寄存器分配、指令选择、寻址方式
真题演练
例题1:(2021年软考真题)编译程序中对源程序进行词法分析时,采用的工具通常是什么?A.上下文无关文法 B.有限自动机 C.正规式与有限自动机 D.下推自动机
解答:词法分析识别单词(正则语言),使用正规式描述单词规则,用有限自动机(DFA/NFA)实现识别器。选C。
例题2:(经典题)以下哪个阶段会进行"变量类型检查"?A.词法分析 B.语法分析 C.语义分析 D.代码优化
解答:类型检查是语义分析的核心工作。词法分析只识别单词,语法分析只检查结构,只有语义分析才关心类型是否匹配。选C。
例题3:(概念题)编译方式和解释方式的根本区别在于?A.编译方式生成目标代码执行,解释方式边翻译边执行 B.编译方式速度慢 C.都需要目标代码 D.编译不能处理循环
解答:编译整体翻译后执行,解释逐句翻译执行。选A。
注意事项
⚠️ 易错点1:词法分析输出"单词流"(Token序列),语法分析输入Token序列、输出语法树。不要搞混输入输出。
⚠️ 易错点2:编译是"一刀切"全部翻完再执行,解释是"边翻边演"。
⚠️ 易错点3:语义分析≠语法分析。语法分析看"结构对不对",语义分析看"意思合不合理"(如int a="hello"结构对但语义错)。
⚠️ 易错点4:中间代码是可选的——有的编译器直接从语法树生成目标代码。
⚠️ 易错点5:目标代码生成≠链接。编译输出目标文件(.obj/.o),链接器合并成可执行文件。链接不是编译阶段!
⚠️ 易错点6:符号表和错误处理贯穿编译全过程,不是某个阶段的专属。
✏️ 做这节的题(8题)
文法与自动机
Chomsky四型文法 重点 难度 2/3
通俗理解
Chomsky文法体系就像语言的"四层金字塔"——越往下约束越少、能力越强;越往上约束越多、结构越简单。
想象你有四种不同难度的拼图游戏:
• 🟢 3型(正规文法):最简单——只能按固定模式拼接,像"红蓝红蓝"交替,不能嵌套
• 🔵 2型(上下文无关文法):中等——可以嵌套,像俄罗斯套娃一层套一层
• 🟡 1型(上下文有关文法):较难——不仅关心套娃里有什么,还关心周围是什么环境
• 🔴 0型(短语结构文法):最强——没有任何限制,像自由创作
真实编程语言(如C、Java)的语法结构主要由2型(CFG)文法描述,词法规则由3型(正规)文法描述。
核心公式/考点
Chomsky文法分类(四层金字塔,逐级包含:3⊂2⊂1⊂0):
0型(短语结构文法)—— α→β(α至少含1个非终结符)—— 图灵机
└── 1型(上下文有关文法)—— αAβ→αγβ(γ≠ε,长度不减)—— 线性有界自动机
└── 2型(上下文无关文法/CFG)—— A→β(左部单非终结符)—— 下推自动机(PDA)
└── 3型(正规文法/RG)—— A→aB 或 A→a(右线性)—— 有限自动机(DFA/NFA)
核心公式:3型 ⊂ 2型 ⊂ 1型 ⊂ 0型(表达能力逐级增强)
表格对比:四种文法的核心区别
类型名称产生式形式左部要求右部要求对应自动机
0型短语结构文法α→β至少含1个非终结符无限制图灵机
1型上下文有关文法αAβ→αγβ可指定上下文γ≠ε(长度不减)线性有界自动机
2型上下文无关文法A→β单个非终结符任意符号串下推自动机(PDA)
3型正规文法A→aB/A→a单个非终结符最多1个非终结符在末尾有限自动机(DFA/NFA)
表格对比:各文法能描述的语言示例
文法类型语言示例说明
3型(正规)aⁿbᵐ (n,m≥0) = a*b*a和b个数独立,可正则描述
2型(CFG)aⁿbⁿ (n≥1)a和b个数相等——嵌套结构,非正规语言
1型(CSG)aⁿbⁿcⁿ (n≥1)三个个数相等——需上下文相关
0型任意递归可枚举语言无结构限制
真题演练
例题1:(经典题)Chomsky文法分类中,描述程序设计语言语法结构最常用的是?
A.0型 B.1型 C.2型 D.3型
解答:编程语言语法结构(if嵌套、表达式递归)最适合上下文无关文法(2型/CFG)。词法部分用3型。选C。
例题2:(软考真题)关于Chomsky分类,不正确的是?A.0型限制最少 B.3型=正规文法 C.2型→PDA D.1型=短语文法
解答:0型叫"短语结构文法",1型叫"上下文有关文法"。D把1型说成"短语文法"是错的。选D。
例题3:(概念理解)以下哪个不能用3型文法描述?A.以ab结尾的字符串 B.a后跟任意个b C.匹配括号对aⁿbⁿ D.至少一个数字的标识符
解答:aⁿbⁿ需要计数(记录嵌套深度),有限自动机只有有限个状态,记不住n的值。选C。
注意事项
⚠️ 易错点1:3型文法=正规文法=正则文法=线性文法(右线性或左线性),多种称呼同一概念。
⚠️ 易错点2:逐级包含关系:3型⊂2型⊂1型⊂0型。正规文法一定是CFG,反之不成立。
⚠️ 易错点3:2型左部必须是"单个非终结符",不能写 aA→ab(那是1型)。
⚠️ 易错点4:1型标志性特征:产生式右部长度≥左部长度(长度不减),仅S→ε是例外。
⚠️ 易错点5:自动机对应关系是高频考点:0型↔图灵机、1型↔线性有界自动机、2型↔PDA下推自动机、3型↔DFA/NFA有限自动机。
⚠️ 易错点6:aⁿbⁿ不是正规语言(是CFG语言),aⁿbⁿcⁿ不是CFG语言(是CSG语言)。
DFA/NFA有限自动机 重点 难度 2/3
通俗理解
有限自动机就像一台"只有开关状态的自动售货机"——你投入硬币(输入字符),机器根据当前状态和硬币种类决定跳转到哪个新状态。
想象你在地铁闸机前:
• 状态【等待进站】:你刷卡 → 状态变成【已进站】
• 状态【已进站】:你出站刷卡 → 状态变回【等待进站】
• 只有两个状态,但能正确处理进出站逻辑
DFA(确定性):就像严格按照百度地图导航——每个路口只有唯一的出口,到了就知道怎么走。
NFA(非确定性):就像迷宫中有多个岔路——站在一个路口看到"向上"箭头,但这条路可能通到A或B区(多个可能),需"猜"或同时走所有路。
核心公式/考点
DFA形式定义:M = (Q, Σ, δ, q₀, F)
• Q —— 有限状态集合
• Σ —— 有限输入字母表
• δ: Q×Σ→Q —— 转移函数(单值映射,唯一确定)
• q₀∈Q —— 初始状态
• F⊆Q —— 终止状态集合
NFA形式定义:M = (Q, Σ, δ, q₀, F)
与DFA唯一区别:δ: Q×Σ → 2^Q(幂集,转移到一个状态集合)
核心定理:DFA和NFA等价!识别同一类语言——正规语言。
表格对比:DFA vs NFA
对比维度DFA(确定性有限自动机)NFA(非确定性有限自动机)
转移函数δ(q,a)=p(唯一状态)δ(q,a)={p₁,p₂,...}(状态集)
ε转移不支持支持(不读字符可跳转)
模拟执行跟踪一个确定路径跟踪所有可能路径(并行)
实现难度简单(硬件实现容易)复杂(需子集构造法)
状态数可能较多通常较少(更紧凑)
识别能力正规语言正规语言(等价!)
设计便利性繁琐但直观简洁灵活
NFA→DFA子集构造法(三步走):
1.NFA初始状态q₀的ε闭包 = DFA初始状态S₀
2.对每个DFA状态S(即NFA状态集),对每个输入字符a:T = ε闭包(δ(S, a)) → 新DFA状态
3.重复直到无新状态;含NFA终态的DFA状态标记为终态
ε闭包定义:状态本身 + 通过任意条ε转移能到达的所有状态
真题演练
例题1:(软考真题)关于DFA和NFA的叙述中,正确的是?
A.DFA和NFA语言能力不同,NFA更强 B.确定性/非确定性指转移方式不同 C.DFA可转NFA但反之不成立 D.NFA状态数一定少于DFA
解答:DFA和NFA等价,A❌。确定性=唯一转移,非确定性=多转移,B✅。双向可转,C❌。无必然关系,D❌。选B。
例题2:(经典题)NFA有n个状态,子集构造法转化后DFA最多可能的状态数是?A.n B.2n C.n² D.2ⁿ
解答:NFA的每个状态子集对应DFA一个状态,最多2ⁿ个状态。选D。
例题3:(基础题)以下哪个语言可以被有限自动机识别?A.aⁿbⁿ B.aⁿbᵐ C.aⁿbⁿcⁿ D.ww
解答:有限自动机识别正规语言。aⁿbⁿ需计数(非正规),aⁿbⁿcⁿ更复杂,ww需复制。只有aⁿbᵐ = a*b*是正规语言。选B。
注意事项
⚠️ 易错点1:DFA和NFA等价!都是正规语言。NFA只是更方便设计,实现时通常转DFA。
⚠️ 易错点2:ε转移是NFA特有的——不读任何字符就可以跳转,相当于"免费传送门"。
⚠️ 易错点3:NFA的"非确定性"不是"随机性"——它同时尝试所有路径,只要一条到终态就接受。
⚠️ 易错点4:DFA必须完全定义——每个状态每个输入必须有唯一转移。没定义的需添加"死状态"。
⚠️ 易错点5:子集构造法最坏指数级2ⁿ,但实际大多数子集不可达,规模可控。
⚠️ 易错点6:有限自动机只有有限个状态,无法"计数"任意大的数——这是它能力有限的理论根源。
✏️ 做这节的题(6题)