详解半静态语言原理及价值(下)

  3、变量声明

  变量声明就是对变量的类型进行声明。变量声明根据放置的地点分为两种,显示声明(Explicit Declaration)和隐式声明(Implicit Declaration)。

  1、显式声明

  显式声明采用特殊指令(Directive)或语句(Statement),在源码中对变量进行类型声明。

  显式声明通常的格式为:

  

      为了保持与运行时解释器的兼容性,我们引入一种“基于注释的扩展声明指令”技术。以Velocity模板语言(VTL)为例,在Velocity注释指令“##”上扩展“##$”指令用于变量声明。如下例所示:

      

      [Code3]showBuyProducts_static.vm ##$com.abc.crm.Customercustomer ##$ListbuyingProducts ##$Stringflag,sss,abc

      对于其他动态类型语言,同样使用“基于注释的扩展声明指令”来实现兼容性的半静态语言。

      

      Language

      Comment Instruction

      S2L Declaration Instruction

      Velocity

      ##

      ##$

      Javascript

      //

      //$

      Ruby

      #

      #$

      Python

      #

      #$

      2、隐式声明

      隐式声明不用在源码中编写声明语句,而从配置文件或其他地方分析变量声明。例如,使用Velocity进行Web App开发时,如果需要直接频繁操作request,response,session等Servlet容器对象,编译器可以将它们作为内置变量,使用隐式声明。如下表所示:

      

      Built-in variable

      Type

      request

      HttpServletRequest

      response

      HttpServletResponse

      session

      HttpSession

      application

      ServletContext

      以下代码使用隐式声明变量 request, session,

      

      Hello,$request.getParameter(“username”)!Yourloggedinat$session.getAttribute(“loginTime”)lasttime. body>

      这段代码看起来,对现有Velocity语法没有任何扩展. 但实际上,在编译时,编译器使用内置变量对源码进行类型检查。

      如果编写了一段错误的调用,例如:

      

      $session.getParameter(“loginTime”)

      则编译器输出一条“方法不存在的”错误信息:

      

      Error:line:12,column:5,method’getParameter’notfoundfor$session!.

      4、语法约束

      半静态语言基于某种动态类型语言进行实现,但它在语法语义上更接近与静态类型语言。在这两个端点,存在一些矛盾的地方,比如:变量动态定型,ducking type等。因此,半静态语言需要有语法约束:

      1、变量先声明,后使用

      2、变量在作用域scope内置能声明为一个类型;

      3、禁止Ducking type 也就是多, 动态语言的无继承多态特性不允许使用,因为这与静态类型系统是冲突的。

      如果违反这几个规则,编译器会产生相应的编译错误。以ducking type 为例(Ruby支持,而Velocity等Java系列脚本不支持), 如果尝试访问一个不存在的方法,则会产生下面的错误。

      

      Error:line:12,column:5,method’quack’notfoundfor$dog.

      而在Ruby中,只要 dog 存在 quack 方法,代码运行是正确的。

      5、半静态语言组成模型和实现方式

      半静态语言本质上是动态语言思想和静态语言思想的结合的产物。一种基本的半静态语言实现,核心功能是在运行前进行类型检查和语义检查。其组件集合 SS包括:

      1、一种静态类型语言S,S以编译方式运行;

      2、一种以S语言为基础的动态类型语言 D。D以解释方式由P执行,解释器 P 由S 编写;

      3、在语言D的语法集合上扩展变量声明语法,新语法集合名为 SD ;

      4、用语言S对解释器P进行扩展,实现 SD 的类型编译器C;

      5、开发时,遵循SD语法集合的代码由 C 进行类型检查;

      6、运行时,遵循SD语法集合的代码由 P 进行解释执行。

      因此,新的半静态语言SS是基本组成是:新语法集合SD和类型编译器C.

      SS = SD + C

      

      举例:

      Java 是一种静态类型语言,运行前进行编译和类型检查;

      Velocity是一种基于Java的动态模板语言,通过 Velocity Engine以解释方式运行;

      基于Velocity实现半静态语言的方式为:为Velocity基本语法增加变量声明指令(语句),基于Velocity 解释器 实现类型编译器 ,负责在开发时对模板进行类型检查。

      实践中,Java体系的动态类型语言一般与Java语言天生的结合使用,应用广泛。以它们为基础,很容易通过扩展方式实现类型编译器,进而实现半静态语言。 例如Freemarker,Groovy,JRuby,Bean Shell等。其他动态类型语言也可以基于此原理设计半静态语言,如:Python,Ruby。

      IDE敏捷开发(Agile Development in IDE)

      对于Velocity,Freemarker这类动态类型语言,它们基于Java等强类型语言,在模板内能直接操作传入的Java对象。由于Java等语言有反射(Reflection)机制。因而,除了静态类型检查的基本功能,可以在类型检查和反射技术基础上,实现一系列IDE敏捷开发功能。包括:

      1、代码提示:编辑器内的Java对象的属性,方法代码提示;

      2、参数提示:编辑器内的Java对象的方法参数提示;

      3、全量构建和增量构建:Java类修改对相关Velocity模板的增量检查;

      4、代码重构:修改Java属性或方法名称,自动批量修改相关模板中所有对应类型的JavaBean属性或方法名称。

      其中3),4) 功能对于大型系统的维护和重构价值尤为明显。以上这些敏捷开发功能可独立实现或结合集成开发环境(IDE)如Eclipse插件来实现。

      结论

      通过以上分析可见,半静态化语言结合了静态语言和动态语言的优点,能很好的解决动态语言编程的开发质量和开发效率问题。半静态化语言保留了动态语言的灵活性优点,同时达到了静态语言在开发时强类型检查优势,能有效提升程序健壮性,减低测试复杂性和测试成本。通过与IDE结合,实现代码提示,代码重构等敏捷开发功能,有效提升动态语言的开发效率。在企业级应用和互联网应用开发中有着良好的应用价值。

      相关链接:

      详解半静态语言原理及价值(上)

    每年的同一天和他庆祝生日,每年的情人节、圣诞节、除夕,

    详解半静态语言原理及价值(下)

    相关文章:

    你感兴趣的文章:

    标签云: