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

从0.1开始实现一种编程语言 - 简单的预展开模板

发布网友 发布时间:2024-08-19 12:46

我来回答

1个回答

热心网友 时间:2024-08-22 23:18

在编程语言中,模板有着不同的名称,如Java和C#中的generics,C++和D中的templates。尽管从用户角度来看这些实现的差异不大,主要是语法上的区别。然而,这两种实现方法可以被区分为类型擦除和类型展开。


类型擦除的实现方式中,模板中的类型参数在模板自身内部是不存在的;而类型展开的实现方式中,模板中的类型参数在实现的类型内部存在。类型擦除模板需要类似类型限制,而类型展开模板在编译时无法简单地生成独立的包。下面通过示例详细解释这两种实现。



类型擦除

以类C为例,其基本等同于。


在类型擦除的实现中,编译器会将模板C编译为单独的类C的包,同时包含有限的元数据,比如对于D的类型限制(例如T: new()或T getter())。Java则通过extends和super来实现类似的限制。虽然细节上有所不同,但编译器能够将类C简化为类C的包,再加上类型限制的元数据。



类型展开

在类型展开的实现中,类C可以使用模板参数T的print()函数,无需任何“限制”。如果类C中的D2没有print()函数,编译会失败。因此,类C可以被认为。


如果类C在其他地方被引用,编译器会生成类C_D2,允许直接调用D2::print()函数,无需额外查找类型信息。然而,这种模板实现无法编译为独立的包,且编译器无法仅通过头文件定义进行模板展开。因此,无法使用#include 实现#include 的功能。



模板实现

在B2Style中,模板实现分为两个主要部分:模板定义和模板展开。B2Style中的实现采用类型展开方法,支持模板的嵌套,允许模板参数实例化,如整型(如int作为参数)。


实现时,首先进行一些杂项修改,比如将名称和类型名分开,然后修改nlexer和syntaxer的规则文件。模板定义和展开分别在template_template.vb和代码生成器中处理。在处理template_type_name节点时,代码生成器将展开实现嵌入代码,并用包含模板参数类型的新的类名替换模板名称,如将C替换为C_D。



支持模板嵌套和类型实例化

早期实现不支持模板嵌套,通过允许递归调用自身来支持模板嵌套。对于模板参数类型实例化,原理与上述一致,即使得模板参数能够接受类型实例,如整型。


实现中有个小问题,即typedef在BStyle中实现,导致B2Style无法识别C和C实际上为同一类型,从而生成两份代码。若要在B2Style中实现scope.type_alias,此问题可得解决。但该问题对实际效果影响不大,仅影响生成代码的大小和编译时间。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
罗马全面战争怎么样提高元老院评价? 半夜家中镜匾忽然碎了 镜子忽然碎掉怎么解 化能异养型微生物分类 如何判断自养微生物与异养微生物 如何得知某微生物是否为哪种氨基酸的异养型微生物。 滨州市北海振宇电子科技有限责任公司怎么样? 北京振宇科技有限公司怎么样? 上海振宇化工科技有限公司经营范围 商业医保是否值得购买? 八字四金四木到底好不好呢 两个字同字艺名发财2个叠字旺财的艺名 河蚌如何清洗河蚌怎么清洗 蚌肉如何清洗蚌肉怎么清洗 超级扣扣发短信改密码怎么发 最近在破一个朋友的扣扣相册密码,她第一次设的密码是BD,答案是 生日... 在手机扣扣上申请扣扣号密码是多少 淡奶油和稀奶油是一样的吗 命理学中一世无病无灾福禄俱全的命造都有哪些特点 七夕节快到了,送花攻略小技巧掌握好! 男生表白失败后女生要照片是什么意思 发生交通事故农村户口可以按城市标准赔偿吗 男生暗示女生的表现? 英译中。论文的翻译。 他达拉非片在哪买 拼多多上的他达拉非片是真是假啊? 在拼多多上买他达拉非片安全吗? 在拼多多买他达拉非片是假货吗? 拼多多上面买他达拉非片靠谱吗? 交通事故赔偿农村户口与城镇人员的区别项目有哪些? 八字中有四木 ,一火,一金2水,0土,八字喜金,请问取名需要补什么吗? 苹果4s如何设置4g网络 苹果4s可以变为4G网络吗? 想考下半年四川公务员考试,报成都五城区的职位的话,笔试要多少分才 二年级数学题请大家辅导谢谢 宫体大小正常范围是多少 therebe句子如何提问? 全国最大的五金批发市场在哪里? 紫砂壶泡什么茶合适,紫砂壶泡哪些茶叶比较好喝 什么茶适合用紫砂壶泡,什么茶适合用盖碗泡(六大茶类) 今天我去了一家银行,大堂经理说没有硬币了。银行里都没有硬币,怎么开银... 舒张压收缩压是什么意思 血压舒张压和收缩压是什么意思 去几个银行都没有100块硬币可以换,唉 什么是舒张压和收缩压 有没有更多叠字的字典? 与你分享独家的本地重装win11系统教程 深圳西站怎么走 用了老毛桃重装系统本地模式然后格式化C盘然后一键装机接下来怎么办... 我用大白菜本地模式装系统要下载镜像文件,本地模式不用u盘,镜像文件放在...