一个c语言的hello world的本质是什么?

文章目录

  • hello world
  • 程序源文件的本质是0和1
  • hello world文件的ASCII表示
  • 程序被其他程序翻译成不同的格式
    • 预处理阶段
    • 编译阶段
    • 汇编阶段
    • 链接阶段
  • 为什么需要了解编译系统的工作原理?
    • 优化程序性能
    • 理解链接时出现的错误
    • 避免安全漏洞
  • 参考

hello world

在这里插入图片描述

程序源文件的本质是0和1

hello程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件,文件名是 hello.c。源程序实际上就是一个由值0和1组成的位(又称为比特)序列,8个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。

hello world文件的ASCII表示

大部分的现代计算机系统都使用 ASCII标准来表示文本字符,这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符。
在这里插入图片描述

hello.c 程序是以字节序列的方式储存在文件中的。

每个字节都有一个整数值,对应于某些字符。

例如,第一个字节的整数值是 35,它对应的就是字符“# ”。第二个字节的整数值为 105,它对应的字符是“i,依此类推。
每个文本行都是以一个看不见的换行符“\n’来结束的,它所对应的整数值为 10。

像 hello.c 这样只由ASCII 字符构成的文件称为文本文件,所有其他文件都称为二进制文件。

hello.c 的表示方法说明了一个基本思想:

系统中所有的信息一一包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串bit表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。

比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

作为程序员,我们需要了解数字的机器表示方式,因为它们与实际的整数和实数是不同的。它们是对真值的有限近似值,有时候会有意想不到的行为表现。

程序被其他程序翻译成不同的格式

hello程序的生命周期是从一个高级 C语言程序开始的,因为这种形式能够被人读懂。

然而,为了在系统上运行 hello.c 程序,每条 C语句都必须被其他程序转化为一系列的低级机器语言指令。

这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。

目标程序也称为可执行目标文件。

在 Unix 系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:

linux> gcc -o hello hello.c

在这里,GCC 编译器驱动程序读取源程序文件 hello.c,并把它翻译成一个可执行目标文件 hello。

这个翻译过程可分为四个阶段完成。
执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统(compilation system)。

在这里插入图片描述

预处理阶段

预处理器(cpp)根据以字符#开头的命令,修改原始的 C 程序。比如hello.c中第 1行的#include <stdio.h> 命令告诉预处理器读取系统头文件stdio.h 的内容,并把它直接插入程序文本中。结果就得到了另一个 C程序,通常是以.i 作为文件扩展名。

编译阶段

编译器(cc1)将文本文件 hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序。该程序包含函数 main的定义,如下:

main:
subq	$8%rsp
movl	$.LCO,%edi
call	puts
movl	$0%eax
addq	$8%rsp
ret

定义中 2~7行的每条语句都以一种文本格式描述了一条低级机器语言指令.

汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供了通用的输出语言。

汇编阶段

接下来,汇编器(as)将 hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件 hello.o中。

hello.o文件是一个二进制文件,它包含的 17 个字节是函数 main的指令编码。

如果我们在文本编辑器中打开 hello.o文件,将看到一堆乱码。

链接阶段

请注意,hello程序调用了 printf 函数,它是每个C编译器都提供的标准C库中的一个函数。

printf 函数存在于一个名为 printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的 hello.o程序中。链接器(ld)就负责处理这种合并。

结果就得到 hello 文件,它是一个可执行目标文件(或者简称为可执行文件),可以被加载到内存中,由系统执行。

为什么需要了解编译系统的工作原理?

对于像 hello.c 这样简单的程序,我们可以依靠编译系统生成正确有效的机器代码。
但是,有一些重要的原因促使程序员必须知道编译系统是如何工作的。

优化程序性能

现代编译器都是成熟的工具,通常可以生成很好的代码。作为程序员,我们无须为了写出高效代码而去了解编译器的内部工作。但是,为了在 C程序中做出好的编码选择,我们确实需要了解一些机器代码以及编译器将不同的 C语句转化为机器代码的方式。

比如,一个 switch 语句是否总是比一系列的 if-else 语句高效得多?

一个函数调用的开销有多?

while循环比 for循环更有效吗?

指针引用比数组索引更有效吗?

为什么将循环求和的结果放到一个本地变量中,会比将其放到一个通过引用传递过来的参数中,运行起来快很多呢?

