コラムってかんじで、、、C言語置換言語の要件

twitterの履歴を見てたら、なにやら、タグ指向言語がどうのという、話をalohaさんとid:RiSKさんが話してたので、
その話をしたいナァなどとつぶやいた。
そしたら、alohaさんが今からでもとかいいはじめ、YTさんがいろいろ話して
自分なりに考えがすこし進んでよかったです。
この中の、5番の話題について詳しく話してみたいのでした。


そんなわけで、とにかく、C言語をパースしたい。したいけどできない。
そんなあなたにCIL。しかしOcamlなんて久しく使ってないからサッパリわからない。
w_oさんの日記見て修正をちょっとやってみて終わる。
というか、CILつかってプロトタイプのSafe Fail C for Javaを作ったらしい。
うぉ、すげー。東北大入りてー。オープンキャンパスって30日なのかいきてー。
っていうか入試問題見てみる。仮想メモリの問題見て、やってみてよくわかってないなってことでwikipedia読む。
とかやってて終わる。
S式で全部出しときたい。XMLでもいいけど、とにかくS式でいい。
なんか、プリンターとかあるのでそのへん書き換えたほうがいいのかもしれないんだけど、、、。
このOcamlってやつはやっぱ、わかりにくい言語だナァ。ってことで今日は終わった。
とりあえず、GTypeあたりを出力しようとしてたのだけど、メンドクサイ。
なんか、なにがどうなってるのかよくわからん。くそっ。
型推論効いてないほうがこういうときはありがたいんだなと思ったりする。

open Cilversion

let _ =
  if Array.length Sys.argv < 2
  then (print_string "e-\n"; exit(0));;

let f:Cil.file = Frontc.parse Sys.argv.(1) () ;;

print_endline("(");;

print_endline("(cilVersion \"" ^ Cilversion.cilVersion ^ "\")");;
print_endline("(fileName \"" ^ f.Cil.fileName ^ "\")");;
print_endline("(globals ");;

let callback a = (
	let loc = Cil.get_globalLoc a in
	if loc = Cil.builtinLoc then ()
	else match a with
	| Cil.GFun (f,loc) -> print_endline ("(GFun " ^ f.Cil.svar.Cil.vname ^ ")")
(*	| Cil.GType (typ, l) ->print_endline( typ.Cil.ttype) *)
	|                _ -> ()
)in

(List.iter callback f.Cil.globals);;

(* print_endline(f.Cil.globinit);; *)
(Printf.printf ")\n(globinitcalled %B)" f.Cil.globinitcalled);;

print_endline(")");;


1.OSを作ることができる。
 C言語は高級アセンブラとして使うものでUNIXを作るための言語だ。
 当然OSを書くことができる必要がある。


2.GCを含まない。
 C言語GCを書くための言語であるべきだ。
 だからGCがなくても動くプログラムを書ける必要がある。
 GCを導入するとするならば、CPU,OS,VMがすべての言語で使えるGCを用意した場合と、
 ライブラリによってGCを導入する場合の2通りが考えられる。
 ただし、VM用のC言語ならすでにJavaC#などがある。
 ライトウェイトな言語の多くはGCを備えている。
 したがって、GCをライブラリとして使うための便利な機能があるとよいだろう。
 たとえば、メモリアロケーションを独自実装に置き換える機能などがそれだ。
 他に、スマートポインタのような機能も扱えると良いだろう。
 メモリの自動回収には、どこから参照されているかが重要だからである。
 スクリプト言語C言語レベルの言語が同じメモリ管理機構を使って書くことができれば、
 拡張機能をきれいにC言語レベルの言語で書くことができるだろう。


3.他の言語から使われるものを作るものなのだからAPIを簡単に取り出せるものであるとよい。
 ポーティング作業は大変な作業なので、自動化を簡単にできる仕組みが欲しい。
 C言語ではマクロによりいろいろな機能を実装できるが結果として判別が難しくなっている。
 定数なのか、列挙なのか、インライン関数なのかわからない。


4.C言語よりはメモリを使ってよい
 昔と違って今は大量のメモリがある。だから、コンパイラはメモリは多少、多く使ってもよい。


5.式言語ベースである。
 式言語ベースにすることによってLISPのマクロと同等のことを行うことができるようになるだろう。
 式言語ベースにすれば比較的簡単にパーサが作れるようになる。
 パーサを簡単に作れればポーティング作業も簡単になるだろう。
 式言語ベースであることによって、Haskellやml、cleanのような言語のノウハウも取り入れることができ、
 XMLの研究の成果を取り入れることもできるだろう。
 

6.C言語からの完全なコンバータが存在していること。
 いくらすばらしい言語ができたとしても、既存の資産を生かせないと本当の置き換えを行うことはできない。
 しかし、C言語からの完全なコンバータが存在していればすべて置換えが可能だ。
 おそらく、もっとも難しいのがプリプロセッサの問題だ。
 それはなんとか、デバッガの技術を使って解決できることを期待する。
 また、CLIというocamlC言語のパーサ&アナライザーがある。これは安全なC言語を作成するためのツールとしても使われている。


7.オブジェクト指向はサポートしない
 C言語プログラミング言語を書くための言語でもある。
 したがって、あるひとつの指向にとらわれた機能をサポートするべきではない。
 C言語オブジェクト指向をサポートせず、C++やObjective Cのような形でオブジェクト指向がサポートされた。
 同じように、拡張によってサポートできればよい。
 できることなら、マクロで拡張できれば最高だろう。


8.型推論
 今や型付き言語についていて欲しい機能ではないだろうか?
 プログラムを短く書くことができることはいいことだ。


9.末尾再帰最適化
 再帰的にロジックを考えたほうが良い場合


10.クロージャ
 高階関数を使いたい場合などは欲しい機能だと思う。
 問題はメモリ管理。


11.例外
 例外はオブジェクト指向ではないし欲しい機能だと思う
 問題はおそらく、スコープから抜けた場合の自動デストラクタ的


12.ブレースを使う
 見た目、C言語っぽいのがいいと思う。endで終わるのは支持得られない気がする。

13.参考となる言語一覧、順不同

BCPL、B言語、C言語C++Objective-CJavaC#D言語pascal、Ada、Limbo、JavaScriptActionScriptHaskellOcaml、Clean、ScalaErlang