Gambit 3.Gambit编译器

翻译 2016年08月30日 09:56:17
gsc [-:runtimeoption,…] [-i] [-f] [-v]
    [-prelude expressions] [-postlude expressions]
    [-dynamic] [-exe] [-obj] [-cc-options options]
    [-ld-options-prelude options] [-ld-options options]
    [-warnings] [-verbose] [-report] [-expansion] [-gvm]
    [-debug] [-debug-location] [-debug-source]
    [-debug-environments] [-track-scheme]
    [-o output] [-c] [-keep-c] [-link] [-flat] [-l base]
    [[-] [-e expressions] [file]]…

3.1参数说明

gsc命令为命令行上的每一个Scheme文件生成对应的c文件。

-i
强制在交互模式下执行。

-prelude
在被编译的源码文件开头追加表达式。 此选项主要用于在命令行上提供的一些声明。

$ gsc -prelude "(declare (not safe))" bench.scm

-postlude
在被编译的源码文件末尾追加表达式。 此选项主要用于提供可启动程序的表达式。

$ gsc -postlude "(start-bench)" bench.scm

-cc-options
该选项只在动态加载被编译的对象文件时有效(即:’-c’和’-link’未使用 )。此选项主要用于指定include路径、符号定义、优化级别,或取消定义等。

$ gsc -cc-options "-U___SINGLE_HOST -O2 -I../include" bench.scm

-ld-options
‘-ld-options-prelude’和’-ld-options’只在动态加载被编译的对象文件时有效(即:’-c’和’-link’未使用 )。它们主要用于指定其它对象文件或链接库。

$ gsc -ld-options "-L/usr/X11R6/lib -lX11 -dynamic" bench.scm

-warnings
在标准输出中显示所有编译器产生的警告信息。

-verbose
在标准输出中显示编译器执行的跟踪信息。

-report
在标准输出报告全局变量的使用情况。

-expansion
在标准输出内嵌入代码之后的源码。

-gvm
为”Gambit Virtual Machine”(GVM) 生成中间代码。

-debug
生成的目标文件里嵌入调试信息。

-debug-location
-debug-source
-debug-environments
生成的目标文件里嵌入源码位置等调试信息。

-track-scheme
生成的目标文件里嵌入源码行号信息。

-o
为输出文件指定文件名。

-c
把Scheme文件编译成c文件。

-link或-exe
一旦其中之一被指定,Gambit 连接器(linker)会被调用。

-
进入REPL 会话模式。

-e
执行其后的表达式。

-flat
-l

3.2生成可执行文件

$ cat h.scm
(display "hello") (newline)
$ cat w.six
display("world"); newline();
$ gsc -o hello.exe -exe h.scm w.six
h.scm:
/Users/feeley/gambit/doc/h.c:
w.six:
/Users/feeley/gambit/doc/w.c:
/Users/feeley/gambit/doc/w_.c:
$ ./hello.exe
hello
world

把环境变量’GAMBCOMP_VERBOSE’设一个非空值,可以查看执行的详细信息。

$ export GAMBCOMP_VERBOSE=yes
$ gsc -o hello.exe -exe h.scm w.six
h.scm:
/Users/feeley/gambit/doc/h.c:
gcc -no-cpp-precomp -Wno-unused -O1 -fno-math-errno -fschedule-insns2
 -fno-trapping-math -fno-strict-aliasing -fwrapv -fomit-frame-pointer
 -fPIC -fno-common -mieee-fp -I"/usr/local/Gambit/include" -c -o "h.o" h.c
w.six:
/Users/feeley/gambit/doc/w.c:
gcc -no-cpp-precomp -Wno-unused -O1 -fno-math-errno -fschedule-insns2
 -fno-trapping-math -fno-strict-aliasing -fwrapv -fomit-frame-pointer
 -fPIC -fno-common -mieee-fp -I"/usr/local/Gambit/include" -c -o "w.o" w.c
/Users/feeley/gambit/doc/w_.c:
gcc -no-cpp-precomp -Wno-unused -O1 -fno-math-errno -fschedule-insns2
 -fno-trapping-math -fno-strict-aliasing -fwrapv -fomit-frame-pointer
 -fPIC -fno-common -mieee-fp -I"/usr/local/Gambit/include" -c -o "w_.o" w_.c
gcc  -no-cpp-precomp -Wno-unused -O1 -fno-math-errno -fschedule-insns2
 -fno-trapping-math -fno-strict-aliasing -fwrapv -fomit-frame-pointer
 -fPIC -fno-common -mieee-fp -I"/usr/local/Gambit/include"
 -o "hello.exe" h.o w.o w_.o "/usr/local/Gambit/lib/libgambit.a"

