void main()
{
debug_message("%O","hello" == "hello");
debug_message("%O",[1,2]==[1,2]);
}
这段lpc代码会输出什么呢?
我们先从字节码分析吧。
引用
STRINGS:
0: a.c
1: %O
2: hello
0000: push string 1, string 2, string 2
0005: ==
0006: debug_message 2
0009: push string 1, number 1, number 2
000e: aggregate 2
0011: push number 1, number 2
0015: aggregate 2
0018: ==
0019: debug_message 2
001c: return_zero
红色的这四行先在栈顶上创建了两个数组。先push数字,再aggregate出数组
aggregate 对应的代码:
{
array_t *v;
LOAD_SHORT(offset, pc);
offset += num_varargs;
num_varargs = 0;
v = allocate_empty_array( (int)offset);
/*
* transfer svalues in reverse...popping stack as we go
*/
while (offset--) {
v->item[offset] = *sp--;
}
(++sp)->type = T_ARRAY;
sp->u.arr = v;
}
num_varargs由F_EXPAND_VARARGS字节码来赋值,用于以下情况
int *i = [1,2];
int *j = [3,i...];
num_varargs就是1
至此两个数组已经创建出来了。
这与Java中的数组创建方式不一样。Java是先分配数组,再根据下标来给分配好的数组赋值。字节码多点,但粒度更细更灵活。
引用
0: iconst_2
1: newarray int
3: dup
4: iconst_0
5: bipush 10
7: iastore
8: dup
9: iconst_1
10: bipush 20
12: iastore
接下来就是==字节码了。
void f_eq(){
……
case T_STRING:
{
if (SVALUE_STRLEN_DIFFERS(sp - 1, sp) )
{
i = 0;
}
else
{
i = !strcmp( (sp - 1)->u.string, sp->u.string);
}
free_string_svalue(sp--);
free_string_svalue(sp);
break;
}
case T_ARRAY:
{
i = (sp - 1)->u.arr == sp->u.arr;
free_array( (sp--)->u.arr);
free_array(sp->u.arr);
break;
}
……
}
两个数组==比较,只是比较了地址。所以输出是1 0
但数组在lpc中比较地址,有什么意义呢?python是比较数组内容的,我觉得可以改善一下。
作者:翁志艺
分享到:
相关推荐
FluffOS仅需很少的代码更改即可支持所有基于LPC的泥浆。 如果您目前仍在使用MudOS,则绝对是时候进行升级了!版本当前版本是v2019。 使用基于cmake的构建系统,它支持在Linux / OSX / Windows(WSL和msys2两者)上...
MudOS的源码,可以使用vs2008进行编译和调试。
Mudos中用到的LPC语言教程,不错的教程入门文档
MudOS(LPC)的教程,是学习mud开发的必备教程
MUDOS 源码 服务器端,无mudlib。。。。。。
mudos v21c2的帮助手册中文翻译版. 感谢作者翻译
mudos.泥巴服务端,mud文字游戏服务端
Mudos的efun手册,chm中文版,使用起来比较方便。
单机版所需的mudos源码,不过还是很有意思的。
泥土2015 年 3 月 4 日: add redis support in packages/rd.c2012 年 7 月 14 日: add mongodb support in packages/mg.c , mongoc-v0.8.12012 年 7 月 7 日: change lpc int to long suport 64bit2011年初: add...
很久以前的MUD游戏源码和mudos,给需要和感兴趣的朋友
Fading Summer的mudlib是基于LP的mud(MudOS驱动程序),被设计为在全球范围内推出最好的LP编码器的基础。 欢迎有LPC知识并希望帮助编写核心Mudlib的任何人加入该项目。
CISTOMS是用LPC编写的Mudlib,用于经过修改的MudOS驱动程序。 它具有用于有限访问容器,通用物品,房间和开放式蘑菇状出口的原型。 尽管计划了更多,但简单的随机心跳驱动了战斗系统。
2015最新的mudos fluffos 支持64位 支持数据库
泥巴服务器,比较新的支持mysql和epoll