语义规则的编译时执行
Compile-Time Enforcement of Semantic Rules
编译器强制执行语法规则。我想要的是语义编译器,或者在普通编译器之上的语义阶段。
我不确定最好的方法。有些语言 可能 有直接的方法,有些语言可能允许你 "abuse" 模板之类的东西来强制执行它,最后,Clang 允许非常强大的 AST 生成。但我不知道有任何工具使用它来执行任意规则。
我正在寻找功能强大的静态(编译时)"context" 检查器。
例如:我想确保(通过编译时警告或错误消息)已评估特定函数的 return 值。非常简单,D 论坛的热心人士提供了一些示例代码。
但是其他规则呢?例如,当有人在调用先决条件初始化函数之前调用库函数时产生错误。 (*) 当然,您可以产生异常。但是,当问题本身是静态的时,难道不应该有更优雅的编译时解决方案和系统吗?还是我会减少到 "bending" 种带有奇异模板巫术的语言来做我想做的事?
(*) 是的,这种情况可能需要动态检查器。但它可能不取决于上下文。就像在初始化之前使用变量一样。
我见过一些进行 "best practices" 扫描的代码检查器。他们中的任何一个(免费的)是否支持自定义规则?它们对开发过程的侵入性是否很大?理想情况下,当我去编译我的项目时,我想要的只是"user defined semantic rules that produce compiler errors or warnings"。
p.s。我事先意识到有些人会宣称 "code enforcement" 应该归入代码指南,你不能强迫程序员遵守规则。但我并不要求完美。我要求项目的首席开发人员能够使用编译器强制执行某些规则,这将迫使其他人在违反这些规则时注意到。
你想要的是一个可定制的程序分析工具。
我的理解是 Clang 可以做到这一点,并且在某种程度上是为了让这件事变得相对容易。您可以自定义 Clang 以在您的代码上实现任意谓词;你用 C++ AFAIK 编写这些定制。 Clang 还充当编译器,因此您大概可以将它们集成到单个 Clang 映像中。
据我所知,您也可以使用 GCC 执行此操作,但它并非为此目的而设计,因此在实践中通常要困难得多。 GCC MELT 应该会让这更容易。恕我直言,它和 GCC 一样复杂,所以我看不出这有多大帮助。 YMMV.
第三种方法是使用专为支持此类定制而设计的工具。我们的 DMS Software Reengineering Toolkit and its C++ front end are this kind of tool. You can use it to define semantic constraints, using a combination of source-level pattern matching 和任意谓词编码在符号表 values/C++ 类型和方法局部控制和数据流分析上。
编译器强制执行语法规则。我想要的是语义编译器,或者在普通编译器之上的语义阶段。
我不确定最好的方法。有些语言 可能 有直接的方法,有些语言可能允许你 "abuse" 模板之类的东西来强制执行它,最后,Clang 允许非常强大的 AST 生成。但我不知道有任何工具使用它来执行任意规则。
我正在寻找功能强大的静态(编译时)"context" 检查器。
例如:我想确保(通过编译时警告或错误消息)已评估特定函数的 return 值。非常简单,D 论坛的热心人士提供了一些示例代码。
但是其他规则呢?例如,当有人在调用先决条件初始化函数之前调用库函数时产生错误。 (*) 当然,您可以产生异常。但是,当问题本身是静态的时,难道不应该有更优雅的编译时解决方案和系统吗?还是我会减少到 "bending" 种带有奇异模板巫术的语言来做我想做的事?
(*) 是的,这种情况可能需要动态检查器。但它可能不取决于上下文。就像在初始化之前使用变量一样。
我见过一些进行 "best practices" 扫描的代码检查器。他们中的任何一个(免费的)是否支持自定义规则?它们对开发过程的侵入性是否很大?理想情况下,当我去编译我的项目时,我想要的只是"user defined semantic rules that produce compiler errors or warnings"。
p.s。我事先意识到有些人会宣称 "code enforcement" 应该归入代码指南,你不能强迫程序员遵守规则。但我并不要求完美。我要求项目的首席开发人员能够使用编译器强制执行某些规则,这将迫使其他人在违反这些规则时注意到。
你想要的是一个可定制的程序分析工具。
我的理解是 Clang 可以做到这一点,并且在某种程度上是为了让这件事变得相对容易。您可以自定义 Clang 以在您的代码上实现任意谓词;你用 C++ AFAIK 编写这些定制。 Clang 还充当编译器,因此您大概可以将它们集成到单个 Clang 映像中。
据我所知,您也可以使用 GCC 执行此操作,但它并非为此目的而设计,因此在实践中通常要困难得多。 GCC MELT 应该会让这更容易。恕我直言,它和 GCC 一样复杂,所以我看不出这有多大帮助。 YMMV.
第三种方法是使用专为支持此类定制而设计的工具。我们的 DMS Software Reengineering Toolkit and its C++ front end are this kind of tool. You can use it to define semantic constraints, using a combination of source-level pattern matching 和任意谓词编码在符号表 values/C++ 类型和方法局部控制和数据流分析上。