`
canonical
  • 浏览: 367146 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

D语言与tpl之编译期动作

阅读更多
   最近D语言发布了1.0版,这是一个由编译器开发者所设计的编译语言,语法类似C++, 但是针对C++的弊病作了大量修正,并增加了很多现代特征,其中还是有一些新意在其中的。http://www.digitalmars.com/d/overview.html 我对其比较感兴趣的部分是D语言明确提出的编译期运行的概念。虽然C++让大众了解了meta programming技术,很多人因此认为meta programming的威力在于类型演算,但是在我看来meta programming的真正作用在于在编译期可以“动态”产生或调整代码结构。它依赖于类型是因为我们只能利用类型来承载一些额外信息, 这无疑也是对于类型的一种滥用。在D语言中template所接受的不仅仅是类型, 或者类型的类型,它可以是任何符号.
  template MixInAttr(T, char[] name){ 
     mixin(" T _" ~ name ~";");
     mixin(" T "~name~"(){ return _"~name~"; }");
     mixin(" void "~name~"(T v){ _"~name~" = v;}");
  } 
 
  template MixInOtherAttr(T, T v){
    T _otherAttr = v;
   
    int otherAttr(){ return _otherAttr; }
  }
 
  const int myValue = 1;
 
  int addFunc(int x){
    return x + 1;
  }
  
  class MyTest{ 
     mixin MixInAttr!(int, "myAttr"); 
     mixin MixInOtherAttr!(int,4);
    
     static if(addFunc(myValue) 〉 0){
        int testFunc(){ return 5;}
     }
  }
 
  void main(){ 
     auto t = new MyTest;
     t.myAttr = 3;
     int v = t.myAttr;   
     v = t.otherAttr;
     t.testFunc();
  }  
  不过现在编译期运行无疑是一个正在探索的方向, 在D语言中的使用方式并不是非常理想的, 在形式和功能实现上都存在着重大改进的可能. 
 
  在witrix平台的tpl模板语言中,我们也引入了编译期运行的概念,只是tpl的语言特征非常简单再加上xml格式特殊的规范性,编译期运行在tpl中的实现是非常直接和明确的.在tpl中定义了<cp:run〉标签,它的内容在编译期运行, 输出结果(xml字符串)将被继续编译. 在<cp:run〉中可以执行任何有效的tpl代码, 它们在编译期状态空间中运行. 例如
 〈cp:run〉
   〈c:forEach var="_x" items="${tagBody.children()}"〉
       bla bla bla...
   〈/c:forEach〉
 〈/cp:run〉
在EL表达式中我们通过cp前缀实现普通调用和编译期调用的混杂.
  〈cp:const class="mypkg.MyConstantClass"/〉
  〈c:eval expr="${myFunc(cp:const.MY_CONST, commonVar, cp:funcInCompileTime())}" /〉
  〈cp:compile test="${exprInCompileTime}"〉
     any tpl ...
  〈/cp:compile〉

 其实当我们把改进的目光开始放到编译期的结构方面的时候, 可以做的工作是非常多的. 例如从结构上看, 继承策略相当是类结构的一种一阶替换策略.
  类B(methodB) extends 类A(methodA, methodB)  ==〉 类B(methodA[inA], methodB[inB])
如果我们放弃概念层面上的纠缠,而如同template那样只关注语法结构, 则可以发展出更加复杂的替换操作.
  NODE_B(                              NODE_A(                                    NODE_B(
    SUB_NODE_A1        〉〉    SUB_NODE_A1             ==〉    SUB_NODE_A1
      SUB_NODE_B11                   SUB_NODE_A11                         SUB_NODE_B11
                                                         SUB_NODE_A12                          SUB_NODE_A12
  )                                                  )                                                  )
C++中及D语言中的template技术在某种意义上相当于是在代码结构中预留了空洞, 可以实现跨越类结构的替换填充. 只是D语言挖洞的能力无疑比C++强大的多. 
  如果我们考察的再细致一些, 就会发现两个语法节点的融合也是存在多种策略的.
  B 〉〉 A ==〉 (remove_A, replace_A, insert_B_before_A, insert_B_after_A, insert_B_into_A, insert_A_into_B)
而通过insert_A_into_B/insert_B_into_A策略既可实现所谓的AOP intercept操作http://canonical.iteye.com/blog/34941 在witrix平台的BizFlow技术中, 我们通过高级的结构融合策略实现为任意实体引入流程支持. 最简单的情况下我们所需要做的工作只是增加一个语法元素
 〈bizflow extends="myflow"〉
引入流程意味着对界面的一系列修正, 例如增加,删除某些菜单, 同时要增加很多流程相关函数, 对某些函数实施AOP操作, 在各处引入权限控制等等, 这些都可以通过extends操作引入.

  在传统上, 编译器结构是固化的, 它所编译的代码结构是固化的, 而它所编译出的代码也是固化的, 但是现代语言的各种发展正致力于在各个层面引入动态性. 编译期运行抑或是编译期结构操纵技术的引入是在一个层面上打开了潘多拉魔盒. 它让我们看到了前所未有的技术可能性, 但它无疑也是危险的,难以控制的. 我们目前的做法是尽量克制,只在局部使用, 但我相信它在很多语言中都是可以在理论上严格定义,并精确实现的, 我们最终也能够找到合适的形式来约束它的破坏性. 在这个过程中我们需要引入更多的物理化的视角。
分享到:
评论
1 楼 hyf 2007-03-04  
  template MixInAttr(T, char[] name){ 
     mixin(" T _" ~ name ~";");
     mixin(" T "~name~"(){ return _"~name~"; }");
     mixin(" void "~name~"(T v){ _"~name~" = v;}");
  }  


问几个问题,
我要MixInAttr!(int, ["myAttr1", "myAttr2", ..]); 
可以?

MixInAttr!(int, string, float);
得到 int item1; string item2; float item3;
可以?

MixInAttr!( ... ) {
  maxin("mixin MixInAttr!(...);");
}

会死?

要真是那么追求code generate的能力,那就索性把整个D语言弄进编译时执行算了.
况且, 你展示的这些代码, 让我想起MACRO, C++不推荐使用MACRO就是因为它可以随意产生代码, 类型不安全, 可见性(可读)差.

我觉得C++的MP设计非常适合,
在C++0x出来之后, 就可以更好的应付MP的复杂性. (现在已经够复杂了)
你可以去看看OpenC++, 他的元编程在语法树上做文章, 灵活性最强了.  是啥下场?

在这个世界上有好多工具可以做代码生成, (生成我还可以看到整个结果, 怎么不对一目了然)
在语言中做这种事情, 一来IDE智能提示废了, 而且没有编译期调试还玩不转.

相关推荐

    tpl存储序列化

    **存储序列化(TPL)详解** 存储序列化是一种将数据结构或对象的状态转换为可存储或传输的形式的技术。在计算机科学中,它通常用于将内存中的数据保存到磁盘上,或者在网络上传输数据。TPL(Template Packet ...

    TPL0401数字电位器源码

    4. **C语言编程**:源码通常会用C语言编写,因为这是嵌入式系统最常用的编程语言之一。理解基本的C语法、变量声明、函数调用、条件语句和循环是必不可少的。 5. **中断和定时器**:在某些应用场景中,STM32可能需要...

    TPL521中文资料 光耦

    TPL521 中文资料 光耦 TPL521 是一款可控制的光电耦合器件,广泛应用在电脑终端机、可控硅系统设备、测量仪器、影印机、自动售票、家用电器等领域,旨在实现信号传输的隔离,以增加安全性、减小电路干扰、减化电路...

    Laravel开发-tpl

    8. **与前端框架集成**:随着Vue.js等前端框架在Laravel中的广泛使用,`tpl`可能提供了更好的与这些框架集成的方式,使开发者能更方便地在模板中嵌入和管理Vue组件。 总的来说,“Laravel开发-tpl”是一个关于如何...

    stm32控制tpl0202数控电位器

    在这个系统中,STM32作为微控制器,通过SPI(Serial Peripheral Interface)总线与TPL0202数控电位器进行通信,从而实现对电位器的数字控制。 首先,我们要了解STM32。STM32是意法半导体(STMicroelectronics)推出...

    基于PHP的tmd_tpl国产PHP模板引擎.zip

    总的来说,tmd_tpl模板引擎以其易用性、灵活性和高性能的特点,成为了国产PHP开发者的首选之一。通过了解和掌握tmd_tpl,开发者可以更高效地组织代码,提高项目的可维护性和开发效率。在实际项目中,结合具体需求,...

    C# TPL 同步实例代码

    C# TPL(Task Parallel Library)是.NET Framework中用于并行编程的重要库,它使得开发者可以轻松地在多核或多处理器系统上实现并发和并行处理。同步在多线程和并行编程中扮演着至关重要的角色,确保了数据一致性、...

    TPL与C语言的混合编程方法研究.pdf

    1. TPL(测试过程语言)的基本概念及其与传统测试语言ATLAS的不同之处。 2. TPL作为一种嵌入式语言在自动测试系统中的应用,其与传统语言的区别与优势。 3. TPL与C语言混合编程的实现方法,以及这种编程方式对测试...

    tpl7407l.pdf

    • 与 与 1.8V 至 至 5.0V 微 微控 控制 制器 器和 和逻 逻辑 辑接 接口 口兼 兼容 容 这个器件包含 7 个特有高压输出的 NMOS 晶体管,这 • 用 用于 于感 感应 应反 反冲 冲保 保护 护的 的内 内部 部自 自振 振荡 ...

    gulp-wind-tpl2js:将模板编译为js字符串,并包装为amdcmd模块

    gulp-wind-tpl2js 将模板编译为js字符串,并包装为amd / cmd模块。安装使用NPM安装软件包: npm install gulp-wind-tpl2js 用法 var tpl2js = require ( 'gulp-wind-tpl2js' ) ;gulp . task ( 'tpl2js' , function ...

    TPL0501EVM数字电位器.pdf

    TPL0501EVM由德州仪器公司设计,用于与基于MSP430的低成本LaunchPad平台配合使用。EVM具备一个预先编程的MSP430G2553微控制器,该微控制器应插入LaunchPad上的DIP插座中。用户可以通过简单的图形用户界面(GUI)来...

    TPL Performance Improvements in .Net 4.5

    文章指出,在.NET 4.5的开发过程中,微软承认了基于继续(continuation-style)编程与分叉-连接编程同等重要,很大程度上是由于.NET 4.5中async/await支持的出现(它是建立在继续之上的)。在.NET 4.5的开发中,微软...

    前端开源库-dot-tpl-loader

    点模板文件(.tpl)是一种常见的模板语言格式,它将HTML结构与逻辑分离,使得代码更易于阅读和维护。dot-tpl-loader支持这种格式,使得前端开发者能够利用熟悉的模板语法编写视图层,同时结合Webpack的强大功能,...

    tpl5010 (1).pdf

    TPL5010 纳瓦级计时器是一款超低功耗计时器,其看门狗功能专为占空比、电池供电型 应用 (比如物联网中的应用)中的系统唤醒功能而设计。

    关于tpl.js的一个demo

    这里我们关注的是`tpl.js`,一个专为JavaScript设计的模板引擎。`tpl.js`允许开发者创建动态的HTML片段,通过将数据注入预先定义的模板来生成最终的视图。这个“关于tpl.js的一个demo”提供了实践`tpl.js`功能的机会...

    TPL-E3_win7驱动

    标题“TPL-E3_win7驱动”表明这是一份专为TPL-E3网卡设计的Windows 7操作系统驱动程序。在IT领域,驱动程序是计算机硬件与操作系统之间的重要桥梁,允许操作系统识别并有效控制硬件设备。TPL-E3可能指的是某个特定...

    TPL7407L_16数据手册

    《TPL7407L_16数据手册》解析与技术要点 一、产品概述 TPL7407L是一款40V、7通道低边驱动器,属于高电压、大电流NMOS晶体管阵列。该设备由七个NMOS晶体管组成,每个晶体管都具有高电压输出和共阴极箝位二极管,...

    WinHex tpl模板.rar

    tpl模板是WinHex中的一个重要概念,它允许用户预定义一系列的查看和分析设置,以便在处理特定类型的数据时快速应用。本压缩包包含了一系列的WinHex模板文件,用于帮助用户更高效地解析和理解各种文件格式。 1. **...

    php 网站tpl模板以及解析类

    在PHP开发中,TPL模板是一种常见的页面视图分离技术,它的主要目的是为了将HTML结构与PHP代码分开,提高代码的可读性和维护性。这里我们主要探讨PHP网站中TPL模板的使用及其解析类的工作原理。 TPL模板允许开发者...

Global site tag (gtag.js) - Google Analytics