转自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. VHDL学习札记:library and Package

     参考:http://www.cnblogs.com/garylee/archive/2012/11/16/2773596.htmlhttp:// http://forums.xilinx.com ...

  2. hive[3] 数据类型和文件格式

    Hive 支持关系型数据库中的大多数据基本数据类型,同时也支持3种集合类型:   3.1 Hive 的基本数据类型 支持多种不同他度的整形和浮点型数据类型,具体如下(全都是保留字): tinyint ...

  3. CentOS 5.x版本升级PHP

    #-----------------------------CentOS 5.x版本升级PHP------------------#! /bin/sh #1.关闭selinuxcp -rp /etc/ ...

  4. subpage和secondary page的区别

    Hi,  Can you tell me the differences between subpage and secondary  page and when to use which ? I n ...

  5. js dom 操作

    JS的DOM操作   1DOM是文档对象模型,这种模型为树模型:文档是指标签文档,对象是指文档中每个元素:模型是指抽象化的东西. 2间隔与延迟间隔执行一段代码(函数):window.setInterv ...

  6. JavaScript 一些基础练习

    JavaScript为网页添加动态效果并实现与用户交互的功能.改变颜色以及宽高,隐藏或显示内容,取消设置 <style type="text/css"> body { ...

  7. java高级工程师必备知识

    成为Java高级工程师需要掌握哪些核心点? 每 逢长假都会有很多程序员跳槽,十一.过年是跳槽黄金时刻,尤其是过年.过年的时候年终奖到手,没有了多少牵挂,年终同学同事聚会比较多,沟通的就多,各种 工作机 ...

  8. 修改 WordPress 文件上传目录

    WordPress 默认的上传目录位于 wp-content/uploads ,并且根据设置还可以按照年月归档.但是如果要上传一个头像,或者幻灯片的话,也跟附件混在一起总是不太好吧?幸好 WordPr ...

  9. linux下的循环命令写法

    直切正题 方法一:利用while do循环,举例,while true;do ls;sleep 1;done  解释,该命令为每秒执行ls查询命令,sleep 1 为每秒循环,其他命令可直接替换 ls ...

  10. Pycharm 使用 (一)

    学习[Python基础教程]到后面的练习阶段就觉得python自带的IDLE有点out的感觉,于是就在网上搜索好用的IDE, 挺多人推荐Pycharm的 不仅跨平台而且还支持django等框架; 初次 ...