当前位置:首页 » 编程软件 » c编译器工作原因

c编译器工作原因

发布时间: 2022-07-23 15:40:31

c语言编译器的工作过程及程序是如何在计算机上运行的呢

王爽 汇编语言 一切答案都在里面

Ⅱ c语言编译器如何运行

编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。

1、预处理阶段:

主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)

2、汇编阶段:

插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。

3、编译阶段:

将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。

4、链接阶段:

在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。

Ⅲ c语言的编译器是干什么用的

高级语言、汇编语言、机器语言这三种语言统称“计算机语言”。其中,机器语言是最低级的,是一串一串的电流表示“0001101010010110010101000110”之类的数据,全部由0和1组成,这样的语言是机器语言,只有机器才能记住这样冗长而没规律的数据,所以,用机器语言来编程序几乎是不可能的。但要命令机器做一样事情,必须用机器语言,怎么办呢?于是,产生了汇编语言,汇编语言比机器语言简单一点,但还是很难明白,当时的编译器就是把汇编语言转换成机器语言,再命令机器做事。现在,出现了高级语言,最人性化,人们很容易读懂,所以,我们可以直接输入自己熟悉的语言,到达机器的时候变成了机器最熟悉的语言,编程序就很容易了。编译器担负的就是这个转换工作。

Ⅳ C语言程序运行后 出现exe停止工作 为什么呢

这种情况叫做 runtime error (运行时错误)。


在 Windows 7 上这样提示:

runtimeerror(运行时错误)就是程序运行到一半,程序就崩溃了。

比如说:

①除以零

②数组越界:inta[3];a[10000000]=10;

③指针越界:int*p;p=(int*)malloc(5*sizeof(int));*(p+1000000)=10;

④使用已经释放的空间:int*p;p=(int*)malloc(5*sizeof(int));free(p);*p=10;

⑤数组开得太大,超出了栈的范围,造成栈溢出:inta[100000000]

Ⅳ C语言编译原理是什么

编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。

1、预处理阶段:

主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)

2、汇编阶段:

插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。

3、编译阶段:

将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。

4、链接阶段:

在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。

Ⅵ c语言的编译器从何而来

大致如下:
1)汇编编译器由二进制代码直接编写(只能够是这样子的),形成了最原始的汇编编译器
2)然后用原始汇编编译器的汇编代码编写更复杂的汇编编译器,依次类推。
3)高级语言(C、C++等)编译器(最初原始版本的),由汇编语言编写。
4)在用原始版本编译器的代码编写更加复杂的编译器。
5)其他高级语言的编译器一般是用像C、C++这类程序设计语言编写。

总结一些:用低级语言写高级语言编译器;
由简单的编译器代码编写复杂的编译器。

Ⅶ C语言工作原理

作为一种编程语言,本身是谈不上工作原理的,实际上C语言所有的语法,正是C语言编译器的工作原理或者工作机制的具体实现。要细致的讨论起来是不可能,但是作为C语言程序员,必须了解这个大致的流程。一个程序,从C语言源码,到系统可执行的文件,一般经历四个过程。
1、预处理阶断,这个阶断是文本处理阶断,有预处理器来完成,会将源码中的带"#"开头的预处理命令进行相应的处理,在Linux上C语言的预处理器程序是cp命令。
2、编译阶断,这个阶断是有C语言编译阶断,在Linux上C语言的编译器是cc命令,它将C语言源码转换成汇编指令。
3、汇编阶断,这个阶断是汇编编译阶断,在Linux上C语言的汇编器是as命令,这个阶断会将汇编指令编译成二进制机器码。
4、链接阶断,这个阶断是会将汇编阶断生成的机器码目标文件,装载成一个系统可执行的文件,在Linux平台以ELF格式进行组装,在Windows平台上以PE格式进行组装。在Linux平台上的链接器命令为ld,在windows平台上的链接器命令为linker。

Ⅷ C语言编译器是用来做什么的

