- 追加された行はこの色です。
- 削除された行はこの色です。
#topicpath
#contents
* Low Level Programming Markup Language (LLPML) [#pe9ff953]
XMLと簡略記法(仮称LLP:JavaScript風の言語)のネイティブコンパイラです。[[CompilerLib]]を利用しています。 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!595.entry]]
- C#で作成されているため、コンパイラの動作には.NET Frameworkが必要です。
- 出力はネイティブバイナリです。.NET Frameworkに依存しないためランタイムなしで動きます。
- 最終的には自分自身を自分自身で記述して、C#や.NET Frameworkがなくても動くことを目指します。 ⇒ [[WikiPedia.en:Eating one's own dog food]]
- 当初計画ではXMLだけですべて記述する方針でしたが、あまりに非効率で自分自身を記述できないと判断しました。1.0までは共存状態のままで進めますが、1.0以降ではXMLはASTのシリアライズ用に特化して、LLPを独立した言語として扱えるようにする予定です。
- Windows Live WriterでLLPのソースコードを挿入するためのプラグインを作りました。 ⇒ [[Source Plugin]]
#ref(LLPML-0.11-20080314.png,nolink)
** 作業予定 [#s1fa4ed6]
予定の実装は完了しました。安定を確認後、1.0をリリースします。
+ 【済】%%ASTのオブジェクト化%%
+ 【済】%%ブロックによる変数のスコープ%%
+ 【済】%%関数%%
+ 【済】%%構造体%%
+ 【済】%%制御構造、算術演算%%
+ 【済】%%メンバ関数%%
+ 【済】%%コンストラクタ・デストラクタ%%
+ 【済】%%継承%%
+ 【済】%%簡略記法%%
+ 【済】%%配列%%
+ 【済】%%整数型%%
+ 【済】%%プロパティ%%
+ 【済】%%無名関数%%
+ 【済】%%仮想関数%%
+ 【済】%%関数の戻り値の型%%
+ 【済】%%ラムダ式%%
+ 【済】%%委譲%%
+ 【済】%%クロージャ%%
+ 【済】%%静的メンバ%%
+ 【済】%%new/delete%%
+ 【済】%%クラス%%
+ 【済】%%スコープ解決演算子%%
+ 【済】%%文字列型%%
+ 【済】%%RTTI%%
*** 現在の方針 [#g25b1c19]
- C言語にC++やC#の要素を取り入れて焼き直したような言語です。
- 構文がJavaScript風なのは、パースが簡単だからです。なるべくC#と同じ記述を取り入れたいと考えていましたが、実装の都合による妥協などもあり、現時点ではC#から乖離しています。
- 自分自身を記述するのに必要な要素を実装します。
- ちょっとした工夫(あれば便利で実装もあまり難しくない機能)もなるべく取り入れます。
- マングリングを避けるため、関数のオーバーロードはサポートしません。
- 自分自身の記述に不要なため、64bit整数型や浮動小数点数型(float, double)はサポートしません。
- 型推論による多相型、もしくは明示的なgenericsは、実装がかなり難しいと思われます。実装が望ましい機能ですが、ちょっとした工夫の枠内を超えているため、現時点では見送ります。
- 以上は必要に応じて変更する可能性があります。
** ダウンロード [#l401226c]
- ソース: &ref(LLPML-0.24-20080826.zip); - 文字コード変換
- ライセンス: パブリックドメイン
#include(:VCS2008Exp,notitle)
*** 過去のリリース [#d34b4a4d]
- ソース: &ref(LLPML-0.24-20080825.zip); - is, as
- ソース: &ref(LLPML-0.24-20080824.zip); - RTTI、typeofでType型を返す
- ソース: &ref(LLPML-0.23-20080824.zip); - 参照カウントの修正
- ソース: &ref(LLPML-0.23-20080822.zip); - 文字列操作、参照カウントの修正
- ソース: &ref(LLPML-0.23-20080819.zip); - 文字列をクラス化
- ソース: &ref(LLPML-0.22-20080818.zip); - スコープ解決演算子、参照型配列の型指定
- ソース: &ref(LLPML-0.21-20080817.zip); - クラス、参照型配列、参照カウント ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!852.entry]]
- ソース: &ref(LLPML-0.20-20080708.zip); - メンバのオフセット、変数演算、委譲のリークを修正
- ソース: &ref(LLPML-0.20-20080514.zip); - 配列のnew/delete
- ソース: &ref(LLPML-0.20-20080512.zip); - new/delete
- ソース: &ref(LLPML-0.19-20080511.zip); - 静的メンバ、base
- ソース: &ref(LLPML-0.18-20080421.zip); - クロージャ ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!789.entry]]
- ソース: &ref(LLPML-0.17-20080421.zip); - 委譲、デストラクタのバグ修正 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!787.entry]]
- ソース: &ref(LLPML-0.16-20080410.zip); - ラムダ式、パイプ演算子、パーサの演算子周りを整理 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!779.entry]]
- ソース: &ref(LLPML-0.15-20080406.zip); - 引数の型チェック、bool型の追加、キャストのバグ修正
- ソース: &ref(LLPML-0.15-20080403.zip); - 関数の戻り値の型 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!776.entry]]
- ソース: &ref(LLPML-0.14-20080402.zip); - 型周りの実装を整理
- ソース: &ref(LLPML-0.14-20080329.zip); - 仮想関数、JITによる関数型もどき ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!771.entry]]
- ソース: &ref(LLPML-0.13-20080327.zip); - 無名関数、メンバ参照のバグ修正、コンストラクタとデストラクタの実装を見直し ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!770.entry]]
- ソース: &ref(LLPML-0.12-20080325.zip); - プロパティ、値なしreturnのサポート、代入時の符号変換、エラー箇所情報の拡充 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!766.entry]]
- ソース: &ref(LLPML-0.11-20080324.zip); - メニュー、Win32ラッパー
- ソース: &ref(LLPML-0.11-20080323.zip); - MMXとSSE2の一部サポート、キャストと構造体初期化のバグ修正 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!763.entry]]
- ソース: &ref(LLPML-0.11-20080314.zip); - 演算子の処理を分離、符号、ポインタ演算、サンプルのタイトル
- ソース: &ref(LLPML-0.11-20080307.zip); - 初期化と型推論のバグ修正
- ソース: &ref(LLPML-0.11-20080306.zip); - 整数型のbyteとshortをサポート ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!752.entry]]
- ソース: &ref(LLPML-0.11-20080218.zip); - 【暫定】CompilerLibに8bitと16bitの命令を追加
- ソース: &ref(LLPML-0.10-20080212.zip); - ラッパー風のシンタックスシュガー ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!668.entry]]
- ソース: &ref(LLPML-0.10-20080211.zip); - 配列アクセス、型推論 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!667.entry]]
- ソース: &ref(LLPML-0.10-20080205.zip); - 埋め込みを<?llp ?>に変更、引数チェックの強制、externの簡略記法、相互参照、ヒープ、サンプルの整理
- ソース: &ref(LLPML-0.10-20080203.zip); - 配列の宣言、Win32サンプル(17.xml)で描画処理 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!665.entry]]
- ソース: &ref(LLPML-0.9-20080127.zip); - PHP風の<?llpml ?>に簡略記法を埋め込み、HTML風の<script>は廃止
- ソース: &ref(LLPML-0.9-20080123.zip); - Visual C# 2008に移行、簡略記法の適用範囲を拡大 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!663.entry]]
- ソース: &ref(LLPML-0.9-20071021.zip); - ブロックベースの構造体(移行完了)、サンプルを簡略記法で書き換え ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!637.entry]]
- ソース: &ref(LLPML-0.9-20071016.zip); - ブロックベースの構造体(移行途中)、簡略記法の適用範囲を拡大 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!636.entry]]
- ソース: &ref(LLPML-0.9-20071014.zip); - 名前空間の統一、プロジェクト構成の整理
- ソース: &ref(LLPML-0.9-20070930.zip); - [[中置記法による数式の簡略化>LLPML/簡略化]] ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!628.entry]]
- ソース: &ref(LLPML-0.8-20070926.zip); - エラー表示の改善、castとnullの追加、[[浮動小数点数算出のサンプル>IEEE 754]] ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!625.entry]]
- ソース: &ref(LLPML-0.8-20070924.zip); - 継承 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!623.entry]]
- ソース: &ref(LLPML-0.7-20070917.zip); - コンストラクタ・デストラクタ ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!621.entry]]
- ソース: &ref(LLPML-0.6-20070904.zip); - var-ptrを廃止してptrに統合、struct-member-ptrを追加
- ソース: &ref(LLPML-0.6-20070830.zip); - メンバ関数 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!615.entry]]
- ソース: &ref(LLPML-0.5-20070829.zip); - var-intをvarに改名して型情報を付加
- ソース: &ref(LLPML-0.5-20070826.zip); - 構造体内構造体
- ソース: &ref(LLPML-0.5-20070821.zip); - switch/break/returnの修正、continueの追加、無駄なスタックフレームを抑制
- ソース: &ref(LLPML-0.5-20070819.zip); - 制御構造、算術演算、ウィンドウ表示 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!610.entry]]
- ソース: &ref(LLPML-0.4-20070817.zip); - IIntValueで変数処理を抽象化
- ソース: &ref(LLPML-0.4-20070816.zip); - 構造体、変数処理の抽象化 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!609.entry]]
- ソース: &ref(LLPML-0.3-20070815.zip); - 関数の戻り値、コールバック、変数宣言タグの分離、サンプルの整理 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!608.entry]]
- ソース: &ref(LLPML-0.3-20070814.zip); - 関数 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!607.entry]]
- ソース: &ref(LLPML-0.2-20070806.zip); - BASIC風forの追加(0.5でC言語風に仕様変更)
- ソース: &ref(LLPML-0.2-20070805.zip); - ブロックとスコープ ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!600.entry]]
- ソース: &ref(LLPML-0.1-20070729.zip); - ASTオブジェクト ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!598.entry]]
- ソース: &ref(LLPML-0.1-20070722.zip); - 最初のリリース ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!595.entry]]
** 例 [#a5a2a600]
図形言語の内部処理用を想定しているため記述性は低いです。ASTをXMLで記述するというイメージです。しかしあまりにも記述性が低くてサンプルの作成だけでも苦労したため、簡略記法を導入しました。
以下にもサンプルがあります。
- [[IEEE 754]]
以下には細かい部分でのC言語との比較があります。
- [[IEEE 754/比較]]
*** 標準出力 [#a1f62321]
以下の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>
** コメント [#cb625047]
#comment(below)