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结合,实现代码提示,代码重构等敏捷开发功能,有效提升动态语言的开发效率。在企业级应用和互联网应用开发中有着良好的应用价值。
相关链接:
详解半静态语言原理及价值(上)
每年的同一天和他庆祝生日,每年的情人节、圣诞节、除夕,