第 212 回 PTT のお知らせ


日時: 1995年10月26日 (木) 18:30 から
場所: 工学部6号館1階大会議室 (103号室 内線 6948)
	(19時を過ぎると正面の玄関が閉まってしまうので, 遅れて来た人は玄関
	にある内線電話で大会議室にいる人を呼び出して下さい)

	安 |            |        |  |       |   |
	田 |            +--------+  +-------+   -
	講 |                                       正門
	堂 |            +--------+  +-------+   -
	---+            | 法文   |  | 工学部|   |
	                |        |  | 列品舘|   |
	                +--------+  +-------+   |
	                                        |                             
	---------+  +-------+             +----+|                             
	工学部   |  |工学部 |             |工11||
	2号館    |  |6号館  =入口         |    ||                             
	         |  |       |             |    ||                             
	---------+  +-------+             |    ||                             


話者: 森信 拓,原口 幸一郎,小林 広和 (東大)
題目: emacs のソースを読んで:ソース読み会について
概要: 先日演者達は八王子セミナーハウスで2泊3日でemacsのソースの読み 会に参加した。この発表では、どのような形式で読み会が行なわれたかと、ソー スの中の興味深いと思われた点を紹介する。



食事: 今回は食事はありません。
次々回: 1995年11月16日 (木) 電通大



葉書の残りは 枚です

差出人、幹事:
東京農工大学 工学部 電子情報工学科 並木美太郎

第 212 回 PTTメモ


日時: 1995年10月26日(木) 18:30〜
場所: 東京大学 工学部6号館1階大会議室
話者: 森信 拓、原口 幸一郎、小林 広和
出席者: 金子裕之, 佐々木崇郎(慶応大), 岩崎英哉, 小林広和, 下國治, 高橋和久, 立山義祐, 田中哲朗, 寺田実, 原口幸一郎, 森信 拓(東大), 小熊寿, 金井秀明, 鈴木貢, 多田好克, 中山泰一, 増田義朗(電通大), 田中淳裕(NEC), 並木美太郎, 早川英一(農工大), 伊知地宏, 佐口泰之, 中津利秋(富士ゼロックス), 石畑清(明大)
質疑応答: ・森信 拓

毎年10月辺りに東京大学の情報科学セミナーという授業として2泊3日で ソース読み会が行なわれている。発表者達は今年このセミナーに参加した経 験を基にして、感想や興味深いと思われた点が色々あった。
実際のソース読み会は1995年の10月に2泊3日をかけて大体20時間 ほどかけて行なわれた。題材はEmacs Lispが使われて、ソースコード全部は 読まなかったが、lispが動くための重要な部分やEmacs Lisp特有の部分は読 んだ。
Emacs Lispは基本的にlispプログラムを書くために使用することが出来るデ ータタイプが7種類あり、それらはヘッダファイルlisp.hに記述されている。 この7種類とはInt型、シンボル型、ストリング型、VectorLike型、Cons型、 Float型、そしてMisc型である。
lisp.hで興味深かった他の点として、Forwarding Pointerの存在が挙げられ る。これはLispの組み込み関数がCでの変数などを参照したい場合、Cのデー タ型とLispのデータ型では同じInt型でもLisp型には最初の4ビットにマーク ビットなどが入ってしまうから、共通に使えないという特徴を緩衝する物で ある。他にはいくつかの面白いマクロの使用法などがあった。

・質疑
Forwarding Pointerを使う時、例えばInt型でなくもっと複雑なデータ型だっ た場合、難しくないか?という質問がありました。この点については、Emacs LispではInt型にしかForwarding Pointerは使われてない、という答えになり ました。


・原口 幸一郎
Emacs Lisp の特徴の1つに、バッファローカル変数の存在が挙げ られる。バッファローカル変数とは、各マルチプルバッファでローカ ルな値を持つことのできる変数のことである。fill-column に代表さ れるように、最初からバッファローカルな属性になっている変数もあ るが、ユーザも自由にバッファローカル変数を作成したり削除したり することができる。担当の原口は、make-local-variable、make- variable-buffer-local、set の各コマンドについて、そのデータ構 造を中心にインプリメンテーションの方法を紹介した。


・小林 広和
Emacsのメモリ管理について説明した。
Emacsにはpure strageとnormal strageの2種類がある。
EmacsのGCはconsでなくevalの中で呼ばれる。
メモリのアロケーションは、リンクを用いたblock構造をmallocし その中にデータをとるのを基本としていて、さらに3つの場合に分 けられる。その3つの場合は、フリーリストからとblockの拡張で データをアロケートするInt、Symbol、Cons、Misc、Float、 可変長の専用BlockをアロケートするVector、 また固定長のblock内にデータをとるstringと可変長の専用blockを とるLarge stringである。
GCは、mark-and-sweep法を用いている。
GCは、Markにおいてはリカーシブコールを減らそうとしており、 stringはデータのcompactionによる移動が行なわれるためポインタ反転法 を使用している。
Sweepはcons、float、symbol、などはゴミをフリーリストにつなぎ、 buffer、Vector、Large Stringなどゴミになったらゴミになった領域をfreeし、 stringはcompactionを行なう、という3通りのアルゴリズムに分けられる。

質疑
1.Emacsのキー入力がない時に起動されるGCはどのように起動されるのか?
読んでないので分からないと答えました。誰か他の方が説明してくれた ような気がします。
2.stringはcopyを行なっていないのか?
stringは2つの領域を使ったcopyではなく、同じ領域内での詰め替えのみ が行なわれている。
以上です。