HCl のサイトジェネレーション


HCl ジェネレーション手順

HCl ソースプログラムはss1.cc.hokudai.ac.jp (133.50.33.12) 上のanonymous ftpによって配布されます。IP接続可能でない場合は OMRON LUNA用 SJ600NカセットストリーマあるいはSPARCStation用CMT(/dev/rst8) のみにて配布を。SPARCStation用テープの場合、テープを作成できる マシンの都合上、高密度テープ(3M DC6150)で配布されます。

サイトジェネレーションは次の手順で行って下さい。

  1. まずftpパッケージあるいはテープをunix systemV, 4.2/4.3BSDの システムの作業デイレクトリの下に展開します。(~/hclが適当と思います) System V ではtarの性質上、ファイルのuser idの問題でロードが出来ないことがあります。 その場合はsuper user modeでtarの展開を行って下さい。

    FTPでソースを入手した場合、Sun 3/SPARCstationでは次のように行います。

    % mkdir hcl
    % cd hcl
    % zcat HCL_V1.6.tar.Z | tar -xvf -
    	
    テープにて配布された場合はtarの入力ソースをSUNでは/dev/rst8, Sony NEWSでは /dev/rtu00, OMRON LUNAでは /dev/rst0 としてください。
  2. トップレベルのMakefileを実行します。
    makeを実行し、HCl 核(bin/hcl)を作成します。HCl ver 1.6 release 1.16以降 では標準サポートの機種に関してはmake内で自動的に機種を判別して妥当な Makefileを実行します。現在サポートしている標準プラットホームは OMRON LUNA, LUNA88K, SX9100(UNIOS-SIGMA), SUN SUN3/60,80,260, SPARCStation1,2, SONY NEWS(M68KCPU)です。 あなたのマシンがこれらのいずれかである場合は単に make を実行するだけで CLXを含むmakeが完了します。 自動判別できない機種についても 68000,88100,SPARC CPUに関しては 組み込みのMakefileを 多少変更することで 実行できることが あります。現在のところ、E15,E20,E30,X20, OKI if1000-10, Sun3 ,SPARCstation, Omron SX9100, SX9100/DT(LUNA),Sony NEWS,Data General AViiON等に対応したmakeが 定義されています。しかしLUNA,LUNA88K.SPARCStation以外の機種について は開発者が当該機種を保有していないため動作は保証されません。

    ソースに問題がなければ30〜2時間でbin/hcl(HCl 核)及びbin/hcl.savが できあがります。

  3. 正しくmakeが終了したならば、カレントデイレクトリをbinに移し、hclを実行します
    % cd bin
    % ./hcl
    HCL Version 1.6, Release 2.0 (Last change: July 20, 1991)
                     [April 29, 1991,The Green-Day version] 
                     (C) Tsuyoshi    Yamamoto,
                         Hokkaido  University.
    
    
    Starting Lisp Listener [USER]
    [1]->
    	
    となりhclが起動します。

SUN SPARCStation JLE環境下でのmakeの注意事項

SPARC版HCl のmakeではカーネルの作成時にsedを 用いてマクロ展開を行っている部分がありますが、SUN JLE環境のSun3,SPARC では付属のsedによるマクロ展開がうまくいかない場合があります。 その場合には標準(JLEパッチの当たっていない版)のsedを使用して make を行ってください。

System V の機種での注意

配布されるtar形式ファイルのユーザーIDやグループIDが開発元のそれ になっているので、System Vの機種ではそのままではロード及びmakeができません。 ロードはおそらくスーパーユーザーモードで行うと思われますから、ロード終了 後直ちに全ファイル、デイレクトリのオーナーを自分自身に変更したほうが良い と思います。

HCl の使用環境

HCl を使用する場合に実際に必要なファイルはhcl,hcl.sav の2本だけです。 このうちhclはa.out形式の実行ファイルですがhcl.savはhclがスタート直後に 読み込むもので単体で実行はできません。したがってHCl をインストール する場合、hclはそれがおかれるデイレクトリにpathを設定すればよいのですが、 hcl.savについてはカレントデイレクトリに存在するか、あるいは 環境変数HCL_IMAGEにpathnameに設定されている必要があります。 標準的にはhcl,hcl.savとも~/bin/におき、環境変数pathに ~/binを加え、
%  setenv HCL_IMAGE ~/bin/hcl.sav
	
を行うことが勧められます。別の方法としてaliasによって コマンド名lispを特定のhcl及びhcl.savに結合する方法も考えられます。\\ 例えば
%  alias lisp /usr/local/bin/hcl -e /usr/local/bin/hcl.sav
	
はlispというコマンド名をhcl,hcl.savに結合します(*) この定義を.cshrcにいれておくことによりどのデイレクトリにいてもHCl を イニシャライズ付きで開始できるようになります。
(*)Emacsの 外部lispモードはaliasを参照しないようである。従ってこの状態で M-x run-lispとしてもHCl は起動されない。 詳細は付録Emacs参照。

Makefileについて

hclのmakeはhcl(a.out形式)の作成(src/make*),faslファイルの作成およびhcl.sav(fasl/Makefile) の2段階で行われています。hcl.sav作成の段階では 動作パラメータとしてheap,stackの大きさの設定も行っています。 必要に応じてMakefile中のloadhclの引数を変更すること により所望のhcl.savイメージを得ることができます。 loadhclの引数として-m,-sが指定可能です。配布時のMakefileでは以下のようにパラメータが設定されています
 (cd fasl; loadhcl -m 2000 -s 64)
	
