zoukankan      html  css  js  c++  java
  • 程序员的自我修养阅读笔记

    1、编译器:
    编译器的作用:从最直观的角度来讲,编译器就是将高级语言翻译成机器语言的一个工具。比如我们用C/C++语言写的一个程序可以使用编译器将其翻译成机器可以执行的指令及数据。

    2、编译过程:
    1》编译过程一般分为6步:扫描、词法分析、语义分析、源代码优化、代码生成、和目标代码优化

    3、预编译:
    1》首先是源代码文件helloc.c和相关的头文件,如stdio.h等被预编译器cpp预编译成一个 .i 文件。对于C++程序来说,它的源代码文件的扩展名可能是 .cpp 或 .cxx ,头文件的扩展名可能是 .hpp ,而预编译后的文件按扩展名是 .ii 。
    2》第一步预编译的过程相当于如下的命令(-E表示只进行预编译):
    gccEhello.cohello.i

    gcc hello.c > hello.i
    3》预编译过程主要处理那些源文件代码中的以“#”开始的预编译指令,比如“#include”、“#define”等,主要处理规则如下:
    1>将所有“#define”删除,并展开所有的宏定义。
    2>处理所有条件预编译指令,比如:“if”、“ifdef”、“elif”、“else”、“endif”
    3>处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
    4>删除所有的注释“//”和“/* */”.
    5>添加行号和文件标识,比如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息以及用于编译时产生的编译错误或者警告时能够显示行号。
    6>保留所有#pragma 编译器指令,因为编译器需要使用它们。
    4》经过预编译之后的 .i 文件不包含任何宏定义,因为所有的宏都已经被展开了,并且包含的文件也已经被插入到 .i 文件中。所以当我们无法判断宏定义是否正确或头文件包含是否正确时,可以查看预编译后的文件来确定问题。

    4、编译:
    1》编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后产生相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分,也是最复杂的部分之一。
    2》上面的编译过程相当于如下命令:gccshello.iohello.s

    gcc -s hello.o -o hello.s
    3》实际上gcc这个命令只是这些后台程序的包装,它会根据不同的参数要求去调用预编译编译程序cc1、汇编器as、链接器ld

    5、汇编:
    1》汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于汇编器来讲比较简单,它没有复杂的语法,也没有语义,也不需要指令优化,只是根据汇编指令和机器指令的对照表一一翻译就可以了。
    2》上面的汇编过程我们可以调用汇编器as来完成: ashello.sohello.o

    gcc -c hello.s -o hello.o 或者使用gcc命令从C源代码文件开始,经过预编译、编译、汇编直接输出目标文件 $gcc -c hello.c -o hello.o

  • 相关阅读:
    iOS 疑难杂症 — — 复制 Storyborad 莫名崩溃
    【Swift 2.1】共享文件操作小结(iOS 8 +)
    【Swift】 应用内显示 AppStore 某个应用的详情
    【Swift】iOS开发笔记(一)
    【Swift 2.0】实现简单弹幕功能
    站长名站
    Future home of something quite cool.
    大神们都在用的两个国外的免费离线下载:Rain& LoadBT
    Amazon Publisher Studio让产品推广更简单
    人脉是设计出来的,进入高端人脉圈的方法
  • 原文地址:https://www.cnblogs.com/wwbzuiku/p/14206144.html
Copyright © 2011-2022 走看看