B.G*_*ill 6 c programming-languages
我试图完全理解用一些语言编写代码以便由OS执行的过程.就我而言,语言将是C,操作系统将是Windows.到目前为止,我阅读了很多不同的文章,但我不确定,我是否理解这个过程是正确的,我想问你是否知道一些关于我找不到的主题的好文章.
所以,我认为我对C(基本上是其他语言)的了解:
C编译器本身只处理数据类型,基本数学运算,指针运算和函数处理.通过使用函数我的意思是如何将参数传递给它,以及如何从函数中获取输出.在编译期间,函数调用被替换为将参数传递给堆栈,而如果函数不是内联函数,则其调用将被链接器的某个符号替换.链接器比找到函数定义,并替换符号跳转到该函数的地址(当然比跳回程序).
如果以上一般都是正确的,我说得对,最终的.exe文件在哪里实际上链接器保存了函数?在main()函数之后?什么创建.exe标头?编译器还是链接器?
现在,C的其他功能,现在被称为C standart库,是一组函数及其声明,其他程序员编写这些函数来扩展和简化C语言的使用.但像printf()这些函数是(或可能是?)用不同的语言或汇编语言编写的.还有我的下一个问题,例如,printf()函数是用纯C编写的而不使用汇编程序?
我知道这是一个非常大的问题,但我只是想知道,我是对还是不对.相信我,我在网上阅读了很多文章,我不会问你,如果我能在一个地方,一篇文章中找到这些信息.Insted我必须逐个收集信息,所以我不确定我是否正确.谢谢.
我认为你接触到一些与初级C程序员不太相关的信息,这可能让你感到困惑 - 使用这种更高级别语言的部分目标是不必首先考虑这个过程是如何工作的.但是,随着时间的推移,了解这一过程非常重要.我认为你通常对它有正确的理解.
C编译器只接受C代码并生成包含机器语言的目标文件.大多数目标文件都是由函数的内容获取的.例如,C中的简单函数调用将以编译形式表示为低级操作符,以将事物压入堆栈,更改指令指针等.
您将使用的C库和任何其他库已在此编译表单中提供.
链接器是组合所有相关目标文件,解析所有依赖项(例如,一个目标文件调用标准库中的函数),然后创建可执行文件的东西.
至于语言库的编写:将每个函数都想象成一个黑盒子.只要黑盒子有一个标准接口(C调用约定;也就是说,它以某种方式接受参数,以某种方式返回值等),内部写入的方式无关紧要.最典型的是,函数将用C语言编写或直接用汇编语言编写.当它们成为目标文件(或作为编译库)时,它们最初创建的方式并不重要,重要的是它们现在处于已编译的机器形式中.
可执行文件的格式取决于操作系统,但Windows中可执行文件的大部分内容与目标文件的大部分相似.想象一下,好像有人将所有目标文件合并在一起然后添加了一些粘合剂.胶水会加载相关的东西,然后调用main().例如,当我还是个孩子的时候,人们会在"更换胶水"之后添加另一个功能,然后在main()之前添加一个带有名字的闪屏.
需要注意的一点是,无论您使用何种语言,最终都必须使用操作系统服务.例如,在屏幕上显示内容,管理进程等.大多数操作系统都有一个也可以类似方式调用的API,但其内容不包含在EXE中.例如,当您运行浏览器时,它是可执行文件,但在某些时候,会调用Windows API来创建窗口或加载字体.如果这是你的EXE的一部分,你的EXE将是巨大的.因此,即使在您的可执行文件中,也存在"缺少引用".通常,这些是在加载时或运行时解决的,具体取决于操作系统.