Low Level Programming Markup Language (LLPML) †
XMLで記述するプログラミング言語のネイティブコンパイラです。CompilerLib?を利用しています。 ⇒ 関連日記
構文解析を排除するため、.NET Frameworkの汎用XMLパーサーを使っています。
- XMLだけでプログラムを記述する手間に耐え切れず、構文解析を導入しました。 ⇒ 再帰下降構文解析
XMLの手書きは記述性が悪いのですが、図形言語の内部表現という位置付けのため、手書きでの記述性は追求しません。
- あまりにも冗長だったため、0.9より簡略化を導入しました。 ⇒ LLPML/簡略化?
#ref(): File not found: "LLPML-0.9-20080123.png" 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"; - 最初のリリース ⇒ 関連日記
作業予定 †
試行錯誤で仕様を模索しているため、仕様が確定するまでは非互換変更を行うことがあります。
仕様が確定するまでは、バージョン番号は進捗の目安です。マイナーバージョン内でも互換性は保証しません。
第1段階: LLPML (Low Level) †
実装完了後、LLPML 1.0として仕様を確定します。
- 【済】
ASTのオブジェクト化
- 【済】
ブロックによる変数のスコープ
- 【済】
関数
- 【済】
構造体
- 【済】
制御構造、算術演算
- 【済】
メンバ関数
- 【済】
コンストラクタ・デストラクタ
- 【済】
継承
- 【済】
簡略記法
- 配列
- 整数型
- 仮想関数
- インライン関数
- インライン高階関数
- 無名関数
第2段階: MLPML (Middle Level) †
LLPMLの上層に構築する言語です。
実装完了後、MLPML 1.0として仕様を確定します。
- クラス(メタ情報付き構造体)
- インターフェース
- GC
- 委譲
- クロージャ
第3段階: 図形言語(仮称) †
長大なXMLの手書きは非現実的なため、MLPMLを図形にマッピングして視覚化した言語です。
実装完了後、図形言語の名称を決定して、1.0として仕様を確定します。
この段階でC#や.NETから独立します。
- 図形マッピングという位置付けのため、MLPMLと仕様が同期します。
- 可能な限りキーボード入力を排除して、マウスだけで操作できるものを目指します。
- 描画エンジンとしてPixelDrawingを使用します。
- MLPMLでの開発
- 図形言語での開発(自分自身を記述)
- CompilerLib, LLPML, MLPMLを図形言語で再実装
図形言語の内部処理用を想定しているため記述性は低いです。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>
コメント †