Low Level Programming Markup Language (LLPML) †
XMLと簡略記法(仮称LLP:JavaScript風の言語)のネイティブコンパイラです。CompilerLib?を利用しています。 ⇒ 関連日記
- C#で作成されているため、コンパイラの動作には.NET Frameworkが必要です。
- 出力はネイティブバイナリです。.NET Frameworkに依存しないためランタイムなしで動きます。
- 最終的には自分自身を自分自身で記述して、C#や.NET Frameworkがなくても動くことを目指します。 ⇒ WikiPedia.en:Eating one's own dog food
- 当初計画ではXMLだけですべて記述する方針でしたが、あまりに非効率で自分自身を記述できないと判断しました。1.0までは共存状態のままで進めますが、1.0以降ではXMLはASTのシリアライズ用に特化して、LLPを独立した言語として扱えるようにする予定です。
#ref(): File not found: "LLPML-0.11-20080314.png" at page "LLPML"
作業予定 †
以下の実装が完了して動作の安定が確認された後に1.0をリリースします。
- 【済】
ASTのオブジェクト化
- 【済】
ブロックによる変数のスコープ
- 【済】
関数
- 【済】
構造体
- 【済】
制御構造、算術演算
- 【済】
メンバ関数
- 【済】
コンストラクタ・デストラクタ
- 【済】
継承
- 【済】
簡略記法
- 【済】
配列
- 【済】
整数型
- 【済】
プロパティ
- 【済】
無名関数
- 【済】
仮想関数
- 【済】
関数の戻り値の型
- 【済】
ラムダ式
- 【済】
委譲
- 【済】
クロージャ
- staticメンバ
- new/delete
- 演算子のオーバーロード
- インライン関数
- 文字列型
現在の方針 †
- C言語にC++やC#の要素を取り入れて焼き直したような言語です。
- 構文がJavaScript風なのは、パースが簡単だからです。なるべくC#と同じ記述を取り入れたいと考えていましたが、実装の都合による妥協などもあり、現時点ではC#から乖離しています。
- 自分自身を記述するのに必要な要素を実装します。
- ちょっとした工夫(あれば便利で実装もあまり難しくない機能)もなるべく取り入れます。
- マングリングを避けるため、関数のオーバーロードはサポートしません。
- 自分自身の記述に不要なため、64bit整数型や浮動小数点数型(float, double)はサポートしません。
- 型推論による多相型、もしくは明示的なgenericsは、実装がかなり難しいと思われます。実装が望ましい機能ですが、ちょっとした工夫の枠内を超えているため、現時点では見送ります。
- 以上は必要に応じて変更する可能性があります。
ダウンロード †
- ソース: &ref(): File not found: "LLPML-0.18-20080421.zip" at page "LLPML"; - クロージャ ⇒ 関連日記
- ライセンス: パブリックドメイン
過去のリリース †
- ソース: &ref(): File not found: "LLPML-0.17-20080421.zip" at page "LLPML"; - 委譲、デストラクタのバグ修正 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.16-20080410.zip" at page "LLPML"; - ラムダ式、パイプ演算子、パーサの演算子周りを整理 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.15-20080406.zip" at page "LLPML"; - 引数の型チェック、bool型の追加、キャストのバグ修正
- ソース: &ref(): File not found: "LLPML-0.15-20080403.zip" at page "LLPML"; - 関数の戻り値の型 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.14-20080402.zip" at page "LLPML"; - 型周りの実装を整理
- ソース: &ref(): File not found: "LLPML-0.14-20080329.zip" at page "LLPML"; - 仮想関数、JITによる関数型もどき ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.13-20080327.zip" at page "LLPML"; - 無名関数、メンバ参照のバグ修正、コンストラクタとデストラクタの実装を見直し ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.12-20080325.zip" at page "LLPML"; - プロパティ、値なしreturnのサポート、代入時の符号変換、エラー箇所情報の拡充 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.11-20080324.zip" at page "LLPML"; - メニュー、Win32ラッパー
- ソース: &ref(): File not found: "LLPML-0.11-20080323.zip" at page "LLPML"; - MMXとSSE2の一部サポート、キャストと構造体初期化のバグ修正 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.11-20080314.zip" at page "LLPML"; - 演算子の処理を分離、符号、ポインタ演算、サンプルのタイトル
- ソース: &ref(): File not found: "LLPML-0.11-20080307.zip" at page "LLPML"; - 初期化と型推論のバグ修正
- ソース: &ref(): File not found: "LLPML-0.11-20080306.zip" at page "LLPML"; - 整数型のbyteとshortをサポート ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.11-20080218.zip" at page "LLPML"; - 【暫定】CompilerLibに8bitと16bitの命令を追加
- ソース: &ref(): File not found: "LLPML-0.10-20080212.zip" at page "LLPML"; - ラッパー風のシンタックスシュガー ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.10-20080211.zip" at page "LLPML"; - 配列アクセス、型推論 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.10-20080205.zip" at page "LLPML"; - 埋め込みを<?llp ?>に変更、引数チェックの強制、externの簡略記法、相互参照、ヒープ、サンプルの整理
- ソース: &ref(): File not found: "LLPML-0.10-20080203.zip" at page "LLPML"; - 配列の宣言、Win32サンプル(17.xml)で描画処理 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.9-20080127.zip" at page "LLPML"; - PHP風の<?llpml ?>に簡略記法を埋め込み、HTML風の<script>は廃止
- ソース: &ref(): File not found: "LLPML-0.9-20080123.zip" at page "LLPML"; - Visual C# 2008に移行、簡略記法の適用範囲を拡大 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.9-20071021.zip" at page "LLPML"; - ブロックベースの構造体(移行完了)、サンプルを簡略記法で書き換え ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.9-20071016.zip" at page "LLPML"; - ブロックベースの構造体(移行途中)、簡略記法の適用範囲を拡大 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.9-20071014.zip" at page "LLPML"; - 名前空間の統一、プロジェクト構成の整理
- ソース: &ref(): File not found: "LLPML-0.9-20070930.zip" at page "LLPML"; - 中置記法による数式の簡略化? ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.8-20070926.zip" at page "LLPML"; - エラー表示の改善、castとnullの追加、浮動小数点数算出のサンプル? ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.8-20070924.zip" at page "LLPML"; - 継承 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.7-20070917.zip" at page "LLPML"; - コンストラクタ・デストラクタ ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.6-20070904.zip" at page "LLPML"; - var-ptrを廃止してptrに統合、struct-member-ptrを追加
- ソース: &ref(): File not found: "LLPML-0.6-20070830.zip" at page "LLPML"; - メンバ関数 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.5-20070829.zip" at page "LLPML"; - var-intをvarに改名して型情報を付加
- ソース: &ref(): File not found: "LLPML-0.5-20070826.zip" at page "LLPML"; - 構造体内構造体
- ソース: &ref(): File not found: "LLPML-0.5-20070821.zip" at page "LLPML"; - switch/break/returnの修正、continueの追加、無駄なスタックフレームを抑制
- ソース: &ref(): File not found: "LLPML-0.5-20070819.zip" at page "LLPML"; - 制御構造、算術演算、ウィンドウ表示 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.4-20070817.zip" at page "LLPML"; - IIntValueで変数処理を抽象化
- ソース: &ref(): File not found: "LLPML-0.4-20070816.zip" at page "LLPML"; - 構造体、変数処理の抽象化 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.3-20070815.zip" at page "LLPML"; - 関数の戻り値、コールバック、変数宣言タグの分離、サンプルの整理 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.3-20070814.zip" at page "LLPML"; - 関数 ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.2-20070806.zip" at page "LLPML"; - BASIC風forの追加(0.5でC言語風に仕様変更)
- ソース: &ref(): File not found: "LLPML-0.2-20070805.zip" at page "LLPML"; - ブロックとスコープ ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.1-20070729.zip" at page "LLPML"; - ASTオブジェクト ⇒ 関連日記
- ソース: &ref(): File not found: "LLPML-0.1-20070722.zip" at page "LLPML"; - 最初のリリース ⇒ 関連日記
図形言語の内部処理用を想定しているため記述性は低いです。ASTをXMLで記述するというイメージです。しかしあまりにも記述性が低くてサンプルの作成だけでも苦労したため、簡略記法を導入しました。
以下にもサンプルがあります。
以下には細かい部分でのC言語との比較があります。
標準出力 †
以下のC言語と同等のものを作成します。
#include <windows.h>
int main()
{
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
const char *hello = "Hello, World!\r\n";
DWORD dummy;
WriteConsole(stdout, hello, lstrlen(hello), &dummy, NULL);
return 0;
}
LLPMLでは以下のようになります。
<?xml version="1.0" encoding="utf-8" ?>
<llpml version="0.10.20080205">
<extern module="kernel32.dll" type="std" name="GetStdHandle">
<arg name="nStdHandle" />
</extern>
<extern module="kernel32.dll" type="std" suffix="W" name="WriteConsole">
<arg name="hConsoleOutput" />
<arg name="lpBuffer" />
<arg name="nNumberOfCharsToWrite" />
<arg name="lpNumberOfCharsWritten" />
<arg name="lpReserved" />
</extern>
<extern module="kernel32.dll" type="std" suffix="W" name="lstrlen">
<arg name="lpString" />
</extern>
<int-declare name="STD_OUTPUT_HANDLE">-11</int-declare>
<var-declare name="stdout">
<call name="GetStdHandle">
<int name="STD_OUTPUT_HANDLE" />
</call>
</var-declare>
<string-declare name="hello">Hello, World!
</string-declare>
<var-declare name="length" />
<call name="WriteConsole">
<var name="stdout" />
<string name="hello" />
<call name="lstrlen"><string name="hello" /></call>
<ptr name="length" />
<int>0</int>
</call>
</llpml>
XMLだけでは記述が大変なので、簡略記法が用意されています。
<?xml version="1.0" encoding="utf-8" ?>
<llpml version="0.10.20080205">
<?llp
extern "kernel32.dll" __stdcall
{
GetStdHandle(nStdHandle);
__widecharset WriteConsole(
hConsoleOutput, lpBuffer, nNumberOfCharsToWrite,
lpNumberOfCharsWritten, lpReserved);
__widecharset lstrlen(lpString);
}
const int STD_OUTPUT_HANDLE = -11;
var stdout = GetStdHandle(STD_OUTPUT_HANDLE);
const string hello = "Hello, World!\n";
var length;
WriteConsole(stdout, hello, lstrlen(hello), addrof(length), null);
?>
</llpml>
コメント †