论坛首页 Java企业应用论坛

InfoQ刚发表一篇论文《半静态语言–原理和价值分析》

浏览 8972 次
精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2010-12-13  
静态类型语言也可以被解释执行,动态类型语言也可以编译执行。
所以,jsp就可以满足lz的要求,在eclipse里支持类型检查和代码提示,修改完了tomcat直接后台编译运行,无须用户干预。
至于velocity,我觉得关键也是要做一个eclipse插件支持类型检查等功能。
0 请登录后投票
   发表时间:2010-12-13  

个人觉得,用什么样的语言,不管是静态强类型,或者半静态,还是动态语言,并不存在拿出来比较的价值,除非是为了做很底层的开发,或者研究用;
至于说哪个更好一点,就要根据具体的情况而定,对于模板语言而言,我个人觉得是越简单,越灵活越好,因为这意味着开发成本的降低

之前楼层的同学曾经提出过一个velocity的重构的问题,这里我也发表一下自己的看法,个人觉得,velocity其实不存在重构的问题,能够重用的东西往往都是带有极的一致性,而在网页的开发中,重用虽然能够有效的降低开发周期,但是往往是存在代价的,而且在不同项目之间的移植性往往差的要命;
另外一个关键的问题是,现有的模板引擎大部分已经是很弱的类型,甚至比脚本语言更甚;所以,我认为,如果你不是打算像google那样想要完整的搞一套控件出来,还是不要试图去对模板进行重构了,要做的只是使用已有的模板引擎把逻辑敲出来就好了...

一家之言,欢迎拍砖...
0 请登录后投票
   发表时间:2010-12-14  
yimlin 写道
不错的文章。

在动态类型语言中这么搞有助于提高效率。

但是我的问题是这样:
freemarker和velocity这样的弱类型,包括EL提供的能力,可是使得我们的程序可以超越类型(Type),比如:
actionLet.submit();


我可以不去理会actionLet具体是何种类型,只要他有这个方法就可以了。
但是如果加上一个类型申明,则意味着程序必须有类型定义,如果我们在java下开发,那么比较好的方式是定义一个接口,比如:
com.xxx.web.ActionLet


这样就会导致,一些依靠约定可以完成的工作,现在不得不额外增加接口了。方案在这个方面是怎么取舍的?




这是个典型的  ducking type 问题————无继承的行为多态。 ducking type是很难做到行为的强类型检查的,因此,在语义上,semi-static language 是禁止 ducking type的。
0 请登录后投票
   发表时间:2010-12-14  
ustcfrank 写道
又看了一遍楼主的文章,总结一下楼主引入“半静态语言”的好处:
1、可以重构
2、提高开发效率:比如在IDE中能“.”出属性。


这里我说说重构,拿这段段代码来讲:
##$ com.abc.crm.Customer customer   
<HTML>   
Hello $customer.name   
</HTML>  


按照楼主的思路,如果
Hello $customer.name

错写(name->nome)成了
Hello $customer.nome


那么编译阶段是能检查出来的。

这个就是 半静态语言在 IDE 内最直接的优势了,实时的可视化的编译错误显示,就像 Java 一样。

引用

但是如果整体错写(customer->custamer)成了:
##$ com.abc.crm.Customer custamer   
<HTML>   
Hello $custamer.name   
</HTML> 

这样的话,编译也能检查出来吗??

这段代码是正确的哦,因为只是variable 换了个名字 $custamer。编译器按其声明的类型进行验证。

引用

如果能的话,那么我觉得:
##$ com.abc.crm.Customer custamer 

这个声明就是多余的。

原因:说明你的检查过程一定要去customer对象真的来源地(很可能是java代码里面)去做检查,
既然已经去来源地去做检查的,其实就可以获得它的真正类型了,所以声明是多余的。

基本验证规则是按 class 进行验证,这个是不多余。
如果是分析对应 Java 源文件, 这个声明可以去掉,但这是一种隐式声明, 文章中有提到的。
比如:不分析Java源码,编译器还可以内置固定变量
<html>
<body>
Hello, $request.getParameter("username") ! <p/>
Your logged in at $session.getAttribute("loginTime") last time.
</body>
</html>


