独自言語 picle(pico instruction set compact and lightweight expression) [PIC]
PICのような組込みマイコンをターゲットに想定して今回作成した独自言語(picle)の言語仕様を簡単にまとめてみました。
ソースエディット機能やフラッシュメモリへのセーブ/ロード等のPICに実装する上でのコマンドは言語仕様とは別なので PIC24版 picle を公開 時に記載します。
現時点でもPIC24上でそれなりに動いていますが、インタープリタでの実装なので GAME言語 より2倍弱程度速度が遅い状況です。1.5倍程度遅い状況です。(2016/02/02修正)
しかし、ソースの可読性及びコーディングのしやすさという点ではかなり向上しています。速度に関してはコンパイラ化することで解決できると思います。
★2016/04/2 追記 {
「独自言語 picle compiler on PIC24FJ」にpicle コンパイラを公開しました。
}
【picle(pico instruction set compact and lightweight expression)言語仕様概要】
★2016/03/16 追記
Windows上で動作する評価版インタープリタは PICでのBASIC言語 の記事からダウンロードできます。
[ 前へ ] 連載記事 [ 次へ ]
ソースエディット機能やフラッシュメモリへのセーブ/ロード等のPICに実装する上でのコマンドは言語仕様とは別なので PIC24版 picle を公開 時に記載します。
現時点でもPIC24上でそれなりに動いていますが、インタープリタでの実装なので GAME言語 より
しかし、ソースの可読性及びコーディングのしやすさという点ではかなり向上しています。速度に関してはコンパイラ化することで解決できると思います。
★2016/04/2 追記 {
「独自言語 picle compiler on PIC24FJ」にpicle コンパイラを公開しました。
}
【picle(pico instruction set compact and lightweight expression)言語仕様概要】
- 変数
- 変数の型としては符号付2バイトのみ。例外としてバイト配列がある(詳細は下記)
- 変数名は英数字と'_'の組合せで変数名の長さの上限は無し。小文字と大文字は区別される。
- 変数は使用する前に宣言する必要がある。
例 var hoge1, hoge2;
- ソースの先頭で宣言された変数はグローバル変数となる。
{}ブロックの先頭で宣言された変数はブロック内のみで有効なローカル変数となる。
★2016/04/27 追記
コンパイラ版ではグローバル変数は実行前にゼロクリアされる。
- 変数の型としては符号付2バイトのみ。例外としてバイト配列がある(詳細は下記)
- 配列
- 変数名に[]をつけて配列として使用できる。
- 配列として使用する変数には最初に配列領域のアドレスを設定する必要がある。
- Array_ は組込みの配列変数であり、ユーザ定義の配列を使用する場合はこのArray_配列から領域を割り振る必要がある。
または変数にメモリの絶対アドレスを設定してメモリをアドレス指定でアクセスすることも可能(PICのレジスタのアクセス等) - 組込み関数の Array_(n) はArray_配列の n番目の要素のアドレスを返す。
例 ArrayA と ArrayB に それぞれ 10個、20個の配列要素を割り振る場合の例
var ArrayA,ArrayB; ArrayA=Array_(0); ArrayB=Array_(10);
- 変数名の先頭が _ の場合は配列要素は1バイトとなる。
- 変数名に[]をつけて配列として使用できる。
- 数値表現
- hex表現の場合は先頭に $ をつける。
例 var hoge; hoge=$AB00;
- シングルクォーテーションで囲った文字は文字コードの値を持つ。
例 var char; char='A'; PrnChar_(char);
- ダブルクォーテーションで囲った文字列は文字列の先頭アドレスの値を持つ。
文字列内の ¥n は改行コードに変換される。
例 var str; str = "hello"; PrnStr_(str);
- hex表現の場合は先頭に $ をつける。
- ソース構成
- 最初に use ステートメント(複数可、無くても可)を記述する(但しコンパイラ版のみ)。 use ステートメントの記述形式は
use LibraryName;
で use ステートメントは外部ソースを読込むためのもので詳細は「独自言語 picle のコンパイラ化(その11)」を参照。
★2017/03/31 追記
- 次にグローバル変数の宣言を行い(無くても可)、最後に関数と処理の宣言を行う。
- 関数と処理の宣言は次のように行う。引数は値渡し(call by value)。配列ポインタを引数にすればポインタ渡しのようにすることも可能。
関数宣言:func 処理名(引数) { 処理内容 }
処理宣言:proc 処理名(引数) { 処理内容 }
- 関数は整数のリターン値を返し、リターン値は関数内で自動的に宣言される return 変数(初期値は0)に代入する。
関数は再帰呼出し可能である。
- # 以降行末までコメントとなる。
- 各ステートメントの末尾にはセミコロンをつける。
- main 処理が最初に実行される。
- ★2016/04/05 追記
コンパイラ版ではproc/funcの前方参照(ソース上後述のproc/funcのコール)不可。
★2016/04/16 追記 コンパイラ版で下記宣言に対応
外部処理宣言 : 例 func hoge( arg0, arg1 ) = $9030;
プロトタイプ宣言 : 例 func hoge( arg0, arg1 );
- 最初に use ステートメント(複数可、無くても可)を記述する(但しコンパイラ版のみ)。 use ステートメントの記述形式は
- 制御文
- for文 :C言語のfor文とほぼ同様。但し、forと'('の間にはスペースが必要
永久ループは「for (;1;) { }」とする。
- if文 :if (条件) { } else { }
else以降は無くても可。ifと'('の間にはスペースが必要。
- while文:do { } while (条件);
whileと'('の間にはスペースが必要。
- while文:while (条件) { }
★2016/04/09 追記
コンパイラ版のみ対応。whileと'('の間にはスペースが必要。
- else if文:if (条件1) { } else if (条件2) { } else { }
★2016/04/09 追記
コンパイラ版のみ対応。「else if」は複数回連続可能。
ループ内での break/contine は未対応
★2016/04/16 追記 コンパイラ版で break 制御に対応
- for文 :C言語のfor文とほぼ同様。但し、forと'('の間にはスペースが必要
- 二項演算子
式は優先度つきで評価される。下記の二項演算子を実装(優先度高順)
*,/,%(剰余)
+,-
&(and),|(or),^(xor)
=,<=,>=,<>
- 単項演算子
+:絶対値
-:符号反転
~:ビット反転
- 組込み処理/関数
処理名称 説明 proc PrnDec_( value ) 10進出力 proc PrnDecF_( value, width ) 桁数指定つき10進出力 proc PrnStr_( string ) 文字列出力。space押下で一時停止、
ESCキー押下で実行を中断proc PrnChar_( CharacterCode ) 1文字出力 proc PrnHex_( value ) 2バイトのhex出力 proc PrnHexB_( value ) 1バイトのhex出力 func Array_( n ) Array_配列のn番目要素のアドレス func InpChk_() 入力チェック(0:入力なし) func InpChar_() 1文字入力 func Input_() 数値入力(式やHEX表現にも対応)
^Xで全入力キャンセル
追記 2016/04/02 コンパイラ版では式は未対応proc Seed_( seed ) 乱数の種設定 func Rand_( MaxValue ) MaxValueより小さい乱数 proc Call_( address, parameter ) マシン語処理のコール
パラメータはW0レジスタに設定される
★2016/04/16 追記
コンパイラ版では外部処理宣言機能追加により本組込処理は削除proc exit() ★2016/04/02 追記
プログラム終了。コンパイラ版のみ対応proc Tint_() ★2017/05/26 追記
picleソースに本処理を記述するとタイマー割込み(10ms)毎にTint_()が実行される。コンパイラ版のみ対応proc asm_(code) ★2017/11/25 追記
picleソースにマシン語コードを埋め込むための処理です。マシン語1ワードを引数に入れるとコンパイルコード内に埋め込むことができます。コンパイラ版のみ対応 - 組込み変数
Array_ 配列 Timer_ ゼロ以外の場合、割込み処理により10ms毎にデクリメントされる。 Modulo_ 直前の割り算の余りの値 return 関数内でのリターン値設定用ローカル変数
- サンプルソース
本言語の検討過程の記事 にサンプルソースがいくつかありますので参照してください。
★2016/03/16 追記
Windows上で動作する評価版インタープリタは PICでのBASIC言語 の記事からダウンロードできます。
[ 前へ ] 連載記事 [ 次へ ]
「4.ソース構成」に use ステートメントについての記載を追加しました。
by skyriver (2017-03-31 21:45)
「8.組込み処理/関数」にタイマー処理機能を追記しました。
by skyriver (2017-05-26 21:27)