不简单的hello world之C标准库

目录编程


1. 库(Library)的定义微信

2. 为何须要库网络

3. 库是如何生成app

4. 库里面有什么框架

5. 库的分类socket

6. 如何建立库tcp

7. 什么是标准库函数

8. 标准库的优势工具



在上一篇文章当中咱们分析了hello world这个程序的第一行,那么咱们接下就开始看后面的代码,可能有人会说了,这么简单的代码还有什么可看的,同窗们,有句话说的很是好,魔鬼在细节,那么这个魔鬼在这里就是printf函数。学习


printf人人都会用,从写hello world就开始用,用了这么多年简直是使用最多的函数,调试bug的必备利器,可是,亲爱的同窗,你有没有想过就是这个咱们习觉得常当作空气同样存在的的函数究竟是怎么实现的,它在哪里被实现的,这个函数的实现文件咱们都没有看到过,那么咱们的hello world到底又是怎么调用到这个函数的呢,printf究竟是怎么把hello world打在屏幕上让咱们看的呢,这些你能详详细细的说清楚吗?若是你还不能清楚明白的解释这些问题,这些问题对你仍是一团迷雾的话,那么接下来的我会在后面的文章当中一一为你们详细讲解。


说这些但愿你们能保持一颗好奇的心,本质上这也是人类文明得以发展到今天的缘由,若是牛顿对苹果落地也像你们对printf习觉得常同样,我想万有引力定律可能要向后推迟不少年了,牛顿万有引力的发现绝对是影响人类文明的里程碑事件,具体为何就不在计算机课程上展开说了,归纳的说就是万有引力的发现让人们第一次认识到大天然也是有规律今后解放了长期禁锢欧洲人思想由此诞生了一批猛人极大的推进了文明的发展之类,具体请参考西方历史哲学史天然科学史等一系列史字结尾的书以及相似课程。在这个快节奏高压力的现代生活中,不少人已然迷失了本身,虽然外在环境如此写这些仍是但愿你们能在本身心里能保留一方净土,在这片净土上你依然有着这采菊东篱下悠然见南山的悠然自得,在你深夜加班回家后还能抬头看一看天上的星空,你还能静下心来好好思考一些问题,请保持珍贵的好奇心。


抒情完毕。


如今是时候给你们介绍一下关于这一主题隐藏在冰山之下的一部分,这一部分叫作C标准库(C standard library)。


介绍一下标准库,这个所谓的标准库但愿你们能理解一下,所谓标准库,首先它是一个库,那库又是什么呢,计算机科学当中有好多术语,一听上去真的很唬人,这些很唬人的词每每让初学者误觉得这个东西必定很高深,很难,而那些已经理解这些词语的人为了让后来者也认为这些真的很高深很难因此每每不作任何解释,其中一些术语你确定很熟悉 好比这里的库,socket,面向链接,stream等等,我永远都不能理解为何国内的做者不论是本身写的技术书籍仍是翻译过来的就不能好好解释一下这些名词,我以为计算机学习起来仍是有必定的门槛的,这其中的一部分就在于计算机文化方面,这就相似于咱们很难理解好比零零后喜欢的二次元,里面有不少术语每每让人一头雾水同样,这些文化上的阻隔会成为进入这个领域的第一道障碍,在这里我会尽力用易懂的方式给你们讲清楚这些很唬人的词语究竟是什么意思。


1. 库(Library)的定义



让咱们首先来看看到底什么才是库,总结起来一句话就是:


别人(或者本身)已经写好的现成可用的一堆可重复使用的代码


这就是库定义了,这里的一堆代码能够是针对某个特定功能的代码,好比专用于数字分析计算的库,能够是实现某些功能的框架(至于什么是框架呢,见文章末尾),好比一些图形库,Libevent之类,也是能够本身积累的一些小工具,好比实现字符串操做之类功能,这些均可以称之为库。我的以为其本来的英文更形象一下,Library原本就是图书馆,书库,资料室之类的意思,因此能够形象的把库理解为相关主题的资料,书籍,若是你想了解(使用)一些特定的主题,只须要找相关的书籍资料就能够了,和这里的库的意思是同样的。



介绍完了什么是库,那么你可能会想,到底咱们为何须要用到库这么个东西呢,那接下来首先来回答一下这个很重要的问题。


2. 为何须要库(Library)



 一我的的力量终归是有限的,咱们每一个人都不是孤岛,总须要和其它人一块儿协做来完成某项工做,对于编程,也是一样的道理,若是某些咱们须要的功能别人已经实现实现了,咱们直接来用就行了。

 

 为何须要库总结下来就是一句话:


站在其它人的肩膀之上


 很明显这里改编自著名大物理学家牛顿的名言,在被问及为何能取得如此巨大的成就时,牛顿谦虚的说到本身只是“站在了巨人的肩膀之上”,以牛顿学术成就如此之人尚且须要借助于其它人的研究成果,做为平凡的劳苦大众之广大码农更是没有理由不去借助于其它人的代码了。


在计算机世界当中,库,就是其它人的肩膀


咱们使用的C标准库,程序所运行之上操做系统(从某种角度上看,操做系统也能够看作库,由于没有操做系统的话,若是咱们想运行一个程序还要本身来管理CPU,内存等硬件资源) ,处理网络数据的TCP/IP协议栈(你在写socket程序的时候从没有关心如何处理tcp协议丢包如何处理,如何进行超时重传等等吧,一样TCP/IP协议栈也能够看作是库),由于TCP/IP协议栈已经把这些最复杂最琐碎的工做给你完成了,当你在写本身的程序时只须要专一于完成本身的事情就能够了,其它的事情交给完成特定功能的库就能够了。


