Questions tagged «meta-programming»

更改其他程序或功能的行为的程序或功能。

22
自动编程:编写可编写代码的代码
读完《实用程序员》一书后,我发现最有趣的论点之一是“编写代码编写代码”。 我尝试在网上搜索更多有关它的解释或文章,尽管我找到了一些有关该主题的不错的文章,但仍然没有找到任何特定的代码实现或好的示例。 我觉得它仍然不是一个普遍的论点,缺乏文档或者很多人不接受,我想对此有所了解。 您如何看待这个主题?它会真正提高您的生产力吗?在书籍,博客,幻灯片等中,关于该主题有哪些好的资源? 一些代码示例将不胜感激,使我可以更好地理解其实现。 这是有关该主题的Wiki页面,其中包含各种相关的编程技术,例如元编程,生成式编程和代码生成。

10
即使不是所有的同事都了解元编程,也可以使用元编程吗?
我使用了大量的元编程来避免重复的任务,并建立更安全使用的抽象。 我最近搬到了一个新工作,在一个更大的团队中工作,这让我的一些同事感到担忧,因为他们不理解。 我总是尽力利用这种语言的全部潜力,但是我的一些(并非全部)同事认为这是一种风险(有些人欢迎这种方法)。 我同意编写团队中其他人无法理解的代码是一个问题。另一方面,我们都是C ++专业开发人员,我认为我们应该追求更高的标准,而不是使用类编写C。 我的问题是,谁是对的,我该怎么办? 澄清: 试图充分利用语言的潜力,并不意味着我在所有问题上都投入了TMP。C ++是一个工具箱,对我而言,C ++熟练程度是指能够使用包装箱中的所有工具,以及为特定工作选择合适的工具。

3
编写代码时,我是否必须考虑编译后的机器代码?
例如,我有以下代码: auto z = [](int x) -> int { if (x > 0) { switch (x) { case 2: return 5; case 3: return 6; default: return 1; } } return 0; }; 后来我多次打电话给我。在asm代码中,我看到了使用lambda进行的外部调用。因此,也许我在元编程中获胜,但在asm调试和性能方面是否会输?我是否应该避免使用现代语言功能,宏和其他元编程方面,以确保性能和调试简便性?

4
在简单属性上使用AggressiveInlining有不利之处吗?
我敢打赌,如果我对分析C#/ JIT行为的工具有更多了解,我会自己回答,但是由于我不了解,请耐心询问。 我有这样的简单代码: private SqlMetaData[] meta; [MethodImpl(MethodImplOptions.AggressiveInlining)] private SqlMetaData[] Meta { get { return this.meta; } } 如您所见,我放入了AggressiveInlining,因为我认为应该对其进行内联。 我认为。不能保证JIT可以内联它。我错了吗? 做这种事情会损害性能/稳定性/任何东西吗?

5
Monkeypatching是否被视为良好的编程习惯?
我一直在印象中,monkeypatching属于快速和肮脏的hack类别,而不是标准的良好编程习惯。虽然我不时使用修复第三方库的小问题,但我认为这是临时性的修复,因此我会向第三方项目提交适当的补丁程序。 但是,我已经将该技术用作主流项目中的“常规方法”,例如在Gevent的gevent.monkey模块中。 Monkeypatching是否已成为主流,正常且可接受的编程实践? 另请参阅:杰夫·阿特伍德(Jeff Atwood)的“ Monkeypatching for Humans”


2
编译时IOC
是否有人在编译时启动了一个要进行IOC的项目(可能使用Roslyn或Linq MethodInfo发出)? 到目前为止,我在IOC容器方面的经验非常好,排除了一些小问题 许多IOC容器启动缓慢,因为许多解析逻辑都在这里发生 通常很难确保可以解决,因为编译不再确保可以调用构造函数。 通常,IOC容器会增加运行时的开销(有些甚至不小,通常那些启动很快的容器运行缓慢) 在我看来,理想的解决方案是在构建链上添加一个编译步骤,该步骤添加一个Factory类而不是IOC。 有人做过吗?如果没有,为什么不呢?

4
元编程有多普遍?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 您或您有多少次在项目中使用过元编程?在uni中,我从未见过这种方法的应用,但是我在以前的工作中就已经看到过这种方法(当我看到它的时候,我被它的有效性所震撼)。 但这有多普遍?是一直使用还是偶尔使用?

