自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

语言观止

Hello Snail Language

  • 博客(43)
  • 资源 (11)
  • 收藏
  • 关注

原创 逃出Chrome沙盒——反Hook技术

我下面所讲的沙盒是指在Windows上构造一个和外界绝缘的空间来禁止用户行为的一种技术手段。在沙盒中的进程不能通过标准的Windows APIs读写文件,也不能通过socket等通信方式于其他进程进行信息交流,导致沙盒外面的信息进入不了,沙盒内的信息出不去。我既不从事软件安全,也不从事什么黑客技术的研究,所以我在很长一段时间里不知道何为Sandbox,更别提如何跳出它。直到两三周之前,我想从C

2016-04-04 23:31:33 5315

原创 虚继承

说来惭愧,学习C++好几年了,但是从来没有接触过虚继承,今天总算有时间让我架起windbg一探究竟。下面以狮子(Lion) 和老虎(Tiger)为例来说明,它们继承自动物(Animal),它们所生的后代是狮虎兽(Liger)。

2014-11-19 15:51:14 1020

原创 开发自己的编程语言(九)—— 生成EXE文件

本章介绍将Snail脚本编译成EXE文件的原型框架,其主要原理是利用Reflection.Emit逐一转换Snail的每条语句。之所以称为原型框架,是因为目前版本只支持:将一个变量赋值为整数,然后将这个整数变量输出。a = 1001print(a)利用上面的两条语句生成一个exe文件,同时将结果输出,得到的exe文件大小只有2k。实现了这个原型之后,其他内容的实现就是时间和体力的问题了

2014-01-20 17:59:34 3844

原创 Snail的编程感悟

一个又一个版本的更新,CSDN和我一起见证着Snail Language的长大。从2013年到2014年,从未停止过编写代码的步伐,从未停止过为它添加新功能的想法。写Snail的目的何其简单,只是为了学习语言的意义;写Snail的过程何其快乐,来自从无到有功能的喷发。    我的职业不是做编译器(做编译器的也没有我业余)。Snail  Language并没有涉及到编译器的后端(也就是中间语言以

2014-01-17 19:34:29 1721

原创 开发自己的编程语言(八)—— 在Snail中调用C#函数

自己开发的脚本语言Snail Language 可以调用C#的函数了。

2014-01-17 11:52:03 1595

原创 开发自己的编程语言(七)—— 字典数(相关联数组)

在Snail Language 0.17中,我将原先的线性数组改成了相关联数组,它的本质就是Hash Table,采用C#的Dictionary类型来实现。相关联数组的使用方法:a = [100, name:"haz", language:"snail", year:2014, version:0.17, 3.14:"浮点数测试"]数组内的元素可以以单个Value,或者Key : Valu

2014-01-15 18:08:10 1787

原创 开发自己的编程语言(六)—— First-Class Value

从0.16版本开始,Snail Language语言将函数作为First-Class Value。First-Class Value指的是:函数名和变量名之间没有区别,它们可以相互赋值。要注意的是,print既是函数名又是关键字,所以print可以作为右值,但是不能作为左值。现在一个变量可以表示为:整数、浮点数、字符串、数组、函数。由于是所有的变量都是动态类型,所以赋值时不需要在意当前的类型。

2014-01-14 18:42:43 4303

原创 开发自己的编程语言(五)—— CIL中间代码的生成

在编译原理中,最难的步骤应该是代码的优化。只有通过不停的优化代码才能得到更好的性能,而性能又是商业编译器的重要指标。这一切就注定了码优化是一个没有止境的过程。但是对于不争早夕的初级语言来说,这一步骤就显得可有可无,因为有足够的时间让我去等待一个结果的出现。就像我花了很长很长的时间去等待斐波那契第30个结果的出现,而一个经过优化的编译器能在很短的时间内完成计算。除了代码的优化,中间语言的生成好像

2014-01-13 15:36:38 2984

原创 开发自己的编程语言(四)

Snail Language经过一段时间的完善,目前的0.143版本已经具备了简单编程语言应有的功能。Snail Language的最终目标:成为一款.NET语言,即它的中间语言为CIL。下面用代码片段讲解语言的功能,==>为输出结果。操作符目前只正确支持:+, -, *, /, %, +=, -=, *=, /=, %= , =, ==, >= , 其他操作符也支持,但是

2014-01-10 17:08:35 2392 4

原创 开发自己的编程语言(三)

Snail Language 0.134版本新增了对内置域函数的支持。如,str = “12345”; str.length()返回的值就是str的长度5。域函数的地位和普通函数是一样的,在对类型string求值时将内置域函数放入全局函数列表中。length函数就将str当做默认参数,返回str的长度。求值以后将域函数从函数列表移除。伪代码如下:string类型:class Strin

2014-01-05 13:21:16 1989

原创 开发自己的编程语言(二)

目前的版本为0.12,相比较0.1版本,添加了如下功能:1)字符串类型2)字符串和整数n相乘,得到重复n次的字符串组合3)print可以输出多个参数,比如:print("hello", "&", "world"); ==> hello&world4)实现了if else选择语句

2014-01-02 13:57:26 1725

原创 开发自己的编程语言(一)

Snail Language是一门toy语言,是本人为了学习编译原理而开发的练习之作。目前的版本为0.1版本。功能如下:1)基本的算术表达。2)全局变量和局部变量。3)函数调用。4)输出结果的print函数。运行环境:.Net Framework 4.5编程语法:1)目前只支持int和double类型。2)函数定义以func为前缀

2013-12-31 22:16:20 5909 4

原创 图解Lua中的栈

在Lua中,脚本和C语言程序之间的值传递是通过栈进行的,也就是说,栈是它们之间的枢纽。其中一方会将值写到栈中,供另一方读取。Lua的栈是一个线性数组,栈中的每一项元素的类型都是TValue,它是Lua表示内部数据的数据结构。栈的最大空间在luaconf.h中给出:#define LUAI_MAXSTACK1000000。栈包括:基指针、栈顶指针、栈大小。图中的stack->top表示栈顶指

2013-12-11 21:13:34 3155

原创 lua中load的使用方法

前面一篇博文提到了,用load函数实现Lua的反射机制,但是没有深入的讲解load的用法。load的本质就是在Lua代码中运行一段存储在字符串中的代码。但很快你会发现,它并不是将字符串去掉“引号”那么简单,如:b = 200print(load("b"))解析器毫不犹豫的给你一个error。因为load又另一层含义,它是将字符串的内容作为一个函数体返回。所以以下代码才是正确的使用方法:b

2013-12-06 16:19:27 26755

原创 设置断点

function trace(event, line)if (line == 120) thendebug.debug() end -- 在120行设置断点enddebug.sethook(trace, "l")

2013-12-05 16:35:45 1328

翻译 24.3 性能分析

尽管它的名字中有“debug”,但是debug库在很多非调试方面也很有用。常见的任务就是用于性能分析。用于时间的性能分析最好使用C接口:因为Lua代码的hook调用开销很大,所以用于测试时间毫无意义。然而用于性能分析,Lua代码很适合。在本章中,我们开发一个初版本的分析工具,用于统计每个函数的调用次数。两个table是我们程序中用到的主要数据结构:一个记录函数调用次数,另一个记录对应的

2013-12-05 16:34:13 1485

翻译 24.2 hooks

Hook机制的作用:一个运行程序执行某个事件时,会调用我们注册过的相应的函数。有四种事件可以触发一个hook:调用事件(call):当Lua调用一个函数时发生;返回事件(return):当一个函数返回时发生;行事件(line):当Lua执行一行新的代码时发生计数事件(count):在执行完给定的指令条数之后发生Lua用一个参数调用hook,就是用一个字符串表示事件:“call”(或

2013-12-05 16:33:29 1364

原创 内省和反射

内省和反射的英文名称分别为:introspector和reflection内省:从字面上理解,凡是查看(类、函数等)内部情况的函数叫做内省函数。Lua把debug.getinfo称为内省函数,它可以查看函数或者协程里面的情况。反射:通过函数(类等)的字符串名访问对应的函数,成为反射。Lua中的反射为:function func(a) print(a, "fun

2013-12-05 12:46:28 1815

翻译 24.1 Lua debug library

Debug库并没有为你提供一个Lua的调试器,而是为你提供了编写个人调试器的基本功能。出于性能的考虑,调用基本功能的正式接口都是通过C API提供。在Lua中访问debug库的一种方式是通过Lua代码直接访问。和其他库不同,你要很吝啬的使用debug库。首先,库中的很多功能都会影响性能。其次,它打破了Lua中一些颠扑不破的真理,比如在一个局部变量的作用域之外,你不能访问它。最后,你可以

2013-12-05 11:10:52 5454

原创 虚拟机漫谈(Lua、Java、C#)

最近,花了四天的时间去看和虚拟机相关的资料,终于换来了一知半解。其实在N年前,我就碰到过虚拟机。那时候用的java、C#、vmware都和虚拟机有千丝万缕的关系。甚至,windows的保护模式也是虚拟机的一种。但是很多时候我不求甚解,对虚拟机的认识只停留在名词解析上面。也怪那时候的老师们从来不点破这层窗户纸,把Java教的和C一样,让我误以为Java就是C的移动版;把C#当做XX系统管理工具的专属

2013-11-30 22:08:27 9344 1

原创 C语言printf IEEE (数字在计算机中的表示)

在计算机中整数和字符串都用十六进制数表示,如 int a = 2,计算机中就存储着2,表示它的值。又如,char c = '2',则用0x32表示,计算机里存储着32。唯有浮点数的表示方法不同,它们采用IEEE格式存储。问题来了,如何在C语言中查看IEEE格式呢?在C语言中数据本身是没有意义的,只有我们告诉计算机这段数据的含义时,计算机才能正确的理解。所以当我们要查看一个float的IEEE时

2013-11-30 12:08:24 4020

原创 语法语义、形参实参,懂彻底!

你知道parameter和argument的不同吗,你知道syntax和semantic的区别吗?这两对词汇经常在英文技术文档中出现,以前我不知道它们的确切含义,只知道前者说的是参数,后者说的和语法相关,这样都能蒙混过关。直到有一天它们很频繁的一起露面,我才不得已去把它们知彻底。中文解释:    parameter:形式参数(形参)    argument:实际参数(实参)

2013-11-27 22:42:48 2303

翻译 《Lua 5.0的实现》第八章 - 结论和致谢

在本篇论文里,我们展现了Lua 5.0中很多创新的部分:基于寄存器的虚拟机,用新算法优化当数组使用的table,实现闭包。据我们所知,在所有被广泛使用的语言中,Lua是第一个使用基于寄存器的虚拟机的。对table的优化,lua可以实现一部分的table当数组使用(也就是说,如果有足够的key在1...n之间)。它实现的闭包也是唯一的,在复杂的情况下(基于数组的栈,词法作用域,first-cla

2013-11-26 21:15:52 1390 1

翻译 《Lua 5.0的实现》第七章 - 虚拟机

Lua在运行程序之前,首先将它们编译成虚拟机指令(opcodes),然后再去执行这些指令。Lua编译每个函数,为每个函数都创建了一个原型(prototype),原型中的内容有:函数的指令(opcodes)数组,和另一个记录函数中所用到的值(值(TObjects)以及所有常量(字符串、数字))的数组。    在最初的十年中(自1993年Lua第一次发布),各个版本的Lua使用了基于栈的虚

2013-11-26 21:12:27 3478

翻译 《Lua 5.0的实现》第六章 - 线程和协程

自Lua 5.0以后,Lua实现了非对称协同程序(也称为半对称协同程序或者半协同程序)[7]。Lua通过三个标准库支持协程:create、resume和yield。(这几个函数位于coroutine命名空间中。)create函数接受一个”主“函数,然后创建一个新的协程。create返回一个类型为thread的值,表示创建的协程(和Lua的其他值一样,协程也是first-class。)resume函

2013-11-26 21:06:28 1478

翻译 《Lua 5.0的实现》第五章 - 函数和闭包

当Lua编译一个函数时,Lua为此产生一个原型(prototype),原型的内容包括:函数的虚拟机指令、常量(数字,字符串等),一些调试信息。在运行时,当Lua执行一个function ... end表达式时,它就创建一个新的闭包。每个闭包都包含:一个对它所对应的原型的引用;一个对它environment的引用(environment是一张表,函数通过这张表获得全局变量);和一个对upvalues的引用数组,用过upvalues引用数组,可以访问函数外面的局部变量。

2013-11-26 21:02:52 1707 1

翻译 《Lua 5.0的实现》第四章 - 表

Table是Lua主要(实际上是唯一)的数据结构。Table在语言中和实现上都起到了关键的作用。Lua语言受益于我们精心设计的table,因为table用在几个内部的任务上,而无需担心性能问题。这有助于保持Lua设计的小巧。但是,由于缺乏其他数据结构,就对用table实现的效率提出了更高的要求。

2013-11-25 20:21:09 1537

翻译 《Lua 5.0的实现》第三章 - 值的表现形式

导读:Lua中的值是如何用ANSI C表示的,它们存放在哪里?

2013-11-25 14:02:55 1461

翻译 《Lua 5.0的实现》第二章 - Lua的设计和实现概述

《Lua 5.0的实现》第二章翻译,翻译方知写作难。

2013-11-22 22:27:15 2504

翻译 《Lua 5.0的实现》第一章 - 介绍

implementation of Lua 5.0 翻译

2013-11-22 00:12:04 2800

原创 基于Lua的C/C++调试模块

基于Lua的C/C++调试模块    每当阅读逻辑复杂的代码时,首先都想弄清函数之间的调用关系,然后想在适当的位置打上断点(或者移除断点),或者想看看某个函数被调用了多少次。很多代码阅读器、编辑器都已经提供了这些基本的功能,甚至提供的功能比我们想象的要强大很多。但有时候总不能满足我们的所有需求。经过数次的摸索,我写成了一个较为可行的调试模块与君交流商榷。其中用到了Lua脚本,固称为基于Lua,其实就是一个C/C++的模块。

2013-11-21 16:22:09 4079

原创 辅助调试

本文内容和Lua代码无关,只是写了一段用于调试的C代码。只需在每个函数体的第一句写上:DEBUGFLAG。就可以通过Lua脚本控制每个函数的调试行为。调试行为包含断点、printf函数名和fprintf函数名。输出的函数名带有缩进格式,并用花括号表示函数体。这样的格式可以很清晰的看到函数之间的调用关系。下面是lua.c中的调用关系。main{ pmain{ collectarg

2013-11-20 20:31:47 2481

原创 在lua中实现printf

本文讨论如何在lua中实现printf。学习的目的是为了进一步了解C函数和lua之间利用栈传值的过程。在lua中printf的功能等于string.format + io.wirte,前者用于格式化字符串,后者用于输出。文中的代码来自于lua官网。用lua代码实现为:printf= function(s, ...)    return io.write(s:format(...))

2013-11-20 16:04:10 7395 1

翻译 Programming in Lua -- 27.2 Continuations

通过lua_pcall和lua_call可以实现,在lua脚本中调用一个C函数,这个C函数可以回调lua。很多个标准库中的函数都是这样做的,比如table.sort可以调用一个排序函数;string.gsub可以调用一个替换函数;pcall和xpcall在保护模式下调用函数。我们是否还记得lua的主要代码是通过C(一个主程序)来调用的,所有我们得到一条调用链条:C(主程序)--> Lua(脚本)-

2013-11-20 10:23:07 1319

原创 Lua中使用C函数之简化版

在《Programming in lua》中告诉我们一种添加C函数的方法,然后可以在lua脚本中使用。它是通过在lua.c添加函数来实现的。我照着葫芦画瓢了一次,不是很到要领。今天突然想到一种更简单的方法可以为学习lua所用。例如我要在lua脚本中试验一个叫“mysin”的函数,即用C语言实现的sin,方法如下://#ifdef __cplusplus#include extern "C

2013-11-20 00:43:09 1297

原创 在C中调用lua的内置函数string.gsub

本章以string.gsub为例子讲述如何在C语言中调用Lua中的函数。假设我们有一个命名为fordebug.lua的lua脚本:function add(a, b) return a + bend要在C语言中调用这个add函数的方法想必大家都知道,通过lua_getglobal(L, "add");lua_pusnumber(L, 3);lua_pusnumber(L, 5

2013-11-20 00:15:04 1763

原创 C言语中可变参数的原理

《Programming in Lua》的26章最后列举了一个可变参数的例子。通过for循环将后面的参数都压入lua的栈中,lua_pushnumber(L, va_arg(v1, double))。在C语言中,函数的参数压栈的顺序是由右至左,而栈的变换是从高地址到地址,所有最左边的参数地址是最小的。比如int add(int a, int b, int c),入栈的顺序是c,b,a。假如

2013-11-19 21:48:51 1347

原创 User-Defined Types in C

User-Defined Types in C作为《Programming in Lua third edition》的第29章,引入了一个新的数据类型userdata,向我们介绍如何在Lua中实现C语言的数组。除此之外,其余的内容都在总结过往的章节,比如:原表(metatable)、原函数的使用。同样,首先给出文章的结果:array = require("array") --连接一个自己

2013-11-18 20:01:16 1302

原创 在lua中调用DLL

整整的花了一个下午的时候,才在lua中调用了动态链接库。比起其他脚本语言,lua的调用方式算是比较繁琐的,但是lua的编程思想非常的统一,即lua和C之间的传值都是通过栈进行的,目前为止我还没有深入的去了解这个“栈”,但是这并不妨碍去使用”栈“。当我们在一个空的工程中写下几个C/C++的函数,然后把属性类型设置为“动态链接库”以后,编译虽然成功了,DLL也产生了,但是我们得到的DLL是一个没有

2013-11-15 15:45:08 11321 4

原创 Lua解析器Read脚本内容

你知道C语言是怎么Read一整个文件吗?如果你知道了,那么请忽略本文,如果你不知道,你可以花五分钟来阅读本文。在我开始阅读Lua代码之前,我好像没有用C语言写过一次性Read整个文件的字符的代码,以往都是一句句的读取。以至于我对这样的代码失去了敏感性。在开始阅读Lua代码的时候花了两个小时来寻找Lua解析器如何读取脚本的内容,一直当我看到getc的时候才豁然开朗,以前几乎没有用过getc,开篇就定

2013-11-14 18:54:27 2103

Snail Language V0.19

通过Emit,实现了从Snail脚本到exe转换的框架原型。 测试代码: a = 12321 print(a)

2014-01-20

Snail Language V0.18.01

1)更新了版本号的格式 2)支持C#的静态域:如,a = Math.PI

2014-01-17

Snail Language 0.180

初步支持在Snail中调用C#函数。测试例子: Math.Pow(10, 8) MessageBox.Show("Hello Snail Language!")

2014-01-17

Snail Language 0.171

实现了foreach来遍历数组: foreach(key, value in array) { ... } 或者 foreach(key in array) { ... }

2014-01-15

Snail Language 0.170

Snail Language 0.17,实现了相关联数组,替代原先的线性数组。

2014-01-15

Snail Language 0.160

Snail Language 0.16实现了: 1)First-Class Value的函数类型。 2)__FUNCTION__存储当前函数的字符串名称。用途:debug时候可以打印函数log 3)在一个函数return之前,调用一个预先指定的函数。用途:希望在一个函数返回时做一些处理,通过使用Action,可以不用在每个return前增加代码。

2014-01-14

Snail Language 0.15

实现了从Snail Language到CIL转换的几个简单例子。 if(1 < 2) { print(1) } else if (2 < 3) { print(3) } else { print(4) }

2014-01-13

Snail Language IDE 0.143

Snail Language是一款个人开发的语言语言,目标是成为一款.NET语言。目前版本为0.143,计划于0.5版本开源。

2014-01-10

Snail Language

Snail Language是一门toy编程语言,实现了简单的语法,目前的版本为0.1。

2013-12-31

C言语实现lua数组

《Programming in Lua third edition》的第29章工程源码

2013-11-18

lua-5.2.2的VS2012工程

在VS2012中建立lua-5.2.2的工程,可以直接build。

2013-11-12

空空如也

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

TA关注的人

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