🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.implementation
Article #22

Re: OS/GC in Java (Re: c++ or java ?)

#22
From: MAEDA Atusi
Date: Tue, 03 Feb 1998 00:00
106 lines
5902 bytes
kuno@gssm.otsuka.tsukuba.ac.jp writes:

> 久野です。fj.lang.implementationに振りました。

こんなスレッドが盛り上がってるなんて、知りませんでした。
(C++を使わなくなって久しいもんで)。

Katsuya Higuchi writes:

> 言語の中だけで完結することは論理的に不可能です。
> だから、JavaVM から書かなければ絶対に解決しない。
> 
> 前にも書きましたが、この事態は C でも同じで、
> C なら malloc が書けるのかというと実はそうではありません。

この言葉にほとんど尽きている気もしますけど...

「GCがある言語はシステムプログラムが書けない」なんてのは迷信です。「C
ならなんでも書ける」というのも、UnixやWindowsの上ではそんな気がするだ
けの話でしょう。(ANSI Cの定めるポータブルなCの範囲ではlongjmpやva_arg
など書けない事は周知の通り)。

結局、よっぽどtrivialな言語を除いて、完全な自己記述は不可能ですから(こ
れを言語意味論における不完全性定理といいます(ウソ))、言語からはみ出す
部分は何らかのマホウ、あるいはズルを使わざるを得ません。

(1) 言語処理系が作れるか
	CでもJava(etc.)でも、コンパイラやアセンブラやリンカやインタプ
       リタは作れます。
(2) ランタイムライブラリが作れるか
	CでもJava(etc.)でも、言語仕様の規定する範囲では作れません。
	(スタートアップ、終了、メモリ管理、レジスタの退避/復帰など。)
(3) OSが書けるか
	CでもJava(etc.)でも、言語仕様の規定する範囲では作れません。
	(割り込みマスク、排他処理、TLBの処理、intel CPUのI/Oなど...)

(2), (3)とも、多少のズルをすれば *ほぼ* 1つの言語だけで書く事は可能で
す。

ryo@is.s.u-tokyo.ac.jp (KAWAMICHI Ryoji) writes:
> >   Lispコンパイラがあれば、出来ると思いますよ。
> >   OSから何からLispで書かれたLispマシンてのもあるし、
> >   Lispコードを吐くCコンパイラだってある。
> 
> でもそれはあくまで Lisp マシンの上で動くということではないでしょうか?
> (とか言っていると、どこまでの機能を持つものがマシンなのかという議論に
>   なりそうですね)
> 確かに、樽石さんもおっしゃっているように、Java のコードは Java 仮想マ
> シン上で動かすのが自然ですし、Lisp マシンの上で Lisp で書かれたコード
> を実行するのも自然なわけですけど、とりあえず、一般的なごく普通のマシンで
> 動かせるかどうかと考えますと、やはり、Java にしろ、Lisp にしろ、C で書
> かれたモジュールをどこかで使わないと駄目なのではないでしょうか?

# 「Cが存在するずっと以前からLispはありました」という茶々はおいといて...
JavaマシンやLispマシンが特殊で、Cで書かれたOSの走っている環境が「一般
的なごく普通のマシン」という感覚がちょっと良く分かりません。あるいは、

> しかし、私は、「IOポート入出力」「割り込みインターフェース」
> 「スタートアップ」などをアセンブラで書かなければならないことと、
> 「ガーベージコレクション」をアセンブラで書かなければならないことは
> 違うような気がしてならないのです。(やっぱり同じですか?)

なんか、C/C++にない言語機能は「特殊」で、C/C++にある機能は「普通、一般」
と無条件で考えてらっしゃるような気がしますが...

> ですから、Java のソースで GC が書けなければ、Java だけで OS を書くのは
> 不可能なのではと思うのです。

樋口さん、久野さん他のフォローにもありましたが、
(1) 効率を度外視すれば書けるのは明らか。
(2) ちょいと(longjmp, va_arg程度の)ズルをすればJavaでも効率良く書ける。
    例えば
	native int addrToInt(Object);
	native void writeToAddr(byte, int);
    なんてのをいくつか作っとく。カーネル内でだけ使ってユーザに見せない
    ようにすれば良い。native codeに落す部分(バイトコードインタプリタと
    か)では、クロスコンパイラがインライン展開しちゃえば効率はCとそう
    変わらないはず。
(3) C/C++のmalloc, new/deleteも同じようなもの。

で答えになってませんか。

# Cでasm文を使っても、レベルがあんまり変わらないだけにズルした気がし
# ない、というのはあるかも。

Katsuya Higuchi writes:
> 確か LISP の自己記述も結局コンパイラを作る事で解決しているはずです。

(ほとんど)Lispで書いてあるLisp処理系のソースを見てみると、

(defun car (x) (car x))

なんてのに出食わしたりします。コンパイルすると中身の(car x)はインライ
ン展開されてちゃんと動く:-)。

> 「C言語の定義の中で malloc() をC言語で記述せよ」という命題のなかで、
> プラットフォームの情報を malloc() 以外から取得するのは反則です。

ま、仮にvoid *sbrk(ptrdiff_t size)でOSからメモリを取って来るのを許した
としてもですね、複数回のsbrk()呼び出しが返したメモリブロックを互いに比
較した結果は不定ですから、freeをC言語の範囲内で書く事はできません。

「標準規格なんてくそくらえ」という立場なら、どんな言語でもなんでもあり
になっちゃいます。
					前田敦司
Technical Details
Message-ID: <pypd8h558rn.fsf@tp560e.sowa.is.uec.ac.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6aot1k$7gv@utogw.gssm.otsuka.tsukuba.ac.jp> <6asknd$f8v@newsgate.so-net.or.jp> <6b4tdd$otc@newsgate.so-net.or.jp> <vo7afchynkw.fsf@ise12.is.s.u-tokyo.ac.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 10692b,3d5896058105a238
X-Google-Attributes: gid10692b,public
From: MAEDA Atusi <maeda@is.uec.ac.jp>
Subject: Re: OS/GC in Java (Re: c++ or java ?)
Date: 1998/02/03
Message-ID: <pypd8h558rn.fsf@tp560e.sowa.is.uec.ac.jp>
X-Deja-AN: 321626347
References: <6aot1k$7gv@utogw.gssm.otsuka.tsukuba.ac.jp> <6asknd$f8v@newsgate.so-net.or.jp> <6b4tdd$otc@newsgate.so-net.or.jp> <vo7afchynkw.fsf@ise12.is.s.u-tokyo.ac.jp>
Content-Type: text/plain; charset=ISO-2022-JP
Organization: The Univ. of Electro-Communications, Tokyo, Japan
Mime-Version: 1.0 (generated by tm-edit 7.103)
Reply-To: maeda@is.uec.ac.jp
Newsgroups: fj.lang.implementation