博客
关于我
编译原理及技术(一)——简单介绍一个编译器的结构
阅读量:798 次
发布时间:2019-03-25

本文共 1227 字,大约阅读时间需要 4 分钟。

一个编译器的结构

编译器作为 translators,连接人写的语言代码与计算机能够执行的机器码。整个编译过程可以分为预处理器、编译器、汇编器、链接器和加载器等几个步骤。预处理器负责处理宏定义和其他前处理工作,编译器接着将预处理后的源代码转化为汇编语言,汇编器再将汇编语言生成可重定位置的机器码,而链接器和加载器则负责连接各个模块并加载程序到内存中。

一、语言处理器

语言处理器是编译器的核心,主要负责将人写的语言代码转化为计算机能理解的机器码。其结构分为三个主要阶段:词法分析、语法分析和语义分析。

1. 词法分析

词法分析的任务是将输入的字符分割为词法单元。词法单元可以分为关键字、标识符、常数、操作符等,各有不同的种别码和属性值。例如,源代码“while (value != 100)”会被分割为“WHILE”、”(“、”value“、”!”、”100”、”)“等词法单元。

2. 语法分析

语法分析则是在词法分析的基础上,根据词法单元的种别码和符号表信息,构建语法树,描述源程序的语法结构。如赋值语句“position = initial + rate * 60;”对应的语法树结构。

3. 语义分析

语义分析器则检查源程序是否符合语言定义的语义,完成类型检查和符号表管理。例如,检查变量的使用是否声明,运算符和操作数的类型是否匹配。

二、编译器的工作流程

  • 源程序分析:编译器首先进行词法分析、语法分析和语义分析,确保源程序的语法和语义正确无误。
  • 中间代码生成:将语法和语义分析结果转化为中间表示,如三地址码。三地址码主要通过四元式表示运算。
  • 目标代码生成:根据中间代码,对机器码进行优化和生成,最终形成目标机器码。
  • 三、技术分析

    1. 词法分析实例

    源代码“while (value != 100) {num++;}”的词法分析过程可以分为以下几个步骤:

    • 识别“while”为关键字,对应种别码WHILE。
    • 识别”(“为左括号,对应种别码LPAREN。
    • 识别”value“为标识符,对应种别码IDN,属性值为“value”。
    • 识别”!=100”中的”!”和整数数值100分别为运算符和标识符。
    • 最终完全分割为六个词法单元。

    2. 语法树构建

    赋值语句“position = initial + rate * 60;”的语法树如下:

    • 左子树为标识符“position”。
    • 右子树为加法表达式,左子树为标识符“initial”和常量60,右子树为标识符“rate”和常量60。
    • 表达式的加法运算会产生结果。

    3. 语义检查

    在语法分析的基础上,编译器会检查语义是否正确。一方面,符号表用于管理标识符信息;另一方面,类型检查确保运算分量一致。例如,数组下标必须为整数,避免类型不匹配错误。

    四、得出结论

    通过以上详细分析,可以看到编译器的内部架构及其各步骤的重要性。从词法分析到语义分析,每一步骤的作用均不可或缺,为生成高效、安全的目标代码奠定基础。

    转载地址:http://etbyk.baihongyu.com/

    你可能感兴趣的文章
    mysql复杂查询,优质题目
    查看>>
    MySQL外键约束
    查看>>
    MySQL多表关联on和where速度对比实测谁更快
    查看>>
    MySQL多表左右连接查询
    查看>>
    mysql大批量删除(修改)The total number of locks exceeds the lock table size 错误的解决办法
    查看>>
    mysql如何做到存在就更新不存就插入_MySQL 索引及优化实战(二)
    查看>>
    mysql如何删除数据表,被关联的数据表如何删除呢
    查看>>
    MySQL如何实现ACID ?
    查看>>
    mysql如何记录数据库响应时间
    查看>>
    MySQL子查询
    查看>>
    Mysql字段、索引操作
    查看>>
    mysql字段的细节(查询自定义的字段[意义-行列转置];UNION ALL;case-when)
    查看>>
    mysql字段类型不一致导致的索引失效
    查看>>
    mysql字段类型介绍
    查看>>
    mysql字段解析逗号分割_MySQL逗号分割字段的行列转换技巧
    查看>>
    MySQL字符集与排序规则
    查看>>
    MySQL字符集乱码
    查看>>
    mysql字符集设置
    查看>>
    mysql存储IP地址的数据类型
    查看>>
    mysql存储中文 但是读取乱码_mysql存储中文乱码
    查看>>