博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用ECL编译字符游戏的跨平台(Linux/OSX/WINDOWS)可执行文件
阅读量:6451 次
发布时间:2019-06-23

本文共 4174 字,大约阅读时间需要 13 分钟。

hot3.png

用ECL编译字符游戏的跨平台(Linux/OSX/WINDOWS)可执行文件

说明

前面我们用 CLISP 写了一个代码超简短的字符游戏, 不过每次运行时都需要通过 Common Lisp 来加载, 本文介绍一种可以把 Common Lisp 代码编译为可执行文件的方法: 用 ECLCommon Lisp 程序编译为可执行文件.

这里稍微介绍一下 ECL-Embedded Common Lisp, 也就是嵌入式 Common Lisp, 它采用了一种不同于其他 Common Lisp 实现的内部处理, 具体说就是把 Common Lisp 代码翻译为标准 C 代码, 然后调用系统上的 gcc 进行编译. 所以使用 ECL 的前提是安装好 gcc 编译器.

正因为 ECL 的这种内部处理机制, 所以只要是符合 ANSI Common Lisp 标准的代码都可以由 ECL 编译为可执行文件.

而且因为调用了 gcc 进行实际的编译链接, 所以生成的可执行文件体积非常小.

相关编译命令

  • 编译函数 compile-file, 用于把 Common Lisp 源代码编译为 .fas 文件;
  • 构建函数 c:build-program, 用于调用 gcc 生成可执行文件;
  • 全局变量 c::*delete-files*, 用于设置是否删除中间文件.

假设要编译的文件为 c11-cn.lisp, 我们的编译构建命令如下:

(setf c::*delete-files* nil)(compile-file "c11-cn.lisp" :system-p t)(c:build-program "c11-cn" :lisp-files '("c11-cn.o"))(quit)

可执行文件

就以之前我们的那个字符游戏为例, 把它编译为可执行文件, 在 OSX 系统上执行上述命令后, 会生成可执行文件 c11-cn, 如下:

Air:ecl admin$ ls -al c11-*-rwxr-xr-x  1 admin  staff  16004 12 19 01:30 c11-cn-rw-r--r--  1 admin  staff   7898 12 19 01:30 c11-cn.c-rw-r--r--  1 admin  staff   1011 12 19 01:30 c11-cn.data-rw-r--r--  1 admin  staff    527 12 19 01:30 c11-cn.eclh-rw-r--r--  1 admin  staff   2389 12 19 01:28 c11-cn.lisp-rw-r--r--  1 admin  staff  33652 12 19 01:30 c11-cn.oAir:ecl admin$

看看执行的效果:

Air:ecl admin$ ./c11-cn|                                                                ||                                                                ||                                                                ||                 A    A                                         ||                   A                                            ||                                                                ||                                                                ||                                                  A             ||                                @                               ||   A                              A                             ||         A        A                                             ||                                                                ||                                                  A             ||                                                                ||                                                                ||                                                  A             |qwe/asd/zxc 用来移动, (t)eleport-瞬移, (l)eave-离开:

可以看到, 可执行文件非常小, 仅仅 16k, 跟其他 Common Lisp 实现动辄生成几十M的可执行文件相比, ECL 生成的十几K可执行文件简直就是小到极点了(当然小了, 因为本来就是用 gcc 生成的).

但是该有的功能一点也不缺, 而且还具备跨平台的优势.

在树莓派的 Raspbian 系统下进行编译的命令是一样的, 不过可执行文件要稍微大一些, 48k, 如下:

pi@rpi ~/code-staff/ecl $ ls -al c11-*-rwxr-xr-x 1 pi pi 48564 Dec 19 00:01 c11-cn-rw-r--r-- 1 pi pi  7184 Dec 19 00:01 c11-cn.c-rw-r--r-- 1 pi pi   990 Dec 19 00:01 c11-cn.data-rw-r--r-- 1 pi pi   527 Dec 19 00:01 c11-cn.eclh-rw-r--r-- 1 pi pi  2386 Dec 19 00:01 c11-cn.lisp-rw-r--r-- 1 pi pi   130 Dec 18 17:22 c11-cn-make.lisp-rw-r--r-- 1 pi pi 36344 Dec 19 00:01 c11-cn.o-rw-r--r-- 1 pi pi   114 Dec 18 21:01 c11-make.lisppi@rpi ~/code-staff/ecl $ ./c11-cn|                                                                ||                                                                ||                                                               A||                            A                                   ||                                                                ||                 A                                              ||                                           A  A                 ||                                                                ||                                @                            A  ||                               A                                ||   A                                                            ||                                                                ||      A                                                         ||   A                                                            ||                                                                ||                                                                |qwe/asd/zxc 用来移动, (t)eleport-瞬移, (l)eave-离开:

WINDOWS 下编译应该是一样的, 不过需要预先安装好 gcc, 暂时没试验, 后面试验了再补充.

转载于:https://my.oschina.net/freeblues/blog/606836

你可能感兴趣的文章
<译> MIT 为何停掉 SICP?
查看>>
如何解决因float带来的排版问题?
查看>>
Scala Essentials: 隐式转换
查看>>
Java基础:Java核心技术提示的易忽略点 Ch4
查看>>
@autoreleasepool-内存的分配与释放
查看>>
Fescar 发布 0.2.3 版本,支持 Redis 和 Apollo
查看>>
ReThought (二): 如何照顾团队中的新人
查看>>
棉花种子在月球发芽啦!中国或将成首个在太空建“定居点”的国家 ...
查看>>
kubernetes1.9.2基于kubeadm高可用安装教程,包含离线安装包,支持简单快速安装,含视频教程 ...
查看>>
MySQL 笔记整理(19) --为什么我只查一行的语句,也执行这么慢? ...
查看>>
Fescar 全局锁介绍
查看>>
动画库animate.css的用法
查看>>
实战:基于Spring Boot快速开发RESTful风格API接口
查看>>
java List的4种实现类
查看>>
lenovo thinkpad t460s tlp-stat 修复acpi_call
查看>>
04 贝叶斯算法 - 贝叶斯网络
查看>>
引燃抖音短视频源码开发项目的几点原因
查看>>
Android插件化之VirtualAPK框架Jar包开发
查看>>
php分页数据最后一页继续追加第一页数据
查看>>
内存优化篇-String/char[]/byte[]的选择
查看>>