C语言的实现经过(C代码到CPU执行)

2018-01-05  创建人:Ruo_Xiao
2018-01-06  修改人:Ruo_Xiao
1、添加编辑器之后,预处理之前的编译器的操作。
2、添加对优化器的简单的说明。
2018-01-12  修改人:Ruo_Xiao
修正最后的逻辑总图,添加“源代码处理”。
2018-01-20  修改人:Ruo_Xiao
增加对编译器和连接器更详细的说明。

一、概括

C源代码 -> C编辑器 -> 源代码处理 -> 预处理器 -> C编译器 ->(优化器) -> 连接器 -> 可执行文件 -> CPU执行

二、C源代码

英文:Source Code。

三、C编辑器

  1. 用C语言编写的程序都存储在文本文件中,该文件被称为源代码文件(Source Code Files),大多数系统都以“.c”为扩展名。
    拓展:点号“.”前面的部分被称为基本名(Basename),点号后面的部分被称为扩展名(Extension),基本名和拓展名的组合被称为文件名。
  2. 常用的C编辑器有:
    (1)windows:记事本(notepad)。(需要修改扩展名)
    (2)Linux:Vi、Vim。
    (3)Unix:emacs、jove、Vi、X Window System文本编辑器。
  3. 有的C编辑器具有自动纠错功能,例如Vim。

四、源代码处理

1、编译器把源代码中出现的字符映射到源字符集,该过程处理多字节字符和三字符序列。
2、编译器定位每个反斜杠后面跟着换行符实例,并删除它们。也就是说把下面两个物理行(physical line):

printf("Hello,my\
        wife!/n");

转化为一个逻辑行(logical line)。

printf("Hello,my wife!/n");

3、编译器将文本划分成预处理记号序列、空白序列和注释序列(记号是由空格、制表符或换行符分隔的项)。这里,编译器将空白字符序列和注释序列用一个空格替换。所以下面代码

int/*我是注释!*/i = 0;

变成了

int i = 0;

五、预处理器

  1. 预处理器是在真正的编译开始之前由编译器调用的独立程序。
  2. 预处理器指令以#号开头标识,末尾不包含分号。
  3. 主要功能有文件包含、宏替换、条件编译等。
  4. 在编译的预处理阶段实现的功能:
    (1)将头文件加载到代码中。
    (2)对宏进行替换。等等
    再根据条件编译指令,最终生成新的源代码,传给编译器。

六、C编译器

  1. 英文: C Compiler。
  2. 是将经过预处理器处理之后的C代码翻译成对应于各种CPU能够执行的可执行代码的程序。
    拓展:可执行代码,用计算机的机器语言表示的代码,这种语言是由数字码表示的指令组成,即CPU的微指令。
  3. 编译器检查的是语法、函数与变量的声明是否正确。
  4. 存储编译器生成的可执行代码的文件被称为目标文件(Object file)。
    拓展:目标文件
    (1)扩展名:
    Unix/Linux:“.o”。
    Windows:“.obj”。
    (2)目标文件虽然包含机器语言代码,但是不能直接运行,原因如下:
    A、缺少启动代码(Startup Code),启动代码充当着程序和操作系统的之间的接口。
    B、缺少库函数代码,只是包含了库函数的指令。
  5. 种类
    (1)GNU编译器集合(GCC,其中包含GCC C 编译器),Linux和Unix下使用gcc即可调用GCC C 编译器。
    (2)GCC编译器在windows上的运行的软件是Cygwin和MinGW。
    (3)LLVM项目的Clang编译器,通过clang调用,应用于Linux和FreeBSD(默认)中。
    (4)VC和VS。
    (5)cc 是 Unix系统的 C Compiler,一个是古老的 C 编译器。

七、优化器

  1. 对目标代码进行进一步处理,使其效率更高。
  2. 只针对Release,Debug不进行处理。

八、连接器

  1. 将编译器生成的目标文件中的代码、系统的标准启动代码和库代码三者合并成一个文件,即可执行文件。
  2. 主要是链接函数和全局变量。链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现,你需要指定函数的ObjectFile。

九、可执行文件

  1. windows:扩展名为“.exe”。
  2. Unix/Linux:扩展名“.out”。

十、CPU执行

  1. 能让CPU执行的只要其特有的微指令集。
  2. 可执行文件就是由微指令集中的指令构成,故在windows下,双击exe就可以让CPU开始按照C源代码中所设想的那样工作了。

十一、流程图

这里写图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取CPU温度需要使用操作系统提供的API接口,而不是使用纯C语言编写代码。下面给出两种常用的获取CPU温度的方法。 1. 使用Linux下的lm-sensors工具获取CPU温度 lm-sensors是Linux下的一个硬件监控工具,可以用来获取CPU温度等硬件信息。使用C语言调用lm-sensors的API接口可以获取CPU温度。下面是一个示例代码片段: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LEN 1024 int main() { char cmd[MAX_LINE_LEN] = "sensors | grep 'Core 0' | awk '{print $3}'"; char buf[MAX_LINE_LEN]; FILE *fp; fp = popen(cmd, "r"); fgets(buf, MAX_LINE_LEN, fp); pclose(fp); int temp = atoi(buf); printf("CPU temperature: %d°C\n", temp); return 0; } ``` 这段代码通过执行命令`sensors | grep 'Core 0' | awk '{print $3}'`获取CPU Core 0的温度,然后将结果转换为整数输出。 2. 使用Windows下的WMI获取CPU温度 在Windows系统下,可以使用WMI(Windows Management Instrumentation)获取CPU温度。WMI是Windows提供的一组API接口,可以用来获取系统信息。下面是一个示例代码片段: ``` #include <stdio.h> #include <windows.h> #include <wbemidl.h> #pragma comment(lib, "wbemuuid.lib") int main() { HRESULT hr; IWbemLocator *pLoc = NULL; IWbemServices *pSvc = NULL; IEnumWbemClassObject *pEnum = NULL; BSTR bstrQuery = NULL; BSTR bstrWQL = NULL; ULONG uReturn = 0; VARIANT vtProp; CIMTYPE cimtype; CoInitialize(NULL); hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc); hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\WMI"), NULL, NULL, 0, NULL, 0, 0, &pSvc); bstrWQL = SysAllocString(L"WQL"); bstrQuery = SysAllocString(L"SELECT * FROM MSAcpi_ThermalZoneTemperature"); hr = pSvc->ExecQuery(bstrWQL, bstrQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum); hr = pEnum->Next(WBEM_INFINITE, 1, &vtProp, &uReturn); if (uReturn) { printf("CPU temperature: %d°C\n", (vtProp.lVal - 2732) / 10); VariantClear(&vtProp); } pEnum->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); return 0; } ``` 这段代码使用WMI接口查询MSAcpi_ThermalZoneTemperature类的数据,然后将结果转换为整数输出。需要注意的是,由于WMI获取的温度单位为0.1K,需要进行一定的计算才能转换为摄氏度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值