我认为您是在问两个不同的问题。
- 编程语言将其所有程序表示为数据的能力。
- 关于程序作为数据的推理。
出于分析目的,将它们分开是很有用的。我将专注于前者。
编程语言在数据受元编程或
同声性等术语约束时表示,操纵(和运行)其程序的能力。
以一种(笨拙的)方式,所有众所周知的编程语言都可以进行元编程,即通过使用字符串数据类型以及对字符串调用外部程序(编译器,链接器等)的能力(例如,将它们写入文件中)系统优先)。但是,这可能不是您的意思。您可能会想到不错的语法。字符串不是用于程序表示的好语法,因为几乎所有的字符串都不表示程序,即当被视为程序表示机制时,字符串数据类型包含很多“垃圾”。更糟糕的是,字符串运算的代数与程序构造的代数基本上没有关系。
您可能想到的是更好的东西。例如,如果是一个程序,那么 ⟨ P ⟩是P,但作为数据,在手操纵和分析。这通常称为报价。实际上,报价是不灵活的,因此我们使用准报价,这是对报价的概括,其中报价可以包含“漏洞”,可以在其中运行提供数据以“填充”漏洞的程序。例如⟨ 我˚FP⟨P⟩P是表示有条件的准报价,其中,而不是我们有一个孔的条件 [ ⋅ ]。如果程序中号的计算结果为所述数据 ⟨ X > 0 ⟩,则准报价 ⟨ 我˚F
⟨ 我˚F[ ⋅ ]吨ħ È Ñ7Ë 升小号Ë8 + 9 ⟩
[ ⋅ ]中号⟨ X > 0 ⟩计算结果为数据
⟨ 我˚F⟨ 我˚F[ M]吨ħ È Ñ7Ë 升小号Ë8 +9 ⟩
⟨ 我˚Fx > 0吨ħ È Ñ7Ë 升小号Ë8 + 9 ⟩ 。
(请注意,是一个普通程序(不是作为数据的程序),它返回带引号的程序,即作为数据的程序。)为了使其正常工作,您需要一种数据类型来表示程序。通常,该数据类型称为AST(抽象语法树),您可以将(准)引号视为AST的缩写机制。中号
几种编程语言为元编程提供了准引用和其他功能。Lisp的宏化功能开创了将程序视为数据的这种能力。也许不幸的是,长期以来,人们一直认为基于Lisp的宏的功能很大程度上取决于Lisp的简约语法。直到MetaML(1),现代的,语法丰富的语言才被证明能够进行元编程。从那时起,MetaOCaml(2)(MetaML的后代,对于在仍在继续进行的探索中解决如何将程序键入为数据的问题具有重要意义),Template Haskell(3)和Converge(4)(取得所有关键的元编程功能(我认为是对的)表明,各种现代编程语言都可以容纳元编程。重要的是要意识到我们可以采取任何编程语言并将其转换为元编程语言L m p
,即L,并具有将其自己的程序表示为数据并进行评估的能力。大号大号米p大号
e v a l(⋅)P⟨ P⟩PPe v a l(⟨ P⟩ )时P⟨P⟩
关于第二维,关于作为数据给出的程序的推理。只要将程序转换为数据,它们就是“正常”数据,可以作为数据进行推理。如Joshua所指出的,您可以使用所有方式的证明者技术,例如从属类型或契约,交互式定理证明者或自动化工具。但是,您将必须在推理过程中表示语言的语义。如果您需要的那种语言具有元编程能力,那么事情可能会变得有些棘手,并且在这个方向上没有做太多的工作,其中(5)是用于此目的的唯一程序逻辑。在基于元编程的推理方面,还有基于Curry-Howard的工作(6、7、8)。请注意,这些基于逻辑的方法 而且基于类型的方法(2)确实可以表达对所有未来元编程阶段都适用的属性。除了(2)以外,这些文件都没有执行。
总结:您所要求的内容已经实现,但是非常微妙,并且仍然存在未解决的问题,特别是与类型和简化的推理有关的问题。
塔哈(W. Taha)。多阶段编程:其理论与应用。
塔哈(W. Taha)和尼尔森(MF Nielsen)。环境分类器。
T. Sheard和S. Peyton Jones。Haskell的模板元编程。
L. Tratt。使用动态类型的OO语言进行编译时元编程。
M. Berger,L。Tratt,《齐次元编程的程序逻辑》。
R. Davies,F。Pfenning,分阶段计算的模态分析。
R.Davies,一种绑定时间分析的时间逻辑方法。
T. Tsukada,A. Igarashi。环境分类器的逻辑基础。