问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

元编程的使用示例

发布网友 发布时间:2022-04-19 00:57

我来回答

1个回答

热心网友 时间:2022-04-19 02:27

一个简单元编程的例子是使用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是一种源代码等于输出的特殊的元程序。
面向语言的程序设计是一种强烈关注元编程的编程风格,通过领域特定语言来实现。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
轻度慢性萎缩性胃炎 活动期,伴轻度肠 化 胃角多发糜烂。医生说了我... 胃窦粘膜慢性轻度萎缩性炎伴轻度肠化胃窦粘膜慢性轻度萎缩性炎? 芬兰留学读研费用是多少 芬兰留学读研时间 去芬兰留学学费生活费一年要多少 芬兰留学读研费用是多少? 芬兰留学读研学费多少? 感冒好多天了,可不可以打蓝球或者其它运动出出汗啊? 感冒打喷嚏,鼻塞然后可以让自己多出出汗吗 宝宝感冒了能去游泳吗 大家帮着姓 &quot;呼&quot;的孩子起个名字.谢谢. 姓呼的女生起什么名字呢。 兔年姓呼的给女孩起什么名字。老婆姓张,女儿是2011年阴历3月25日上午10点25分出生,希望高人指点下、、、 姓呼的女宝宝叫什么名字? 起名,姓呼的女孩儿 2014年阳历4月生的孩子,姓呼,起什么名字好?男孩女孩名字都要,谢谢 姓呼,男孩女孩名字 2012年5月4日阳历出生的女孩起个什么名字好父亲姓呼 福建省福州市长乐市松下镇农商银行的联行号是多少 福建长乐农村商业银行股份有限公司湖南支行怎么样? 福建长乐农村商业银行股份有限公司金峰支行怎么样? 我有100个车友群,每个群300-500很活跃,我是群主。请问这种群和流量有什么商业价值?有何用处_百度问一问 有没有微信群 我需要两个微信群 我想要快速换很多微信群,怎么弄? 汽车抵押到期 债权转让 不过户的车可以要吗 抵押车不过户债权转让什么意思 求中国玩过COS的明星 都有哪些明星cosplay动物角色很成功? YACC用的是哪种翻译程序,是汇编程序、编译程序还是解释程序 cos成动漫人物的明星你认识几个? 现在北京新发地让运输蔬菜的车辆进京了吗? 刘嘉诚这个名字打多少分 ...银行卡、社保卡和U盾为什么不可以借给认识的人和不认识的人使用... 这种一块钱一瓶的盐典饮料谁喝过?健康吗?每次打完球之后狂喝一瓶感觉很爽!可是担心会不会是那种小工坊 含盐饮料有哪些? 求:2010年9月24日晨4:35分刘姓男宝宝生辰五行!取名字建议~谢谢! 北京亿鑫百兴福蔬菜配送有限公司怎么样? vr业务主要包括哪些产品形态 刘嘉玮 刘嘉宇 刘嘉轩 刘嘉皓 刘嘉烨,刘嘉诚刘嘉龙哪个好啊,或者别的刘嘉。。。什么的名字还有吗。谢谢 乙烯制环氧乙烷方程式 给姓刘的男孩取名 广州越秀区蔬菜配送 跪求艺术签名 名叫 刘嘉诚 乙烯制备氯乙烷的化学方程式 高悬赏,大师请进,,帮忙起个男孩的名字。。 普通话测试里的命题说话怎么说啊?? 我想学做美食到哪里学? 河北新发地农副产品有限公司怎么样? 北京京明璐航蔬菜配送有限公司怎么样? 盐典饮料有哪些好处