【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

LLPML

1.0リリース

独自言語Andromedaのコンパイラver.1.0をリリースしました。 ソース閲覧: https://bitbucket.org/7shi/andromeda/src/95cc549d01b4 ダウンロード: https://bitbucket.org/7shi/andromeda/downloads ライセンス: パブリックドメイン 開発当初から自分自身のコ…

Andromeda for Silverlight

自作言語AndromedaをSilverlightに移植しました。Win32バイナリを出力するネイティブコンパイラです。動作確認とソースのダウンロードは以下です。 Andromeda for Silverlight Andromeda クラスマップ ツリーのSamplesからビルドしたいサンプルを選んで[Buil…

まとめ

LLPMLからAndromedaまでの開発を振り返って、アーキテクチャをスライドにまとめました。LLPMLSlideShareははてなダイアリー対応なので、embedコードをブログの本文にコピペするだけで貼り付けることができました。

無名クラス

無名クラスを実装しました。局所的な型に名前を付ける手間を省きます。 LLPML (1.7-20090115) 同じ書式で継承(Java風)と初期化(C#風)を記述できます。

GUIコントロールの追加

AndromedaにGUIコントロール(Win32ラッパー)を追加しました。LLPMLの問題もいくつか修正しました。 Andromeda (0.2-20090112) LLPML (1.6-20090112) ボタンを押すと終了する簡単なアプリケーションは次のようになります。

h01

MonoでLLPMLが動くようになったので、FreeBSD上でid:m107さんのh01をコンパイルして動かしてみました。もちろんC#版も動きます。 LLPML版 C#版

Mono対応

Monoでビルドして実行できるようになりました。UNIX系OS上ではLLPMLで出力したバイナリをWineで実行することができます。FreeBSDで動作確認しました。 LLPML (1.1-20080926) System.Collections.Generics.Dictionaryの挙動にハマりました。将来のMonoではMic…

Windows CE(x86)対応

Windows CE(x86)のバイナリが出力できるようになりました。 LLPML (1.1-20080920) PEとしての構造は同じなので、ヘッダのサブシステムを変更しただけです。x86にしか対応していないため、実質的にエミュレータでしか動きません。

h01の移植

LLPML 1.0リリースを記念して、id:m107さんのh01を移植しました。自分でテストコードを書くと無意識に問題を避けてしまうので、今回の移植はとても参考になりました。 h01_02adm.zip このようにコンパイラ同梱でソース配布を行うことも、コンパイラを自作し…

1.0リリース

独自言語コンパイラLLPMLの1.0をリリースしました。 LLPML (1.0-20080915) それに伴い、内部でネイティブコードの生成に使用しているCompilerLibもLLPMLで使用しているバージョンに更新しました。 CompilerLib (0.6-20080825) 今後はIDEを実装しながら、自分…

クラス

クラスを実装しました。クラスには参照カウントが働きます。循環参照への対策は行っていません。 LLPML/v0 (0.21-20080817) .NETと同じようにstructとclassを区別します。structは値型、classは参照型です。

クイックソート

クロージャが使えるようになったので、クイックソートを書いてみました。

クロージャ

クロージャを実装しました。 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)

仮想関数とJIT

仮想関数を実装しました。 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のサンプルで描画を試してみました。

Visual C# 2008に移行

LLPMLの開発をVC#2008に移行しました。 LLPML/v0 (0.9-20080123) 簡略記法で構造体や関数が記述できるようになりました。C#とJavaScriptを混ぜたような構文です。

コンストラクタ名

構造体の実装の移行が完了しました。 LLPML/v0 (0.9-20071021) ブロックベースの実装のため、メンバ変数の初期化を普通の変数宣言と同じ書式で行えます。初期値代入やコンストラクタとの兼ね合いで、仕様を変更しています。

構造体を再実装

クロージャを検討したときに、関数を関数オブジェクトに見立てれば構造体を表現できるということに気付きました。それに沿ってブロックベースで構造体を再実装しています。 LLPML/v0 (0.9-20071016) プロトタイプベースの考え方でメソッドを定義すると、クロ…

クロージャ

今の仕組みのまま、特別な拡張なしにクロージャを実現できないか考えてみました。結論から言うと見送りですが、せっかく検討したので記録を残しておきます。

簡略化

数式に中置記法を取り入れて簡略化しました。 LLPML/v0 (0.9-20070930) 使用できるのはタグの子要素に限られます。フローなどはXMLのままです。そのため一見あまり変わらないように見えますが、数式部分は劇的に書きやすくなっています。HTML内のJavaScript…

記述性

昨日作ったC言語の浮動小数点数算出プログラムをLLPMLに移植してみました。特に問題なく動きます。出力するコードは問題なさそうです。ちなみに出力するコードに最適化はまったく施されていませんが、仕様が完全に固まるまでは最適化は行わない予定です。 LL…