Language agnostic 计算 代码的逆向工程回到概念 跨语言,包括java、C++、C++、PHP、……/P>

Language agnostic 计算 代码的逆向工程回到概念 跨语言,包括java、C++、C++、PHP、……/P>,language-agnostic,code-generation,metaprogramming,Language Agnostic,Code Generation,Metaprogramming,OP还问:“为什么这比另一个更好?” 答案与规模、时间和准确性有关 对于大型应用程序,代码库的巨大规模意味着您没有足够的资源 或者手工进行此类分析或更改的时间 对于代码生成或优化任务,您可以 它是手工完成的,但是这些工具可以更快更准确地完成 本质上,这些工具做了人类根本做不到的事情 值得注意的是,这些工具没有创造性;你还是 需要人类决定让他们做什么,例如决定 任务是什么(参见上面列表中的示例)并确定 如何定义分析/转换以实现效果。 你仍然需要元程序员。然而,当一个元程序员 使用正确的知识武装这样

OP还问:“为什么这比另一个更好?” 答案与规模、时间和准确性有关

对于大型应用程序,代码库的巨大规模意味着您没有足够的资源 或者手工进行此类分析或更改的时间

对于代码生成或优化任务,您可以 它是手工完成的,但是这些工具可以更快更准确地完成

本质上,这些工具做了人类根本做不到的事情

值得注意的是,这些工具没有创造性;你还是 需要人类决定让他们做什么,例如决定 任务是什么(参见上面列表中的示例)并确定 如何定义分析/转换以实现效果。 你仍然需要元程序员。然而,当一个元程序员 使用正确的知识武装这样一个工具,生成的代码可以
似乎是由一位速度极快、富有创造力、专业的程序员构建的。

我可以给出自己的具体示例:我正在开发,这是一种元编程方法。使用ABSE可以创建一个模型(实际上是一棵树),其中每个项目都是一个“原子”。这个原子代表一个“概念”,并包含其定义所需的元数据

在ABSE中,一个概念的实施实际上是一个“迷你计划”

然后,主机建模器(与ABSE一起开发)获取模型并用其所有原子“编织”一个生成器程序。然后运行该程序,生成所需的工件(源代码、数据等)

因此,ABSE工作流程是:

  • 创建一个离散概念(元元元程序的一部分)
  • 在模型中重用该概念(有效地构建元程序)
  • Host modeler编制并运行元程序
  • 元程序生成最终程序
  • 乍一看,这看起来像是许多重复的、复杂的工作,但如果你掌握了这个概念,它实际上是非常简单的

    元编程的优点(不限于ABSE)?:

    • 更改模型并重新生成完整的系统(想象重构功能而不是源代码行)
    • 更改模型中的一些定义可能会产生不同的程序(软件产品系列)
    • 通过重用模板,您可以在几十、几百个地方更改模板的代码、重新生成和更改代码
    • 还有很多,真的
    元编程、代码生成、程序转换是软件开发中令人兴奋的新领域。然而,元编程需要一种新技能:元思维


    我们可以将元思维定义为“思考你如何思考自己的发展”。一种课堂反思,适用于你自己。在实践中,您必须找出自己的开发模式,将其隔离,使其通用,然后使用您最喜欢的技术(如ABSE、DSL、DSM等)将其转换为元程序。

    这是一个具体的示例,说明了它可能是一种有用的方法

    您有一组第三方类,希望向其中添加通用行为—例如某种安全/访问控制、将对象映射为JSON等

    您可以为所有内容编写或生成子类,添加包装器方法以添加访问控制并调用超类。使用元编程,您可以在运行时执行此操作,并且您的更改将自动应用于任何其他/更改的第三方类

    在JSON示例中,通过使用类的内省,您应该能够生成序列化对象的代码,然后将其作为方法添加到类中。另一个极端是(在编译之前)提前生成或编写代码,并在每次类更改时产生影响,或者是一种完全通用的方法,在每次需要映射时对每个对象进行内省

    根据所讨论的语言和运行时,元编程方法可能比完全通用/内省的方法快,但比前端代码慢,因为您已经减少了对代码的大量数据查找


    在一种语言中不直接存在元编程的地方,在我看来,元编程通常是通过框架(如Spring之类的IoC风格的容器)重新发明的。

    我最大限度地利用元编程在不同API之间架桥

    一个工作示例是FixVeices 1,它可以简化编写暴露于JavaScript的C++类。通过为要公开的函数提供注册工具,可以检查参数类型,并从编译时生成的代码,从脚本API类型转换为本机C++类型,并返回,甚至直接支持 map < /code >,<代码>向量< /代码>等< /P>

    作为一个简单的例子,考虑一个使用了一些脚本API类型的<<代码>添加(a,b)< /代码>函数:

    ScriptVariant add(const std::vector<ScriptVariant>& values) {
        // have to check argument count
        if(values.size() != 2)
            throw script_error("wrong number of arguments");
    
        try {
            // have to convert from scripting-API types
            long a = values[0].convert_cast<long>();
            long b = values[0].convert_cast<long>();
            return a+b; // potentially need to convert back too
        } catch(ScriptVariant::bad_cast& e) {
            // need to handle conversion failure
            throw script_error("conversion failed :(");
        }
    }
    
    现在可以简单地写为:

    long add(long a, long b) {
        return a+b;
    }
    
    。。。框架负责为您生成必要的代码


    1:虽然我会做一点实施工作。。。清洁工如果我必须重新开始,你可以看看Common Lisp的宏或C++的模板,看看它们是如何使用的。两者都是您正在使用的元编程。您会发现这两种方法在很多代码中都被大量使用

    Lisp宏通常用于重新定义语言。例如,Paul Graham的最后一章为Common Lisp创建了一个面向对象的扩展。另一个例子是现在已经不存在的

    旧的C++标准模板库(主要结合在标准库中)是一种引入大量容器和算法的方法,它们的作用是建立在语言中,至少在集成和效率方面(不是句法上)。

    long add(long a, long b) {
        return a+b;
    }
    
     <asp:TextBox ID="**ID**" runat="server" style="z-index: 1; left: **LL**px; top: **TOP**px; position: absolute"  Text='<%# Bind("[**CTLSOURCE**]") %>' />
    
    <asp:TextBox ID="txtCustomerID" runat="server" style="z-index: 1; left: 50px; top: 240px; position: absolute"  Text='<%# Bind("[CustomerID]") %>' />