深入c语言和程序运行原理(28)编译器在链接程序时发生了什么?

我曾在 02 讲 的最后提到,C 代码的完整编译流程可以被分为四个阶段:代码预处理、编译优化、汇编,以及链接。在前三个阶段中,编译器会对输入的源代码文件依次进行分析、优化和转换,并生成可以在当前平台上使用的对象文件。紧接着,链接过程可以将程序依赖的所有对象文件进行整合,并生成最终的二进制可执行文件。 今天,我就来带你深入看看,这个“链接”的过程究竟是怎样执行的。按照发生时刻的不同,链接可以被分为编
深入c语言和程序运行原理(28)编译器在链接程序时发生了什么?

深入c语言和程序运行原理(29)程序可以在运行时进行链接吗?

  在上一讲中,我介绍了有关 Linux 下静态链接的内容。而这一讲,我们将继续程序的“链接”之旅,来看看我之前提到的另外两种链接类型,加载时链接与运行时链接。 实际上,加载时链接与运行时链接均可归为动态链接,只是在这两种方式中,程序进行链接的具体时刻有所不同。其中,加载时链接发生在程序代码被真正执行之前;而运行时链接则可发生在程序运行过程中的任意时刻。 为什么要使用动态链接? 在上一讲
深入c语言和程序运行原理(29)程序可以在运行时进行链接吗?

深入c语言和程序运行原理(30)C 程序的入口真的是 main 函数吗?

“main 函数是所有 C 程序的起始入口”,相信对于这句话,每个同学在刚开始学习 C 语言时都很熟悉,因为这是一个被各种教材反复强调的“结论”。但事实真是如此吗? 实际上,这句话对,但也不完全对。在一段 C 代码中定义的 main 函数总是会被优先执行,这是我们在日常 C 应用开发过程中都能够轻易观察到的现象。不过,如果将目光移到那些无法直接通过 C 代码触达的地方,你会发现 C 程序的执行流程
深入c语言和程序运行原理(30)C 程序的入口真的是 main 函数吗?

深入c语言和程序运行原理(31)ABI 与 API 究竟有什么区别?

今天我们来聊另外一个老生常谈的话题:“ ABI 与 API 这两个概念究竟有什么区别?” 也许你之前也思考过这个问题。ABI 与 API 这两个英文缩写只差一个字符,因此它们对应的概念在很多线下讨论和博客文章中会被经常混用,甚至是乱用。当然,时不时地,这个问题也会成为人们在技术社交圈内的丰富谈资。这一讲,就以你熟悉的 C 语言体系为例,我们来一起看看 ABI 与 API 二者分别指代什么内容,有什
深入c语言和程序运行原理(31)ABI 与 API 究竟有什么区别?

深入c语言和程序运行原理(32)程序如何与操作系统交互?(完结)

  在上一讲中我曾提到,你可以将操作系统内核暴露的“系统调用”也作为 API 的一种具体表现形式,因为调用者可以通过这些接口来使用内核提供的某种能力,但是却无需了解它们的内部实现细节。在之前的课程中,我也多次提到过有关系统调用的内容。那么,系统调用究竟是什么?它与我们编写的应用程序函数有何不同?通常情况下它又是怎样实现的呢?这一讲,我们就来看看这些问题的答案。 什么是系统调用? 不知道你
深入c语言和程序运行原理(32)程序如何与操作系统交互?(完结)

深入C语言和程序运行原理(1)— 如何更好地拥抱现代 C 语言?

  相信来学习这门课的大部分同学,都或多或少接触过一些 C 语言的基础知识。但是,我认为掌握 C 语言的基本语法并不困难,更重要的是能够灵活、高效地使用这门语言,并通过观察语言背后机器的执行细节,来深入了解关于编译优化、程序执行,以及计算机体系结构等其他相互关联的知识。 C 语言是工作中使用最多的语言之一。由于 C 语言语法简单、抽象层次较低,能够通过它在进行原型验证时精确地控制程序的运
深入C语言和程序运行原理(1)— 如何更好地拥抱现代 C 语言?

深入C语言和程序运行原理(2)一个 C 程序的完整生命周期

在深入了解 C 语言、做到“知其所以然”之前,我们需要先做到“知其然”,也就是知道 C 语言是如何使用的。所以这一讲,会从语法细节和语言特性、微观和宏观相结合的角度,带你快速、直观地回顾 C 语言的一些基础内容。而通过本讲的学习,你也会更容易理解这门课接下来的内容。 首先,我会带你回顾一个 C 程序从源代码编写到编译,再到最后运行的完整过程。除此之外,我还会用一段相对复杂的示例代码,来带你快速回顾
深入C语言和程序运行原理(2)一个 C 程序的完整生命周期

深入C语言和程序运行原理(3)数据与量值是如何被组织的?

从这一讲开始,我们将围绕 C 语言的七大类核心语法,深入探寻隐藏在语法背后,程序代码的实际执行细节。 C 语言让我们能够用一种可移植、结构化,且具有人类可理解语义的方式,构建我们的程序。C 标准中详细描述了 C 语言在语法和语义两个层面的基本内容,但对于实现者,比如编译器来说,如何将这些语法和语义体现在具体的机器指令(汇编代码)上,标准并未给出详细规定。 所以问题来了:在这层抽象背后,一个 C 程
深入C语言和程序运行原理(3)数据与量值是如何被组织的?