-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdocument.txt
375 lines (252 loc) · 14.3 KB
/
document.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
Meiji-Scheme
[環境]
セル数の関係上Windows7以降が望ましい。MinGW GCCでコンパイル。
[起動]
mesh で起動。
起動オプション
-1 ncomp.oコンパイラで起動。(デフォルト)
-2 xcomp.oコンパイラで起動。(改良時用)
-S S式で表現された機械語を与える形式で起動。
ファイル mesh.exe 処理系本体 ncomp.scm ncomp.o コンパイラ本体 xcomp.scm xcomp.o 改良時の予備 initlib.scm initilib.o ライブラリの初期化
[VM仕様]
ニモニック 機械語 機能
NOP 0 何もしない。
HALT 1 実行を停止する。キャッシュした情報を解除する。
CONST x 2 x スタックに定数xプッシュする。
LVAR m n 3 m n 局所変数の値をプッシュする。局所変数の位置はm,nで与えられる。
GVAR 4 スタックにあるシンボルの大域変数の値をプッシュする。
LSET m n 5 m n スタックの最上部を局所変数に格納する。
GSET x 6 x スタックの最上部を大域変数xに格納する。
POP 7 スタックからポップする。
JUMP x 8 x ジャンプする。ジャンプ先は相対アドレスで与えられる。
TJUMP x 9 x スタックの最上部が非#fの場合にジャンプしスタックはポップする。
FJUMP x 10 x スタックの最上部が#fの場合にジャンプしスタックはポップする。
RETURN 11 スタックから戻り番地と環境を得て復帰する。
ARGS n 12 n n個の環境を用意してスタックから移動させる。
CALL n 13 n 戻りアドレス、環境を格納してスタックに積んだ関数の最初へジャンプする。
CALLJ n 14 n スタックに積んだ関数の最初へジャンプする。戻りアドレスなどは格納しない。末尾再帰最適化で使う。
FN n lis 15 n lis n引数のクロージャーを生成してスタックに積む。クロージャーの実行コードはlisにリストとして格納されている。
SAVE x 16 x 戻りアドレスをスタック積む。(現在、使用されていない。)
PRIM x n 17 x n 組込関数を実行する。xは組込関数シンボルまたはその実体のアドレス、nは引数の個数。
DEF x 18 x スタックに積んだクロージャをシンボルxに束縛する。
DEFM x 19 x スタックに積んだ変換子クロージャを伝統的マクロとしてシンボルxに束縛する。
DEFH 20 スタックに積んだ変換子クロージャを健全マクロオブジェクトにし定義時VM環境を保持してスタックに積む。
NEQP 21 スタックに積んだ2つの数値が等価なら#tをそうでなければ#fをスタックにプッシュする。以下同様に2項の数値比較、数値演算。速度を稼ぐために専用命令にしている。
SMLP 22 (< x y)
ESMLP 23 (<= x y)
GRTP 24 (> x y)
EGRTP 25 (>= x y)
ZEROP 26 (= x 0)
ADD1 27 スタックに積んだ数に1を加算する。
SUB1 28 スタックに積んだ数から1を減算する。
ADD2 29 スタックに積んだ数に2を加算する。
SUB2 30 スタックに積んだ数から2を減算する。
GREF x 31 x closure呼び出しのGVAR命令の直後に置換される。手続き呼び出しのアクセスを短時間ですますため。
CATCH 32 継続を捕捉し継続オブジェクトにしてスタックに積む。
PAUSE 33 一時停止。
CAR 34 car
CDR 35 cdr
CONS 36 cons
ADAPT 37 多値を分解してスタックに積む。多値の個数を5ステップ先のアドレスに記憶。
DEFLIB name body 38 R7RSライブラリシステムのために予約
EXPLIB forms 39 同上
IMPLIB forms 40 同上
RESERVE 41~50 将来のScheme機能拡張のために予約
DEFLIB nameリストのライブラリを登録(すでにあればカレントを移動)しカレントをnameに移動したうえでbodyをremake-listする。さらにコンパイル、アセンブルしてVMで実行する。
EXPLIB formsを解釈してexportするシンボルをmodule_tableに登録する。
IMPLIB formsを解釈してexportされたシンボルの実体をimportする側のシンボルとで共有する。
[R7RS以外の独自機能]
デバッグ (mesh debug)ライブラリ
(debug sw) #tでデバッグモード。#fで通常モード。VMを2つもっておりデバッグモードではデバッグのための情報収集の機能をつけた2号vmが起動する。バックトレース,トレース、ステップ,プロファイラ実行が可能になる。以下の手続きはデバッグモードでのみ機能する。
(trace fn1 fn2 ...fnn) トレース。引数なしの場合にはトレース中の手続きを表示。
(untrace fn1 fn2 ... fnn) トレース解除。引数なしの場合は全部トレース解除。
(profiler sw) #t でプロファイルを表示。#fで表示しない。
(step sw) #t でVMをステップ実行する。 #fで解除。
システム用 (mesh system)ライブラリ
(dump addr1 addr2) addr1~addr2のセルを表示する。addr2が省略された場合には10行表示。
(room) セルポインタなど内部情報表示。
(vm1 lis) (vm2 lis) vmで機械語を実行する。
(gbc sw) 引数なしの場合GC実行。#tでGC中に表示。#fで非表示。
(lambda/asm n lis) 引数がn涸のクロージャをlisに格納されたアセンブリをもとに生成する。
(sys-code x) クロージャxの保持する命令列をS式にして表示。
(sys-env x) クロージャーxの保持する環境を表示。
(system str) 文字列strで与えられたコマンドをMS-DOS/Windowsに実行させる。
コンパイラ (mesh compile)ライブラリ
(compile sexp) sexpをコンパイルしてニモニックをS式で返す。
(compile-file file) 文字列fileで与えられたファイルをコンパイルして実行形式のファイル(file.o)を生成する。fileには識別子scmを付加する。例(compile-file "foo") -> foo.o foo.oは(load ”foo.o")で読み込むことができる。Normalは起動時にncomp.oを読み込む、これは 第2版のコンパイラをコンパイルしたもの。これを書き直してコンパイルすればコンパイラを改良、改造することが可能。
(assemble lis) コンパイルされたニモニックを受け取り機械語に変換されたリストを返す。
(macrotrace sw) sw=#tでマクロ展開時にパタンマッチングの様子を表示する。
(macrexpand x) (macroexpand-1 x) Gaucheと同じ。マクロの展開表示。
時間関係 (scheme time)ライブラリ
(time sexp) sexpの実行時間を計測表示。clock()を使っているため精度は高くない。
[セルの構造]
car 4byte
cdr 4byte
aux 4byte
flag enum
type enum
name *char
[データタイプごとの利用状況]
type car cdr aux name
symbol bind trace prop-list pname
closure code env address
continuation code stack env
integer - - -
float double
rational numerator denominator
complex real pointer imag pointer
string immutable? string
vecor *dyba_vector immutable?
bytevector *dyna_u8vector immutable?
char char
code *dyna_vector
stack *dyna_vector
environment ealloc
multiple *dyna_vector
identifier vairable==1 ellipsis==2 bind-name
trad-macro transformer-clo
hygienic transformer-clo env compiler-env
[局所環境データ構造]
動的配列により(m,n)行列を生成。m>=1の部分は旧環境であり旧環境参照する。ひとつの環境は 最初の要素が旧環境のアドレスでその次に(1,j) 要素が並ぶ。 lvar(i,j), lset(i,j)で参照、書き換えをする。これらの命令では要素の(i,j)は数学とことなり0行、0列から始まる。
|-[org1][0,0][0,1]...[0,m]
|
|addr
|- org1 [org2][0,1],[0,2],...[0,m']
[モジュール]
モジュールはR7RS準拠を目指している。
(define-library <name-identifier> body)
(export forms) forms = id, (rename id1 id2)
(import <name-identifier>)
(mesh user) 通常作業領域
(mesh system) コンパイラなどで利用するSUBR
(mesh compile) コンパイラの格納用
(mesh test) テストツール
(mesh debug) デバッグツール
起動時に以下のLibraryをimportしている。
(import (scheme base)
(scheme load)
(scheme write)
(scheme read)
(scheme eval)
(scheme char)
(scheme inexact)
(only (mesh system) macroexpand macroexpand-1)
(only (scheme process-context) exit))
[モジュール管理配列のデータ構造]
module_table 列
行 library-name export-list
0 (mesh user)
1 (mesh system)
2 (mesh compile)
3 (scheme base)
4 (scheme inexact)
5 (scheme complex)
6 (scheme cxr)
7 (scheme lazy)
8 (scheme case-lambda)
9 (scheme eval)
10 (scheme repl)
11 (scheme process-context)
12 (scheme load)
13 (scheme file)
14 (scheme read)
15 (scheme write)
16 (scheme char)
17 (scheme r5rs)
18 (scheme time)
export-list (id1 id2 ... idn)
[継続オブジェクトのデータ構造]
heap-cont
car cont_code
cdr cont_stack
aux (env current_module)
cont_code
0 継続開始アドレス
1 code-pointer-end
2 head
3 tail
4 closure0 address
5 closure0 head
6 closure1 address
7 closure1 head
2n+4 .... 4〜4+2*(code_pointer_end-1) まで継続捕捉時のClosureの情報
継続捕捉時の0番地からtail番地までのコピー
cont_stack
0 スタックの深さ
1 ... スタックのコピー
stack-cont
car stack-pointer
cdr stack-size
aux (env current_module)
stack-structure
0 継続開始アドレス
1 ... スタックのコピー
[多値オブジェクトのデータ構造 ]
0 値の個数
1 ... 各値
[健全マクロ関係 非標準手続き]
(make-syntactic-closure env fv expr)
(syntactic-closure-env x)
(syntactic-closure-freevar x)
(syntactic-closure-expr x)
(symbol->identifier x)
(identifier->symbol x)
(syntactic-closure? x)
(identifier? x)
(identifier-bind! x y) 識別子xの束縛値をyとする。
(identifier-free? x) 識別子xが束縛値を持たなければ#t
(identifier-bound? x) 識別子xが束縛値を持てば#t
(identifier-bound x) 識別子xの束縛値を返す。
(identifier-variable! x) 識別子をパターン変数とする。
(identifier-variable? x) 識別子がパターン変数なら#t
(identifier-ellipsis! x) 識別子を省略子変数とする。
(identifier-ellipsis? x) 識別子が省略子変数なら#t
(global-bound? x) シンボルxがcurrent-moduleで大域に束縛をもてば#t
[record型]
(make-record size obj) 大きさがsizeでその初期値がobjのレコード型を返す。objが省略された場合にはundefが入る。
(record-set! x n y) レコードxのn番目にyをセットする。
(record-ref x n) レコードxのn番目を参照する。
(record? x) レコード型なら#tそうでなければ#f
[数学ライブラリ]
計算実験、数学遊びをするための最低限のものを用意してあります。
(import (mesh math))で利用可能。
定数
pi 円周率
e 自然対数の底
gamma オイラーの定数γ
数学関数
(make-matrix m n) m行n列の行列を生成する。
(matrix-ident n) n行n列の単位行列を生成する。
(matrix-set! x i j y) 行列xの(i,j)要素をyとする。
(matrix-ref x i j) 行列xの(i,j)要素を参照する。
(matrix->list ls) リストlsを行列に変換する。
(matrix-row x) 行列xの行数
(matrix-col x) 行列xの列数
(matrix? x) xが行列なら#t、そうでなければ#f。
(matrix-square? x) xが正方行列なら#t、そうでなければ#f。
(matrix-ident? x) xが単位行列なら#t、そうでなければ#f。
(matrix-zero? x) xが零行列なら#t、そうでなければ#f。
(m= x y) 行列x,yの相等。
(m+ x y) 行列x,yの加算。
(m- x y) 行列x,yの減算。
(m* x y) 行列x,yの乗算。
(m-expt x n) 行列xのn乗。
(matrix-tr x) 行列xのトレース。
(m/ x s) 行列xの各要素をスカラsで除算。
(matrix->list x) 行列xをリストに変換する。
(list->matrix ls) リストlsを行列に変換する。
(vector-math-ref x) ベクタxの要素を参照する。要素は1から始まる。
(vector-math-set! x i y) ベクタxのi番目の要素をyとする。要素は1から始まる。
(sum ls) リストlsの要素の総和
(product ls) リストlsの要素の積
(coprime? x y) x,yが互いに素なら#t,そうでなければ#f。
(divisible? x y) xがyで割り切れるなら#t、そうでなければ#f。
(divisors x) xの約数。
(eqmod? x y n) x,yが法nのもとで等しいか。
(prime? x) xが素数か?
(prime-factors x) xの素因数分解
(phi x) オイラーのφ関数。
(primitive-root? n p) 原始根の判定。nが素数pを法として原始根であるなら#t 素数なら必ず存在するが条件がそろっていなければ #fが返る。
(primitive-root p) 素数pの最小の原始根を返す.
(ind r a p) 指数の計算。原始根rを底として素数pを法としたaに対する指数を求める。
指数は必ず存在するが与えられた値が条件に合わなければ#fが返る。