为什么我们只是简单地重新排列一下算术表达式中的括号就能让函数运行得更快?

理解链接时出现的错误

根据我们的经验,一些最令人困扰的程序错误往往都与链接器操作有关,尤其是当你试图构建大型的软件系统时。

比如,链接器报告说它无法解析一个引用,这是什么意思?

静态变量和全局变量的区别是什么?

如果你在不同的 C文件中定义了名字相同的两个全局变量会发生什么?

静态库和动态库的区别是什么?

我们在命令行上排列库的顺序有什么影响?

最严重的是,为什么有些链接错误直到运行时才会出现?

避免安全漏洞

多年来,缓冲区溢出错误是造成大多数网络和 Internet 服务器上安全漏洞的主要原因。

存在这些错误是因为很少有程序员能够理解需要限制从不受信任的源接收数据的数量和格式。

学习安全编程的第一步就是理解数据和控制信息存储在程序栈上的方式会引起的后果。

参考

《深入理解计算机系统》

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

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

相关文章

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis初识和框架搭建

第一章 初识Mybatis 1.1 框架概述 生活中“框架” 买房子笔记本电脑 程序中框架【代码半成品】 Mybatis框架&#xff1a;持久化层框架【dao层】SpringMVC框架&#xff1a;控制层框架【Servlet层】Spring框架&#xff1a;全能… 1.2 Mybatis简介 Mybatis是一个半自动化持久化…

银行业数据分析算法应用汇总

数据分析在银行业的应用及具体案例 一、欺诈检测二、客户细分三、风险建模四、营销优化五、信用评分六、客户流失预测七、推荐引擎八、客户生命周期价值预测 一、欺诈检测 欺诈检测即通过分析交易模式&#xff0c;检测可能的欺诈行为&#xff0c;主要有以下几个方面 1.跨机构开…

接口304 Not Modified

当客户端向服务端发送HTTP请求时&#xff0c;如果服务端返回状态码为304 Not Modified&#xff0c;则表明此次请求为条件请求。这意味着客户端已经缓存了该资源&#xff0c;并且该资源未被修改。在请求头中&#xff0c;客户端会发送两个请求参数&#xff1a;If-Modified-Since和…

Django 创建项目时找不到数据库sqlite3

原因:PyCharm创建Django项目,找不到数据库sqlite3 解决&#xff1a;如果没有默认的db文件&#xff0c;则应在PyCharm终端中执行以下命令&#xff1a; python manage.py makemigrations python manage.py migrate

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《就地无常规电源支撑下考虑新能源基地频率稳定的储能优化配置方法》

这个标题涉及到一个关于新能源基地频率稳定的储能优化配置方法的主题。让我们逐步解读&#xff1a; 就地无常规电源支撑下&#xff1a; 就地 (On-site): 意味着在特定地点或场地进行操作&#xff0c;而不是依赖外部地点的资源。无常规电源 (Non-conventional Power): 指的是不传…

python报错ModuleNotFoundError: No module named ‘docx‘解决方案

python报错ModuleNotFoundError: No module named docx解决方案 执行报错分析原因解决方案 执行报错 ModuleNotFoundError: No module named ‘docx’ pip install docx 后报错 分析原因 导错包了&#xff0c;不是docx而是python-docx 解决方案 卸载安装错的 docx pip uni…

足底筋膜炎症状及治疗方法

足底筋膜炎是一种常见的足部疾病&#xff0c;通常会引起足跟疼痛和不适。这种疼痛通常在早晨起床后或者长时间休息后更为明显&#xff0c;行走一段时间后可能会减轻。下面我们将详细介绍足底筋膜炎的症状及治疗方法。 一、足底筋膜炎的症状 足跟疼痛&#xff1a;这是足底筋膜…

2023/11/21JAVAweb学习

优先级高低id > 类 > 元素 格式化ctrl alt L

无人驾驶相关硬件汇总

1&#xff1a;激光雷达 激光雷达主要用于3D感知&#xff0c;是一种可以探测物体精确位置的传感器&#xff0c;其主要是通过对目标物发射激光信号&#xff0c;再根据从物体反射回来的信号时间差来计算这段距离&#xff0c;然后根据发射激光的角度来确定物体和发射器的角度&…

探索无限自然之美——Terragen Professional 4渲染软件

Terragen Professional 4是一款强大的自然环境渲染软件&#xff0c;为设计师、艺术家和电影制作人们带来了无限的创作可能性。无论是为游戏、电影、动画还是虚拟现实体验创建逼真的自然场景&#xff0c;Terragen Professional 4都能为您提供令人难以置信的结果。 Terragen Pro…

电商数据|淘宝商品数据接口接入|参数|获取商品订单物流|电商数据分析

授权认证 授权不是开放平台对服务商应用的授权 &#xff0c;而是需要开放平台的客户&#xff08;用户&#xff09;对服务商应用的授予&#xff0c;比如ERP应用&#xff0c;也就是淘宝的店铺商家对应用进行授权&#xff0c;使其能够拉取到店铺的订单来完成订单履约。 淘宝授权页…

#include <sensor_msgs/Imu.h>这个ROS头文件包含的功能有哪些?

在 ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;#include <sensor_msgs/Imu.h> 头文件定义了 sensor_msgs/Imu 消息类型&#xff0c;它用于处理来自惯性测量单元&#xff08;IMU&#xff09;的数据。IMU 通常包括加速度计、陀螺仪和有时还包括磁力计…

C题目11:数组a[m]排序

每日小语 双手&#xff0c;且放下一切劳作&#xff0c;前额&#xff0c;也忘掉忧思&#xff0c;此时此刻我所有的感觉就想沉入安睡。 自己敲写 这个问题老师上课讲了一种方法&#xff0c;叫做冒泡排序。基本思想是 1.找最小值&#xff0c;放到a[0] 2.从a[1]~a[3]找最小值&a…

如何理解Python中一切皆对象?

Python 一、示例代码二、Python中的魔法方法 一、示例代码 有理数类 import mathclass rational:def __init__(self,p,q):self.p pself.q qdef __str__(self):return "{} / {}".format(self.p,self.q)def simplify(self):gcd math.gcd(self.p,self.q)return rat…

「实用场景教程」如何用日程控件DHTMLX Scheduler制作酒店预订日历?(二)

dhtmlxScheduler是一个类似于Google日历的JavaScript日程安排控件&#xff0c;日历事件通过Ajax动态加载&#xff0c;支持通过拖放功能调整事件日期和时间&#xff0c;事件可以按天&#xff0c;周&#xff0c;月三个种视图显示。 DHTMLX Scheduler正式版下载 在本教程中&…

Atcoder ABC159

总体来说本期比较简单 C - Maximum Volume 答案显然是 O ( N 3 ) O(N^3) O(N3) D - Banned K 先统计总的&#xff0c;然后减去选到的那个数再重新计算 E - Dividing Chocolate 既然n范围是10&#xff0c;那么在n的宽度上做一个位操作&#xff0c;若i位与i1位之间有切割&…

数据结构之二叉树

前言&#xff1a;我们前面已经学习了数据结构的栈和队列&#xff0c;今天我们就来学习一下数据结构中的二叉树&#xff0c;那么作为二叉树我们就得先了解树的一些概念&#xff0c;还有二叉树一些特点。 树的概念&#xff1a; 树是一种非线性的数据结构&#xff0c;它是由n&…

golang指针学习

package mainimport "fmt"func main() {name:"飞雪无情"nameP:&name//取地址fmt.Println("name变量的内存地址为:",&name)fmt.Println("name变量的值为:",name)fmt.Println("name变量的内存地址为:",nameP)fmt.Prin…

DC电源模块检测故障步骤有哪些

BOSHIDA DC电源模块检测故障步骤有哪些 DC电源模块检测故障步骤如下&#xff1a; 1. 检查输入电压&#xff1a;用万用表测量输入电压&#xff0c;确保其在规定范围内。 2. 检查输出电压&#xff1a;用万用表或示波器测量输出电压&#xff0c;确保其在规定范围内。 3. 检查输…

使用vue-cli搭建vue项目

1&#xff1a;安装vue-cli 命令&#xff1a;npm install -g vue/cli 2&#xff1a;查看安装的版本 vue --version 或者 vue -V 3&#xff1a;创建项目 vue create 项目名称 名称小写 4&#xff1a;vue2框架中根据自己的需求选择&#xff08;我选择…