Monthly Archives: April 2012

多范式编程的思考

如之前所言,不同的语言往往注重不同的范式,并在语言层面上加以实现/强化。 在当前使用的语言中一定程度上借鉴其它语言所推崇的范式常常是可行且有益的。 例如在 C++ 中,简单的把函数本身和其入参设为 const 一般就可以保证其没有副作用。这并不能使 C++ 得以应用函数式语言中强大的高阶函数编程(个人始终认为用范型做 lambda 表达式实在无益),也不见得能使整个系统的运行并行化,但足以提高系统的可理解性和可维护性,因为程序员往往更难理解程序在运行时的状态和行为(这在并行编程的情况下表现的尤为明显,以致我们需要用临界区段之类的概念来辅助理解)。试想,如果能把有副作用的模块局限在系统的 10%,那剩余 90% 的模块的运行时的表现就是完全确定的了,其测试和维护将会变得非常简单,而一旦系统发生问题,也可以把调试的重点集中到那控制系统状态的 10% 的代码中。 John Carmack 的 Functional Programming in C++ 中有更详尽的说明和更具体的方法,当然也有性能方面的折中。 当然,也有一些范式的使用会更加困难(如果不是不可能的话)。最近发现 Erlang 语言 相当有趣,函数式编程加上基于 Actor 模型的 Erlang 进程的并行支持。Erlang 进程并不是系统进程或是系统线程,而是由 Erlang 虚拟机管理的位于用户空间的轻量级进程,因此其开销非常低。同时,Actor 之间只通过消息传递来相互交互,不共享任何状态,这使其非常适合服务器端的并行,且拥有良好的可扩展性。不过要在 C++ 中实现 Actor 模型看来会相当困难。轻量级进程也许可以通过 … Continue reading

Posted in Computer and Internet, Programming and Algorithm | Tagged , | Leave a comment

魔法使いの夜 完成

TYPEMOON 的 ADV,Visual Novel。主线完成,章间和番外还留着。 演出与音乐绝赞中。 演出方面,这是我到目前为止看到的制作的最精致和华丽的了。虽然据说用的是有点历史的 krkr引擎,但表现力确实无与伦比,战斗部分的演出几乎接近全动画CG的效果了。 音乐方面,三名主角的角色曲都非常传神,首战时的BGM First star 和终战时的 Five 相当大气。坐等 5/9 的 OST。 剧情方面,由于是 TM 所以完全没问题。因为主要角色就三人,所以就算男主这么没存在感的家伙也能给人留下相当的印象的(笑)。只是留的坑有点多,看来得等传说中的后两部了。 没语音这个大家应该都已经知道了吧,就不多抱怨了。

Posted in Entertainment, Game | Tagged | Leave a comment

Low level code / Assembly

C/C++ Low Level Curriculum 这系列的 blog 简要介绍了(x86上)常用 C++ 的汇编code。 不过注意作者犯了一个比较大的错误:blog 中堆栈相关的汇编示例都是 cdecl,但作者的说明中写的都是 stdcall。应用 callee clean-up 的 stdcall 最显著的特征是用 ret xx 指令在函数返回的同时弹出堆栈,而 caller clean-up 的 cdecl 则直接用 ret 指令。我手上版本的 GCC 和 MSVC 的默认设置都是 cdecl。 实际看代码的话,就算同是 cdecl,GCC 生成的汇编和 MSVC 的也是有些差别的。比如 MSVC 进入函数后立刻 … Continue reading

Posted in Computer and Internet, Programming and Algorithm | Tagged | 1 Comment

Memory ordering & memory barrier

最近很惊异的发现(对称多处理器)ARM 架构的乱序执行技术对内存的读取/写入顺序几乎没有任何保证(嗯,我知道早就old了)。这方面 x86 架构好些,但也有一条: Loads may be reordered with older stores to different locations. 于是第一想到的就是古董的 Peterson lock(这个现在一般是用来说明为何需要处理器加入 test-and-set 之类的指令),代码如下: 果不其然,不管是 ARM 还是 x86,只要是多核心的,程序都会生成错误结果。 补救的方法是使用 memory barrier(或者 memory fence)处理器指令来强制限制内存操作的顺序。在上面的程序中便是 lock 函数中注释掉的两行汇编代码,dmb 是 ARM 的指令,mfence 是 x86 的指令。 虽然 Peterson lock 早已成为遗迹,但现今也还有栽在这个 … Continue reading

Posted in Computer and Internet, Programming and Algorithm | Tagged , | Leave a comment