Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 什么';这是D'的用例;s编译时评估_Compiler Construction_Ocaml_D - Fatal编程技术网

Compiler construction 什么';这是D'的用例;s编译时评估

Compiler construction 什么';这是D'的用例;s编译时评估,compiler-construction,ocaml,d,Compiler Construction,Ocaml,D,我在我最喜欢的语言OCaml中集成了这个特性,我知道这是D中最吸引人的特性,但是除了一些优化之外,编译时评估的用例是什么呢? 越多越好,越古怪:-)一些建议: 如何解析PEG语法,组装PEG解析器,然后在编译时使用所述解析器?这是项目 构建大型静态查找表 为正则表达式生成最佳本机代码: 从定义文件实现protobufs 许多函数,如果它们的输入在编译时已知,则可以在编译时而不是在运行时进行计算——所有这些都不需要更改函数的实现 当然,优化是一个重要的用例。像这样的东西比运行时编译的正则表达式(

我在我最喜欢的语言OCaml中集成了这个特性,我知道这是D中最吸引人的特性,但是除了一些优化之外,编译时评估的用例是什么呢? 越多越好,越古怪:-)

一些建议:

  • 如何解析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++模板所面临的同样的限制。这是不容易解决的。有些人想将源代码嵌入到库对象文件中来绕过这个问题,但还没有人尝试过。