Scheme解释器开发札记

缘起

最早见到的Scheme解释器实现,是在The Litter Schemer的最后一章。虽然书中实现的是一个原型版本,只能解析最基本的形式,并且用外部的Scheme解释器去计算解析出的Scheme表达式(接近于作弊),但是还是可以隐约地感受到,函数式编程在解决复杂问题时的简洁有力。

那么设计一个实际的Scheme解释器,会遇到哪些挑战呢?函数式编程思想在解决这些问题的时候,又会起到怎样的作用呢?带着对这些问题的好奇,用两个星期的业余时间,尝试写了一个自己的scheme解释器

Read More

jQuery 源码精粹4 -- defer与promise

引言

JavaScript采用回调函数来处理异步编程,但是用户经常会陷入一种被称作回调金字塔(Pyramid of Doom))的困境,即在回调函数内部嵌套其它回调函数,层层嵌套使得代码清晰性急剧下降。

1
2
3
4
5
6
asyncOperation(function(data){
anotherAsync(function(data2){
yetAnotherAsync(function(){
});
});
});

defer和promise是jQuery实现中,最难也最有趣的部分,它们以优雅的方式实现了JS世界中的异步回调。

1
2
3
4
5
6
7
8
9
promiseSomething()
.then(function(data){
return anotherAsync();
})
.then(function(data2){
return yetAnotherAsync();
})
.then(function(){
});

Read More

jQuery 源码精粹0 -- 引言

缘起

作为世界上被误解最深的编程语言,JavaScript承载了很多并不公平的指责。

相对于它一无是处的远房表兄Java,JavaScript至少在这三处设计得非常优雅:

  • 对象字面量表示法。(以及JSON)
  • 基于原型链的继承模型
  • 匿名函数块

以我对JavaScript粗浅的理解,编写优秀的JavaScript程序,基本是把这三点用到极致,并且避免所有其余JS糟粕的过程。jQuery, 作为应用最广的JavaScript库,是一个很好的学习范例。

本系列博客,旨在和你一起暂时远离html和css的泥沼,徜徉在jQuery源码的沙滩,寻找那些闪光的贝壳。

Read More

spark 中的RDD 和 DAG

Spark 核心

Spark是继Hadoop之后的下一代分布式大数据处理框架,相对于传统的批处理框架Hadoop,Spark通过可存储在内存中的数据集RDD,以及对流式(streaming)处理的支持,可以获得10到100倍的性能提升。相对于仅支持流式处理的Storm框架,Spark提供了对批处理,流处理,交互式查询,机器学习及图形计算等一系列任务的支持,一站式解决各类大数据分析需求。

每个分布式框架需要解决分布式环境中天然的技术难题,比如并行效率,出错恢复和一致性等问题。分布式框架本身需要精巧的设计,但是对使用框架的用户来说,需要实现的客户端代码是比较简单直接的,无非是对数据集合的map, reduce, filter, group, join等一系列操作。

然而要实现高效的Spark应用,需要用户对数据在物理节点上的存取,在网络间的传递,以及任务的执行流程有清晰的理解,RDD和DAG是需要掌握的两个核心概念。

Read More

Akka in Scala Part 6 - Router

引言

Akka是一个自由的世界,actor之间可以互相发送任意类型的消息,但是随着actor数量的增多,如果不加限制地任由actor之间互相通信,很快整个系统将变得复杂且难以管理。

在互联网的世界,将一群节点组成一个内网,不同网络间的通信,需要通过路由器作为中介。路由使消息传递变得有序。

Akka世界中,也有扮演路由器角色的router,通过router可以管理一组routee的创建、通信和销毁。

Read More