用Go写了一个编程语言
前两个月莫名的对编译原理产生了浓厚的兴趣,刷完相关理论知识后,于是迫不及待地动手用Go写了个脚本语言gscript,麻雀虽小但五脏俱全,目前已经支持现代编程语言的大部分特性,这篇博客记录下实践过程中碰到的难点以及解决思路。
华中科技大学本硕, 热爱编程, 擅长C++、Go开发
前两个月莫名的对编译原理产生了浓厚的兴趣,刷完相关理论知识后,于是迫不及待地动手用Go写了个脚本语言gscript,麻雀虽小但五脏俱全,目前已经支持现代编程语言的大部分特性,这篇博客记录下实践过程中碰到的难点以及解决思路。
并发安全的map在日常开发中使用极为频繁,单纯通过map与sync.RWLock结合并给整个map上粗粒度锁的方式效率并不高。在go1.9中引入sync.Map,通过快慢路径的方式提升并发读性能,除此之外还可以用大锁打为小锁的方式减少并发冲突,获得更优的性能表现。
go语言的map是使用极为频繁的数据结构,如果单单是以理解哈希表原理为目标的话,阅读本系列第一篇文章即可。本篇文章更倾向于通过分析go源码的方式,来深入学习一些哈希表优化技巧。
上文讲到了利用哈希结构实现map,除此之外还可以用红黑树实现。相较于hash结构的实现,红黑树实现虽然查找删除的时间复杂度由O(1)退化为O(logN),但却拥有更优的空间效率,同时还提供了对key排序的功能,因此广泛应用于数据库存储领域。
二叉搜索树提供了平均效率为O(logN)级别的查找、删除、插入操作,但在极端情况下可能导致二叉树退化为单链表。平衡二叉树作为二叉搜索树的一种,通过平衡约束保证左右子树高度相近,能够保证更稳定的性能。本文就从原理出发,最终实现一个操作完备的平衡二叉树。
map映射结构频繁地运用在日常的开发之中,因此成为了面试中的高频考点,本系列将从map的两种实现(hash以及红黑树)出发,再详解go语言的map,最后讨论如何实现高性能的并发安全map,彻底搞懂map结构的奥秘。
本文给我们的框架提供静态路由功能,因为不涉及http协议的解析,以及各种Reader、Writer流的设置,只涉及最基础的逻辑思维以及抽象能力,因此实现极为简单。
以框架目前的完成度来说,handler中还需要我们手动的构建http响应报文,不仅麻烦而且容易出错。因此我们今天就要完成对response的封装,提供更易操作的api以及完成对响应报文的自动构建。本文难度较高,是该系列的最后一个难点。
上文完成了multipart/form-data表单的解析,目前提供的API使用起来依旧有点麻烦,我们在此基础上进行稍加封装,更方便用户使用。本文难度较低。
前文对Body进行了设置,不论客户端是使用Content-Type还是chunk编码的方式,服务端都能够正确的解析。本文将在Body功能的基础上,着重完成form表单中的multipart表单的解析。个人认为是整个框架最难实现部分,不过与chunkReader实现的思路类似,可以借鉴实现。