编译器,是将便于人编写,阅读,维护的高阶计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源代码一般为高阶语言 (High-level language), 如 Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。
一个现代编译器的主要工作流程如下:
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 连接器 (Linker) → 可执行程序 (executables)

Ⅸ C语言编程的时候出现“程序已停止工作”的原因有哪些

最常见的原因:程序发生了空指针调用。
如果你刚入门,请检查:
scanf("%d",&i); 有没有加上“&”号,scanf必须在变量前加“&”(取地址符)。
如果没有加&, scanf会把变量当作地址来用,而你的程序中又没有以变量为地址的变量,操作系统不允许程序读写程序规定范围以外的空间。出于安全起见,操作系统将其紧急中止。就发生了“***.exe已停止工作”的效果。
如果你正在学习数组,请检查:
数组是否越界。定义为int a[10]的数组,如果写a[10]=0; 相当于对a数组里的第11个元素赋值。事实上,a数组里并没有第11个元素。如果该元素的位置指向一个程序以外的内存,操作系统同样会果断将其终止。
如果你正在学习指针,请检查:
指针是否赋值;
在给指针赋值时,有没有在非指针变量前加取地址符“&”;
int * p = &i; //正确!
int * p = i; //错误!
这与在sccanf里没有加上“&”号的原因大致相同。
指针问题属于程序逻辑错误,很多时侯编译器只会给你一个警告。要注意警告发生的位置自己是否有把握。如果你多次编译或忽视编译警告而进行链接,编译器会认为你对这些警告是有把握的,完全地信任了你,也就没有警告了。

Ⅹ C语言编译器原理小知识

1、char *p="asdf"; 则sizeof(p)=2; 是返回指针p占用字节数;即使你是先定义再赋值,char *p; p="asdfasdf"; sizeof(p)都是等于2;任何指针在turbo c中都是2个字节,不是说“字符串中有'0\'占一个字节,字符类型指针占一个字节”。。楼上有的说sizeof(p)是求变量p或字符串长度,是错的,是求占用字节数,不是长度,长度是用函数strlen(p); sizeof不是函数,是一种运算符。。例子:char p[]="abc";则sizeof(p)=4;strlen(p)=3; 比较于char p[10]="abc"; sizeof(p)=10; strlen(p)=3。。。 但如果定义成:char p[]="asdf"; 则sizeof(p);就等于5了,数组名p虽然可以看做指针,但不完全跟指针一样,这就是例子了。。 2、编译器可以看作一个虚拟机器,可以有自己虚拟的内存,栈等。。编译系统就可以看作是物理电脑操作系统上虚拟机的运行系统。。所以不一定是物理地址,但跟物理地址有映射关系,至于为什么,怎么映射,我也不知道。。。 3、编译器是16位。。跟“loat 为4个字节 double 32个字符”??。。跟float 4字节32位没关系,那是编译器设定的,就是常说电脑是16位或32位操作系统一样,编译器16位就看作虚拟机器是16位运行系统。。 4、 我也不知道为什么, (*p)(int,int);是int (*p)(int,int);吧。。。

热点内容
安卓如何设置桌面返回键 发布:2025-02-06 13:58:15 浏览:48
bi可视化php 发布:2025-02-06 13:50:15 浏览:931
shell写脚本文件 发布:2025-02-06 13:47:32 浏览:231
健身器材脚本 发布:2025-02-06 13:46:36 浏览:856
怎么从手机里卸载存储卡 发布:2025-02-06 13:35:04 浏览:644
诛仙青云志2ftp 发布:2025-02-06 13:34:48 浏览:34
mill91编程 发布:2025-02-06 13:10:27 浏览:294
华为平板怎么储存服务器文件 发布:2025-02-06 12:49:21 浏览:482
php查询结果数组 发布:2025-02-06 12:31:05 浏览:717
怎样把照片压缩打包 发布:2025-02-06 12:15:19 浏览:498