自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原林的专栏

Game Maker

  • 博客(38)
  • 收藏
  • 关注

原创 使用Lua Function表示Lambda calculus

http://blog.csdn.net/yuanlin2008/article/details/8627081很多程序语言所带给你的“完美”的感觉都来自于数学抽象之美。在Lua中,function被描述成“具有真正的词法范围的一类值”(first-class values with proper lexical scoping)。所谓的“一类值”,应该满足以下条件:可

2013-03-05 16:07:44 24799 2

原创 Erlang port driver工作原理

原文:http://blog.csdn.net/yuanlin2008/article/details/8244702与其说erlang是一个语言运行环境,不如说它是一个虚拟的操作系统环境。在这个操作系统环境下运行着虚拟的erlang process,这些process之间是独立并行运行的,由erlang虚拟机负责调度,就像在真的操作系统中一样。作为虚拟的操作系统,当然少不了对io的处理。这些

2012-12-10 12:46:37 7513

原创 探索Lua5.2内部实现:Function

基本概念Lua函数引入了很多functional programming的概念,这些概念使得Lua函数在使用上可谓“功能强大,简洁统一”,非常符合程序员的“审美观”。函数在Lua中属于“带有词法范围的一类值”(first-class values with proper lexical scoping)。所谓“一类值”(first-class values),应该符合以下条件:

2017-01-06 13:50:25 5491 1

原创 探索Lua5.2内部实现:Garbage Collection(3)

GC步骤global_State中的gcstate记录了当前incremental gc的执行状态。根据执行状态,整个gc过程被分为很多步执行。GCSpauseGCSpause状态标志着当前没有开始gc。gc一旦开始,第一步要做的就是标识所有的root对象。root对象包括global_State引用的mainthread对象,registry table,全局的metatable和上

2017-01-06 13:48:54 2805

原创 探索Lua5.2内部实现:Garbage Collection(2)

原文:http://blog.csdn.net/yuanlin2008/article/details/8684869GCObjectLua使用union GCObject来表示所有的垃圾回收对象:182 /*183 ** Union of all collectable objects184 */185 union GCObject {186 GCheader g

2013-04-08 14:14:59 17796 1

原创 Ranch基本结构图

原文:http://blog.csdn.net/yuanlin2008/article/details/8691207Ranch是一个使用erlang开发的socket acceptor pool for TCP protocols.Ranch

2013-03-22 17:31:16 16736

原创 探索Lua5.2内部实现:Garbage Collection(1) 原理

Lua5.2采用垃圾回收机制对所有的lua对象(GCObject)进行管理。Lua虚拟机会定期运行GC,释放掉已经不再被被引用到的lua对象。基本算法基本的垃圾回收算法被称为"mark-and-sweep"算法。算法本身其实很简单。首先,系统管理着所有已经创建了的对象。每个对象都有对其他对象的引用。root集合代表着已知的系统级别的对象引用。我们从root集合出发,就可以访问到系统引用

2013-03-13 17:55:07 25055 2

原创 探索Lua5.2内部实现:TString

原文http://blog.csdn.net/yuanlin2008/article/details/8423923Lua使用TString结构体代表一个字符串对象。/*** Header for string value; string bytes follow the end of this structure*/typedef union TString { L_U

2013-02-05 17:57:33 19489 1

原创 探索Lua5.2内部实现:编译系统(4) 表达式分类

原文:http://blog.csdn.net/yuanlin2008/article/details/8534583常量表达式常量表达式在Lua用来表示"nil",“true”,“false”,字符串和数字的值。在BNF中常量表达式属于终结符,也就是语法解析的最底端,在simpleexp函数中被解析出来,并创建对应类型的expdesc对象。VNIL,VTRUE和VFALSE这三个类型

2013-01-29 10:52:33 19195 4

原创 探索Lua5.2内部实现:编译系统(3) 表达式

原文地址:http://blog.csdn.net/yuanlin2008/article/details/8516325表达式(expression)在编程语言中代表一个可以返回值的语法单位,比如常量表达式,变量表达式,函数调用表达式,算术、关系和逻辑表达式等等。对于函数式编程语言来说,几乎所有的语句都是表达式,可以被估值。而对于命令式语言,一般会将语句分成表达式和陈述语句(statem

2013-01-23 15:30:03 19646

原创 探索Lua5.2内部实现:编译系统(2) 跳转的处理

