はじめに
日本語プログラミング言語あおい(Aoi)の実装言語仕様2025 Lv1.2を生成AIに読み込ませて仕様駆動開発を展開しております。
日本語プログラミング言語あおい(Aoi)の企画趣旨はこちらの記事をご参照ください。
この記事内容の作業目的
こちらの記事で現行2025 Lv1.2仕様情報の未定義課題が浮上しましたので、日本語プログラミング言語あおい(Aoi)の構文仕様策定のLv1.3として仕様改定を行います。(主に内部仕様の明示)
この記事内容の保証
※本記事に開示された仕様は次バージョンの仕様においては予告なく変更される場合があります。また、このバージョンの仕様内で補足や追加がなされる場合があります。
概要
日本語プログラミング言語 あおい(Aoi)は静的型付け言語として設計されたオープンな実装言語仕様で、どなたでもコンパイラ・トランスコンパイラを実装することができます。1
オリジナルのランタイムコード、既存の中間コードなどへのコンパイラとしての実装を退けるものではありませんが、今日のシステム開発言語の多様化に鑑みて、それらの言語環境との相互運用性を容易としプログレッシブな導入を実現するため、他のプログラミング言語をターゲット言語とするトランスコンパイラとして実装することを推奨しています。
日本語プログラミング言語 Aoi (あおい)は、リスペクトしてやまない第1世代日本語プログラミング言語 Mind(マインド)や後の日本語プログラミング言語と同じく、日本語を基調とした構文を採用し、英語のプログラミング言語にありがちな「;」や「{ }」などの特殊な文字を区切りとして使用しない点を共有しつつ、半角かっこ内や一部の構文はターゲット言語のシンタックスを許容するとします。
また、日本語プログラミング言語 あおい(Aoi)は、制御構文の開始シンボルとして、◇、〇、・、□などの全角記号を用い、箇条書きされた日本文としての体裁を日本語プログラミング言語いずみ(Izumi)(開発コード名 日本語ロジック記述言語Re:Mind)の構文とも共有しています。いずみ(Izumi)はロジック検証用のコンソールアプリケーションベースのコンパイラ言語となる想定です。◇は分岐構文、〇はループ構文の開始と終了を表し、冗長な日本語表記がなくてもフロー図の表現に慣れている方が直感的に認識できることを考慮しています。
推奨・想定されるターゲット言語
C言語のシンタックスを共有・継承する以下の静的型付け言語
・Java
・C#
・TypeScript
・Go
英語を基調とした以下のBASIC言語
・Visual Basic for Application (Excel)
・Visual Basic.NET
より自然な日本語構文を特徴とする以下の日本語プログラミング言語
・Mind
・なでしこ
推奨・想定される実装言語
・とくにありません。好きな言語、得意とする言語で実装してください。
・現在設計者が実装に使用している言語はC#です。
言語仕様
変数
/** nenrei */
・int 年齢 = 34
/** namae */
・string 名前 = "花子"
/** tokutaiKubun */
・bool 特待区分 = true
□全角文字の中点に続いて、ターゲット言語の物理型名を半角文字で記述し、半角空白に続いて変数名を記述します。
・直前の行はjava doc形式のコメントで、ターゲット言語上の変数名を半角文字で記述します。書かない場合は、日本字のまま変数名となります。
・半角等号で初期値を代入できます。
/** nenrei */
・変数int 年齢
/** namae */
・public string 名前
/** tokutaiKubun */
・変数private bool 特待区分 = true
□全角中点に続いて「変数」と書くこともできます。後述の定数と並んだ時の見栄え、わかりやすさのため、変数宣言であることを明示。
・ターゲット言語のスコープを型名の前に書くことも可能。全角中点または「変数」とはくっついていて可。
・ と □ の使い分け
・変数int 税込価格
□税込価格 = 消費税を計算する(価格, 軽減税率適用可否)
・変数int 税込価格 = 消費税を計算する(価格, 軽減税率適用可否)
・変数の宣言文の後に半角等号で初期値を代入する際に関数の戻り値を代入することもできます。
変数の配列
/** nenrei */
・int[] 年齢 = 34,35,36
/** namae */
・string[] 名前 = "花子","太郎","芽衣"
/** tokutaiKubun */
・bool[] 特待区分 = true,false,true
□全角文字の中点に続いて、ターゲット言語の物理型名を半角文字で記述し[]を記述、半角空白に続いて変数名を記述します。
・半角等号で初期値を代入できます。いったん、かっこ書きの煩雑さをさけるため、かっこ囲いなしとします。初期化構文中の改行は不可。(この構文は改行で終端されます。)
・その他の要件は通常の変数と同じとします。
定数
/** nenrei */
・定数int 年齢 = 34
/** namae */
・定数string 名前 = "花子"
/** tokutaiKubun */
・定数public bool 特待区分 = true
□全角文字の中点に続いて「定数」と書き、続いてターゲット言語の物理型名を半角文字で記述し、半角空白に続いて定数名を記述します。
・直前の行はjava doc形式のコメントで、ターゲット言語上の定数名を半角文字で記述します。書かない場合は、日本字のまま変数名となります。
・半角等号で初期値を必ず代入します。
・ターゲット言語のスコープを型名の前に書くことも可能。全角中点または「定数」とはくっついていて可。
定数の配列
/** nenrei */
・定数int[] 年齢 = 34,35,36
/** namae */
・定数string[] 名前 = "花子","太郎","芽衣"
/** tokutaiKubun */
・定数bool[] 特待区分 = true,false,true
□全角文字の中点に続いて「定数」と書き、続いてターゲット言語の物理型名を半角文字で記述し[]を記述、半角空白に続いて定数名を記述します。
・半角等号で初期値を代入できます。いったん、かっこ書きの煩雑さをさけるため、かっこ囲いなしとします。初期化構文中の改行は不可。(この構文は改行で終端されます。)
・その他の要件は通常の定数と同じとします。
関数
関数の実行
□年齢 = メンバーの年齢を取得する(名前,特待区分)
□(名前,特待区分)で メンバーの年齢を設定する
◇値を返す関数の場合、全角記号の四角□に続いて、戻り値を受け取る変数名を記述し、半角等号に続いて関数名を記述します。
・続いて半角かっこを設け、ターゲット言語の物理型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・半角かっこ内はターゲット言語の記法を可とします。参照渡しの明示や、既定値設定など、ターゲット言語の構文記述ができるとします。
◇値を返さない関数の場合、全角記号の四角□に続いて、半角かっこを設け、ターゲット言語の物理型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・半角かっこ内はターゲット言語の記法を可とします。参照渡しの明示や、既定値設定など、ターゲット言語の構文記述ができるとします。
・半角かっこで閉じた後、続けて関数名を書くことができます。
半角かっこで閉じた後、続けて「で」や「を」を付加し、半角空白を挟んで関数名を書くこともできます。このひらがなは無視します。
・int 年齢 = メンバーの年齢を取得する(名前,特待区分)
・変数int 年齢 = メンバーの年齢を取得する(名前,特待区分)
・変数の宣言の後に、定義された関数の戻り値を代入することもできます。
値を返す関数の宣言
/**
* getMembersAge
* @param 名前 name
* @param 特待区分 kubun
* @return 年齢
*/
▽public int メンバーの年齢を取得する(string 名前,bool 区分)
//todo
□(齢)を 返す
△
□全角記号の下三角▽が関数宣言の開始となります。
・続いてターゲット言語のスコープを書きます。省略も可。
・続いて半角空白をおいて、ターゲット言語の戻り値型を書きます。戻り値あり関数としては省略不可。
・続いて半角空白をおいて、関数名を書きます。
・続いて半角かっこを設け、ターゲット言語の物理型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・半角かっこ内はターゲット言語の記法を可とします。参照渡しの明示や、既定値設定など、ターゲット言語の構文記述ができるとします。
・全角記号の上三角△で定義を終了します。
・かならず、定義終了前に全角四角に続き、変数名に空白を挟んで「返す」と記述するとします。
・全角四角に続き、「return」と書いて、半角空白ののちに変数名を記述でも可とします。
・全角記号の下三角▽直前の行はjava doc形式のコメントで、ターゲット言語上の関数名を半角文字で記述します。書かない場合は、日本字のまま関数名となります。
・コメントの終端までの間、@paramに続いて変数名を書き、続いてターゲット言語上の変数名を半角文字で記述します。書かない場合は、日本字のまま変数名となります。
値を返さない関数の宣言
/**
* memberNenreiSettei
* @param 名前 name
* @param 特待区分 kubu
*/
▽private メンバーの年齢を設定する(string 名前,bool 区分)
//todo
△
□全角記号の下三角▽が関数宣言の開始となります。
・続いてターゲット言語のスコープを書きます。省略も可。
・続いて半角空白をおいて、関数名を書きます。
・続いて半角かっこを設け、ターゲット言語の物理型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・半角かっこ内はターゲット言語の記法を可とします。参照渡しの明示や、既定値設定など、ターゲット言語の構文記述ができるとします。
・全角記号の上三角△で定義を終了します。
・全角記号の下三角▽直前の行はjava doc形式のコメントで、ターゲット言語上の関数名を半角文字で記述します。書かない場合は、日本字のまま関数名となります。
・コメントの終端までの間、@paramに続いて変数名を書き、続いてターゲット言語上の変数名を半角文字で記述します。書かない場合は、日本字のまま変数名となります。
クラス
クラスの宣言
/**
* MembersLogic : AbstractLogic
*/
▽public class メンバーの取り扱い方 : 取り扱い方
・変数int 年齢
・変数public string 名前
・変数private bool 特待区分
▽public int メンバーの年齢を取得する(string 名前,bool 区分)
//todo
□(齢)を 返す
△
▽private メンバーの年齢を設定する(string 名前,bool 区分)
//todo
△
△
□全角記号の下三角▽がクラス宣言の開始となります。
・続いてターゲット言語のスコープを書きます。省略も可。
・続いて半角空白をおいて、ターゲット言語のクラス表記を書きます。ここは全角カタカナで「クラス」と書いても可。
・続いて半角空白をおいて、クラス名を書きます。
・続いて半角空白をおいて、ターゲット言語のクラス継承表記を書きます。その後は半角空白をおいて、継承元のクラス名を書きます。継承しない場合はこれらの記述は省略可です。
・クラスのメンバの書き方は変数宣言、関数宣言に準じます。上記の記述例では個々の変数宣言、java docコメントの記述を割愛しています。
・全角記号の上三角△で定義を終了します。
・全角記号の下三角▽直前の行はjava doc形式のコメントで、ターゲット言語上のクラス名を半角文字で記述します。書かない場合は、日本字のままクラス名となります。
・継承元クラスがある場合は、半角空白の後にコロン:、続けて半角空白の後にターゲット言語上の継承元クラス名を半角文字で記述します。継承があるのに書かない場合は、日本字のまま継承元のクラス名となります。
クラスのインスタンス宣言
/** membersLogic */
・メンバーの取り扱い方 メンバー取り扱い方法 = new()
□クラスのインスタンス名は同じ主旨の別名としてください。
・コンストラクタにオーバーロードがある場合は、かっこ内にターゲット言語の記法で記述します。
クラスのインスタンスの変数操作
□年齢 = メンバー取り扱い方法.年齢
□メンバー取り扱い方法.年齢 = 年齢
□クラスのインスタンス名の装飾子は半角ドットです。
□年齢 = メンバー取り扱い方法?.年齢
□メンバー取り扱い方法.年齢 = 年齢 ?? 0
・Null条件演算子はターゲット言語が対応している場合は使用可とします。
・Null合体演算子はターゲット言語が対応している場合は使用可とします。
対応していない言語の場合は同等構文を展開するのが望ましい
クラスのインスタンスの関数実行
□年齢 = メンバー取り扱い方法.メンバーの年齢を取得する(名前,特待区分)
□(名前,特待区分)で メンバー取り扱い方法.メンバーの年齢を設定する
□クラスのインスタンス名の装飾子は半角ドットです。
・Null条件演算子はターゲット言語が対応している場合は使用可とします。
◇値を返す関数の場合、全角記号の四角□に続いて、戻り値を受け取る変数名を記述し、半角等号に続いてクラスのインスタンス名と関数名を半角ドットを挟んで記述します。
・続いて半角かっこを設け、ターゲット言語の物理型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・半角かっこ内はターゲット言語の記法を可とします。参照渡しの明示や、既定値設定など、ターゲット言語の構文記述ができるとします。
◇値を返さない関数の場合、全角記号の四角□に続いて、半角かっこを設け、ターゲット言語の物理型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・半角かっこ内はターゲット言語の記法を可とします。参照渡しの明示や、既定値設定など、ターゲット言語の構文記述ができるとします。
・半角かっこで閉じた後、続けてクラスのインスタンス名と関数名を半角ドットを挟んで書くことができます。
半角かっこで閉じた後、続けて「で」や「を」を付加し、半角空白を挟んで関数名を書くこともできます。このひらがなは無視します。
四則演算、論理演算
・ターゲット言語のシンタックスに準じます。中置記法
・ただし、ターゲット言語がjavaの場合でもBigDecimal同士のメソッドによる四則演算は通常の四則演算子で表記できるとします。
制御構文
分岐
2分岐(if文)
◇i > 0 の場合
//todo
◇ここまで
□全角記号のひし形◇が条件分岐の開始となります。
・続いてターゲット言語の論理式を書きます。半角かっこは不要。
・続いて「の場合」と書きます。半角で書かれた論理式とはくっついていても可。
・全角記号のひし形◇が条件分岐の終了となります。
・つづいて「ここまで」と書くことができます。省略も可。
◇i > 0 の場合
//todo
◇他に i < 0 の場合
//todo
◇他に
//todo
◇ここまで
◇途中で最初の論理式とは排他的な条件をつづける場合は、全角ひし形◇に続いて「他に」と書いて、論理式を書いて、「の場合」と書きます。
・論理式の前後の空白は、論理式を半角で書いている場合は省略できます。
◇最後に例外条件を明示する場合は、全角ひし形◇に続いて「他に」と書きます。
◇i > 0 の場合
◇j == 0 の場合
//todo
◇他に
//todo
◇ここまで
//todo
◇他に i < 0 の場合
//todo
◇他に
//todo
◇ここまで
□おなじ分岐構文を使って、入れ子で記述することができます。
多分岐(switch文)
switch文の構文です。条件構文自体に分岐を抜けさせる働きがないことをフォークスルーといいます。言語によってはこのフォールスルーがあったり、なかったりする場合だったりしますので、トランスコンパイラ言語としてはこのあたりをターゲット言語の動作に依存するところです。
- Re:Mind
◇値 で分岐する
◇定数1
//todo1
□処理する1
□脱出する
◇定数2
//todo2
□処理する2
□脱出する
◇既定
//todo3
□処理する3
□脱出する
◇ここまで
◇定数1 がCase文に相当する構文で、ここでは実行文を書く場合改行必須です。「◇既定」がdefalut文相当です。
□脱出するがbreak文に相当します。
ターゲット言語がフォークスルー動作が仕様としてない言語の場合(break文を書かなくても脱出する)は書いてもターゲット言語のソースコードには出力しないという動作とします。
値は半角かっこ()で囲っても囲わなくても可です。
ターゲット言語ごとのフォールスルーの挙動の違い
switch文のフォールスルー(□脱出する (break)を書かない場合脱出せず次のcaseに移る)の有無はターゲット言語の仕様に合わせるという仕様について、コンパイラのオプションにします。
□脱出する (break)を書かない場合のオプション
既定のオプション フォークスルー有
オプション フォークスルー無
オプション ターゲット言語に合わせる
繰り返し
カウンタ変数の初期化を行なう(for文)
〇int i=0,i<10,i++ 繰り返す
//todo
〇ここまで
□全角記号の丸印〇が繰り返しの開始となります。
・続いてターゲット言語のカウンタ論理式をカンマ区切りで書きます。半角かっこは不要。セミコロン区切りも可。
・続いて「繰り返す」と書きます。半角で書かれた論理式とはくっついていても可。
・全角記号の丸印〇が繰り返しの終了となります。
・つづいて「ここまで」と書くことができます。省略も可。
〇繰り返す
//todo
〇ここまで
□全角記号の丸印〇に続いて「繰り返す」と書いた場合は無限ループになります。
〇繰り返す
//todo
◇j==0 の場合 やめる
//todo
〇ここまで
・繰り返し構文内で条件分岐文を書いて「やめる」と書くと、直接のループを脱出します。
/** index */
〇int インデックス=0,インデックス<10,インデックス++ 繰り返す
//todo
〇ここまで
□繰り返し構文のカウンタ変数をインラインで日本字で宣言した場合、java docでターゲット言語上の表記を半角英字で書いておきます。
前判定繰り返し構文(while文)
- Re:Mind
・int i=0
〇(i<10) の間は繰り返す
//todo
□反復処理
□i++
〇ここまで
□while(i<10) のような構文の表記です。
・int i=0
〇(i<10) の間は繰り返す
◇i<2 の場合
□ループ先頭へ
//todo
〇ここまで
□条件分岐と合わせて、ループ先頭に制御を移す場合は「ループ先頭へ」を使います。
・int i=0
・int j=0
・int k=0
〇(i<10) の間は繰り返す
//todo
□反復処理
□k++
□j++
◇j>8 の場合
□脱出する
◇ここまで
◇k<4 の場合
□ループ先頭へ
◇ここまで
□i++
〇ここまで
ループ本体内に条件分岐式を記述して、ループ続行の判定が成立する前にループを脱出したり(□脱出する)、ループの先頭に復帰して(□ループ先頭へ)ループ本体の処理をスキップさせることができます。
後判定繰り返し構文(do-while文)
後判定繰り返し構文の場合、最初の〇の後に「ここから」を記述し、末尾の〇に判定文「(条件式) の間は繰り返す」を記述します。
・int i=0
〇ここから
//todo
□反復処理
□i++
〇(i<10) の間は繰り返す
例外処理
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(Exception e)
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
◇ここまで
Re:Mindはターゲット言語が例外処理try~catch文をサポートする場合はサポートします。例外処理try~catch文をサポートしないターゲット言語の場合は構文エラーが出力されるのが望ましい。
◇の直後の「試す」と「捉まえる」は予約語となります。
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(Exception e)
//例外の処理 例外型はサンプル
◇必ず最後に
//例外がスローされてもされなくても通過する処理
◇ここまで
例外がスローされてもされなくても通過する処理「必ず最後に」句もオプショナルに記述できます。
◇の直後の「必ず最後に」は予約語となります。
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(Exception e)
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
投げる new Exception("エラーの意味がわかるメッセージ");
◇必ず最後に
//例外がスローされてもされなくても通過する処理
//"エラーの意味がわかるメッセージ"例外がスローされた後も通過します。
◇ここまで
「投げる」文で新しい例外を投げることができます。
new Exceptionはターゲット言語の構文をそのまま使います。
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(例外型 e)
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
◇ここまで
◇捉まえる()のかっこ内はターゲット言語の例外型をそのまま書いて可とします。多様な例外型の派生型があるため、ここの型名の英語・日本語間の言語的な変換は面倒なので、基本型のExceptionは「例外型」と書いても可。捉まえる()のかっこ内のローカル変数名はムリに日本字にしなくて可。
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(Exception e)
//例外の処理 例外型はサンプル
◇捉まえる(Exception2 e)
//別の例外の処理 例外型はサンプル
◇必ず最後に
//例外がスローされてもされなくても通過する処理
◇ここまで
「捉まえる」文で補足する例外型を指定して、特定例外だけの処理を記述することができます。
コメント
通常コメント
//todo
□ダブルスラッシュ//で行末までコメントアウトします。
/*
todo
todo
*/
□スラッシュとアスタリスク/でコメント行開始、アスタリスクとスラッシュ/でコメント行の終了。
ターゲット言語上での半角英字名の指定
/** nenrei */
・int 年齢 = 34
/**
* namae
*/
・string 名前 = "花子"
/**
* memberNenreiSettei
*/
▽private メンバーの年齢を設定する(string 名前,bool 区分)
△
/**
* MembersLogic : AbstractLogic
*/
▽public class メンバーの取り扱い方 : 取り扱い方
△
□javadocと同じ/** */で半角英字を囲って、変数宣言文、関数宣言文、クラス宣言の直前に記述することで、ターゲット言語上の英字名を指定できます。
/**
* memberNenreiSettei
* @param 名前 name
* @param 特待区分 kubu
*/
▽private メンバーの年齢を設定する(string 名前,bool 区分)
//todo
△
@paramに続いて、日本字の引数名、半角空白に続いて英字名を記述することで、引数名のターゲット言語上の英字名を指定できます。
ターゲット言語のライブラリの引用の仕方
□今日のシステム開発に使われる有力言語は巨大なライブラリを保持しておりますが、利用の際には名前空間を指定したり、パッケージを指定したりして、予め利用する範囲を指定するが一般的です。
・また言語によっては、利用する関数、変数単位でインポートするものもあります。
□そこでRe:Mindはあらかじめタ-ゲット言語の全方位のライブラリをサポートすることはせず、一定のルールで利用可とできる構文を提供します。
◇開発ユーザーがターゲット言語を理解している場合は、ターゲット言語で直接記述することも可とし、ターゲット言語との相互運用に有利な環境を提供します。
■using System
▼public static class コンソール Console
▼public static System.Text.Encoding 入力エンコード
InputEncoding { get; set; }
▲
▼public static string? 次の1行を読み取る()
ReadLine ()
▲
▼public static 改行表示する(string? value)
WriteLine (string? value)
▲
▲
□全角黒四角■に続いてターゲット言語のインポート文を記述します。セミコロンは書かなくても可。
・全角下三角▼に続いてターゲット言語のターゲットクラスを宣言し、クラス名の直前に日本字のクラス名を記述します。
・通常のクラス定義と同様に全角上三角▲が定義の終了となります。
・この間に、ターゲット言語の利用対象のターゲット関数・変数を全角下三角▼と全角上三角▲挟んで宣言します。
・全角下三角▼に続いてターゲット言語の構文で関数、変数を宣言しますが、関数名・変数名は日本字を記述します。
・関数の引数仕様はターゲット言語の仕様情報の記述のままとします。引数名は日本字にしない。
・戻り値のない関数はvoidは省略可。
・C#の変数の { get; set; }は英字側に記述。省略可。
・改行してターゲット言語の関数・変数を英字オリジナルで宣言します。
・関数の引数仕様はターゲット言語の仕様情報の記述のままとします。
↑ここまで2025 Lv1.2
↓ここから2025 Lv1.3
2025 Lv1.3 追記(実装確認済み事項)
本節では、これまでの実装・検証資料で確認できた範囲を追記します。「実装済み」は生成ソースへの到達を指し、ターゲット言語でのコンパイル・実行まで確認済みであることを意味しません。未確定と記録されている規則は、本節で新たに確定しません。
意味解析と定数
・メソッド引数、ローカル変数、フィールドを名前解決の対象とします。未定義の識別子・メソッドは診断し、if・while・forの条件式にはbool型を要求します。
・定数への再代入は診断します。定数配列の不変性など、ターゲット言語ごとの表現規則は別途確定するまで定めません。
・return文の出力、引数・戻り値を含む型検査は基本形を扱いますが、全経路のreturnや厳密な型検査が完了したことを保証しません。
根拠:最小セットMVPの実装済要件v3.md「最小セット(MVP)の照合」、同 §7「SemanticResolverの達成度」(L106-L126)。
switch、繰り返し、例外
・switch相当の構文は判定値、case、既定節、脱出文を扱います。caseの脱出文を省略した場合のフォールスルー規則は、既存のターゲット別オプションの定義に従い、ここでは新たな既定値を定めません。
・後判定繰り返しは 〇ここから と末尾の条件で表します。ループ脱出は □脱出する、次の反復への移行は □ループ先頭へ で表します。
・例外処理では ◇試す、◇捉まえる(例外型 変数名)、任意の ◇必ず最後に、□投げる を扱います。複数catch節も扱います。
根拠:最小セットMVPの実装済要件v3.md「中間セットの照合」、優先度の高い残課題要件検証結果反映実行プラン完了レポートv5.md「Priority 05: 制御構文と例外」。
ライブラリAliasとクラス・null関連構文
・■インポートする はImport宣言、外側の ▼ / ▲ はクラスAlias、内側の ▼ / ▲ はメンバーAliasとして扱います。Alias情報を変換経路へ渡し、未定義Aliasは生成前の診断対象とします。
・クラス宣言では複数クラスと : に続く基底型を扱います。new() は宣言型から型を補完でき、インスタンスの基本的なフィールド参照・代入とメソッド呼出しを扱います。
・null条件演算子 ?. とnull合体演算子 ?? を式として扱います。ただし、演算子の型規則とJava・VB.NETを含む全ターゲットの生成・コンパイル結果を保証するものではありません。
根拠:最小セットMVPの実装済要件v3.md「拡張セットの照合」および §7「SemanticResolverの達成度」(L106-L126)、優先度の高い残課題要件検証結果反映実行プラン完了レポートv5.md「Priority 04: Import/Alias」「Priority 06: オブジェクトとnull」。
確定範囲と未確定事項
上記の記法・機能はLexerからParser、意味解析、IR、C#・Java・VB.NETの生成器へ接続された範囲で記載しています。生成ソースの出力確認と各ターゲットでのコンパイル・実行確認は区別します。特に、else-ifや終端省略の曖昧な場合、定数配列の不変性、switchのフォールスルー、継承メンバーの探索、catch変数のスコープ、Aliasの衝突・優先順位、全ターゲットでのnull演算子の型規則は、追加の設計・検証が終わるまで本節で規則を確定しません。
根拠:最小セットMVPの実装済要件v3.md「判定基準」「総合判定」、同 §§3–5(L47-L95)、優先度の高い残課題要件検証結果反映設計課題.md「Parserのブロック境界設計」「AliasとImportの共通意味設計」「共通AST/IRの意味契約」。
↓ここから2026 Lv1.3
設計課題の推奨解決策
本節は、優先度の高い残課題要件検証結果反映設計課題.mdに示された設計方針を、実装に移す順序で整理したものです。候補が複数あり同資料で採用案が確定していない事項は、確定済みの言語仕様として扱わず、「要決定」と明記します。
1. Parserのブロック境界と終端省略
Parserは行ごとの個別判定に依存させず、if、ループ、switch、try/catch、クラス、関数などの開始・中間節・終端を管理するブロックスタックを持たせます。ブロックごとに有効な中間節、対応する終端、省略可否を定義し、終端記号が直近の対応する開始構文に結び付くことを検査します。
◇他に 条件の場合は親ifのelse-if節、◇他にはelse節として扱います。終端省略は、後続の宣言、同階層の構文または外側ブロックの終端から境界が一意に決まる場合だけ受理し、曖昧な場合は推測で構文木を作らず、位置と期待される終端を示す構文エラーにします。
受入条件: 入れ子のif/else-if、ループ内if、明示終端、省略可能な終端、曖昧な省略、対応しない終端を検証し、誤った節の結合や曖昧な入力の黙認がないこと。
要決定: 構文ごとの終端省略範囲
設計資料は一意に境界を推定できる場合だけ省略を受理する方針を示していますが、構文ごとにどの終端を省略できるかの一覧は確定していません。次のどちらを採用するか、構文別の一覧とともに定めます。
・A案 既存の言語仕様で省略可能とされた終端を維持し、境界が一意に決まる箇所に限って受理する。
・B案 曖昧さを避けるため、省略を認める構文・位置を限定し、それ以外は明示終端を必須とする。
決定
B案でいきます。当面は明示的に省略可能とした場合だけとします。
決定の評価
メリット: 省略を明示的に許可した構文・位置に限定できるため、Parserの推測による誤解析や、入れ子構文で終端の所属を取り違える危険を抑えられます。許可範囲を構文ごとにテストしやすく、将来の拡張時にも仕様変更の影響を特定できます。
デメリット: 既存仕様や慣れた書き方で終端を省略できる場合でも、許可一覧に含まれなければ明示終端が必要です。入力の記述量が増える可能性があり、省略を追加するたびに仕様とテストの更新が必要です。
「明示的に省略可能」とする構文・位置の一覧は別途定義し、一覧にない省略は構文エラーとします。
根拠
優先度の高い残課題要件検証結果反映設計課題.md「Parserのブロック境界設計」。
2. Import、Alias、名前解決
Importは生成器向けの文字列にとどめず、入力上の名前、ターゲット名、必要な修飾情報を持つ宣言として保持します。AliasClassはRe:Mind名とターゲット上の型名の対応、AliasMemberは所属クラス、ターゲットメンバー名、引数型・戻り値型、static/instanceの区別を保持します。
名前解決は意味解析時に共通のAliasTableを構築して行い、その結果をProgramIRへ渡します。生成器ごとにAlias解決表や独自の名前解釈を重複して持たせません。同名Alias、未定義Alias、型不一致などは生成前に診断します。
Importの順序・重複、Aliasの優先順位、完全修飾名との衝突については規則を別途明文化し、正常系と衝突・未定義の異常系テストで固定します。設計資料は決定事項として優先順位の具体値を指定していないため、その選択は実装前に確定します。
要決定: Importの重複とAliasの衝突解決
次の各規則は設計資料に採用案がないため、明示的に選択し、同じ規則を意味解析と全生成器で共有します。
・Importの重複:
A案 重複宣言をエラーにする/B案 同一Importを一つにまとめる。
・同じRe:Mind名に複数Aliasが対応する場合:
A案 エラーにする/B案 定めたスコープ優先順位で一つを選ぶ。
・Alias名と完全修飾名が衝突する場合:
A案 Aliasを優先する/B案 完全修飾名を優先する/C案 曖昧エラーにする。
・複数Importが同じ名前を提供する場合:
A案 宣言順で優先する/B案 宣言順に依存させず曖昧エラーにする。
決定
・Importの重複:
A案 重複宣言をエラーにする とします。
・同じRe:Mind名に複数Aliasが対応する場合:
A案 エラーにする とします。
・Alias名と完全修飾名が衝突する場合:
C案 曖昧エラーにする とします。
・複数Importが同じ名前を提供する場合:
B案 宣言順に依存させず曖昧エラーにする とします。
決定の評価
メリット: 重複や衝突を宣言順で暗黙に解決しないため、Importの並べ替えで名前の意味が変わりません。誤ったAlias定義やライブラリの取り違えを早期に検出でき、C#・Java・VB.NETで同じ診断規則を適用できます。
デメリット: 同一Importの重複もエラーとなり、複数の候補が存在するケースでは利用側がAlias名やImportを整理する必要があります。意図的に同名の型・Aliasを併用したい場合も、曖昧さを解消する別名付け等の手段が必要です。
各項目の範囲は次のとおりです。重複Importは同じターゲットImport宣言の重複、同名Aliasは同一のRe:Mind名への複数定義、Aliasと完全修飾名の衝突は一つの参照が両方に解釈できる場合、複数Importの同名提供は異なるImport元が同一の非修飾名を提供する場合を指します。該当する場合は宣言順で選ばず、衝突した名前を示す曖昧エラーにします。
受入条件: 同じ入力のAliasがC#、Java、VB.NETで同じ意味に解決され、未定義Aliasでは対象名を含む診断が出て生成ファイルを作成しないこと。
根拠
優先度の高い残課題要件検証結果反映設計課題.md「AliasとImportの共通意味設計」。
3. 共通AST/IRと構文の意味
AST/IRには、ターゲットごとに再解釈しなくてよい形で、各構文の意味を保持します。
・定数配列: 「配列参照の再代入禁止」と「配列要素の変更禁止」のどちらを意味するかを先に決め、C#、Java、VB.NETそれぞれの出力と要素変更時の診断を定義します。A案とB案は定数配列に要求する不変性を選ぶ案、C案は選択した不変性を各ターゲットが表現できない場合の扱いです。意味が未決定、またはターゲットで表現できない場合は、暗黙に通常配列へ変換せず診断します。
・switch: 判定式、case値、既定節、本体、各caseの終了状態を共通IRに保持します。フォールスルーは「暗黙に次caseへ進まない」「ターゲット言語に合わせる」などの候補があるため、コンパイラオプションと既定値を明記してから実装します。生成器にケース終了の意味決定を委ねません。
・例外: throw式、catch型、catch変数、本体、finally本体、複数catchの順序を共通IRに保持します。catch変数をcatch本体の局所スコープへ登録し、例外型の継承とcatch順序を用いて未定義変数や到達不能catchを検査します。
・null関連: nullリテラル、null条件アクセス/呼出し、null合体を独立した式としてIRへ保持します。C#は対応する演算子を出力し、Java・VB.NETは等価なnull判定等へ変換します。変換では左辺式の評価回数、戻り値型、値型・参照型の差を保つ規則を定義します。
要決定: 定数配列の不変性
仕様の「定数配列」が保証する不変性として、次のどれを採用するかを決めます。ターゲットごとの出力形式と、許可されない変更に対する診断も同時に定義します。
・A案 配列変数への再代入だけを禁止し、配列要素の変更は許可する。
・B案 配列変数への再代入と配列要素の変更の両方を禁止し、不変コレクション等へ変換する。
・C案 A案またはB案で選択した不変性を、対象ターゲットで表現できない場合は、暗黙変換せずエラーにする。
決定
B案+C案とします。配列変数への再代入と配列要素の変更の両方を禁止し、対象ターゲットでその不変性を表現できない場合は暗黙変換せずエラーにします。
決定の評価
A案のメリット: 配列要素の更新を許すため、通常の配列に近い操作性を保ち、要素を変更できない不変コレクションへの変換を避けられます。デメリット: 「定数」という語から配列内容全体が不変だと期待する利用者には直感的でなく、要素変更によって内容が変わることを別途明記する必要があります。
B案のメリット: 配列参照と要素の両方が変更されないという強い不変性を保証でき、宣言後に値が変化しないことを前提にできます。デメリット: 不変コレクション等への変換が必要になり、通常配列と異なる型・API・性能特性を伴う場合があります。既存の配列引数を要求するAPIとの相互運用にも変換が必要になる可能性があります。
C案のメリット: ターゲットごとに表現できない意味を黙って弱めず、生成物間の意味の不一致を防げます。デメリット: ターゲットや型の組み合わせによってはコンパイル可能な出力を生成できず、利用者が別の構文を選ぶ必要があります。C案だけでは「定数配列」の不変性自体は決まらず、A案またはB案との併用が必要です。
案の関係: A案とB案は同じ定数配列に同時適用する意味としては排他的です(B案はA案の再代入禁止に加えて要素変更も禁止するため、より強い制約です)。C案は意味の選択ではなく、選択した意味をターゲットで実現できない場合の診断方針なので、A+CまたはB+Cのように組み合わせます。C案を選んでもA/Bの選択は不要になりません。
B案+C案の評価: 宣言後の再代入と要素変更をともに拒否し、3ターゲット間で保証できない場合は生成を止める方針です。ターゲットの型・API自体が不変性を保証するのか、Re:Mindの意味解析が変更を禁止すれば「表現できる」とみなすのかは、受入条件として明確化が必要です。後者を認める場合、生成先言語の別コードから配列が変更されないことまでは保証しません。
要決定: switchのフォールスルーと既定値
case末尾に □脱出する がない場合の意味と、コンパイラオプションの既定値を決めます。設計資料に挙げられた候補は次のとおりです。
・A案 Re:Mind共通でフォールスルーなしとし、case末尾で暗黙に次caseへ進まない。
・B案 ターゲット言語に合わせ、ターゲットのフォールスルー規則に従う。
・C案 コンパイラオプションで「フォールスルー有」「フォールスルー無」「ターゲット言語に合わせる」から選択する。採用する場合は、オプション未指定時の既定値も決める。
決定
C案でいきます。オプション未指定時の既定値「ターゲット言語に合わせる」
決定の評価
メリット: 一つのコンパイラ設定でフォールスルー有・無を選べるほか、既定ではターゲット言語の挙動を尊重できます。既存のターゲット固有コードとの相互運用性を保ちやすく、必要に応じてターゲット間で同じ挙動を選択できます。
デメリット: 既定値がターゲットごとに異なるため、同じRe:Mindソースでもターゲット間で実行結果が変わる可能性があります。3ターゲットで同一の意味を求める場合は、オプションを明示する必要があります。また、各ターゲットのフォールスルー特性と、□脱出するを出力するかどうかの対応を実装・テストで一貫させる必要があります。
要決定: null演算子のターゲット変換規則
Java・VB.NETでnull条件アクセス/呼出しとnull合体を表す方法、および適用できない型の扱いを決めます。
・A案 短絡条件式または三項式へ展開する。
・B案 一時変数を用いた明示的null判定へ展開し、左辺式の評価を一度にする。
・C案 ターゲットの型・構文で意味を保てない場合は、その構文をエラーとして拒否する。
選択した方式ごとに、値型・参照型、戻り値型、ネストしたアクセス、左辺式の評価回数を含む適用条件を定めます。
決定
A案とします。値型・参照型、戻り値型、ネストしたアクセス、左辺式の評価回数を含む適用条件を追記してください。
決定の評価
メリット: 条件式や三項式は通常の式として出力でき、追加の一時変数や文ブロックを生成せずに済む場合は、生成コードが簡潔になります。
デメリット: 単純な展開では左辺式をnull判定と値取得で複数回評価する形になり得ます。左辺に関数呼出し、プロパティ取得、副作用のある式が含まれる場合、結果が変わったり副作用が重複したりするおそれがあります。また、値型・nullable型の扱いと、null時に得られる結果型をターゲットごとに整合させる必要があります。
適用条件: 参照型のreceiverにはnull判定を行い、null時の結果と非null時のアクセス結果を同じ式型として表せる場合に条件式/三項式へ変換します。値型のreceiverはnullになり得ないため、nullable値型として表現できる場合に限ってnull条件アクセスを適用し、結果型をnullable化します。null合体は左辺がnullになり得る型であることを要求し、右辺は左辺の非null時の型へ変換可能であることを型検査します。ターゲットごとの結果型の差を吸収できない場合は、暗黙の型変換で意味を変えず、診断対象とします。
ネストしたnull条件アクセスは内側から段階的に条件化し、途中のreceiverがnullなら後続のアクセスや呼出しを評価しません。条件式/三項式の条件部と値部でreceiverを再評価する形になる場合、左辺式に副作用がなく値が安定していることを確認できなければ、元の「一度だけ評価する」意味を保てません。一時変数を導入して一度だけ評価する方法はB案に相当するため、A案を選んだ場合にそれを許すか、またはそのような式を診断で拒否するかは別途決める必要があります。C#の ?. / ?? は直接出力可能な場合は直接出力し、Java・VB.NETでは選択した条件式/三項式形式が同じ短絡性と結果型を保つことをターゲットコンパイルとテストで確認します。
未確定の適用条件(A案におけるreceiverの再評価):
A案の条件式/三項式展開だけではreceiverの一度だけの評価を保証できない場合があります。次のどちらにするかを決めます。
・一時変数によるreceiverの退避を認める。この場合、式展開に文や一時変数を導入するため、実装方式はA案とB案の併用となる。
・A案の式形式を維持し、一度だけ評価できると保証できないreceiver(副作用のある呼出しやプロパティ等)を診断する。
この適用条件の選択は未決定です。いずれの場合も、同じreceiverを複数回評価してよいと無条件に扱ってはなりません。
未確定の適用条件の決定
・A案の式形式を維持するとします。
決定の評価
メリット: 条件式/三項式という式の形を保てるため、代入式や関数引数など式が必要な位置でも変換しやすく、文や一時変数を追加しない単純なケースでは生成コードを短くできます。また、採用する変換形式が明確になり、ターゲットごとのコード生成を統一しやすくなります。
デメリット: A案の式形式を維持するだけではreceiverを一度だけ評価する保証になりません。null判定とアクセス結果の両方でreceiverを参照する展開では、関数呼出しやプロパティ取得が複数回実行され、副作用や値の変化が発生する可能性があります。一時変数を導入して一度だけ評価する方法は式形式を維持するという決定と異なるため、receiverが再評価されても安全だと判定できないケースは診断で拒否する必要があります。単純に重複評価を許すと、元の ?. の意味を保てない場合があります。
したがって、A案の式形式を維持する範囲は、receiverの再評価が安全な式に限定する必要があります。安全性を判定できない式をどのように診断するかは、Parser/意味解析の受入条件として定義します。
根拠
優先度の高い残課題要件検証結果反映設計課題.md「共通AST/IRの意味契約」。
4. 複数クラス、継承、インスタンスの型・シンボル表
CompilationUnitとClassIRは、複数クラス、ターゲット名、基底型、static/instanceのフィールド・メソッド、アクセス修飾子、コンストラクターを保持します。解析ではまず全クラスの型情報を登録し、その後にメンバー本体を解決することで、宣言順に依存しない型解決を目指します。
クラス単位のシンボル表とローカル等のスコープ単位のシンボル表を分け、メンバー探索順を「対象型、基底型、必要な場合はAliasで指定された外部型」として定義します。new()の型補完、コンストラクター引数、メソッド引数・戻り値、フィールド代入を共通の型情報で検査し、未定義の基底型・メンバー、アクセス違反、名前衝突、staticからのinstance参照を診断します。
受入条件: 複数クラスの宣言順を入れ替えても解決結果が同じであり、継承メンバー、instance/staticの呼出し、コンストラクター引数、未定義メンバーを検証できること。
根拠:優先度の高い残課題要件検証結果反映設計課題.md「複数クラス、継承、インスタンスの設計」。
5. ターゲット別生成契約
共通IRの各ノードについて、C#、Java、VB.NETの出力構文と、表現できない場合の診断を対応表にまとめます。コード生成器は共通IRに記録された意味を出力へ写し、意味解析や名前解決を独自にやり直しません。
特に定数配列、switch、例外、null合体・null条件、継承、インスタンス生成について、ターゲット固有の型・構文・評価規則を表にし、コンパイラで表現できない組み合わせを明示的なエラーにします。生成ソースの作成だけをコンパイル・実行成功とみなさず、JavaとVB.NETを含む各ターゲットの対象コンパイラおよび実行結果まで確認します。
根拠:優先度の高い残課題要件検証結果反映設計課題.md「ターゲット生成契約」。
6. 診断とCLIの失敗契約
構文、意味解析、IR変換、コード生成のエラーは、標準エラーへ診断を出し、非0の終了コードを返す共通契約とします。診断には可能な限り入力ファイル、行・列または近傍、対象名、期待内容、実際の内容を含めます。エラー時はターゲット出力ファイルを新規作成・更新しません。
Alias未定義、catch変数未登録、継承元未定義、未確定の定数配列表現、曖昧な終端省略などを、生成器で黙って補正せず、原因が特定できる段階で停止します。
根拠:優先度の高い残課題要件検証結果反映設計課題.md「診断とCLI契約」。
7. 統合受入と実装順
AOIごとに入力、ターゲット、生成先、期待結果をテストケースとして定義し、次を自動検証します。
- トランスコンパイルの終了コードと生成ファイルを検査する。
- 各ターゲットのコンパイル終了コードを検査する。
- 実行時の標準出力・標準エラー・終了コードを取得し、文字コードと改行の正規化規則に従って期待値と比較する。
- 失敗した段階(変換、コンパイル、実行)を区別して記録する。
- 対象コンパイラが環境にない場合は、変換成功とコンパイル・実行成功を分け、受入完了と誤認しない。
要決定: 生成物と実行結果の比較正規化
期待値と実測値を比較する前に正規化する範囲を決めます。設計資料は正規化が必要であることを示していますが、具体的な規則は未確定です。
・改行: A案 CRLF/LFを統一する/B案 改行コードの差も不一致として扱う。
・文字コード: A案 UTF-8へ読み替えて比較する/B案 規定した同一文字コード・BOM条件での比較を必須にする。
・末尾空白: A案 行末空白を除去して比較する/B案 空白を含めて完全一致させる。
採用した規則を変換後ソースと実行時標準出力のどちらに適用するかも明記し、比較テストで固定します。
実装は、(1) Parserのブロック境界、(2) CompilationUnit・ClassIR・AliasTable・スコープ・型解決の共通モデル、(3) switch・例外・null・定数配列の意味とIR、(4) ターゲット別変換表と診断、(5) catch・継承・コンストラクター等の意味解析、(6) Priorityごとの正常・異常AOI、(7) Priority 07の3ターゲットコンパイル・実行自動化の順で進めます。
決定
・改行: A案 CRLF/LFを統一する とします。
・文字コード: A案 UTF-8へ読み替えて比較する とします。
・末尾空白: A案 行末空白を除去して比較する とします。
決定の評価
メリット: OSやツールが異なる環境で生じる改行コード・BOM等の表現差を吸収し、生成内容や実行結果の実質的な差を比較しやすくなります。行末空白の差による不要な不一致も避けられます。
デメリット: 改行形式や末尾空白そのものを検査できなくなるため、生成物のバイト単位の再現性や書式を保証する検証には使えません。また、UTF-8として不正なバイト列の扱い、BOMの扱い、空白を意味として保持すべきデータの比較方法は別途定義が必要です。正規化は比較時だけに適用し、元の生成物や実行出力を書き換えないものとします。
完了条件: 曖昧な文法と省略規則が明文化され、AST/IR・名前解決・ターゲット変換契約が共通化され、正常系は3ターゲットでコンパイル・実行でき、異常系は診断・終了コード・出力抑止を検証でき、Priority 07統合AOIを自動実行できること。
根拠
優先度の高い残課題要件検証結果反映設計課題.md「Priority 07統合受入の設計」「設計確定から実装までの推奨順」「完了判定」。
おわりに
Lv1.2からLv1.3への更新は、主に最小MVPのAI仕様駆動開発の完了条件の検証時に発見された内部仕様の不備の確定となりました。
参考リンク
↓ここからは2022 Lv1
日本語トランスコンパイラ言語 Re:Mind (自作言語)と他言語との構文比較(IF文)
日本語トランスコンパイラ言語 Re:Mind (自作言語)と他言語との構文比較(FOR文)
Java C# Ts GoのC系言語 Mind DNCLの日本語系言語の制御構文を比較して自作言語Re:Mindの構文を定める(if..else if..else文)
Java C# Ts GoのC系言語 Mind DNCLの日本語系言語の制御構文を比較して自作言語Re:Mindの構文を定める(for..if文)
C言語系(Java C# Ts Go) 日本語系(Mind DNCL)各言語構文を比較して自作言語Re:Mindの構文を定める(変数宣言・実行文・関数宣言)
オープンな実装言語仕様 日本語トランスコンパイラ言語 Re:Mind(リマインド)2022 Lv1
↑ここまでは2022 Lv1
↓ここからは2023 Lv1.1ドラフト
C言語系(Java C# Ts Go) 日本語系(Mind DNCL プロデル なでしこ)各言語構文を比較して自作言語Re:Mindの構文を定める(switch文)
C言語系(Java C# Ts Go) 日本語系(Mind DNCL プロデル なでしこ)各言語構文を比較して自作言語Re:Mindの構文を定める(while文)
C言語系(Java C# Ts Go) 日本語系(Mind DNCL プロデル なでしこ)各言語構文を比較して自作言語Re:Mindの構文を定める(try~catch文)
C言語系(Java C# Ts Go) 日本語系(Mind DNCL プロデル なでしこ)各言語構文を比較して自作言語Re:Mindの構文を定める(import文))
オープンな実装言語仕様 日本語トランスコンパイラ言語 Re:Mind(リマインド)2025 Lv1.1
↑ここまで2023 Lv1.1
↓ここから Lv1.2ドラフト
オープンな実装言語仕様 日本語トランスコンパイラ言語 Re:Mind(リマインド)2024 Lv1.2ドラフト
オープンな実装言語仕様 日本語トランスコンパイラ言語 Re:Mind(リマインド)2025 Lv1.2ドラフト
↑ここまで Lv1.2ドラフト
↓ここから Lv1.2
オープンな実装言語仕様 日本語プログラミング言語 Aoi (あおい)2025 Lv1.2
↑ここまで Lv1.2
-
あおい言語ファミリー(あおい・いずみ・なごみ・あいな)の対象仕様の本文・図はCC BY 4.0、指定自作例示コードはCC0 1.0。転載・改変等は各ライセンスに従い、第三者素材・既存コードは各条件に従います。
独立実装は商用・非商用、公開・非公開を問わず自由で、実装のライセンスも自由。仕様のライセンスは実装・利用者プログラムへ自動適用されません。名称・ロゴ・公式認定・特許・第三者の権利は別扱いとなります。仕様・例示は各ライセンスに従い無保証です。
付記:対象「日本語プログラミング言語 あおい(Aoi)2026 Lv1.3」|権利者・表示名 mylifewithviolin|原文 URL |CC0対象「言語仕様」内の全自作あおいソースコード例|除外 なし ↩