关于标准ML编译器,我的问题是,尽管ML本身已经正式定义,可以证明程序的确定性评估,但编译器本身并不是用C语言编写的,而C语言没有正式定义,至少不是全部。 ?我想我的问题是我们在Standard ML中编写一个程序并且可以证明它的正确性,我们怎么知道C编写的编译器没有以可能改变结果的方式执行?
由于
答案 0 :(得分:3)
这是一个责任问题。无论编写SML运行时或编译器的语言是什么(SML是一个规范,而SML编译器不必须站在C代码上,它可能是其他任何东西),你的责任是制作你的SML程序根据SML规范工作。如果SML编译器有问题,那就是别人的问题。
您是否考虑过运行SML运行时编译指令的处理器?谁正式证明了这一点?那些在处理器晶体管内移动的电子怎么样?是谁告诉他们按照处理器设计所依据的物理“规律”工作?谁正式证明了这些法律?
这不是你的问题。
这就是说,在编写本文时,C编译器主要用Coq编写,CompCert。此编译器为输入语言(大多数C)和目标汇编语言定义了形式语义。输入语言不必完全是C,只要SML实现被设计为在使用这种C语言编译时工作。如果您使用CompCert的输入语言实现SML,尽可能遵循正式定义,您将拥有具有信心链的SML解释器几乎不间断地进行组装。
答案 1 :(得分:3)
仅仅因为可以编写错误的C程序并不意味着你拥有。完全可以编写正确的C程序,并从C语言规范中推断出程序正确执行。