Article View: fj.lang.implementation
Article #22Re: OS/GC in Java (Re: c++ or java ?)
From: MAEDA Atusi
Date: Tue, 03 Feb 1998 00:00
Date: Tue, 03 Feb 1998 00:00
106 lines
5902 bytes
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-mailReferences:
<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