CompCert 之 Coq源代码 编译过程

        在 CompCert 的主要构建过程中,如下:

        其中的 $(MAKE) proof 就是将 Coq 源代码(.v 文件)编译成 Coq 对象文件(.vo文件),动作如下:

        也就是,proof 目标(Target)依赖所有源代码的对象文件。其中,所有的源代码如下:

        而, .v 文件编译成 .vo文件的动作,如下:

        其中,下面的部分,是有部分 .v 文件是由 .vp 文件而来的。 .vp 文件是 CompCert 项目定义的需预处理(Preprocessing)的 coq 源文件,其中的 tools/ndfun 就是该预处理的工具,用 ocaml 编写的,其源代码是 tools/ndfun.ml。例如:

        有了,.v 文件后,其对应的对象文件(.vo),通过 $(COQC) 来编译,其定义如下:

        也就是,coq 编译器 coqc ,以及 一些预先定义好的参数。其中,

        -q,指 不要预加载(preload)资源文件(resource file),也就是,不运行额外的代码。

        $(COQINCLUDES),相当于 C 里面的 INCLUDES,即头文件寻找目录,这里是 Coq的寻找目录。

        $(COQCOPTS),就是一些额外的标志位(Flags)。

        另外,$(PROFILE_ZIP) 指的是输出 profile 文件,这里恒为 true。目前,可以忽略。

        例子,如下:

        有了,Coq 对象文件(.vo)后,就进入了 extraction 阶段,即,在 Coq 对象文件中,提取出 ocaml 的执行代码。即:

        将,所有提取出来的 ocaml 代码,放置在 extraction 目录下。其具体的动作过程如下:

        此时,extraction 目录下就有所有的 CompCert 的 ocaml 源代码,就可进入 ccomp 阶段。也就是将所有的 ocaml 代码进行编译链接,生成最后的 ccomp 可执行文件,这里就不再赘述了。

        因为,对于 CompCert 最核心的内容在  Coq 源代码内,即,其验算式编程(Certified Programming)。

        也就是, CompCert 是一个 C语言的编译器,其实现的C语言标准主要是 C99。在其实现的过程,每个处理函数,包括前端(Frontend)、中间表示层(IR)、后端(Backend)、优化(Optimizations)等的处理过程,都通过证明(Proof)方式,保证其处理函数具备其定义的属性,由此,通过归纳证明方式,证明整个编译器,即 ccomp,具备其预定的属性,从而保证, ccomp编译出来的 C 程序,符合 C99 标准的行为。

        也就是,ccomp 除了通过常规的测试用例来保证其编译过程符合 C99标准,还通过验算式编程的方式,利用 Coq 语言提供的证明机制(Theorem Prover),来保证其编译过程符合标准。

        后续的一系列博文,将对其的验算式编程进行分析,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeithTsui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值