3
C ++:使用编译器API而不是C ++功能进行元编程
这最初是一个SO问题,但我意识到这是非常不合常规的,并且根据网站上的实际描述,它可能更适合程序员。因为该问题在概念上具有很大的分量。 我一直在学习clang LibTooling,它是一个非常强大的工具,能够以友好的方式(即以语义的方式,而不是通过猜测)公开代码的整个“坚韧不拔” 。如果clang可以编译您的代码,则clang 可以确定该代码内每个字符的语义。 现在让我退一步。 当人们从事C ++模板元编程时(特别是当冒险超越模板进入聪明的领域,尽管使人恐惧)时,会出现许多实际问题。老实说,对于包括我自己在内的许多程序员而言,模板的许多常规用法也有些令人恐惧。 我想一个很好的例子就是编译时字符串。这是一个已经存在一年多的问题了,但是很显然,到目前为止,C ++对于普通人来说并不容易。尽管看这些选项还不足以引起我的恶心,但我仍然对能够产生神奇的,最高效率的机器代码以适应我的软件中任何花哨的应用程序没有信心。 我的意思是,让我们面对现实吧,伙计们,琴弦非常简单和基本。我们中的某些人只是想要一种便捷的方法来发出带有某些字符串的机器代码,而这些字符串在某些情况下“嵌入”了比直接编写代码时要多得多。在我们的C ++代码中。 输入clang和LibTooling,这将公开源代码的抽象语法树(AST),并允许简单的自定义C ++应用程序正确正确地操作原始源代码(使用Rewriter)以及AST中所有对象的丰富的面向对象的语义模型。它处理很多事情。它了解宏扩展,并让您遵循这些链。是的,我说的是源代码到源代码的转换或翻译。 我在这里的基本论点是,使用clang,现在我们可以创建可执行文件,这些可执行文件本身可以用作C ++软件的理想自定义预处理程序阶段,并且可以使用C ++实现这些元编程阶段。我们仅受以下事实的约束:该阶段必须接受有效的C ++代码的输入,并产生更多有效的C ++代码作为输出。加上您的构建系统适用的任何其他限制。 输入至少必须非常接近有效的C ++代码,因为毕竟clang是编译器的前端,而我们只是在四处寻找并利用其API发挥创意。我不知道是否有任何规定可以定义要使用的新语法,但是显然我们必须开发一种方法来正确解析它并将其添加到clang项目中。期望更多的是在clang项目中超出范围。 没问题 我可以想象一些无操作宏函数可以处理此任务。 查看我正在描述的另一种方法是通过运行我们的源代码的AST(感谢clang及其API)来使用运行时C ++实现元编程构造,而不是使用语言本身可用的更有限的工具来实现它们。这也具有明显的编译性能优势(繁重的模板头与您使用它们的频率成比例地减慢了编译速度。然后,许多已编译的东西被链接器仔细地匹配并丢弃了)。 但是,这样做的代价是在构建过程中引入了额外的一两个步骤,并且还要求(当然)编写一些更详细的软件(但至少是简单的运行时C ++)作为我们工具的一部分。 那不是全部。我非常确定,生成核心语言功能极其困难或不可能的代码可以提供更大的功能空间。在C ++中,您可以编写模板,宏或两者的疯狂组合,但是在clang工具中,您可以在运行时以C ++可以实现的任何方式修改类和函数,同时可以完全访问语义内容,除了模板和宏以及其他所有内容。 因此,我想知道为什么每个人都还没有这样做。是不是来自clang的此功能如此新,并且没人熟悉clang的AST的巨大类层次结构?那不可能。 也许我只是低估了这一点的难度,但是使用clang工具执行“编译时字符串操作”几乎在犯罪上很简单。它很冗长,但是非常简单。所需要的只是一堆无操作宏函数,它们映射到实际的实际std::string操作。clang插件通过获取所有相关的无操作宏调用来实现此目的,并使用字符串执行操作。然后将该工具作为构建过程的一部分插入。在构建过程中,这些无操作宏函数调用会自动评估为其结果,然后作为纯旧的编译时字符串插入到程序中。然后可以照常编译该程序。实际上,结果是该程序的移植性也大大提高,不需要新的支持C ++ 11的编译器。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.