#topicpath
#contents

* Low Level Programming Markup Language (LLPML) [#pe9ff953]

XMLで記述するプログラミング言語のネイティブコンパイラです。[[CompilerLib]]を利用しています。 ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!595.entry]]

- %%構文解析を排除するため、.NET Frameworkの汎用XMLパーサーを使っています。%%
-- XMLだけでプログラムを記述する手間に耐え切れず、構文解析を導入しました。 ⇒ [[再帰下降構文解析]]
- %%XMLの手書きは記述性が悪いのですが、図形言語の内部表現という位置付けのため、手書きでの記述性は追求しません。%%
- あまりにも冗長だったため、0.9より簡略化を導入しました。 ⇒ [[LLPML/簡略化]]

#ref(LLPML-0.5-20070819.png,nolink)

** ダウンロード [#l401226c]
- ソース: &ref(LLPML-0.9-20071021.zip); - ブロックベースの構造体(移行完了)、サンプルを簡略記法で書き換え ⇒ [[関連日記>http://gir-lab.spaces.live.com/blog/cns!63A4C32EDA5CF2F7!637.entry]]
- ライセンス: パブリックドメイン

#include(:VCS2005Exp,notitle)

*** 過去のリリース [#d34b4a4d]
- ソース: &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]]

** 作業予定 [#s1fa4ed6]

試行錯誤で仕様を模索しているため、仕様が確定するまでは非互換変更を行うことがあります。
- 例: <var-int> → <var>

仕様が確定するまでは、バージョン番号は進捗の目安です。マイナーバージョン内でも互換性は保証しません。

*** 第1段階: LLPML (Low Level) [#wec6f17c]
実装完了後、LLPML 1.0として仕様を確定します。
+ 【済】%%ASTのオブジェクト化%%
+ 【済】%%ブロックによる変数のスコープ%%
+ 【済】%%関数%%
+ 【済】%%構造体%%
+ 【済】%%制御構造、算術演算%%
+ 【済】%%メンバ関数%%
+ 【済】%%コンストラクタ・デストラクタ%%
+ 【済】%%継承%%
+ 【済】%%数式の簡略化%%
+ 仮想関数
+ 整数型
+ 配列

*** 第2段階: MLPML (Middle Level) [#n9323f1a]
LLPMLの上層に構築する言語です。
実装完了後、MLPML 1.0として仕様を確定します。
+ クラス(メタ情報付き構造体)
+ インターフェース
+ GC
+ 委譲
+ クロージャ

*** 第3段階: 図形言語(仮称) [#c12f999b]
長大なXMLの手書きは非現実的なため、MLPMLを図形にマッピングして視覚化した言語です。
実装完了後、図形言語の名称を決定して、1.0として仕様を確定します。
この段階でC#や.NETから独立します。
- 図形マッピングという位置付けのため、MLPMLと仕様が同期します。
- 可能な限りキーボード入力を排除して、マウスだけで操作できるものを目指します。
- 描画エンジンとして[[PixelDrawing]]を使用します。
+ MLPMLでの開発
+ 図形言語での開発(自分自身を記述)
+ CompilerLib, LLPML, MLPMLを図形言語で再実装

** 例 [#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, strlen(hello), &dummy, NULL);
     return 0;
 }

LLPMLでは以下のようになります。

 <?xml version="1.0" encoding="utf-8" ?>
 <llpml version="0.8.20071016">
 
 <extern name="GetStdHandle" module="kernel32.dll" type="std" />
 <extern name="WriteConsoleW" module="kernel32.dll" type="std" />
 
 <int-declare name="STD_OUTPUT_HANDLE">-11</int-declare>
 <var-declare name="stdout">
 	GetStdHandle(STD_OUTPUT_HANDLE)
 </var-declare>
 
 <string-declare name="hello">Hello, World!
 </string-declare>
 <var-declare name="dummy" />
 <call name="WriteConsoleW">
 	stdout, hello
 	<string-length name="hello" />
 	<ptr name="dummy" />
 	null
 </call>
 
 </llpml>

** コメント [#cb625047]

#comment(below)


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS