Web Analytics

C程序员驯服Common Lisp – 入门

毫无疑问,Common Lisp是一门庞大且复杂的语言,学习曲线并不平坦。对于一个从未接触过函数式语言、交互式语言以及动态类型语言的C程序员来说,学习Common Lisp显然是一个很大的挑战。 也许有人会问:"C语言已经无所不能了,为何还要学习Common Lisp?“在这里我不想说太多冠冕堂皇的话,至少对我而言,理由有三: 一是好奇,在C语言的世界里待得久了,总想探出头来吸几口新鲜空气,这次我选择了Common Lisp; 二是为了变成一名更好的程序员。为何学习Common Lisp就能成为一名更好的程序员呢?这不是我的观点,而是诸多牛人或大师们(包括Paul Graham、Peter Norvig以及另外一个Peter:Peter Seibel等)的观点。不过不管你们信不信,反正我是信了。这个观点的关键思想就是一门语言可以影响一个程序员的思维方式。我相信Common Lisp可以给我带来一种不同于以往的新的编程思维方式,这样至少比只有一种思维方式要好,不是吗; 最后,Lisp是一门可编程的编程语言,可以很容易扩展自身并且创造一门新的语言。我无法不动心于如此一门强大的语言。 ...

August 30, 2011 · 11 min · Tony Bai

使用autoconf解决可移植性问题

昨天在编译项目代码时遇到了这样一个错误: xx_base.h:72:2: 错误:#error “One of _BIG_ENDIAN or _LITTLE_ENDIAN must be defined.” 这是预编译器的错误输出。原因很明显:预编译器在处理xx_base.h时没有发现_BIG_ENDIAN或_LITTLE_ENDIAN的定义,#error预处理宏输出了如上错误。下面是出现错误位置的源码片断: ...

August 23, 2011 · 5 min · Tony Bai

CBehave – 一个C语言行为驱动开发框架

Behaviour-Driven Development,即行为驱动开发在业界早已不是什么新鲜玩意了。我之前也略有了解,不过一直没有"深入钻研"。直到今年年初InfoQ的几篇有关BDD的文章才让我对BDD有了更多的认识。与TDD一样,C语言在BDD领域依旧是一个"后进分子",在多数主流语言(Java,C#,Ruby等)都已经拥有比较成熟的BDD框架(如JBehave、SpecFlow和Cucumber)的今天,C语言却似乎仅有一款BDD框架-CSpec可用。于是年初的时候我就把设计和实现一个用于C语言的行为驱动开发框架加入到我今年的ToDoList中了。 ...

August 15, 2011 · 7 min · Tony Bai

行为驱动开发导引

本文翻译自Dan North的文章"Introducing BDD"。 我遇到了一个问题。当我在不同环境的多个项目中使用和教授类似测试驱动开发(test-driven development, TDD)这样的敏捷实践时,我总是能遇到来自程序员们相同的困惑和误解。他们想知道从哪里开始、测什么不测什么、一次测试多少、谁来调用他们的测试以及如何理解为什么一个测试失败了。 越是深入TDD,我越能感觉到我对TDD认知过程是时断时续、逐步掌握的,还远未进入到死胡同。我记得多数时间我想到的都是"这只是别人告诉我这样做的",而不是"哇,我明白为何要这样做了"。我断定一定可以通过某种方法将TDD直截了当地呈现给那些优秀的程序员们,并且可以避免所有陷阱。 ...

August 10, 2011 · 12 min · Tony Bai

Common Lisp初学点滴

Common Lisp是一门Interactive语言,比较容易上手。无论你是用CLISP,SBCL还是Clozure CL,你都可以很快地写出一个"Hello, World“程序出来。不过千万不要因此低估了Common Lisp,前人的经验表明:Common Lisp是门庞大且复杂的语言,其学习曲线可并不低。要想真正掌握它,需要你有持续的热情、足够的耐心和不断的练习。我接触Common Lisp时间也不长,是个地地道道的初级选手。这段时间看了些书,做了一些练习,这里把我初学Common Lisp过程中的点点滴滴记录下来,以备忘。 ...

August 5, 2011 · 6 min · Tony Bai

偿还N年前的一笔技术债

记得刚来公司时曾参与过一个项目,项目中用到了部门基础库中的一个B+树接口。不过在程序调试过程中我们发现可执行程序总是dump core(在sparc solaris上),经初步分析,断定问题就出在B+树接口处,但一时又找不到问题原因。还好这个B+树的实现者就坐在我的旁边。他分析后告诉我:这个B+树接口要求用户自定义的索引结构体的size应该为4的整数倍。按照他的说法,我为结构体打了padding,以满足结构体size为4的整数倍的要求。修改后果然不再dump core了。当时项目进度紧,我也没有求甚解,这件事也就过去了。 ...

July 21, 2011 · 6 min · Tony Bai

为函数添加enter和exit级trace

日常开发中,我们为了辅助程序调试常常在每个函数的出入口(entry/exit)增加Trace,一般我们多用宏来实现这些Trace语句,例如: #ifdef XX_DEBUG_ #define TRACE_ENTER() printf(“Enter %s\n”, __FUNCTION__) #define TRACE_EXIT() printf(“Exit %s\n”, __FUNCTION__) #else #define TRACE_ENTER() #define TRACE_EXIT() #endif ...

July 13, 2011 · 4 min · Tony Bai

也谈共享库2

我之前写过一篇名为"也谈共享库“的博文,对共享库的查找和符号解析机制做了还算比较详细的说明,不过百密一疏,总有一些意想不到的情况发生。这不今天我又遇到了一个有关共享库的新问题,这里将这个问题及其解决过程记录下来,也算是对上一篇文章中未涉及内容的一个补充吧。 N年前我曾参与过部门的一个可复用系统的设计开发,当时我们设计了一种插件式的系统结构,其中所谓的"插件"是以共享库的形式提供。主程序通过读取配置,获取插件的位置,并在运行期利用dlopen动态加载插件(.so文件),用dlsym查找、绑定并执行.so中的特定业务函数。 ...

July 7, 2011 · 6 min · Tony Bai

也谈C语言编译器的标准编译阶段

了解C编译器的工作流程有助于C程序员解决编译代码过程中出现的问题。市面上凡是讲解得还算全面的C语言书籍中都或多或少对此有所提及。 让我们在这里来回顾一下C编译器的工作流程!一般C编译器的工作流程大致分为:预编译、编译、生成目标代码(汇编)和连接这四个主要步骤。我们用实例具体描述一下这四个步骤,以最著名的GCC编译器结合helloworld.c文件为例: ...

July 4, 2011 · 7 min · Tony Bai

也谈C语言对国际化的支持

C语言对国际化的支持由来已久,最初开始于其第一版标准,即C89标准。在C89中我们可以看到用于支持国际化的locale.h、宽字符、宽字符串以及多字节字符(串)。而之后的"C89增补1"标准,即C90标准,以及C95标准又进一步完善了C语言对国际化的支持,增加了wchar.h、 wctype.h以及大量用于操作宽字符(串)和多字节字符(串)的标准库函数。最新一版C语言标准,即C99,让C语言对国际化的支持变得更加成熟,对非英语字符集也给予了更好的支持。 ...

July 1, 2011 · 10 min · Tony Bai