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

2008-01-01から1年間の記事一覧

コンパイラの作り直し

LLPMLが一定の完成度に達したので、Andromeda言語でコンパイラを作り直し始めました。 Andromeda (0.1-20081019) x86以外のCPUにも対応するため、試験的にARMバイナリの出力を行っています。

アセンブラ

ARM

ARMのアセンブラをいじってみました。生のバイナリを確認するにはアセンブルしてから逆アセンブルすれば簡単です。x86のときはnasmとndisasm -uでやっていましたが、binutilsではasとobjdumpを使います。

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にしか対応していないため、実質的にエミュレータでしか動きません。

インポートライブラリ解析ツール

インポートライブラリからシンボル名と序数を調べるツールを作成しました。標準C++で作成したため、UNIX環境でも動きます。 ソース implib.cpp ライセンス パブリックドメイン ターゲット 汎用(標準C++)

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は参照型です。

.NET Compact FrameworkでTwitter

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)

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

ソース整理

C#

クラスが長いと見通しが悪くなります。今まで#regionで折りたたんで整理していましたが、デバッグしていて飛んだときに開くため、意図的にたたまないとそのままになってあまり便利ではありませんでした。 そのため今はpartialクラスをソースの整理に使ってい…

Visual C# 2008に移行

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

Scratch

子どもたちがOSS活動、プログラミング言語「Scratch」が開く未来 本当の意味でコンピュータリテラシーがあるというのは、つまりプログラミングができるということだ――。“パーソナル・コンピュータ”という概念の生みの親で、先進的なプログラミング言語「Smal…

IntelliSense

C#

VC# 2008でIntelliSenseの候補は[Ctrl]で半透明になります。 キャレットより下にあるコードを見ながら書いているときIntelliSenseに隠れることがあります。今までは[Esc]を押してIntelliSenseを消していたのですが、コピペをしようと[Ctrl]を押して気付きま…