0 请登录后投票
   发表时间:2010-12-14  
1.静态语言也可以解释执行。你用过单步调试?那就是在解释执行你的语句,甚至是传说中最静态的语言fortran,都是可以解释执行的!
2.动态语言也可以编译执行。你用过python,ruby?这些不能编译成exe么?甚至是传说中最动态的语言lisp,都是可以编译成exe的!

所以在解释与编译,动态与静态之间完全没有既定的规则,说谁一定要解释谁一定要编译。

类型检查,嗯……其实呢,我一直觉得,类型检查是好东东,动态也是好东东,ducking type在使用的时候也是好东东。为啥一定要矛盾呢?

我期望的语言是,你愿意写明类型,我就检查,写得越多检查越多,你不写,我就推断,推断不出来拉倒。

举例而言:我期望中的语言的函数,大概是这样的(语法可以再设计,这里只说明思路)
func(in a as const A, in b, inout c like IC, out d as D)

这里in,inout,out,as,like是关键字。
a,d写了类型const A,于是我就检查,你的参数是不是A类型的,在函数里有没有写操作?
b什么都没写,于是就不检查,运行时再报错。
like是我自己编的关键字,专门针对ducking type的情况,即,你编写一个interface,只要c长得和这个interface一样,即满足其公共方法(注意只关心公共方法),就ok!没必要从那个interface继承(有时候强制继承很没必要)。如果愿意的话,这种interface甚至只是用来做检查,不会真正参与编译。

这语言甚至可以考虑在语法上支持更多的约束的表示,以方便愿意使用的人们在编译时进行检查。

所以我觉得很多事情其实没用本质冲突的来着。
0 请登录后投票
   发表时间:2010-12-14  
如果这样的话,那就无法解决 VelocityContext 和 Template 中变量名称不匹配的问题。
也就是说,变量名不能重构。


raymond2006k 写道
ustcfrank 写道
又看了一遍楼主的文章,总结一下楼主引入“半静态语言”的好处:
1、可以重构
2、提高开发效率:比如在IDE中能“.”出属性。


这里我说说重构,拿这段段代码来讲:
##$ com.abc.crm.Customer customer   
<HTML>   
Hello $customer.name   
</HTML>  


按照楼主的思路,如果
Hello $customer.name

错写(name->nome)成了
Hello $customer.nome


那么编译阶段是能检查出来的。

这个就是 半静态语言在 IDE 内最直接的优势了,实时的可视化的编译错误显示,就像 Java 一样。

引用

但是如果整体错写(customer->custamer)成了:
##$ com.abc.crm.Customer custamer   
<HTML>   
Hello $custamer.name   
</HTML> 

这样的话,编译也能检查出来吗??

这段代码是正确的哦,因为只是variable 换了个名字 $custamer。编译器按其声明的类型进行验证。

引用

如果能的话,那么我觉得:
##$ com.abc.crm.Customer custamer 

这个声明就是多余的。

原因:说明你的检查过程一定要去customer对象真的来源地(很可能是java代码里面)去做检查,
既然已经去来源地去做检查的,其实就可以获得它的真正类型了,所以声明是多余的。

基本验证规则是按 class 进行验证,这个是不多余。
如果是分析对应 Java 源文件, 这个声明可以去掉,但这是一种隐式声明, 文章中有提到的。
比如:不分析Java源码,编译器还可以内置固定变量
<html>
<body>
Hello, $request.getParameter("username") ! <p/>
Your logged in at $session.getAttribute("loginTime") last time.
</body>
</html>



0 请登录后投票
   发表时间:2010-12-14  
强类型和弱类型,动态和静态没有直接的关系吧,强类型可以是动态的,弱类型也可以是静态的,只要你有精力去实现就是了。
知道basic不?最早是弱类型的,在vb里加个声明就可以变成强类型了,basic既有解释执行的,又有编译执行的
所以楼主无非是需要一个解释器和一个编译器罢了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics