转自http://my.oschina.net/mayqlzu/blog/113528

问题:

最近lua很火,因为《愤怒的小鸟》使用了lua,ios上有lua解释器?它是怎么嵌入大ios中的呢?lua的官网说:"lua is an embeddable scripting language",怎么理解呢?怎么在你自己的程序里嵌入lua解释器呢?如果可以在我的程序中嵌入了lua,那是否意味着我可以从此用lua编程了呢?

带着这些问题,打算在我的windows笔记本上做个实验,目标是在windows上跑一个lua的解释器,然后用lua语言写一个程序,跑在这个解释器之上,也就说最后的效果是:

(上) lua program -> lua解释器 -> windows (下)

或者是:

(上) lua program -> lua解释器 -> my c program -> windows (下)

实践:

1) 下载lua源码;

2) 用eclipse+mingw编译lua解释器的源码

eclipse+mingw编译环境我之前就已经搭好了,有兴趣的同学可以参考我的另一篇文章,当然你也可以用其他编译工具,比如visual Studio;

建立一个空白c工程,project type选Executable->Empyt Project;

导入src目录下的所有文件,包括.c, .h和Makefile文件;

点击build,开始编译;

遇到编译错误:main()重定义,lua.c和luac.c里分别有一个main(),lua.c是解释器的源码,luac.c是编译器的源码,我们此时要的是解释器,所以从工程删除luac.c,重新编译,通过,生成lua.exe;

没想到lua的源码和Makefile写得这么好,这么顺利就编译通过了,网上说lua是用标准c写的,只要是支持标准c的编译环境都能顺利的编译它;

3) 运行编译出来的解释器

找到lua.exe所在的目录,在这个目录下先准备一个用lua写的程序,比如hello.lua,包含代码:print "hello lua";

打开一个windows的cmd窗口,cd到编译结果lua.exe所在的目录,调用lua解释器,执行hello.lua程序,命令为:lua.exe "hello.lua",(我之前从官网下载了一个编译好的lua解释器和SciTE编辑器,我看到SciTE编辑器就是用这个命令调用lua解释器的)看到窗口输出hello lua,太好了,至此,我亲手编出了一个lua解释器,可以跑在我的windows系统之上;

4) 下一步,怎么在我的c程序里调用lua解释器?

哦,知道了,我的c程序调用windows的接口将lua.exe跑起来,同时把hello.lua文件作为参数传给lua.exe,不就行了。

在你的main.c中,可以用类似这样的代码调用lua.exe:system("C:\\some_path\\lua.exe -e \"hello.lua\" " )

5) lua解释器执行hello.lua的时候,如果hello.lua想调用一个本地库foo.dll中的foo()函数,foo.dll是foo.c编译生成的,怎么办?

稍等,我正在做...

6) foo.c怎么调用hello.lua中的函数?

写到这儿,突然明白了,解释型语言和编译型语言之间的相互调用没什么神秘的,还是以lua和c为例,

a)先看lua怎么调c?

所谓的lua调用c,是指foo.lua调用bar.c中的代码,foo.lua本身只是一段源码,不能执行的,必须由lua解释器来执行,lua解释器是一个可执行程序,可以运行,foo.lua可以看成是解释器程序运行过程中读取的一个配置文件,根据”配置文件foo.lua“内容的不同做不同的事情,如果”配置文件foo.lua“说调用bar.c中的bar()函数,那么解释器lua.exe就去调用了,假设此时bar.c也已经编译成了二进制bar.dll,那既然lua.exe和bar.dll是同一个平台(比如windows)上的二进制程序,互相之间的调用就没什么稀奇了吧,就跟你写一个简单的main.exe调用bar.dll一样了;

b)再看c怎么调用lua?

所谓的c调用lua,是指foo.c调用bar.lua中的代码,我们先要把foo.c编译成一个可执行程序foo.exe,这样才能执行嘛,可是被调用方bar.lua只是一个包含lua代码的源文件,不是二进制的(我们现在是在讨论解释器,不考虑lua预编译成二进制的情况),无法调用,所以我们就要借用lua解释器了,所以整个流程就是:foo.exe -call-> lua解释器(可执行程序)-读取-> bar.lua,foo.exe其实只和lua解释器打交道,告诉它我要调用某个函数,然后由解释器负责去找到这个函数并调用;

综上,你会发现,不管是lua调c还是c调lua,他们都不是直接交互的,因为lua程序只是一堆”死“的源代码,像一个配置文件一样,不能执行的,所以就需要一个中间人”lua解释器“,只要c程序和lua解释器之间约定好接口,那么实现c和lua之间的调用就是很自然的事情了,没什么神秘的。

最后给出一个示意图:

一个用c写的程序,已经编译成二进制 <--> 用c写的lua解释器,已经编译成二进制 -> 一个lua写的程序,只能被解释器”被动“地读取,不能”主动“地执行

解释型语言和编译型语言如何交互?以lua和c为例的更多相关文章

  1. Python程序的执行过程原理(解释型语言和编译型语言)

    Python是一门解释型语言?我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成的. ...

  2. Python程序的执行过程 解释型语言和编译型语言

    转载地址:http://blog.csdn.net/lujiandong1/article/details/50067655 1. Python是一门解释型语言? 我初学Python时,听到的关于Py ...

  3. 解释型语言和编译型语言的不同以及Python如何运行

    计划写关于Python中如何实现属性管理.函数(或类方法)管理.类管理的几篇成系列的文章. 而这篇文章写在这个系列之前,希望对后面几篇文章的理解有所帮助. 老实说,我也是在网上搜索了一些资料才写的这篇 ...

  4. 解释型语言VS编译型语言

    前言 计算机不能直接理解除机器语言以外的语言,所以只有把程序员编写的程序翻译成机器语言,计算机才能够执行程序. 将其他语言翻译成机器语言的工具,被称之为:编译器. 编译器的翻译方式有两种:编译和解释. ...

  5. lua和C++交互的lua栈操作——以LuaTinker为例

    一. -- C++类注册函数(LuaTinker) 的lua栈操作: -- lua栈内容(执行到pop语句) 栈地址 <--执行语句 space_name[name] = t1 -- (2b8) ...

  6. cocos2d-x lua与c++简单交互

    cocos2d-x lua与c++简单交互 version: cocos2d-x 3.6 本文讲述lua与c++的一些简单交互: lua通过消息方式调用c++无参接口 c++调用lua带参接口 1.通 ...

  7. lua和整合实践

    这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...

  8. Lua使用心得(1)

    这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...

  9. (转) Lua使用心得一 LUA和VC整合

    这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...

随机推荐

  1. 网络基础知识、ASP.NET 核心知识(1)*

    为什么要写网络? 我原本的计划是这样的,连续两天梳理ASP.NET开发的核心知识.说到这呢,有人问了.“不是说好了做ASP.NET笔记吗?为啥要写网络基础知识?是不是傻?” 原因是这样的.作为网站开发 ...

  2. linux系统下将php和mysql命令加入到环境变量中的方法

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行 “php -v”命令查看当前php版本信息时时 ...

  3. JavaScript常用标签和方法总结

    什么是javascript?   (1) JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的 脚本语言. (2) JavaScript是由Nets ...

  4. 最新百度音乐api

    一直都想做网络音乐播放器,但是自己又没有服务器,根本就不能实现,也没那个能力实现.唯一的办法就是借助别人的API. 网上公布的API特别少,像能够直接得到音乐文件的真是地址的几乎没有,有的也只是截取流 ...

  5. 导航控制器(UINavigationController)

    一.导航控制器基础 1.导航控制器的组成 i.中间视图 ii.导航栏 iii.工具栏 2.配置一个导航界面 a.配置一个导航界面最重要的部分就是配置被包含的视图控制器. b.当它所属的视图控制器在导航 ...

  6. c# dataset 索引0没有值

    datatable绑定到dataGrieView,在刷新datatable的数据时,常会bug:索引0没有值或索引(int)x没有值 昨天弄了一个下午,发现bug原因: dataGridView中有数 ...

  7. ajax+php+mysql更新

    html代码 <input type="button" id="quxiao" class="quxiao" name="q ...

  8. .ascx.g.cs文件不能生成 The name ‘InitializeControl’ does not exist in the current context - Visual Web part Sharepoint

    InitializeControl doesn't exsit When using visual studio 2012 for developing SharePoint 2013 Visual ...

  9. Eclipse 4.6 Neon, could not create the java virtual machine

    下了eclipse 4.6,打开报错:could not create the java virtual machine. a fatal exception has occurred. 命令行用 e ...

  10. 8.css边框

    其实,与其将css盒模型称为是一个盒子,我更愿意将其称为卡片,或者是图画.因为相对于盒子的三维特效,网页的元素更像是二维的图画.而我们之间对元素尺寸之类的调整,更像是对画布的调整. 但是,就像我可以为 ...