Groovy实现原理简单研究(1)

本文简单研究一下Groovy的实现原理。我们会下载groovy源码并编译运行。最后简单的分析一下源代码原理。

1.实验环境
Win7 64bit
JDK 1.7.0_72

2.编译Groovy2.5

2.1 首先去以下地址clone代码
https://github.com/apache/incubator-groovy
本文写作时Groovy代码的版本是groovy2.5.0-SNAPSHOT

2.2 准备gradle编译环境
gradlew

用这个命令事先不需要安装gradle,它会自己去下载一个合适的gradle版本,下载下来的会放到C:\Users\{user}\.gradle目录下

2.3 编译
gradlew clean dist


这个挺有意思的,用gradle来编译groovy?到底是鸡生蛋还是蛋生鸡?

经过漫长的等待后(大约30分钟),编译完成。

2.4 生成eclipse工程
gradlew jar eclipse


然后就可以导入eclipse慢慢研究了。(建议用GGTS)

2.5 几个不错的地方:
1.用asciidoctor生成教程文档。生成的文档在target\asciidoc\html5下
2.javadoc,groovydoc也是自动生成的,具体如何实现的还没有研究。

3.研究Groovy 1.0-alpha-1
一上来直接研究庞大的2.5版肯定是啃不动的,当然也可以慢慢啃。
为了降低难度,提高学习积极性,我们这里简单研究下最早的第一版groovy是如何实现的,那时候肯定还没有gradle呢。

通过用git查看代码历史,时间回到了2003年————12年前!我们发现了maven的踪迹。最早的groovy还是用maven 1编出来的,用的是asm,然后文档是用xdoc写的。

3.1 切换到groovy最早的一个版本。

git checkout -b first_ver d1963f1be79aeb0dca8aa012659f725e1ffc96f9


3.2 下载maven1.1
http://archive.apache.org/dist/maven/binaries/maven-1.1.zip
没办法,最早的版本是用maven1做构建的。。。

3.3 将maven 1的PATH设好,然后编译。
maven groovy:make-install

出错dom4j-1.7-20060614.jar找不到

解决方法,手动下载
http://mirrors.ibiblio.org/maven2/maven/dom4j/1.7-20060614/dom4j-1.7-20060614.jar
然后复制到C:\Users\{user}\.maven\repository\maven\jars下面

再次执行上面的命令即可编译通过。
在target下可以找到编出来的groovy-1.0-alpha-1.jar


3.4 测试
修改target\install\bin\groovy.bat 第60行
set GROOVY_HOME="D:\opensource\incubator-groovy\target\install"
改为你的目录即可

然后测试下

cd target\install\bin

groovy -v
groovy compiler version 1.0-alpha-1
Copyright 2003 The Codehaus. http://groovy.codehaus.org/


久违的第一版groovy出来了。激动。

3.5 写一个groovy文件

package abc;

class Abc {

property x;

void a() {
x = 1;
}
}


然后执行
groovy Abc.groovy


可以看到生成了class文件
用反编译工具打开class看一下,可看到这个类被groovy动了手脚
生成的Abc类变成了这个样子:

package abc;

public class Abc
{
private Object x;

public Object getX()
{
return this.x;
}

public void setX(Object paramObject)
{
this.x = paramObject;
}

public void a()
{
this.x = new Integer(1);
}
}



3.6 源码阅读
然后可以读读源码,体会一下。入口点是org.codehaus.groovy.tools.Compiler这个类。
大致原理就是:
[b]groovy负责词法、语法解析groovy文件,然后用asm生成普通的java字节码文件,供jvm使用。[/b]

看代码的话建议由浅入深,各个击破。
比如先看这些类:StringCharStream,Lexer。这些类是做词法分析的,也就是第一步。
看不懂可以跑跑类对应的junit测试,在eclipse里debug一下。
这里看了可以发现最早的groovy,Lexer里面都是自己手写的,而现在新版的groovy估计是用的antlr,自动生成这些词法分析代码,没有人会去手写这些苦力代码了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值