原文跳转用来控制程序的指令流程。Lua使用OP_JMP指令来执行一个跳转,有关OP_JMP的详细介绍,可以参见《虚拟机指令》。跳转可以分为条件跳转和非条件跳转。非条件跳转比较简单,我们可以先从这里入手。goto在Lua5.2中,goto和label是新加入的statement,用来执行非条件跳转。这两个statement分别在lparser.c中的gotostat和labelsta

2013-01-21 13:07:22 21630 3

原创 探索Lua5.2内部实现:编译系统(1) 概述

原文Lua是一个轻量级高效率的语言。这种轻量级和高效率不仅体现在它本身虚拟机的运行效率上,而且也体现在他整个的编译系统的实现上。因为绝大多数的lua脚本需要运行期动态的加载编译,如果编译过程本身非常耗时,或者占用很多的内存,也同样会影响到整体的运行效率,使你感觉这个语言不够“动态”。正是因为编译系统实现的非常出色,我们在实际使用lua时基本感觉不到这个过程的存在。要实现一个Lua的编译

2013-01-18 19:03:25 26217 10

原创 探索Lua5.2内部实现:虚拟机指令(8) LOOP

原文Lua5.2种除了for循环之外,其他的各种循环都使用关系和逻辑指令,配合JMP指令来完成。local a = 0;while(a < 10) do a = a + 1;end 1 [1] LOADK 0 -1 ; 0 2 [2] LT 0 0 -2

2013-01-15 18:10:00 18321 1

原创 探索Lua5.2内部实现:虚拟机指令(7) 关系和逻辑指令

原文nameargsdescOP_JMPA sBxpc+=sBx; if (A) close all upvalues >= R(A) + 1JMP执行一个跳转,sBx表示跳转的偏移位置,被加到当前指向下一指令的指令指针上。如果sBx为0,表示没有任何跳转;1表示跳过下一个指令;-1表示重新执行当前指令。如果A>0,表示需要关

2013-01-15 12:39:26 18677 2

原创 探索Lua5.2内部实现:虚拟机指令(6)FUNCTION

原文nameargsdescOP_CALLA B CA B C   R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1))CALL执行一个函数调用。寄存器A中存放函数对象,所有参数按顺序放置在A后面的寄存器中。B-1表示参数个数 。如果参数列表的最后一个表达式是变长的,则B会设

2013-01-13 20:32:01 18705 1

原创 探索Lua5.2内部实现:虚拟机指令(5)Arithmetic

原文nameargsdescOP_ADDA B CR(A) := RK(B) + RK(C)OP_SUBA B CR(A) := RK(B) - RK(C)OP_MULA B CR(A) := RK(B) * RK(C)OP_DIVA B CR(A) := RK(B) / RK(C)

2013-01-11 18:14:27 17743

原创 探索Lua5.2内部实现:虚拟机指令(4) Table

原文nameargsdescOP_NEWTABLEA B CR(A) := {} (size = B,C)NEWTABLE在寄存器A处创建一个table对象。B和C分别用来存储这个table数组部分和hash部分的初始大小。初始大小是在编译期计算出来并生成到这个指令中的,目的是使接下来对table的初始化填充不会造成reh

2013-01-11 18:13:36 19613 1

原创 探索Lua5.2内部实现:虚拟机指令(3) Upvalues & Globals

原文在编译期,如果要访问变量a时,会依照以下的顺序决定变量a的类型:a是当前函数的local变量a是外层函数的local变量,那么a是当前函数的upvaluea是全局变量local变量本身就存在于当前的register中,所有的指令都可以直接使用它的id来访问。而对于upvalue,lua则有专门的指令负责获取和设置。全局变量在lua5.1中也是使用专门的指令,而5.2

2013-01-11 18:12:38 21029 1

原创 探索Lua5.2内部实现:虚拟机指令(2) MOVE & LOAD

原文nameargsdescOP_MOVEA BR(A) := R(B)OP_MOVE用来将寄存器B中的值拷贝到寄存器A中。由于Lua是register based vm,大部分的指令都是直接对寄存器进行操作,而不需要对数据进行压栈和弹栈,所以需要OP_MOVE指令的地方并不多。最直接的使用之处就是将一个local变量

2013-01-11 18:12:00 23565 2

原创 探索Lua5.2内部实现:虚拟机指令(1) 概述

