当前位置: 首页 > news >正文

【编译原理笔记】2.1 Programming Language Basics

对应龙书中1.6节

一、静态与动态特性(Static vs Dynamic)

1.1 基本定义

  • 静态问题(Static Issues):在编译时就能确定和处理的问题

  • 动态问题(Dynamic Issues):需要在运行时才能解决的问题

1.2 静态特性示例

 // C/Java中的声明作用域int x;  // 编译时确定作用域static class MyClass {  // 静态类对象的位置在编译时确定// ...}

1.3 动态特性示例

 void function() {int local_var;  // 局部变量的位置在运行时确定(栈分配)}

1.4 关键区别

特性类型处理时机示例影响
静态编译时作用域、静态类型检查编译效率、错误检测
动态运行时局部变量分配、多态运行灵活性、性能开销

二、环境与状态(Environments and States)

2.1 两层映射模型

上图展示了名字到值的两阶段映射

2.2 环境(Environment)

  • 功能:将名字(Names) 映射到存储位置(Locations)

  • 性质:相对静态,在编译时部分确定

  • 示例:变量名到内存地址的映射

2.3 状态(State)

  • 功能:将存储位置(Locations) 映射到值(Values)

  • 性质:高度动态,在运行时不断变化

  • 示例:内存地址存储的实际数据值

2.4 实际意义

 int x = 10;  // 环境:x → 内存地址0x1000// 状态:0x1000 → 值10x = 20;      // 状态变化:0x1000 → 值20(环境不变)

三、静态作用域与块结构(Static Scopes/Block Structures)

3.1 静态作用域规则

3.2 最近嵌套规则(Most Closely Nested Rule)

  1. 名字查找顺序:从最内层块开始,逐层向外

  2. 遮蔽(Shadowing):内层声明遮蔽外层同名声明

  3. 作用域确定:在编译时通过程序结构确定

3.3 块结构特性

  • 嵌套性:块可以嵌套在其他块中

  • 局部性:块内声明只在块内有效

  • 确定性:作用域在编译时完全确定


四、显式访问控制(Explicit Access Control)

4.1 访问修饰符

  • Public:公开访问,任何代码都可访问

  • Private:私有访问,只在类内部可访问

  • Protected:保护访问,类及其子类可访问

4.2 封装性设计

 class MyClass {public int publicVar;     // 任何地方可访问private int privateVar;   // 仅本类内可访问  protected int protVar;   // 本类及子类可访问}

4.3 设计目标

  1. 信息隐藏:隐藏实现细节

  2. 接口隔离:明确公开的API

  3. 维护性:减少外部依赖带来的影响


五、动态作用域(Dynamic Scope)

5.1 定义规则

"A use of a name x refers to the declaration of x in the most recently called procedure with such a declaration."

最近调用原则:名字x引用的是最近调用的包含x声明的过程中的声明。

5.2 与静态作用域对比

 // 静态作用域示例int x = 1;void foo() { printf("%d", x); }  // 总是输出1​// 动态作用域伪代码  int x = 1;void bar() { int x = 2; foo(); }  // 如果动态作用域,foo()输出2

5.3 实际应用场景

  1. 宏扩展(Macro Expansion)

  2. 面向对象编程中的方法解析

  3. 某些脚本语言(如早期LISP)

5.4 动态作用域的问题

  • 不可预测性:行为依赖于运行时调用序列

  • 调试困难:相同代码在不同上下文行为不同

  • 维护复杂:难以理解程序逻辑


六、参数传递机制(Parameter Passing Mechanisms)

6.1 传值调用(Call by Value)

 void f(int x) {x = x + 1;    // 修改形参xprint(x);     // 输出增加后的值}​int main() {int y = 1;f(y + 1);     // 传递表达式y+1的值// y的值不变,仍为1}

特点

  • 传递实际参数的副本

  • 函数内修改不影响原始变量

  • 适用于基本数据类型

6.2 传引用调用(Call by Reference)

 void swap(int &x, int &y) {  // C++引用参数int temp = x;x = y;y = temp;}​int main() {int a = 1, b = 2;swap(a, b);  // a和b的值被交换}

应用场景

  • 数组传递

  • 指针参数

  • 类对象传递(大多数面向对象语言)

特点

  • 传递实际参数的引用

  • 函数内修改影响原始变量

  • 适用于需要修改参数值的场景

6.3 传名调用(Call by Name)

 #define MAX(a, b) ((a) > (b) ? (a) : (b))​int main() {int x = 1, y = 2;int z = MAX(++x, y);  // 展开为: ((++x) > (y) ? (++x) : (y))// x可能被多次求值(这里x变为3)}

特点

  • 类似宏替换,参数表达式在调用点展开

  • 可能多次求值同一表达式

  • 现代语言较少使用(Algol 60特性)


七、别名问题(Aliasing)

7.1 别名定义

"An interesting consequence of call-by-reference parameter passing. It is possible that two formal parameters can refer to the same location."

别名:多个名字指向同一个内存位置。

典型示例

void q(int x[], int y[]) {x[10] = 2;    // 修改x// 如果x和y是同一数组,y[10]也变为2
}void p() {int a[100];q(a, a);      // 传递同一数组的两个别名
}

7.2 别名产生场景

  1. 传引用调用:多个参数指向同一对象

  2. 指针别名:不同指针指向同一内存

  3. 数组重叠:数组切片或子数组

7.3 别名的问题

  1. 优化障碍:编译器难以确定内存独立性

  2. 正确性风险:意外修改共享数据

  3. 调试困难:难以追踪数据流

解决方案

// 使用const限制修改
void q(const int x[], int y[]) {// x[]只读,避免意外修改y[10] = 2;
}// 使用restrict关键字(C99)
void q(int *restrict x, int *restrict y) {// 向编译器保证x和y不重叠x[10] = 2;
}

八、核心概念总结

静态vs动态的权衡

方面静态优势动态优势
性能编译时优化运行时灵活性
错误检测早期发现适应性强
确定性行为可预测支持多态

作用域规则演进

动态作用域(早期语言) → 静态作用域(现代语言) → 显式访问控制(面向对象)

参数传递发展

传名调用(Algol) → 传值调用(函数式) → 传引用调用(面向对象)

现代语言设计趋势

  1. 默认安全:传值为主,显式传引用

  2. 静态检查:尽可能在编译时发现问题

  3. 明确语义:减少隐式行为和别名

  4. 封装性:通过访问控制管理复杂性

这些基础概念为理解编程语言设计、编译器实现和程序正确性提供了理论基础,是计算机科学教育的核心组成部分。

http://www.dtcms.com/a/483817.html

相关文章:

  • Transformer模型
  • 做网站要写代码吗学动漫设计后悔死了
  • 服务器做php网站门户网站建设管理工作方案
  • 03_索引管理模版API
  • 经营一个网站要怎么做小学生手工制作大全
  • 企业seo网站优化设计长春网站改版
  • 在银河麒麟系统搭建qt开发环境
  • AI模型测评平台工程化实战十二讲(第八讲 大模型稳定性测评:从理念到实现的完整技术方案)
  • 想找人做网站 要怎么选择乱码网站怎么办
  • PS笔记12345
  • 网站做一样没有侵权吧广州学习做网站建设的学校
  • RocketMQ的消费模式
  • 真空极化新视角(量子信息视角
  • 好看的网站排版本地拖拽网站建设
  • 家具行业网站整站模板那个网站有题做
  • JS逆向-安全辅助项目JSRpc远程调用Burp插件autoDecode浏览器拓展V_Jstools(上)
  • 快餐网站模板哪些网站做面试题
  • 自动铺丝及相关软件技术介绍
  • 企业门户网站是什么意思承接网站开发 app开发
  • JAVA·类和对象③封装及包
  • 使用libhv创建客户端并推送图片到MinIo文件服务器 范例
  • 北京做彩右影影视公司网站网络推广经验交流
  • 甘肃省住房和建设厅官方网站网站建设初衷
  • 规模化电池运维的效率突破口:DSS-5000 电池诊断服务系统技术解析与应用场景
  • 新版EasyDSS视频点播直播视频会议平台,为智慧教育注入全新活力
  • 云服务器和网站空间黄骗免费网站
  • 中国黄金集团建设有限公司官方网站工作纪律和生活纪律研讨发言材料
  • 【Python】.sort()与sorted()的区别与用法
  • 商丘家居网站建设做网页制作的价格
  • 微信辅助做单网站seo属于什么职业部门