-
最近一直很忙,都没空写什么东西了。今天终于闲下来了一些,现在正值今年GSOC项目要结束,而且国内关于Typed Clojure的资料少得可怜,所以写点东西介绍一下。
Typed Clojure
Typed Clojure的作用就是给Clojure语言提供一个可选的类型系统,以获得与静态类型语言同等的类型检查能力,但是这种能力的获得仍然是需要一定的代价:那就是使用者需要为每一个全局变量以及函数都加上类型注释,现有的类型可以见项目的wiki。不过它确实能完成对Clojure的类型检查,甚至包括对nil或者java null的捕捉,这一点还是很帅的。
感兴趣的话可以看作者Ambrose在...
-
生活
最近苏州经常下雨,晚上城市的灯光映射在道路的雨水上特别好看,而且不知道为什么苏州园区这边特别干净,雨后树叶上的水里完全不会像其他城市那样积满灰尘,这一点比我到过的任何城市都好,这种感觉真是太好了。
现在每天的生活变得有些单一了,都是8点起来去实验室,然后待到晚上10点才回寝室睡觉,周末也不休。以前还会偶尔出去骑下车,但是最近实在是太忙了。虽然我的GSOC mentor没对我的工作量有什么要求,但是为了对项目表忠心(其实更主要的是为了刷github最长streak,笑),自己要求自己每天至少commit一次,已经这样坚持一个月了。顺便也锻炼下自己的耐心,因为发现很多事情最终只...
-
继上次优化后,我们的程序又一次被内存问题所烦。上次使用惰性解决了内存消耗的问题,但是由于上次我们只是需要使用AST一次,使用完后就可以将其删除,比较简单。但是现在问题更加复杂了一些。
由于我们做的是符号执行,程序需要像JVM一样在运行中保存应用的所有类。但又由于我们没有对内存中的类的表示也就是AST做任何优化,所以非常耗内存。因此也可以说这次的优化就是在给之前的代码擦屁股。只是因为这次擦得漂亮,而且有一定的通用性,值得写点东西记录下。
和上次一样,这次最耗内存的结构还是那个AST,但是又由于我们需要保存所有的AST,所以之前惰性的优化有些用,但是也只是让我们死得更慢些而已。优化AST...
-
首先非常感谢@0xFAN君之前的帮助,回答了我很多关于比赛的问题,还给我看了他以前的proposal做参考,觉得这次能进真是多亏了饭君的帮助啊!
今年GSOC被接受的项目名单出来了,有1307个学生参加,其中就有我,想想还有点小激动呢。
要知道我可是三年前就想进这个比赛了啊!
当年大二刚学会C,但是已经用了两年多的纯linux,所以对开源充满好奇,也想参加个开源项目试试。当时看一个人的博客(现在已经没了)知道了GSOC,就想进去试试。现在想想那时连系统调用是什么、怎么用C打开一个文件都还不知道,就知道vim、linux是开源项目,所以只有看下以前参加GSOC的项目,觉得git这...
-
最近看了很多clojure代码,第一次这么大规模地看clojure代码,学到很多有意思的东西。
全局变量是好事
在一般语言中,全局变量一般会被认为是坏代码的征兆,但是这几天发现在clojure中完全不是这么一回事,全局变量用得好可以实现一些很有意思的功能。比如很多clojure的库都会把可配置的选项当成全局变量暴露出来,需要配置这些选项时只需要使用binding绑定你所需要的值就行。再比如你需要实现一个类似于可嵌套作用域的功能,在作用域内的表达式都能访问特定资源,出了作用域就不能访问了,这在其他语言中都需要某种栈式的结构,而且还需要保证栈的弹入弹出正确,但是clojure中就用dyn...
-
2013年过得特别充实、刺激:三月面试工作,四月面试研究生并开始实习到九月开始读书。这期间基本上都不知道自己下一步应该怎么走,都是一步一步摸索过来的。幸好过得还算充实。
在北京实习半年是我今年最开心的一段日子了,上班时有一群一起进公司的应届生陪着,周末还能和豆瓣的友邻面下基、听听讲座。还挺滋润。刚进公司时教练就要求新人每天开早会,说说新闻以及自己一天的计划,虽然很多时候我们都只是在聊天,但是通过这种方式认识了很多人,使得我们之间的交流很多,而且直接促成了我们分享的习惯:其中某人对某种技术特别熟悉就可以准备一下然后给大家讲解,而且很多时候完全不是特别正式的,聊着的时候提到,然后在大家都有...
-
我们现在在做一个安卓应用的分析,需要读取apk文件,再通过工具分析成一个抽象语法树(以下简称为A树),之后再做一层和编译器相似的翻译,将A树翻译成我们的抽象语法树(以下简称为B树)。和java类似,apk中每个类都生成一个文件,而我们处理的单位也是这样的文件。为了模块化我们把分析和翻译分成两个独立步骤,所以分析函数和翻译函数的产出是一个装着各自结果的链表。
现在为了验证树的正确性,我们写了个B树的输出,再打包回去运行。所以我们总共有三个分开的步骤:分析、翻译和输出。
对于一些小型的apk这样做没什么问题,但前几天测一些大应用时会因为OOM挂掉,后来把jvm虚拟机堆大小设成2G才不会挂...
-
以前写scheme解释器时完全不去考虑垃圾回收,直接链接个libgc完事。因为当时觉得垃圾回收还是很神秘的,而且懒得花时间去调试内存,只想把解释器的功能赶紧实现了。没想到现在能有机会自己实现个垃圾回收。学校里上的编译课上要求实现一个简单的拷贝收集,而且最后一个大项目我也选择去实现一个分代垃圾回收,其中和垃圾回收有关的部分全部在这。
现在觉得垃圾回收真是很简单,而且也越来越觉得之前博客推荐的那篇关于垃圾回收的综述性论文很牛了,把所有垃圾回收都纳入同一理论,再推荐一次。
拷贝收集
拷贝收集算是垃圾回收中最简单的了,觉得coursera上的compiler课的17-03课就讲得很清楚了(...
-
前几天我们老师给讲了个很励志的故事:一个本科学林学专业的到我们学校来花一年时间做出了个可以上网的内核,简历上就写了“写过内核”,然后去intel实习,毕业时intel给了个终身offer,最终去了阿里的内核组。真是羡慕嫉妒恨。
这也是专注的力量吧。如果没有用心做一件事情,就算是本科学的很好的人花一年时间也做不出一个能上网的内核吧。回顾一下过去简直惨不忍睹,自己上到lisp宏,下到CPU流水线都懂一点,于是就成了什么都懂但是什么都不懂的那种人,写些程序对自己要求也低:能跑就行,然后在github上push几个垃圾代码就以为支持开源了,开源是优秀代码好吧,人艰不拆。
现在真觉得那些只会一...
-
接触ZeroMQ纯属巧合:几个月前实习时,老大让我学学RabbitMQ,好给同事讲解,因为之前听说过ZMQ,但是一直没有时间去了解。于是借着那个机会顺便了解ZMQ,这样讲解时也方便通过比较了解两个工具,碰巧ZeroMQ的新书出来了。读完后,感觉收获很多,准备把它翻译出来,已经翻译了一章。所以现在就出来给ZeroMQ做个广告。
装备了epoll的socket
如果要用一句话来解释ZMQ,我觉得最合适的就是上面的这个小标题了。
传统上进行网络编程就必须使用socket,但socket的抽象太低阶了,没有提供数据帧的抽象,并且更麻烦的是IO会成为瓶颈,要想可扩展性好就必须自己做epoll...