简单的使用’-exe’选项,有时并不妥当。比如,编译的程序是由多个已经编译好的模块组成的时候。

$ gsc -c h.scm    ; 假设已提前编译
$ gsc -c w.six
$ gsc -o hello.exe -exe h.c w.c

为了更精确的控制编译过程,可以分解成调用C编译器和连接器等步骤。

下面是由三个模块组成的例子(其中一个为c文件)

/* File: "m1.c" */
int power_of_2 (int x) { return 1<<x; }
; File: "m2.scm"
(c-declare "extern int power_of_2 ();")
(define pow2 (c-lambda (int) int "power_of_2"))
(define (twice x) (cons x x))

; File: "m3.scm"
(write (map twice (map pow2 '(1 2 3 4)))) (newline)

(1)根据Scheme文件生成c文件
a.两个Scheme文件可以通过下面三个步骤编译生成连接文件

$ gsc -c m2.scm        # create m2.c (note: .scm is optional)
$ gsc -c m3.scm        # create m3.c (note: .scm is optional)
$ gsc -link m2.c m3.c  # create the incremental link file m3_.c

b.也可以如下一步完成

$ gsc -link m2 m3
m2:
m3:

(2)生成目标文件

到这一步,会有4个c文件(‘m1.c’,’m2.c’,’m3.c’,’m3_.c’)。为了生成可执行文件,必须通过C编译器进行编译并链接Gambit的运行时库。(一般需要指定’-I/usr/local/Gambit/include -L/usr/local/Gambit/lib’以便于查找gambit.h头文件和Gambit的运行时库)

$ uname -srmp
Linux 2.6.8-1.521 i686 athlon
$ gsc -obj m1.c m2.c m3.c m3_.c
m1.c:
m2.c:
m3.c:
m3_.c:
$ gcc m1.o m2.o m3.o m3_.o -lgambit -lm -ldl -lutil -lrt
$ ./a.out
((2 . 2) (4 . 4) (8 . 8) (16 . 16))

-lrt未指定的话,可能出现下列错误信息。

......
os_time.c:(.text+0x340): undefined reference to `clock_gettime'
......

3.3生成可加载库

为了把多个模块编译到一个可以动态加载的目标文件里,需要给链接命令指定flat选项。编译器必须用’-o’选项来指定要生成的c文件。如果动态可加载目标文件的扩展名为”.on”,则选项’-o’指定的文件的扩展名必须是”.on.c”。(c的扩展名也可能是.cc .cpp等)

上例的文件,可以通过如下编译生成链接文件

$ gsc -link -flat -o foo.o1.c m2 m3 > /del/null
m2:
m3:

当编译c文件并链接生成的文件时,必须给编译器指定’-D___DYNAMIC’标志,并且必须告诉链接器生成一个可动态加载的共享库。

$ gsc -cc-options "-D___DYNAMIC" -obj m1.c m2.c m3.c foo.o1.c
m1.c:
m2.c:
m3.c:
foo.o1.c:
$ gcc -shared m1.o m2.o m3.o foo.o1.o -o foo.o1
$ gsi foo.o1
((2 . 2) (4 . 4) (8 . 8) (16 . 16))

3.4生成共享库

共享库可以用增量链接或平面链接(指定flat选项)的方式。增量链接通常用于Gambit运行时被扩展为新的程序。平面链接对于生成原始的运行库很有用,该库不是通过别的库扩展而来。编译和链接是必须指定’-D___LIBRARY’和’-D___SHARED’标志。生成原始运行库是还必须指定’-D___PRIMAL’标志。

生成包含上例前两个文件的共享库

$ gsc -link -o mylib.c m2
$ gsc -obj -cc-options "-D___SHARED" m1.c m2.c mylib.c
m1.c:
m2.c:
mylib.c:
$ gcc -shared  m1.o m2.o mylib.o -o mylib.so

这个共享库mylib.so是一个增量链接文件(它是向运行时扩展了pow2和 twice这两个过程)。这个共享库可以和上例的第三个模块一起,生成可执行文件。

$ gsc -link -l mylib m3
$ gsc -obj m3.c m3_.c
m3.c:
m3_.c:
$ gcc m3.o m3_.o mylib.so -lgambit
$ LD_LIBRARY_PATH=.:/usr/local/lib ./a.out
((2 . 2) (4 . 4) (8 . 8) (16 . 16))

3.5通过程序编译

(compile-file-to-target file [options: options] [output: output] [module-name: module-name])

编译选项通过options来指定的列表,可以由写了选项进行任意组合。
verbose, report, expansion, gvm, and, debug

$ cat h.scm
(display "hello") (newline)
$ gsc
Gambit v4.8.5

> (compile-file-to-target "h")
"/Users/feeley/gambit/doc/h.c"

(compile-file file [options: options] [output: output] [cc-options: cc-options] [ld-options-prelude: ld-options-prelude] [ld-options: ld-options])
$ cat h.scm
(display "hello") (newline)
$ gsc
Gambit v4.8.5

> (compile-file "h")
"/Users/feeley/gambit/doc/h.o1"
> (load "h")
hello
"/Users/feeley/gambit/doc/h.o1"
> (compile-file-to-target "h" output: "h.o99.c")
"/Users/feeley/gambit/doc/h.o99.c"
> (compile-file "h.o99.c")
"/Users/feeley/gambit/doc/h.o99"
> (load "h.o99")
hello
"/Users/feeley/gambit/doc/h.o99"
> (compile-file-to-target "h")
"/Users/feeley/gambit/doc/h.c"
> (compile-file "h.c" options: '(obj))
"/Users/feeley/gambit/doc/h.o"

(link-incremental module-list [output: output] [base: base] [warnings?: warnings?])
$ cat h.scm
(display "hello") (newline)
$ cat w.six
display("world"); newline();
$ gsc
Gambit v4.8.5

> (compile-file-to-target "h")
"/Users/feeley/gambit/doc/h.c"
> (compile-file-to-target "w")
"/Users/feeley/gambit/doc/w.c"
> (link-incremental '("h" "w") output: "hello.c")
"/Users/feeley/gambit/doc/hello_.c"
> ,q
$ gsc -obj h.c w.c hello.c
h.c:
w.c:
hello.c:
$ gcc h.o w.o hello.o -lgambit -o hello
$ ./hello
hello
world

(link-flat module-list [output: output] [warnings?: warnings?])
$ cat m6.scm
(define (f x) (g (* x x)))
$ cat m7.scm
(define (g y) (+ n y))
$ gsc
Gambit v4.8.5

> (compile-file-to-target "m6")
"/Users/feeley/gambit/doc/m6.c"
> (compile-file-to-target "m7")
"/Users/feeley/gambit/doc/m7.c"
> (link-flat '("m6" "m7") output: "lib.o1.c")
*** WARNING -- "*" is not defined,
***            referenced in: ("m6.c")
*** WARNING -- "+" is not defined,
***            referenced in: ("m7.c")
*** WARNING -- "n" is not defined,
***            referenced in: ("m7.c")
"/Users/feeley/gambit/doc/lib.o1.c"
> ,q
$ gcc -bundle -D___DYNAMIC m6.c m7.c lib.o1.c -o lib.o1
$ gsc
Gambit v4.8.5

> (load "lib")
*** WARNING -- Variable "n" used in module "m7" is undefined
"/Users/feeley/gambit/doc/lib.o1"
> (define n 10)
> (f 5)
35
> ,q
举报

相关文章推荐

如何在gambit中简化带隔板的模型(转载)

为了答谢广大博友的捧场,特别炮制了这个简单的教程,时间仓促,思维有点混乱,请将就着看。 在实际模拟中经常会遇到流域中存在薄板的情况,如下图,其实这种薄板的厚度跟流域的尺度相比实在太小了,如果直接划分...

Gambit 5.调试

表达式的执行可能因为下列原因而停止: 1. 运算错误,比如除0。 2. 用户中断运算 (通常是通过输入)。 3. 停在断点上等。 4. 单步模式被启动。 当运算被停...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Exceed 13+Gambit 2.4.6 +Tgrid 安装

Introductions Exceed 是在windows操作系统下提供Unix操作环境的软件,现在已经不再更新,最新版本为Exceed 13。 Gambit 是一种网格生成软件,必须在Unix环境...

Gambit 6.编辑环境

6.1 控制台行编辑 默认情况下控制台启动一个简单的面向Scheme友好的行编辑用户界面。它提供以下几个功能: 匹配左右括号 记录输入命令行的内容,以方便快速输入 自动补全功能 ...

GAMBIT FLUENT 简要介绍

fluent软件的组成: 软件功能介绍: GAMBIT-------用于建立几何结构和网格的生成 FLUENT-------用于进行流动模拟计算的求解器 proPDF------用于模拟PDF...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)