当前位置:首页 » 编程软件 » 程元编程

程元编程

发布时间: 2022-06-06 03:46:35

⑴ 元编程的使用示例

一个简单元编程的例子是使用bash脚本的产生式编程示例:
#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)) do
echo echo $I >>program
done
chmod +x program
这个脚本(或程序)生成了一个新的993行程序来打印1至992。这只是演示用代码来写更多代码,并不是打印数字的最有效方法。然而,一个程序员可以几分钟内编写和执行元程序,却生成了近1000行代码。
==========
C++中也可以使用模板来进行元编程(以下代码在VC2008中编译通过):
#include<iostream>
using namespace std;
int Result;
//主模板
template<int N> //模板
class Fibonacci
{
public:
enum{Result = Fibonacci<N-1>::Result + Fibonacci<N-2>::Result };
//枚举,带有隐含计算
};
//完全特化模板
template<>
class Fibonacci<1> //带常参数1的构造函数
{
public:
enum { Result = 1 };
//给枚举赋初值1
};
//完全特化模板
template<>
class Fibonacci<0> //带参数0的模板
{
public:
enum { Result = 0 };
//给枚举赋初值0
};
int main()
{
std::cout << 第20项的Fibonacci数是: << Fibonacci<20>::Result << std::endl;
//隐含计算
system(pause);
return 1;
}
该示例定义了一个类模板,类中声明了一个枚举类型,该程序的奥秘就在枚举类型的构造上。从枚举类型的构造可以看出,他自身有一个样俺的迭代计算。两个构造函数为枚举类型初始化了数列的初始值,当调用“Fibonacci<20>::Reasult“时,就以这两个初始值为基础进行迭代。因此,程序在运行时并没有显示的计算,而是在编译时就由编译器计算了。
当编译器实例化Fibonacci<20>时,为了给其enum Result赋值,编译器需要对Fibonacci<19>和Fibonacci<18>进行实例化,之后同理······,当实例化到Fibonacci<1>和Fibonacci<0>的时候,完全特化模板被实例化,至此迭代结束。
所以,该程序编译的结果仅包含一个常量值,输出如下:
第20项的Fibonacci数是:6765
==========
不是所有的元编程都用产生式编程。如果程序可以在运行时改变(如Lisp、Ruby、python、Smalltalk、Lua、Groovy和JavaScript),这种技术可以不实际生成源代码就使用元编程。
在Ruby中,最常用的就是attr系列方法,譬如attr、attr_reader、attr_writer、attr_accessor。attr_reader方法为一个实例变量产生一个用于读取其值的方法,attr_writer为其产生一个用于写入值的方法,attr_accessor则同时具有这两种功能。
class Foo
attr_reader :just_read
attr_writer :just_write
attr_accessor :both_read_and_write
def initialize
@just_read = 0
@just_write = 0
@both_read_and_write = 0
end
end
# 输出attr系列方法生成的方法
puts Foo.instance_methods - Foo.superclass.instance_methods
最常用的元编程工具是编译器,把高级语言转换为汇编语言或机器语言。更灵活的方法是在程序中嵌入解释器直接处理程序数据。有一些实现例如为Object Pascal编写的RemObject's Pascal Script。
另一个很常用的元编程例子是lex和yacc,用来生成词法分析器和语法分析器。Yacc通常用作编译器的编译器,生成一个把高级语言转换为机器语言的工具。
quine是一种源代码等于输出的特殊的元程序。
面向语言的程序设计是一种强烈关注元编程的编程风格,通过领域特定语言来实现。

⑵ 元编程的发展

元编程在1994年初露端倪,由一个叫 Erwin Unruh 的人首先发现。在1994年,C++标准委员会在圣迭戈(SanDiego)举行的一次会议期间, Erwin Unruh展示了一段特别的代码。这段代码的特别之处在于程序的功能在编译期实现而非运行期,编译器以错误信息的方式产生从2到某个给定值之间的所有质数。同年夏天, Todd Veldhuizen 受Erwin 的例子启发,发现可以使用C++模板进行元编程,并发表了一份技术报告。

⑶ 如何提高”元编程“能力

编程能力:C++接触最多,将基础知识回顾一下,给段程序能看懂、给个需求能边查书边捉急的写出、bug基本可以通过断点等调试出来;接触过Python、Matlab、R等;整体编程设计能力处于Matlab水平。

⑷ C++里的元编程是一很厉害的技术吗

元编程是利用模板特化机制实现编译期条件选择结构,利用递归模板实现编译期循环结构,模板元程序则由编译器在编译期解释执行。是C++中最复杂也是威力最强大的编程范式。也确实是一种很厉害的技术,C++的STL库和BOOST库就大量的运用到了这种技术。

