Mona.NET/ログ の変更点



 [[Mona.NET]]
 
 * Mona.NET/ログ [#n5709456]
 
 ** アンケート [#y57f9040]
 
 適切な項目がない場合は追加してください。
 
 - Q 呼び出し規約について
 #vote(興味なし[1],意味不明[0],stdcallの方がCILに近い[6],UNIXで開発に参加してやるからcdeclにしろ[0])
 
 - Q 楽しんでいただけましたか?
 #vote(興味なし[0],何がやりたいのか意味不明[3],つまらん[0],こんなもの実用になるわけがない[0],アホなことに労力を費やすな[0],いつかやると思った[15],最高でーーす[2])
 #vote(興味なし[0],何がやりたいのか意味不明[3],つまらん[0],こんなもの実用になるわけがない[0],アホなことに労力を費やすな[0],いつかやると思った[15],最高でーーす[3])
 
 ** 動機 [#x84c14ee]
 
 - フリーでOS非依存のx86コードが吐けるオブジェクト指向言語のコンパイラは、現実的にはC++のものしか存在しません。
 - C++は便利に使おうと工夫すればするほど見た目が複雑怪奇になります。使う前の段階で拒絶されては工夫の意味がありません。
 - 新しい言語とコンパイラを作るのは現実的ではありません。
 - 最小限の手間で既存の言語のコンパイラを用意する方法として、MSILに着目しました。
 -- 現段階でコンパイラ自体は既存のものを使って、バイナリトランスレーションをかければ一応動くことは確認しました。
 -- 標準ライブラリのうち言語仕様自体が依存している部分をトランスレーションすることができれば完成です。Object, Int32, Stringなどが該当します。.NET Frameworkのミニマムサブセットと言えるでしょう。
 -- 標準ライブラリ全体をトランスレーションすることは視野に入っていません。汎用的な.NETネイティブコンパイラは目的外です。
 - つまり普通の言語として使える状態に持っていくことまでが対象で、それ以降は普通にアプリケーションやライブラリなどを書くことになるでしょう。
 -- 換言すれば、VMなしの独自の環境で開発言語としてC#が使用できる状態にまで持っていくことが目的です。
 --- .NET FrameworkではなくC#というところがポイントです。
 -- その際にライブラリは.NET Framework互換である必要はありません。
 
 ** 問題点 [#y74b5452]
 
 - mscorlib.cが複雑過ぎます。
 -- C言語でオブジェクト指向を表現するための概念は[[COOL:http://www.sage-p.com/process/cool.htm]]が参考になります。
 -- 既に人間の手で書けるレベルを超えています。
 --- まるでジェネレータで自動生成したかのようです。
 -- C++を使わないのはコンパイラによってマングリングの規則がまちまちでアセンブリから参照するときに厄介なためです。
 --- g++の場合はc++filtを参照
 --- 現時点のMona.NETの実装では単純に戻り値や引数の型まで_でつないでマングリングしています。
 -- 仮想関数を自前vtableで手動管理する時点で破綻しています。
 --- とは言えXlibではこのやり方でやっているのですよね。
 -- MSILに合わせて全部__stdcallにしていますがこれでいいのでしょうか?
 --- @4を付けるのもcallの後にスタック解消コードを挟むのも手間としては同じでしょう。どのみち自動生成ですので、どちらでも大差ありません。
 --- 現時点では__stdcallの方が余計なpopがなく自動生成したアセンブリが短くなるので__stdcallを使っています。
 -- mscorlib自体もC#で書いて、それも変換するのが理想的ですが、以下の条件が満たされる必要があるため、現時点では絵に描いた餅です。
 --- 変換でクラスや関数をサポートする必要があります。現時点では.entrypointの関数しか変換していません。
 --- 変換でP/Invokeをサポートする必要があります。
 --- unsafeとかpinとかマーシャリングとかどうしよう……。
 -- ちなみにMonoではcorlibもC#で記述されています。
 - 最適化がまったくなされていません。
 -- MSILのスタック依存のコードをそのまま焼き直しています。
 --- レジスタはeax, ebp, espしか使っていません。
 -- 1〜1000まで足すような簡単なループだとある程度の大きさまでは変換後のバイナリが速いですが、ある程度の大きさを超えるとC#で作成したexeに追い抜かれます。
 -- MSILはコンパイラが生成する決まったパターンがあるので、それに合わせてレジスタを使うなりすればかなりましになると思われます。
 --- そのためほぼ完璧な逆コンパイラなども作れるわけです。→[[Anakrino:http://www.saurik.com/net/exemplar/]], [[Reflector for .NET:http://www.aisto.com/roeder/dotnet/]]
 -- でもどのみち自動生成することなので、後で直そうとしたら手動で全部書き直しという事態になるわけでもないですから、一定の水準に達するまでは放置しても問題ないでしょう。

リロード   新規 編集 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.005 sec.