因此这下你应该明白了吧,咱们每一个人都不是万能的,总有咱们擅长的和不擅长的,写程序也是这样,好比我须要一些能进行矩阵运算的函数,可是本身实现起来太复杂了,而与此同时又有这样的能够进行科学计算的现成的库,那那咱们为何不直接使用这些已经历经考验的高效优秀的库呢,使用现成的库能够大大加快项目项目的开发进度,目前国内不少互联网公司,不少项目都是直接使用优秀的开源实现,在此基础之上实现业务逻辑,从而实现项目的快速开发,快速迭代,这些都是经过借助其它人的代码来实现的。因此说,某项本身想要的功能若是其它人已经实现了,并且实现的还不错,那为何不直接只是用呢,而是用其它人的代码可能是是以库的形式来使用的,因此:


人生苦短,咱们用库


 (注意这里的意思是让你们不要去造轮子(库),可是知道一些轮子是如何造出来的仍是很重要的,好比操做系统,好比计算机网络,或者对于任何你感兴趣的库我都鼓励你们去看看究竟是怎么实现的,可是对于工程项目来讲,仍是那句话,不要造轮子,除非当前的轮子已经不适用于你的车速了)


咱们在这一节中了解了为何须要库,那么库是如何生成的呢? 接着往下看。


3. 库是如何生成



让咱们先来猜猜,库是如何生成,既然咱们在上一节中说过,其它人的代码可能是以库的形式发布的,那么库就是由代码生成的。可能不少人都说,这不是废话吗,是的,这种看似废话的推理每每都是直白简单的,而简单的东西不容易出错,这种这种不易出错的推理正是咱们一步一步进行探索的重要基础。

说到这里就不得不说一下源文件和目标文件(Object File)了。

咱们知道,CPU不能执行if...else...,int a = b+c,等等这样的咱们人类能看懂的程序,CPU能够执行的偏偏是咱们人类及其不容易看懂的二进制指令01011000等等,从这些基本常识中咱们就能够知道了,既然咱们写的是if...else...,int a = b+c等等这样人类能看懂的程序,并且咱们写的这些程序CPU还能运行起来,那么必然须要某个什么东西把咱们写的代码翻译成CPU能看懂的01二进制指令,,而执行程序翻译工做的翻译官就是一个叫作编译器的东西,咱们写的程序被编译器翻译过来给CPU看的就叫作目标文件(Object File),如图所示:



咱们写的每一个.c文件文件都叫作源文件,每一个源文件别翻译官编译器翻译后生成的文件是目标文件,注意源文件和目标文件是一一对应的。每一个源文件当中就是咱们写的人类可读的代码啦,而目标文件当中对应的就是CPU能够读懂的二进制二进制指令啦。你能够简单的理解源文件就是中文,而目标文件就是对应的英文,而CPU只能看懂英文(固然,但愿有朝一日,CPU也能读懂中文)。

有的同窗可能会问,那头文件(include File)呢,请对此还不太了解的同窗参考个人上一篇文章叫作《不简单的Hello World之头文件》,那里面会有关于头文件的详细描述。简单的说就是,编译器不会编译头文件,头文件的处理是一个叫作预编译器的东西来完成的。编译器只处理源文件,而后把源文件中的程序翻译成二进制文件生成对应的目标文件。

既然咱们了解了源文件以及对应的二进制指令目标文件,那么咱们就能够接下里给你们介绍一位计算机世界当中的幕后英雄了,这也是冰山水面之下的一位重量级选手,它就是连接器(Linker)。从名字当中你应该能猜出来它作什么的,连接器嘛,主要就是把一些东西给拼装起来的。连接器拼装的是什么呢,连接器拼装的就是上面咱们介绍的目标文件(Object File)。



连接器的做用就是把编译器翻译的多个源文件生成的多个对应的目标文件打包起来生成一个文件。这就是库,从这里同窗们应该看出来了吧,库里面包含了咱们源文件里的全部代码了,更重要的是,更重要的是什么呢,同窗们看出来了吗,更重要的是,这个连接器链接好生成的单独的一个文件库里面已经就是CPU能看懂的二进制指令了,有的同窗又会问了,为何呢,由于连接器链接的是目标文件啊,如图上面图所示,咱们上面也说过目标文件里面就是翻译官编译器翻译的CPU能读懂的二进制文件了,既然库里面就已是程序的二进制形式了,因此这里有一个好处,那就是,当咱们使用库的时候就省去了编译这样一个环节,要知道在大型项目中,编译时间动不动就是几十分钟一个小时,因此提早把一些模块编译成库能够极大的缩短编译时间。关于库是如何生成的,这下你应该看明白了吧。这里关于连接器的介绍是很隆重的,可是描述是很简短的,这么重要的利器只简单介绍这么一点这么能够呢,太不给连接器(Linker)面子了吧,别着急,我会在下一篇文章当中用整整一章来给你们详细讲解连接器(Linker),敬请期待。


因为本篇文章较长,我会分两篇来介绍本主题,接下来的内容会在下一篇文章中介绍,谢谢你们。


本文分享自微信公众号 - 码农的荒岛求生(escape-it)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索