Language agnostic 计算 代码的逆向工程回到概念 跨语言,包括java、C++、C++、PHP、……/P>
OP还问:“为什么这比另一个更好?” 答案与规模、时间和准确性有关 对于大型应用程序,代码库的巨大规模意味着您没有足够的资源 或者手工进行此类分析或更改的时间 对于代码生成或优化任务,您可以 它是手工完成的,但是这些工具可以更快更准确地完成 本质上,这些工具做了人类根本做不到的事情 值得注意的是,这些工具没有创造性;你还是 需要人类决定让他们做什么,例如决定 任务是什么(参见上面列表中的示例)并确定 如何定义分析/转换以实现效果。 你仍然需要元程序员。然而,当一个元程序员 使用正确的知识武装这样一个工具,生成的代码可以Language agnostic 计算 代码的逆向工程回到概念 跨语言,包括java、C++、C++、PHP、……/P>,language-agnostic,code-generation,metaprogramming,Language Agnostic,Code Generation,Metaprogramming,OP还问:“为什么这比另一个更好?” 答案与规模、时间和准确性有关 对于大型应用程序,代码库的巨大规模意味着您没有足够的资源 或者手工进行此类分析或更改的时间 对于代码生成或优化任务,您可以 它是手工完成的,但是这些工具可以更快更准确地完成 本质上,这些工具做了人类根本做不到的事情 值得注意的是,这些工具没有创造性;你还是 需要人类决定让他们做什么,例如决定 任务是什么(参见上面列表中的示例)并确定 如何定义分析/转换以实现效果。 你仍然需要元程序员。然而,当一个元程序员 使用正确的知识武装这样
似乎是由一位速度极快、富有创造力、专业的程序员构建的。我可以给出自己的具体示例:我正在开发,这是一种元编程方法。使用ABSE可以创建一个模型(实际上是一棵树),其中每个项目都是一个“原子”。这个原子代表一个“概念”,并包含其定义所需的元数据 在ABSE中,一个概念的实施实际上是一个“迷你计划” 然后,主机建模器(与ABSE一起开发)获取模型并用其所有原子“编织”一个生成器程序。然后运行该程序,生成所需的工件(源代码、数据等) 因此,ABSE工作流程是:
- 更改模型并重新生成完整的系统(想象重构功能而不是源代码行)
- 更改模型中的一些定义可能会产生不同的程序(软件产品系列)
- 通过重用模板,您可以在几十、几百个地方更改模板的代码、重新生成和更改代码
- 还有很多,真的
我们可以将元思维定义为“思考你如何思考自己的发展”。一种课堂反思,适用于你自己。在实践中,您必须找出自己的开发模式,将其隔离,使其通用,然后使用您最喜欢的技术(如ABSE、DSL、DSM等)将其转换为元程序。这是一个具体的示例,说明了它可能是一种有用的方法 您有一组第三方类,希望向其中添加通用行为—例如某种安全/访问控制、将对象映射为JSON等 您可以为所有内容编写或生成子类,添加包装器方法以添加访问控制并调用超类。使用元编程,您可以在运行时执行此操作,并且您的更改将自动应用于任何其他/更改的第三方类 在JSON示例中,通过使用类的内省,您应该能够生成序列化对象的代码,然后将其作为方法添加到类中。另一个极端是(在编译之前)提前生成或编写代码,并在每次类更改时产生影响,或者是一种完全通用的方法,在每次需要映射时对每个对象进行内省 根据所讨论的语言和运行时,元编程方法可能比完全通用/内省的方法快,但比前端代码慢,因为您已经减少了对代码的大量数据查找
在一种语言中不直接存在元编程的地方,在我看来,元编程通常是通过框架(如Spring之类的IoC风格的容器)重新发明的。我最大限度地利用元编程在不同API之间架桥
一个工作示例是FixVeices 1,它可以简化编写暴露于JavaScript的C++类。通过为要公开的函数提供注册工具,可以检查参数类型,并从编译时生成的代码,从脚本API类型转换为本机C++类型,并返回,甚至直接支持 作为一个简单的例子,考虑一个使用了一些脚本API类型的<<代码>添加(a,b)< /代码>函数: map < /code >,<代码>向量< /代码>等< /P>
现在可以简单地写为: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]") %>' />