实现一个简单的编译器

简单地说 编译器 就是语言翻译器,它一般将高级语言翻译成更低级的语言,如 GCC 可将 C/C++ 语言翻译成可执行机器语言,Java 编译器可以将 Java 源代码翻译成 Java 虚拟机可以执行的字节码。 编译器如此神奇,那么它到底是如何工作的呢?本文将简单介绍编译器的原理,并实现一个简单的编译器,使它能编译我们自定义语法格式的源代码。(文中使用的源码都已上传至 GitHub 以方便查看)。 自定义语法 为了简洁易懂,我们的编译器将只支持以下简单功能: 数据类型只支持整型,这样不需要数据类型符; 支持 加(+),减(-),乘(*), 除(/) 运算 支持函数调用 支持 extern(为了调用 printf 打印计算结果) 以下是我们要支持的源码实例 demo.xy: extern printi(val) sum(a…

浅谈云巴实时通信的编程模型

概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别。其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异,真正差异则聚焦于产品定位,业务模式,基础技术水平等诸多细节上。本文暂不讨论具体产品形态上的差异,着重从技术角度浅谈实时通信的编程模型。 什么是实时通信 「实时」(realtime) 一词在语义层面上隐含着对时间的约束(real-time constraint),在工程上,我们习惯对「需要在一定时间内」 完成的操作称为「实时操作」。通常,实时可细分为 「软实时」(soft realtime),「准实时」(firm realtime)和 「硬实时」(hard realtime)。它们之间的差异,简单来说,就是对无法在指定时间区间内(deadline)完成事务的容忍程度。维基百科上对这三者有如下解释: Hard – missing a deadline is a…

引用计数 vs. GC

内存管理问题 内存管理是编程过程中的一个经典问题,早期在 C 语言时代,几乎都靠 malloc/free 手动管理内存。随着各个平台的发展,到现在被广泛采用的主要有两个方法: 引用计数 (ARC,Automatic Reference Counting) GC (Garbage Collection) 管理方法 ARC/GC 因为 Java 的流行,GC 被广泛的认知。GC 简单的说是定期查找不再使用的对象,释放对象占用的内存。 基于 GC,申请的对象不需要手动释放,只需要确认对象在不再需要时,不再被其他对象引用。 引用计数早期主要用于底层系统,比如文件系统的 inode 管理,后来 C++ 的 boost 库实现了一套完整的 ARC,目前流行的系统还有 Objective C 也是采用的 ARC…

Parse 关停与开发者服务健康发展

Parse 关停 2016年1月28日,Parse 官方宣布将于1年后关闭 Parse 服务。这应该是这几天以来开发者服务市场,或者移动互联网开发者圈子里最为震撼的一个消息了。 Parse 在开发者服务领域里很有影响力,有很多的使用开发者,产品也比较完整、专业,就拿他们的开发者文档来说,对我的两次创业都产生了很大的影响。当初 Parse 被 Facebook 收购也引起了很大的关注。 种种原因,让我们听到 Parse 将被关停的消息后,都会觉得特别突然。 在冷静思考几天后,我试图理解为什么 Facebook 会在 Parse 成长迅速的情况下,依然选择了关停它。 猜测大概有几个原因: 虽然 Parse 的确发展得很快,但是 AWS 这些原来的云计算服务商也在不断地推出更多的服务,也逐渐覆盖了 Parse 的后端服务范围。看起来 Parse 也没有足够的能力与 AWS 这些行业巨头正面竞争。 Parse 的用户数量增长得很快…

poolboy的坑

poolboy是Erlang中运用非常广泛的进程池库,它有很多优点,使用简单,在很多项目中都能看到它的身影。不过,它也有一些坑,使用时候需要注意。(本文对poolboy的分析基于1.5.1版本) worker创建不能失败 当poolboy初始化的时候,或者当前进程池的worker数量超过默认值,都会新建worker。我们看一下新建worker的代码: new_worker(Sup) -> {ok, Pid} = supervisor:start_child(Sup, []), true = link(Pid), Pid. 可以看到,supervisor:start_child 的时候是不能失败的,也就是说worker创建如果失败,会导致poolboy这个gen_server挂掉,导致整个进程池崩溃。 这会有什么影响呢,我们看一下用poolboy管理eredis的例子,参考其中的一个实现eredis_pool。 创建worker失败,pool无法启动 看eredis初始化代码,如果连接失败,eredis直接退出。如果用eredis_pool的话…

InfoQ 报道

InfoQ 对云巴的相关报道: 2014年11月24日 云巴创始人兼CEO张虎访谈:推送服务架构选型与程序员成长 2014年8月19日 演讲视频 实时系统架构与实践 …