D编译时评估的用例是什么?

时间:2012-07-12 13:22:50

标签: compiler-construction ocaml d

我将此功能集成在我喜欢的语言OCaml中,我知道这是D中的性感功能,但除了一些优化之外,编译时评估的用例是什么? 越多越好,极客越好: - )

4 个答案:

答案 0 :(得分:12)

优化当然是一个很大的用例。像ctRegex这样的东西比它们的运行时编译的正则表达式(通常)更好。解析器生成器也很有趣(见Pegged)并且会受到越来越多的关注。人们刚刚开始接受可以做的事情。

您可以执行mixin(import_c("header.h"))之类的操作来解析和构建任意C头的D接口文件(当然,您需要在D中为C编写解析器来执行此操作)。

可以进行极快的字符串格式化,因为格式字符串(例如,"%0.2f")通常在编译时是已知的。您可以读取格式字符串,只生成格式化所需的代码,删除各种不必要的部分。

vibe.d实际上支持编译时模板。模板文件(基于Jade / HAML)可以包含D代码。它读取它并生成一个自定义的D代码块(想象它就像“”~title~“......”)。我不相信作者已经做过基准,但它应该非常快。

您基本上可以获得专业手动优化代码的优势,同时保持高水平。很难回答你的问题,因为我们只是不知道它将被用于什么。它让我想起了C ++模板。他们的设计者没有预料到它所启用的先进的元编程技术。

答案 1 :(得分:9)

一些建议:

  • 如何解析PEG语法,组装PEG解析器,然后使用所述解析器所有在编译时?这是Pegged项目。
  • 构建大型静态查找表。
  • 为正则表达式生成最佳本机代码:std.regex.StaticRegex
  • 从定义文件中实现protobufs。
  • 许多函数,如果它们的输入在编译时是已知的,那么可以在运行时而不是在运行时进行评估 - 所有这些函数都不会改变函数的实现。

答案 2 :(得分:5)

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自动创建一个可以保存该表行的结构。如果更改架构,则不会更改struct的代码。但是,您必须更改依赖于旧模式的任何代码 - 但这是一件好事,因为它会将运行时错误转换为编译错误。

当然,您也可以使用此方法添加getter + setter属性,并将其用于XML DTD和Web服务。

答案 3 :(得分:4)

以下是我能想到的编译时评估的最常见应用:以函数string f(string code)的形式为您自己的编程语言编写编译器,它将您的编程语言的源代码作为参数并吐出D代码。然后写点像

mixin( f( import("my_code_file") ) );

进入main.d文件。这样,您可以滥用D编译器及其后端为您生成可执行文件。如果需要,可以编写一个shell脚本(或类似的东西),创建main.d文件并在其上运行D编译器。这样您就可以获得半个编译器来支持您的语言。至少你不需要关心后端。 ;)

来自那里的公寓,我已经读过D.中的编译时光线跟踪器。