原文Lua一直把虚拟机执行代码的效率作为一个非常重要的设计目标。而采用什么样的指令系统的对于虚拟机的执行效率来说至关重要。Stack based vs Register based VM根据指令获取操作数方式的不同,我们可以把虚拟机的实现分为stack based和register based。Stack based vm对于大多数的虚拟机,比如JVM,Python,都采用

2013-01-11 18:11:34 33843 4

原创 程序员绘图利器dot

原文作为程序员,我们离不开使用各种图形来描述软件。毕竟,图形描述方法比起直接看代码更加形象,更符合我们的思维方式。大多数的绘图软件,比如viso或者dia,都可以满足一般软件开发中对于绘图的需求了。无论是UML还是其他软件图,使用这些软件来制作都比较得心应手。然而,程序员作为软件的制作者,对于自己使用的软件的要求一般都会比较苛刻。我们总是在问自己,我们所使用的工具是最适合我们的吗?他能为我

2012-12-17 15:28:26 25222

原创 gcc前端的基本结构

原文对于gcc的一些概念,一直都比较模糊。在使用上我们都知道编译c时使用gcc命令,编译c++时使用g++命令;gcc也可以用来编译c++,gcc与g++在使用上的主要区别是g++会自动连接stdc++库。这些使用上的概念使得gcc的前端显得有些混乱。在网上查找有关gcc于g++的关系,有的说gcc会在内部调用g++,有的说g++调用gcc,但都没有更明确的解释他们之间的关系。要想在结

2012-12-17 11:47:18 16712 1

原创 Erlang socket 工作原理

原文由于对并发的原生支持,erlang在很多时候被用来构建网络服务器(socket server, http server...)的底层,处理大量的并发连接。理解erlang在底层如何处理socket,以及如何与自己的并发机制结合,对于使用erlang来构建网络服务至关重要。erlang的对socket的处理被分为两个部分。Port Driver的中的处理基本的io模型在《Er

2012-12-10 16:30:56 19608

原创 bintalk构建

准备cmakegnu flex 和 bison (windows下推荐使用GnuWin32)构建bintalk使用cmake作为构建系统,产生对应平台的makefile或者工程文件。构建最终结果为一个编译器“bintalk”和C++运行时库"bintalk_cpp"。Unixmkdir buildcd buildcmake YOUR_BINTALK_DIR

2012-11-09 15:59:34 1920

原创 bintalk语法

BTK文件BTK文件是bintalk使用的源文件,用来描述结构化数据。一个有效的btk文件可以包含任意数量的定义。如果需要使用一个定义,必须它在之前已经被定义。如果需要使用其他文件中的定义,需要将文件import进来。一个btk文件的基本结构:#import OtherFile1.btk...#import OtherFileN.btkdefinition1definitio

2012-11-08 18:37:06 1831

原创 开始使用bintalk

简单示例创建一个名为"example.btk"的文件,文件内容如下:struct Address{ string city; string street;}struct User{ uint64 id; string name; Address[] addresses;}接下来可以使用bintalk编译这个文件,生成C++代码文件:b

2012-11-08 18:11:21 1574

原创 bintalk简介

bintalk是一个用来对结构化数据进行二进制编码解码的轻量级工具。目的bintalk最初的设计目的是为了满足online game的开发需要。一个online game一般都会有很多相互通信的后端服务器,这些服务器可能使用了不同的语言实现。游戏客户端也可能需要在不同的平台使用不同的语言。并且,游戏对于效率要求很高,一般都会使用自定义的二进制网络协议进行通信。bintalk就是为满足这样的

2012-11-07 17:19:55 1533

原创 Python面向对象学习资料汇总

Python的类型和对象系统http://www.cafepy.com/article/python_types_and_objects/Python对象的属性访问http://www.cafepy.com/article/python_attributes_and_methods/Python类与对象的实现机制《Python源码剖析》第12章 Python虚拟机中的类机制

2012-09-14 17:47:36 1252

翻译 Lua Versus Python

http://lua-users.org/wiki/LuaVersusPython简介Python是一种非常流行的编程语言。Python和Lua都经常被用作为应用程序提供脚本支持。脚本经常会被用在游戏开发中。选择一个脚本语言需要考虑很多的因素。简单来说,你可以根据你的目标平台的体系结构来决定,他们可能是PC,或者游戏机。假设你有顶级的高速CPU,虚拟内存和硬盘,庞大的Python库

2012-08-16 10:59:22 3333

原创 各种语言的二进制数据操作

C/C++这个似乎不用说了C#使用byte[]来标识二进制数据,并通过System.BitConverter来支持基本类型与二进制数据的转化。字节序与本机的体系结构相关,不能设置(X86是Little-endian)。支持与C++类似的bitwise操作符。AS3使用flash.utils.ByteArray表示二进制数据。ByteArray本身可以设置字节序,并且支持各种基本

2012-08-07 17:32:52 1625

原创 Unity的网络功能

首先要说明的是,Unity本身的网络功能并不适合做MMO类型的游戏。如果要使用Unity作为MMO游戏的客户端,一般来说都是在C#中通过socket建立自定义的网络通信来实现。Unity本身的网络功能是为多人游戏设计的,这种游戏模式一般来说就是一个玩家建立游戏(这个玩家既是server,又是client),其他玩家连接进来。从带宽考虑一般同时支持的玩家数量小于64个(这个也不一定,要看游戏本身的设

2012-08-06 17:48:23 14201 4

原创 Unity基于组件的对象模型

组件(Component)这个概念最早是在2005年《Game Programming Gems 5》的《Component Based Object Management》中接触到的,当时感觉在设计上很实用。后来,发现Unreal Engine 3的一个重要的改进就是抛弃了以前的基于纯派生关系的对象模型,而转为使用基于组件的对象模型。对于这种设计思想,Unity比Unreal贯彻的更彻底——一切

2012-08-02 11:58:03 5021

原创 Unity动画系统

在开始使用Unity时,我曾经为找不到骨骼系统的脚本控制接口而感到迷惑。很多的引擎,比如UE和Ogre,都会把骨骼动画系统功能设计成游戏对象的子功能,为骨骼的控制提供一套特殊的API,包括获取和设置骨骼位置信息,将其他游戏对象挂接到骨骼等。Ogre中还有对场景节点动画的特殊支持。材质动画,比如滚动,缩放,颜色等,一般都是在引擎的材质系统中支持的。在Unity中,这些都变得不一样了,你看不到任何有关

2012-07-30 14:59:39 7299 1

原创 Unity适合做网游吗

这个问题最近一直在被讨论,就像我最早使用UE时一样。似乎在国内游戏行业所有的新技术出来,都会被首先问到这个问题。这也难怪,在国内做游戏开发就等于做网游开发,这是我们现在的主流。然而这些新技术的发源地恰巧又是以console game为主流,它们或多或少都带有为console game服务的色彩。这个矛盾一直存在着,就像这个问题一直存在一样。从大的方面看,Unity,UE这些引擎都属于泛用型游戏

2012-07-30 12:27:54 7208

原创 使用virtualbox搭建一个实用的开发环境

开发服务器的部署在开发过程中一般需要很多的工具和服务,比如svn server,building server等等。这些工具和服务应该如何实际的部署到服务器是一个很头疼的问题。从管理和配置角度来看,就像软件本身划分功能模块一样,最好是按照功能划分,每个工具和服务都在一个独立的服务器上面,尽量减少各种工具安装和配置上的冲突。但是从实际来看,由于这些工具和服务一般都不会长时间的占用系统资源,这样会

2012-07-27 15:26:04 3958

翻译 并行实现

原文http://www.altdevblogaday.com/2011/11/22/parallel-implementations/by  John Carmack我一直都在“无畏的编码”,勇敢地干掉所有我认为有更好解决方式的东西。甚至于我为此感到一点点骄傲:“我不怕承受作正确事情所带来的后果!”当然,诚实的讲,这样的后果常常会撂倒一个新手,因为他们需要对付那些因此而无法工作的

2012-07-26 13:12:30 2181

原创 协同线程

最早接触coroutine是在02年使用unreal engine时。unreal script通过支持latent function和state代码实现了coroutine的思想。由于unreal script属于私有语言,整个语言设计的针对性比较强,所以虽然很好用,但是在语言的通用性上的没有任何的考虑。03年开始接触lua时,被他的coroutine设计吸引住了。把lua的coroutine用

2012-07-16 15:21:41 2431

原创 理解Erlang进程

对于一种编程语言,除去具体的语法部分(在写程序是可以参考手册),在头脑中形成它运行时的数据对象描述方式和交互方式,是真正理解它的关键所在。Erlang Process正如在教程和文档中描述的,是erlang语言非常重要的对象,本文将从各个方面描述一下对于erlang进程的理解。主动对象“主动对象”这种设计模式我最早是在ACE中接触到的,在ACE中通过ACE_Task实现。ACE_Task本

2012-07-05 12:31:42 2511

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除