2008-01-01から1年間の記事一覧
LLPMLが一定の完成度に達したので、Andromeda言語でコンパイラを作り直し始めました。 Andromeda (0.1-20081019) x86以外のCPUにも対応するため、試験的にARMバイナリの出力を行っています。
ARMのアセンブラをいじってみました。生のバイナリを確認するにはアセンブルしてから逆アセンブルすれば簡単です。x86のときはnasmとndisasm -uでやっていましたが、binutilsではasとobjdumpを使います。
MonoでLLPMLが動くようになったので、FreeBSD上でid:m107さんのh01をコンパイルして動かしてみました。もちろんC#版も動きます。 LLPML版 C#版
Monoでビルドして実行できるようになりました。UNIX系OS上ではLLPMLで出力したバイナリをWineで実行することができます。FreeBSDで動作確認しました。 LLPML (1.1-20080926) System.Collections.Generics.Dictionaryの挙動にハマりました。将来のMonoではMic…
Windows CE(x86)のバイナリが出力できるようになりました。 LLPML (1.1-20080920) PEとしての構造は同じなので、ヘッダのサブシステムを変更しただけです。x86にしか対応していないため、実質的にエミュレータでしか動きません。
インポートライブラリからシンボル名と序数を調べるツールを作成しました。標準C++で作成したため、UNIX環境でも動きます。 ソース implib.cpp ライセンス パブリックドメイン ターゲット 汎用(標準C++)
LLPML 1.0リリースを記念して、id:m107さんのh01を移植しました。自分でテストコードを書くと無意識に問題を避けてしまうので、今回の移植はとても参考になりました。 h01_02adm.zip このようにコンパイラ同梱でソース配布を行うことも、コンパイラを自作し…
独自言語コンパイラLLPMLの1.0をリリースしました。 LLPML (1.0-20080915) それに伴い、内部でネイティブコードの生成に使用しているCompilerLibもLLPMLで使用しているバージョンに更新しました。 CompilerLib (0.6-20080825) 今後はIDEを実装しながら、自分…
クラスを実装しました。クラスには参照カウントが働きます。循環参照への対策は行っていません。 LLPML/v0 (0.21-20080817) .NETと同じようにstructとclassを区別します。structは値型、classは参照型です。
Windows Mobileから.NET Compact FrameworkでTwitterにアクセスしてみました。作成したものをソース付きで公開します。 TwitterWM 以下にハマったポイントなどを書いておきます。
クロージャが使えるようになったので、クイックソートを書いてみました。
クロージャを実装しました。 LLPML/v0 (0.18-20080421) レキシカルスコープによるアクセスを検出して、自動的に引数を追加してdelegateを生成しています。パーサの側でdelegateを挿入することで簡単に実装できました。
委譲を実装しました。機能的にはC++のbindに近いです。 LLPML/v0 (0.17-20080421) JITを利用して実行時にコードを生成しています。そのためC言語にコールバックとして渡せます。ATLで利用されているサンクと同じ手法です。
ラムダ式が記述できるようになりました。実装としては無名関数のシンタックスシュガーです。 LLPML/v0 (0.16-20080410) パーサを色々と整理しました。今まで特別扱いだったメンバアクセス演算子や関数呼び出しなどを通常の演算子と同列に扱うようにしたため…
関数の戻り値の型が指定できるようになりました。 LLPML/v0 (0.15-20080403)
仮想関数を実装しました。 LLPML/v0 (0.14-20080329) 無名関数で実現していたものを言語仕様に盛り込んで、内部で同等のコードに展開すれば簡単にできるかと思ったのですが、内部構造に柔軟性がなかったため予想以上に手間取りました。
無名関数を実装しました。 LLPML/v0 (0.13-20080327) 当初は難易度が高いので後回しにしようと思っていたのですが、関数定義に関数ポインタの値を持たせれば式の中で扱えることに気付きました。そのためすぐに実装できました。
プロパティをサポートしました。 LLPML/v0 (0.12-20080325) プロパティの定義には特別な構文を導入せずに、get_XXX()/set_XXX() という関数を定義します。呼び出し側のパースではメンバが見付からないときに関数に読み替えています。手軽に実装できて便利な…
MMXとSSE2を一部サポートしました。 LLPML/v0 (0.11-20080323) LLPMLには最適化機能がありません。アルファブレンドのコードを少し工夫するだけで動作速度が目に見えて変わりました。更にMMXやSSE2をサポートしたところ、MMXで3倍、SSE2で4.5倍程度の速度向…
整数型のbyteとshortをサポートしました。 LLPML/v0 (0.11-20080306)
関数呼び出しのシンタックスシュガーを実装しました。 LLPML/v0 (0.10-20080212) ラッパーを書かずにC言語のAPIをオブジェクト風に呼び出すことができます。
配列が使えるようになりました。 LLPML/v0 (0.10-20080211) var a[5]; として a[2] = 3; のようにアクセスできます。byte b[4]; のような配列も宣言できますが、byte型をサポートしていないためアクセスするとおかしくなります。次の0.11でサポートする予定…
配列が宣言できるようになりました。まだ配列の要素に添え字でアクセスすることはできません。 LLPML/v0 (0.10-20080203) PAINTSTRUCT構造体が定義できるようになったので、Win32のサンプルで描画を試してみました。
クラスが長いと見通しが悪くなります。今まで#regionで折りたたんで整理していましたが、デバッグしていて飛んだときに開くため、意図的にたたまないとそのままになってあまり便利ではありませんでした。 そのため今はpartialクラスをソースの整理に使ってい…
LLPMLの開発をVC#2008に移行しました。 LLPML/v0 (0.9-20080123) 簡略記法で構造体や関数が記述できるようになりました。C#とJavaScriptを混ぜたような構文です。
子どもたちがOSS活動、プログラミング言語「Scratch」が開く未来 本当の意味でコンピュータリテラシーがあるというのは、つまりプログラミングができるということだ――。“パーソナル・コンピュータ”という概念の生みの親で、先進的なプログラミング言語「Smal…
VC# 2008でIntelliSenseの候補は[Ctrl]で半透明になります。 キャレットより下にあるコードを見ながら書いているときIntelliSenseに隠れることがあります。今までは[Esc]を押してIntelliSenseを消していたのですが、コピペをしようと[Ctrl]を押して気付きま…