C语言程序是怎么在计算机中运行起来的

  • hello.c
#include <stdio.h>int main(){printf("hello,world\n");return 0;
}

这段 C语言程序的代码能被编程人员读懂,但是计算机系统读不懂。C语言、C++、java 这些高级编程语言本质上还是人类用的语言而不是计算机用的语言。
为了能在计算机上运行这个 C语言程序,需要由其他程序将每一条 C语言程序转化成低级的机器语言指令。这些指令会被按照一种被称为可执行目标程序的格式打包好,以二进制存储文件的形式存储起来。目标程序也称为可执行目标文件。
C语言编译器驱动程序将 C语言程序文件 hello.c翻译成一个可执行目标文件 hello。整个翻译过程可分为四个阶段,执行四个阶段的程序为:

  • 预处理器
  • 编译器
  • 汇编器
  • 链接器

image.png

以下是以这个“hello.c”程序为例,对四个阶段的讲解:

  1. 预处理器阶段:
    • 在这个阶段,预处理器会处理“#include <stdio.h>”这行代码。它会把“stdio.h”这个头文件的内容插入到当前位置。头文件中通常包含了一些函数的声明,比如“printf”函数的声明。此外,预处理器还可能处理其他的预处理指令,比如宏定义等。对于我们的“hello.c”程序,经过预处理器处理后,就为后续的编译做好了准备。
  2. 编译器阶段:
    • 编译器会把预处理后的代码翻译成汇编语言代码。在这个例子中,它会分析“int main()”函数中的语句,比如“printf(“hello,world\n”);”和“return 0;”,并将其转换为相应的汇编指令。这些汇编指令是一种更接近机器语言但仍然相对可读的形式。
  3. 汇编器阶段:
    • 汇编器的任务是将编译器生成的汇编语言代码转换为机器语言指令。机器语言指令是由二进制数字组成的,计算机可以直接执行。对于“printf”这样的函数调用,会生成相应的机器指令来完成函数的调用和参数传递等操作。
  4. 链接器阶段:
    • 因为我们的程序可能会调用一些库函数,比如“printf”函数就是在标准库中定义的。链接器会把我们程序生成的目标文件和系统提供的库文件(包含了“printf”等函数的实现)链接在一起,形成一个完整的可执行目标文件。这样,当我们运行这个可执行文件时,计算机就能正确地执行“printf”等函数,输出“hello,world”并最终结束程序返回 0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无忧易售功能:刊登页面文本翻译,无缝对接全球买家

每一个词语&#xff0c;每一句话&#xff0c;都承载着产品的灵魂和品牌的故事&#xff0c;无忧易售的刊登页面文本翻译服务&#xff0c;一键操作即可将你的产品介绍、详情或广告文案转化为多语言版本&#xff0c;轻松管理&#xff0c;高效发布。 一、Allegro、OZON、Coupang、…

第7章:Electron文件系统操作(2)

7.2 文件对话框 Electron 提供了 dialog 模块用于显示文件打开和保存对话框。 7.2.1 显示文件打开对话框 主进程代码&#xff1a; const { app, BrowserWindow, ipcMain, dialog } require(electron); const path require(path);let mainWindow;const createMainWindow …

盘点2024年最新鼠标连点器推荐

电脑鼠标连点器是一种可以帮助用户自动化点击操作的小工具&#xff0c;广泛应用于游戏、自动化办公和测试等领域。选择一款合适的鼠标连点器能够提高工作和娱乐的效率&#xff0c;避免重复点击带来的疲劳。小编将为您介绍电脑鼠标连点器的产品特点、推荐几款实用的鼠标连点器并…

网络中未授权访问漏洞(Rsync,PhpInfo)

Rsync未授权访问漏洞 Rsync未授权访问漏洞是指Rsync服务配置不当或存在漏洞&#xff0c;导致攻击者可以未经授权访问和操作Rsync服务。Rsync是一个用于文件同步和传输的开源工具&#xff0c;通常在Unix/Linux系统上使用。当Rsync服务未经正确配置时&#xff0c;攻击者可以利用…

Python机器学习-线性回归算法

线性关系 x和y呈一条直线 优点 简单易懂 线性模型具有一定的稳定性。从技术角度,我们在评价模型的优劣好坏时,通常从两个维度去评判,一是模型预测的准确性,二是模型预测的稳健性,两者相辅相成、缺一不可。关于模型预测的准确性,如果模型能够尽可能的拟合了历史数据信息,…

模电基础 - 简介

目录 零 .简介 一. 学习方法 二. 教材推荐 三. 总结 零 .简介 “模电”即模拟电子技术&#xff0c;是电子信息工程、电气工程及其自动化等相关专业的一门关键基础课程。 首先&#xff0c;在半导体器件方面&#xff0c;二极管是一种具有单向导电性的器件&#xff0c;由 P 型…

C# —— 日期对象