これはheap領域を2000KB、stackを64KB割り当てます。heap領域には コンパイルされた関数の実体以外の全lisp objectが格納されます。 ここでstackとはhclが内部で使用するdata stackを 指します。現在の版のHClでは他に program stack, lexical environment stack(*) , dynamic environment stackがあります。 このうち、lexical environment stack, dynamic environment stackには data stackの$1/4$の大きさが割り当てられます。Program stackはOSが 動的に与えるので制限はUnixの制限と同じになります。

現在のHCl では構造上、これらのサイズを実行中に動的に変更することは 出来ません。従ってアプリケーションが極めて大量のstack,heapを要求する場合 は予め大きめのhcl.savを作成しておく必要があります。System VのUnixでは heapを実記憶以上に割り当てることが出来ない場合があります。その場合、 loadhclはHeap allocation error.で異常終了します。 この場合は-mの引数を小さくして試みて下さい。-mは最低1000でも 動作します。


(*)lexical environment stackはインタプリタのみが使用する

HCl の終了

HCl からの脱出はCTL-Dあるいは関数(bye &optional val)によります。 HCl の終了コードはvalで指定できます。CTL-D で終了した場合はデフォルト値の0でシェルに帰ります。

カーネルfaslファイルの作成について

hclはhcl.savを作成するために多量のlispレベルで定義された関数を読み込み ます。lsp/*.lsp,comp/*.lspのライブラリ関数を再定義した場合や 追加ファイルを作成した場合はfaslに対するmakeを行う必要があります。 このためにfasl/Makefileが用意されています。 lispレベル関数の再コンパイルは次の手順で行います。
% cd fasl
% make
	
Makefileはfasl/*.faslを消去し、すべてのlispレベル定義関数を最初から 再コンパイルします。このブートストラッププロセスは機種にかなり依存しま すが、最大3時間位かかることを覚悟してください。 HCl 核に含まれるソースファイル(hcl/lsp/*.lsp) を一本毎に再コンパイルして再ロードすることも可能です。 その場合はhcl/faslにおいてHCl を立ち上げ、
% cd hcl/fasl
%../bin/hcl -e ../bin/hcl.sav
HCL Version 1.6, Release 2.0(Last change: July 20, 1991)
                 [April 29, 1991,The Green-Day version] 
                 (C) Tsuyoshi    Yamamoto,
                     Hokkaido  University.


[1]-> (compile-file "../lsp/xxxx.lsp" :output-file "xxxx.fasl")
;; Compiling ../lsp/xxxx.lsp 
	
を実行します。その結果、*.faslが更新されます。その後、HCl を終了し、 loadhclを実行して新しいhcl.savを作って下さい。コンパイル後HCl を終了せず にloadすると古い関数定義のコードが残っているためHCl のサイズが少し大きく なります。

アプリケーションイメージの作成について

hcl上でアプリケーションを作成した場合、ロードが完了した時点でその状態の スナップショットを作成することができます。 これによってアプリケーションプログラムの立ち上げを大幅に短縮できます。
% hcl
HCL Version 1.6, Release 2.0(Last change: July 20, 1991)
                 [April 29, 1991,The Green-Day version] 
                 (C) Tsuyoshi    Yamamoto,
                     Hokkaido  University.


Starting Lisp Listener [USER]
[1]->(load "....")    ;;loading programs
t
[2]->(in-package 'foo)
t
[3]FOO->(system:freeze "foo.sav") ;; saving snapshot
t
[4]FOO->^D
See ya bye...
% hcl -e foo.sav        ;; starting with foo.sav
HCL Version 1.6, Release 2.0(Last change: July 20, 1991)
                 [April 29, 1991,The Green-Day version] 
                 (C) Tsuyoshi    Yamamoto,
                     Hokkaido  University.


Starting Lisp Listener [USER]
[1]FOO->                ;; Restart from freezed point.
	
*.savファイルはHCl の動的環境全てを含みますから一般に大きくなります。 HCl 単体ではMC68030で1.5MB程度ですがCLXを含んだ場合には3MB、 reduce3.3では4MBぐらいになります。 *.savファイルはフリースペースやスタックを含みません から、大きなheapやスタックを宣言してもそのサイズが大きくなるわけでは ありません。 system:freezeはoptional引数 としてホットスタート直後に実行するformを指定できます。
例えば
[2]->(load "foo")
Loading foo.fasl, completed.

t
[3]->(system:freeze "foo.sav" '(begin))
t
	
とすればfoo.savをロード後、(begin)を評価し、その後トップレベルループに 入ります。 freezeによって作られる*.savファイルはhclとペアですから、後で HCl をmakeなどによって作り直した場合に一般に以前に作られた*.savファイルは 使えなくなります。その場合は新しいHCl の上で再度loadを行って*.savを作り直して 下さい。loadhclによって作成される標準のHCl はイニシャライズ関数 として(system::init-function)を定義してあります。 これは~/.hclrcが存在すればそれをスタート時にloadによって 読み込み、各ユーザ毎に内部パラメータをカストマイズするために用いることを 想定しています。対応するファイルが存在しなければ何もしません。 例えば、ほとんどEmacsで仕事をする方ならば
(system::emacs-mode t)
(proclaim '(optimize (speed 3)))
;;
;; End of initialization
;;
	
という内容を~/.hclrcに入れておけばいつもEmacsモードでHCl を立ち上げる ことが出来ます。
もくじ