Compiler construction 什么';这是D'的用例;s编译时评估
我在我最喜欢的语言OCaml中集成了这个特性,我知道这是D中最吸引人的特性,但是除了一些优化之外,编译时评估的用例是什么呢? 越多越好,越古怪:-)一些建议:Compiler construction 什么';这是D'的用例;s编译时评估,compiler-construction,ocaml,d,Compiler Construction,Ocaml,D,我在我最喜欢的语言OCaml中集成了这个特性,我知道这是D中最吸引人的特性,但是除了一些优化之外,编译时评估的用例是什么呢? 越多越好,越古怪:-)一些建议: 如何解析PEG语法,组装PEG解析器,然后在编译时使用所述解析器?这是项目 构建大型静态查找表 为正则表达式生成最佳本机代码: 从定义文件实现protobufs 许多函数,如果它们的输入在编译时已知,则可以在编译时而不是在运行时进行计算——所有这些都不需要更改函数的实现 当然,优化是一个重要的用例。像这样的东西比运行时编译的正则表达式(
- 如何解析PEG语法,组装PEG解析器,然后在编译时使用所述解析器?这是项目
- 构建大型静态查找表
- 为正则表达式生成最佳本机代码:
- 从定义文件实现protobufs
- 许多函数,如果它们的输入在编译时已知,则可以在编译时而不是在运行时进行计算——所有这些都不需要更改函数的实现
- 当然,优化是一个重要的用例。像这样的东西比运行时编译的正则表达式(通常)性能更好。解析器生成器也很有趣(请参阅),并将受到越来越多的关注。人们才刚刚开始了解可以做什么
您可以执行类似于
mixin(import_c(“header.h”)
的操作,为任意c头解析并构建一个D接口文件(当然,您需要为c-in-D编写一个解析器来完成此操作)
由于格式字符串(例如,%0.2f“
)通常在编译时已知,因此可以进行非常快速的字符串格式化。您可以读取格式字符串,只生成格式化所需的代码,去掉所有不必要的部分
实际上支持编译时模板。模板文件(基于Jade/HAML)可以包含D代码。它读取它并生成一个自定义的D代码块(把它想象成“~title~”)。我不相信作者已经做了基准测试,但它应该是难以置信的快
基本上,您可以在保持高水平的同时获得专门的手动优化代码的好处。很难回答你的问题,因为我们不知道它会被用来做什么。它让我想起C++模板。他们的设计者没有预料到它所启用的高级元编程技术。当与
mixin
一起使用时,它可以提供很大的灵活性
考虑以下示例:
template StructFromFile(string fileName){
string makeStructMembersCode(string[] s){
if(0==s.length){
return null;
}
string memberName=s[0].strip;
return q{
string }~memberName~q{;
}~makeStructMembersCode(s[1..$]);
}
struct StructFromFile{
mixin(makeStructMembersCode(import(fileName).splitLines));
}
}
这将创建一个结构,它的成员是文本文件的行。现在,假设数据库中有一个表,并且希望创建一个D结构来存储该表中的行。您可以编写一个shell脚本,读取该表的架构并将其写入文件,然后使用StructFromFile
自动创建一个可以保存该表行的结构。如果您更改了模式,您就没有权限更改结构的代码。但是,您确实需要更改任何依赖于旧模式的代码——但这是一件好事,因为它会将运行时错误转化为编译错误
当然,您也可以使用此方法添加getter+setter属性,并将其用于XML DTD和Web服务。以下是我能想到的最奇特的编译时评估应用程序:以函数
字符串f(字符串代码)的形式为您自己的编程语言编写编译器
它将编程语言的源代码作为参数,并输出D代码。然后写一些像
mixin( f( import("my_code_file") ) );
进入您的main.d
文件。这样,您可以滥用D编译器及其后端为您生成可执行文件。如果需要,可以编写一个shell脚本(或类似的脚本),创建main.d
文件并在其上运行d编译器。这样,您就可以为您的语言获得半个编译器。至少你不需要关心后端
显然,我已经读到了D中的编译时光线跟踪器。您所说的“将此功能集成到”您最喜欢的编程语言OCaml中”是什么意思?你为什么在没有用例的情况下这么做?这是我其他项目的副作用。正如我所说,优化是一个用例。但我认为应该有更多类似的问题:@bobzhang,看看MetaOCaml,它更有趣(比使用D限制的元编程更灵活)。而且,和任何元编程工具一样,用例用于高效地实现EDSL。@SK logic我以前使用过它。但是它没有赶上最新的ocaml:-(.我的集成是一个库,它也支持全语言编译时评估,因此没有补丁编译器的问题。IMHO,如果您以一种非常方便的方式进行编译时评估,那么有很多东西需要探索:-)谢谢您的建议。我不熟悉D,如果编译时计算返回自定义的数据结构,D如何处理?你能解释一下吗?或者更准确地说,D对使用编译时求值的函数有什么限制?下面是。我发现D编译时求值的一个重要限制是,所有源代码都应该出现在一个文件中,这使得编写非常强大的编译时求值函数非常困难,既然你不能使用任何图书馆。你怎么看它,这基本上是C++模板所面临的同样的限制。这是不容易解决的。有些人想将源代码嵌入到库对象文件中来绕过这个问题,但还没有人尝试过。