DateTime 时间类 存储时间对象 可以获取当前时间 DateTime now DateTime.Now;// 获取当前时间 Console.WriteLine("年:" now.Year);//2023 Console.WriteLine("月:" now.Month);//9 Console.WriteLine("日:" now.Day);//12 Console.WriteLi…

2.2.2 ROS2话题通信之原生消息(C++)

1.发布方实现 功能包cpp01_topic的src目录下&#xff0c;新建C文件demo01_talker_str.cpp&#xff0c;并编辑文件&#xff0c;输入如下内容&#xff1a; /* 需求&#xff1a;以某个固定频率发送文本“hello world!”&#xff0c;文本后缀编号&#xff0c;每发送一条消息&…

算法训练(leetcode)第二十二天 | 491. 非递减子序列、全排列、47. 全排列 II

刷题记录 491. 非递减子序列46. 全排列47. 全排列 II去重写法一去重写法二 491. 非递减子序列 leetcode题目地址 本题对于去重是一个难点&#xff0c;因为题目不允许排序&#xff0c;所以需要加一个笔记数组来判断相同的元素在同一层是否已经使用。使用set、map都可以达到这个…

2024开源之夏记录

研0在家摆烂&#xff0c;防止最后项目完不成&#xff0c;开篇博客督促自己记录每天的进度。

一览 Anoma 上的有趣应用概念

撰文&#xff1a;Tia&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News Anoma 的目标是为应用提供通用的意图机器接口&#xff0c;这意味着使用 Anoma&#xff0c;开发人员可以根据意图和分布式意图机编写应用&#xff0c;而不是根据事务和特定状态机进行…

pgsql+mybatis返回主键id

pgsqlmybatis返回主键id PostgreSQL使⽤MyBatis,insert时返回主键MyBatis中普通的insert语句是这样的&#xff1a; <insert id"insert" parameterType"com.xxx.xxx.xxDo">insert into "table_name" (key, value)values (#{key,jdbcTypeV…

Java增加线程后kafka仍然消费很慢

文章目录 一、问题分析二、控制kafka消费速度属性三、案例描述 一、问题分析 Java增加线程通常是为了提高程序的并发处理能力&#xff0c;但如果Kafka仍然消费很慢&#xff0c;可能的原因有&#xff1a; 网络延迟较大&#xff1a;如果网络延迟较大&#xff0c;即使开启了多线…

新手拍短视频的些许建议

1、尽早行动&#xff0c;拒绝完美主义&#xff0c;有手机就能上车&#xff0c;一开始别花太多时间在打磨细节上。总是要准备好了后再做&#xff0c;就总比别人慢一步&#xff0c;可能永远也追不上了&#xff1b; 2、坚持发&#xff0c;度过难熬的启动期就行&#xff0c;不要走…

启明智显Model3A芯片方案7寸高清触摸屏ZX7D00CM21S:开箱、设置与实操全攻略指南

一、背景 本指南将详细介绍启明智显的Model3A芯片方案下的7寸高清触摸屏ZX7D00CM21S的开箱步骤、基础设置以及实操应用。无论您是电子爱好者、开发者还是工程师&#xff0c;这份指南都能助您快速上手并充分利用这款触摸屏的各项功能。 二、硬件介绍 ZX7D00CM21S 7寸高清触摸屏是…

Spring 事务管理:全面解析

Spring 框架是一款广受欢迎的 Java 开发框架&#xff0c;其强大的功能之一便是事务管理。事务管理在确保数据一致性和完整性方面至关重要。在这篇文章中&#xff0c;我们将深入探讨 Spring 事务管理&#xff0c;包括声明式事务管理、编程式事务管理&#xff0c;以及事务传播和隔…

CPP知识点记录总结

1、类的const成员函数 const成员函数的const 实际修饰的是该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。 class A {void fun() const {// 常成员函数&#xff0c;在函数名后用const修饰} } 一文带你入门C类和对象【十万字详解&#…

谷歌正在试行人脸识别办公室安全系统

内容提要&#xff1a; &#x1f9ff;据美国消费者新闻与商业频道 CNBC 获悉&#xff0c;谷歌正在为其企业园区安全测试面部追踪技术。 &#x1f9ff;测试最初在华盛顿州柯克兰的一间办公室进行。 &#x1f9ff;一份内部文件称&#xff0c;谷歌的安全和弹性服务 (GSRS) 团队将…

【android】【adb shell】写一个shell脚本,监听进程pid变化

前言 当前业务&#xff0c;需要写一个脚本&#xff0c;不断监视com.android.phone 进程是否异常死掉 脚本 #!/system/bin/sh last_pid"" current_pid"" while(true){current_pidps -A | grep com.android.phone | awk {print $2}if [ -n "$current…

uni-appx,实现登录功能,弹窗功能。组件之间传值

这篇文章的内容使用组合式API实现的&#xff0c;只有弹窗部分有选择式API的写法介绍。如果想要看其他选择式API&#xff0c;还请下载官方的hello-uni-appx源码进行学习&#xff0c;查看。想要看组合式API的写法&#xff0c;请查看源码 hello-uvue。 hello-uni-appx源码 相比于…