爆栈(stack overflow), 众所周知是一种软件的致命错误, 一旦发生程序就core了。根据维基百科的描述,当代码中有以下三种情形时会引发爆栈
- 无限递归
- 函数调用链展开过深
- 函数内申请过大的局部变量
其中1.和2.本质上是相同的,不管是否递归,只要函数调用链过深,压栈过多就会引发爆栈。只不过在实践中,由递归更容易引发爆栈。
可是在很多时候,我们无法避免递归。比如数据库在对SQL语句的执行实现中,伴随着输入的SQL语句的复杂性,间接递归通常是可以预见的。但是无论哪种情况,我们都不能容忍一个用户输入导致程序爆栈,因此这种情况下,我们就需要一个防爆栈机制
下文通过介绍我经手的一个防爆栈机制的实现过程,分享一下有关程序设计的教训与心得:
我发现有不少做应用的技术人员对于数据库的一些常识概念其实是理解不清的,这就导致了他们设计的应用中往往充斥了数据访问的相关错误却浑然不知。所以其实我还是比较乐意普及一些数据库常识的。
本文就是我在 segmentfault.com 上对 “怎么理解SQL的四个事务隔离级别?“这个问题的回答:
这两天在虚拟机上新装了一个 Ubuntu Server 16.04LTS,于是很自然地想安装一个Go语言环境。以往无论在Windows上还是在Linux上都是用的现成的二进制distribute包来安装Go, 但是这次打算尝试用源码来直接编译安装。于是把本次编译安装的一些手顺和注意事项分享在本文中:
由于手头当前的工作是基于PostgreSQL(以下简称PG)做二次开发,因此目前对PG的源码也或多或少地读了一些,因此便想到了在博客里分享一些关于阅读PG源码所获得的KnowHow。
在国内的PG技术圈内,提到PG源码解读自然首推武汉大学的两位彭老师所著的《PostgreSQL数据库内核分析》。不过这本书的着眼点是对PG源码的整体架构,以及SQL引擎,存储系统,事务处理等等这些实现机制&算法的介绍,而我则主要想分享一些PG代码中的一些有意思的小细节/小功能。虽然只是PG那几百万行源码中的沧海一粟,不过从这些小细节中解读程序设计的匠心也是颇有意思的。
第一篇就从PG中无处不在的OID开始吧
最近因为在改PostgreSQL的相关的一些代码,因此在自学Perl语言。虽然和Python一样,它也是门解释型语言,然而这门语言真的是比较奇葩,因此无比地怀念Python.
Python是我2015年自学的,虽然没用它做过什么正经的项目,但是小东西还是写了不少。只可惜自己终究还是修行不够,否则在目前这个被”人工智能”,“机器学习”等概念刷屏的年代,借助Python这门深受机器学习领域欢迎的语言,我说不定也能包装成一个年薪百万的大咖~
不过,为什么机器学习领域会如此欢迎Python?之前在一个日文网站上看到一篇文章说这个事情,我觉得写得有点意思,所以就把它翻译了一下…
这篇文章我已经酝酿颇久了,诱因是因为PingCAP团队为了推广他们的TiDB而在知乎专栏发了一篇文章《TiDB 增加 MySQL 内建函数》。受此文启发,我在网上搜索了一下PostgreSQL(以下略称”PG”)中定制内置函数(Built-in Function)相关的文章,果然没有搜到什么像样的中文文章。其实为PG添加内置函数并不难,可能是相对于hacking它的SQL引擎或者存储引擎等等话题而言,加一个内置函数的逼格实在是太Low吧。不过TiDB这个诞生还没多久的数据库产品都知道通过先利用内置函数这个话题来由简入深地吸引广大开发者为它贡献代码,PG作为一个诞生了已有20年的开源数据库老大哥却没有一篇像样文章,也难怪PG的普及率不高了。
以上就作为这篇分享的「意味づけ」吧…
周一在微信上收到了Go中国公众号推送的一篇文章 Is GO object oriented ,读完以后感觉观点还是很有意思的,与我的所见有很多相似之处,所以就饶有兴趣地把它翻译成中文,也算是作为”友军”的一点贡献吧……
在涉及到并发编程的情况下,经常性地会碰到一种场景:
由一个线程开启了多个线程并发执行多个任务,之后由该线程(so called “主线程”)等待多个线程都结束后汇总结果.
这种场景下,主线程在其创建的子线程执行期间内需要阻塞,直到其他子线程都执行完毕。由于这类场景已经在不同语言的开发中遇到多次,所以汇总一下这些语言的常用实现方法,以后查起来也方便~
在github上关于cgo的wiki中,有一章节专门介绍了如何利用cgo技术通过函数指针调用Golang的函数实现. 不过,仔细观察这个章节的代码示例可以发现,它所要解决的其实是以下的场景:
在Golang中想要调用一个已有的C语言函数,但是该C语言函数要求一个函数指针作为参数时应该怎么办?
如果将这个场景稍微改变一下,改成以下场景,对应的解法又该是什么?
在一个C语言实现的已有系统中,对于一个要求函数指针的函数,如何传入一个Golang实现的回调函数以实现“用Golang扩展C语言系统”的目的。
我基于wiki中已有的代码简单探索了一下方法,结果分享如下:
从去年接触Go语言(以后简称”Golang”)到现在,已经有1年的时间了。感觉随着使用经验的积累,越发地喜爱这么编程语言。作为一个以C, C#语言出道,并自学了Java, Python, Golang的无证程序员,使用 了一段时间Go语言后,最明显的感觉就是:“这正式我所期盼的语言”。特别是写多了C语言代码,虽然感叹于C语言在语言上的简洁与性能上的高效,但是对于现实中C语言在开发方面的低效也总是吐槽不断。遭遇了Go语言之后,认为这门语言是C语言的最好传人(不要提C++)。
以下分享一些我认为Golang做的比较值得推崇的地方: