- 博客(52)
- 资源 (1)
- 收藏
- 关注
原创 函数式编程介绍之极简版
Functional Programming是一种编程范式,其中计算是通过对函数的求值(evaluation)来组织的,它尽量避免涉及状态与可变(mutable)数据。FP强调的是函数的施用(application),与之相对的命令式编程则强调状态的改变。几乎所有的主流语言都是偏
2011-07-23 19:12:53 6370 1
原创 Visual C++对虚函数重载的诡异布局
毫不令人惊讶的是,C++又给了我一个惊讶! 对于被重载的虚函数(overloaded virtual member functions),Visual C++ 并不会依照它们声明的顺序排布在虚表中。 一组(同名的)重载虚函数会按照它们声明的逆序依次排布在一起,而组与组之间的顺序,是由组内最先出现的那个函数声明的位置决定的,越先声明,该组越靠前。
2010-05-27 19:27:00 6351
原创 时间的灰烬之与狼共舞的羊
“很多年之后,我会变成一头真正的狼。每一只羊都会变成狼,只要他尝试过什么叫做弱肉强食。我不会介意别的羊怎么看,我只不过不想生命的全部意义就是任人宰割。” 现在,提问开始:“根据以上线索,请说出时间的灰烬到底他妈的是什么?” 很好,王家卫同学举手了,那么你说说看吧。 “时间的灰烬,Ashes of Time,也就是那部神经质到抽风的电影《东邪西毒
2010-05-25 03:04:00 5516
原创 从电影到multi-touch再到几句闲话
今天坐在办公室里,听到另外几个同事在谈电影:A问B有没有看过《星际迷航》,回答没有;A再问《少数派报告》,仍然没有。然后A说《少数派报告》(似乎是2000年左右的片子)里展现的未来电脑的multi-touch人机交互技术对现实世界的计算机界产生了重大影响。诚然,确实是直到最近几年才出现了以iPhone为代表的消费电子产品将multi-touch技术带给了普罗大众,但是我对此技术的创意来自《
2010-02-28 16:03:00 5465
原创 恶斗TCC(Tiny C Compiler)
TCC,全称Tiny C Compiler(http://bellard.org/tcc/),是一个颇具特色的C编译器,你能把它当作一个C语言解释器来用,也可以嵌入你自己的应用程序作一个动态代码生成器。是的,我们就是这么干的。在我们的项目中,粒子系统的运动规则用C语言来描述,然后由TCC动态生成native code运行。这么做既不失效率又保持了较高的动态能力。 但是,
2009-07-12 17:35:00 24159 19
原创 一次顺带的语言性能评测 -- 以2D水波特效的实现为例
本来一开始我只是想学习一下如何实现2D水波特效,关于这个问题早有现成的效果不错且简单的算法,google一下可以找到很多资料,比如这篇http://freespace.virgin.net/hugo.elias/graphics/x_water.htm。但是由于性能上的问题,导致我更换了多种开发语言,最终也使得这次的学习变成了一次编程语言的shoot-out游戏。 简单来说,2D水波
2009-04-09 17:04:00 8448 7
原创 探索一种C++二进制模块的热更新机制
现如今,提供稳定可靠且能满足人民群众日益增长的物质文化需要的服务是互联网服务商的基本责任,所以服务端软件一定要够壮够强够灵活。服务程序一旦跑起来那就最好7X24小时地永远别挂,而且多变的、不停增长的用户需求也得尽快满足。可问题是,永远也别指望程序员写出没有bug的程序,任何架构师也没有水晶球可以预测将来的花花世界,无论当时看起来多么完美的代码,将来也会因为种种原因要被修改(或者被丢弃?)。
2008-06-23 21:39:00 17897 8
原创 一个顶顶简单的冷兵器近距离混战的NetLogo模型
NetLogo和StarLogo都是多主体(multi-agent)模拟平台,后者继承自前者但功能更强大、开发进程也更活跃。它们都采用类Logo的建模编程语言,并引入了大规模并发机制,所以特别适合用于构造由许许多多自主活动但相互影响的简单个体组成的大规模系统(比如蚁群)。通过在电脑平台上模拟每个主体的行为,我们可以探索系统作为整体所表现出的宏观现象和性质。 本文介绍的模型是基于Net
2008-06-04 16:38:00 9997 1
原创 "The Development of AppleScript"的笔记
本文是阅读“AppleScript” William R.Cook的笔记。 该文描述了Mac OS上的通用脚本语言AppleScript和通用的进程间通讯机制Apple Events。 支持脚本的(scriptable)应用程序中的数据对象包含(子)元素(elements)和属性(properties)字段。(子)元素字段可以有多个值,这些值都是(子)对象的引用,而属性字段的
2008-05-20 21:20:00 6542
原创 bjam,别弄乱了链接顺序!
公司目前用bjam做build工具。bjam为boost项目所采用,对构建常规的C/C++工程比较方便,但是限制也很多,尤其是内建的脚本语言太晦涩,使得定制自己的构建规则很不方便。不过今天我想说的倒不是这些缺点,而是bjam 3.1.13在FreeBSD平台上的一个bug。 我们有3个文件,分别是 main.c :#include void foo_one(int);in
2007-02-08 21:43:00 7361 2
原创 Lua5.1.1的一个隐藏BUG
在最近的lua maillist上,三巨头之一的Roberto Ierusalimschy报告了一个5.1.1版本的bug:当一个函数里用到了超过 255个不同的全局变量和常量时,由数字常量和访问table的表达式组成的复合表达式(比如"2*a.x")就有可能产生很奇怪的结果。比如 下面这段程序: kkk = 2;v1=2; v2=2; v3=2; v4=2; v5=2; v6=2;
2007-02-04 16:38:00 9872 1
原创 Lua的debug hook功能探究与改造--上篇
Lua5.1提供了较为完善的debug库函数,其中的sethook可以让用户自己设置hook函数来监控程序的某些运行行为,这包括:调用 函数,从函数返回和将要运行新的一行代码,每当这些事件(event)发生时hook函数都会被调用。读者可以试试 monitor_v1.lua, 它是debug hook功能的一个简单应用。require导入该文件后便得到一个名为monitor的扩展库,里面只有一个
2006-12-24 23:36:00 18035 3
原创 vc如何返回函数结果及压栈参数
首先说明,本文的分析对象是运行在IA32平台上的程序,试验用的编译器是Visual C++ 6.0中的cl.exe(Microsoft 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86)。 IA32程序利用程序堆栈来支持过程(procedure)调用,比如创建局部数据、传递参数、保存返回值信息、保存待今后恢
2006-09-22 19:14:00 5186 6
原创 一颗璀璨的月光宝石——Lua
邓际锋本文发表于2006年6月《程序员》杂志,谢绝转载Lua语言简介 1993年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的月亮。事实证明她没有糟蹋这个优美的单词,Lu
2006-08-10 12:55:00 6509 2
原创 如何实现每个对象只执行一次的例程
对象是数据和行为的有机结合体,每一个对象实例保存的数据都是自身特有的信息,而其中的一些数据是需要经过计算或处理才能得到的,有时候这种计算的量还不小。因此对于那些在整个对象生命周期都不会改变的数据而言,每次为了获取它们而重复执行的计算就是一个大大的浪费。一个改进的方案是:在对象创建时执行相应的动作以预先计算好那些稳定的数据并保存在内部,以后需要的话就直接返回这些预先算好的数据。这听起来是不错
2006-07-25 00:23:00 3477 1
原创 入职了
6月29日上午将近9点抵达公司,可爱的zhangqi已经在办公室等着。本来9点半上班,但今天她专程8点就赶到了。装好配发的电脑后大约10点,她带我去看帮我租的房子。住处离公司很近,走10分钟就到。一室一厅的房型,家具都全,好几样电器还是房东刚买的,虽然装修旧了点,但是我仍然很满意。要知道6月底7月初可是学生毕业工作的高峰期,而且我是23号才告诉zhangqi入职时间的,能在这么短时间找到符
2006-07-01 21:36:00 3159 2
原创 gcc的一个小bug
在C语言里有一个通用指针,即void*类型指针。通用指针有一条特殊的性质:任何一个指向某种类型(非函数类型)数据的指针转型为通用指针后再转换回原始类型,指针(的值)不会改变。换句话说,任何非函数类型的指针与通用指针间的互相转型(以及赋值)是(语法上)合法且(语义上)安全的。 通用型指针实际是一种类型未知的指针,因此不能对它解引用(dereference)和施行下标(subscri
2006-03-31 22:37:00 3220 5
原创 OpenLua简介:一个支持静态元编程的可扩展式开放编译器
邓际锋 本文采用 Creative Commons Attribution-ShareAlike 2.5 许可证零、 从哪里获得OpenLua OpenLua的项目主页是http://www.luachina.org/projects/openlua/ ,2005年12月28日0.01版发布,所有的源代码可从这里下载。因为Lua是主要的开发语言,所以在你的机器上必须有一
2006-03-04 02:50:00 6391 2
原创 Generic for中使用pairs和ipairs的一个陷阱
Lua有一种很自然的循环方式,即Generic for。它的格式是这样的:for namelist in iterator do blockend其中iterator是一个迭代器函数,它可以有一个或多个返回值,namelist是逗号分隔的循环变量名列表,用来接收每次调用迭代器函数得到的返回值。这段程序的语义与下面形式的代码相同:while true do local namelis
2005-12-28 21:56:00 3963 4
原创 2005年C++软件技术大会第一天
今天是C++软件技术大会的第一天,上午的主讲人是Bjarne Stroustrup,topic是关于C++新标准C++0X制订的一些情况。Bjarne用了4个词来描述标准制订的过程: 正式(formal)、缓慢(slow)、官僚主义(bureaucratic)、民主(democratic)。另外,那个X预计是9,所以如果进度正常的话下一代标准应该是2009年推出。 下午由科泰世纪的陈
2005-11-20 00:34:00 7054 8
原创 雅虎招聘考试中两道C++题目的疑问
昨天参加了雅虎校园招聘的在线考试,选择的语言类别是C++,其中遇到了这么两道题://int I = 2;int x = (++I) + (++I) + (++I);//int I = 2;int x = (I++) + (I++) + (I++);问分别执行两段代码后,x的值是多少? 在这里我不想去辛苦地求解,因为我认为这两道题是有问题的。为什么? ANSI C标准告诉我们,如
2005-11-15 17:23:00 12438 75
原创 在VC6.0中如何让new操作失败后抛出异常?
标准C++规定new一个对象时如果分配内存失败就应抛出一个std::bad_alloc异常,如果不希望抛出异常而仅仅传回一个NULL指针,可以用new的无异常版本:new(nothrow)。 VC6.0在头文件中声明了这两种operator new操作符:void *__cdecl operator new(size_t) _THROW1(std::bad_alloc);void *
2005-10-11 23:14:00 4153 1
原创 为什么会出现LNK2005"符号已定义"的链接错误?
许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,那么本文就试图为大家彻底解开关于它的种种疑惑。 大家都知道,从
2005-09-30 21:11:00 22584 12
原创 Lua的语法是无歧义的吗?
Lua5.0的语法非常简洁,这从参考手册中的语法定义的规模(转换成标准BNF形式大概有100个左右的产生式)可以看出。不过简洁归简洁,它却不完全是无二义性的。下面将用具体例子揭示什么样的代码会引起歧义(执行环境是www.lua.org发布的Lua5.04)。 首先定义如下几个函数:function foo(a) print("foo print",a) return aend
2005-09-17 15:41:00 4440 7
原创 C++的缺省参数与函数重载是正交特性吗?
在《程序员》2003年第12期的一篇访谈录中,Ruby的发明人Matz较详细地阐述了Ruby的设计思想及遵循的原则,其中大部分我都深以为然,特别是他高度重视语言设计过程中人的因素则更是让人激赏。不过他对正交特性的看法却让我颇为迷惑。 正交(orthogonal)本来是一个几何概念,表示的是垂直相交,后来又被扩展到线性代数中,表示内积为零的两个向量之间的关系。线性空间中一组两两正交的非
2005-06-16 00:38:00 4734 8
原创 在Win2000注册表中修改中文输入法切换快捷键
Win2000默认的中文输入法切换快捷键是Ctrl-Space,不过用户可以自己修改它。方法是右键点击托盘区的输入法图标,点选“属性”进入“区域选项”设置中的 “输入法区域设置”面板,在“输入法区域设置的热键”的下方有一个“项目”列表框,找到并选中“中文(简体)输入法-有输入法/无输入法切换”这一项,点击“更改按键顺序”按钮便可进入更改快捷键的对话框。但是要注意,一旦你更改并使之生效的话,你就再也
2005-05-17 00:32:00 10476 1
原创 Lua的多任务机制——协程(coroutine)
并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制。大致上有这么两种多任务技术,一种是抢占式多任务(preemptive multitasking),它让操作系统来决定何时执行哪个任务。另外一种就是协作式多任务(cooperative multitasking),它把决定权交给任务,让它们在自己认为合适的时候自愿放弃执行。这两种多任务方式各有优缺点,前者固有
2005-03-24 22:37:00 38834 8
原创 Lua的function、closure和upvalue
Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型值的数据主要是一条条指令而已),所以在函数体中仍然可以定义函数。假设函数f2定义在函数f1中,那么就称f2为f1的内嵌(inner)函数,f1为f2的外包(enclosing)函数,外包和内嵌都具有传递性,即f2的内嵌必然是f1的内嵌,而f1的外包也一定是f2的外包。内嵌函数可以
2005-03-14 12:01:00 5521
原创 ANSI C中取得结构体字段偏移值的惯用法
假设在ANSI C程序中定义了一个名为MyStruct的结构类型,其中有一个名为MyField的字段,如何取得它在结构体中的偏移?typedef struct MyStruct_tag{ // some fields ... long MyField; // other fields ...} MyStruct; 最容易想到的方法应该与如下代码差不多:s
2005-01-18 22:59:00 5010 1
原创 在Lua中如何动态生成两个函数的复合函数
Lua是一种动态类型语言,变量名可以在运行时绑定到任意类型的值上。Lua从函数式编程语言中借鉴了许多思想,这体现在Lua的基本类型中除了有number,string等其它语言中常见的基本类型外,还有函数(function)。这意味着函数: 可以用变量命名; 可以提供给函数作为参数; 可以作为函数的返回值; 可以包含在数据结构中。下面我们利用函数在Lua中作为"一等公民"的身份,来实现
2004-12-20 18:55:00 5228
原创 内存对齐与ANSI C中struct型数据的内存布局
当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密。 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段
2004-12-12 14:43:00 8077 11
你好,Haskell!
2011-04-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人