⑸ 为什么要有限元编程

任何有限元商业软件都有其局限性,很多非常专业的计算还是自己编写程序计算的。另外,购买大型商业软件需要很高的费用,如果进行简单的计算,自己编出更为经济。

⑹ 元编程的元编程的概念

反射是促进元编程的一种很有价值的语言特性。把编程语言自身作为头等对象(如Lisp或Rebol)也很有用。支持泛型编程的语言也使用元编程能力。
元编程通常有两种方式起作用。一种方式是通过应用程序接口(API)来暴露运行时引擎的内部信息。另一种方法是动态执行包含编程命令的字符串。因此,“程序能编写程序”。虽然两种方法都能用,但大多数方法主要靠其中一种。

⑺ 元编程是C++比较高阶的编程技术么

精确地说,C++不提供元编程 —— 元编程(在运行期生成代码)是Ruby之类的语言才有的概念

如果你想说模板元编程(template metaprogramming),那确实是比较高级的技术(一般的技术也不足以大大延长编译时间)

⑻ 编程基础之什么是元编程

元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。很多情况下比手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射。

⑼ 怎么理解元编程

Meta- 这个前缀在希腊语中的本意是“在…后,越过…的”,类似于拉丁语的 post-,比如 metaphysics 就是“在物理学之后”,这个词最开始指一些亚里士多德的着作,因为它们通常排序在《物理学》之后。

但西方哲学界在几千年中渐渐赋予该词缀一种全新的意义:关于某事自身的某事。比如 meta-knowledge 就是“关于知识本身的知识”,meta-data 就是“关于数据的数据”,meta-language 就是“关于语言的语言”,而 meta-programming 也是由此而来,是“关于编程的编程”。

弄清了词源和字面意思,可知大陆将 meta- 这个前缀译为“元”并不恰当。台湾译为“后设”,稍微好一点点,但仍旧无法望文生义。也许“自相关”是个不错的选择,“自相关数据”、“自相关语言”、“自相关编程”——但是好像又太罗嗦了。

Anyway。先看看 meta-data:“我的电话是 +86 123 4567 8910”——这是一条数据;“+86 123 4567 8910 有十三个数字和一个字符,前两位是国家代码,后面是一个移动电话号码”是关于前面那条数据的数据。那么照猫画虎,怎样才算 meta-programming 呢?泛泛来说,只要是与编程相关的编程就算是 meta-programming 了——比如,若编程甲可以输出 A - Z,那么写程序甲算“编程”;而程序乙可以生成程序甲(也许还会连带着运行它输出 A - Z),那么编写程序乙的活动,就可以算作 meta-programming,“元编程”。注意,程序甲和程序乙并不一定是同一种语言:
('A'..'Z').each do |char|
system("python -c 'print \"#{char}\"'")
end

如此说来,inline SQL 甚至动态生成 HTML 也是元编程了?抠定义的话是这样吧。

不过 metaprogramming 更狭义的意思应该是指“编写能改变语言语法特性或者运行时特性的程序”。换言之,一种语言本来做不到的事情,通过你编程来修改它,使得它可以做到了,这就是元编程。本版同文提及 method_missing,那么 Wat — Destroy All Software Talks 之中给出了运行时元编程的经典范例:
>> ruby has no bare words
NameError: undefined local variable or method `words' for main:Object
from (irb) 1
>> def method_missing(*args); args.join(" "); end
=> nil
>> ruby has bare words
=> "ruby has bare words"
>> bare words can even have bangs!
=> "bare words can even have bangs!"

C、C++、Python、JavaScript…… 多数流行的语言或多或少都有元编程能力;Lisp 诸方言更是以元编程为基本。而 Ruby 更是因为元编程易用又强大,被许多人拿来写 DSL,因为元编程可以捏出“本不存在的语法特性”来让书写 DSL 变得简单。

热点内容
dirt5需要什么配置 发布:2024-05-20 06:02:58 浏览:542
怎么把电脑锁上密码 发布:2024-05-20 05:19:09 浏览:985
安卓为什么连上wifi后没有网络 发布:2024-05-20 05:17:50 浏览:419
安卓usb在设置哪里 发布:2024-05-20 05:03:03 浏览:187
绥化编程 发布:2024-05-20 04:59:44 浏览:991
基本原理和从头计算法 发布:2024-05-20 04:50:32 浏览:30
配置情况指的是什么 发布:2024-05-20 04:48:14 浏览:497
那个程序用来编译源文件 发布:2024-05-20 04:46:45 浏览:551
小程序需要数据库吗 发布:2024-05-20 04:35:14 浏览:338
链接sqlserver 发布:2024-05-20 04:27:53 浏览:210