MikoScript 言語仕様

 基本データ型

本言語では、以下のデータ型を基本にしています。
    ・整数型
    ・浮動小数点数型(実数型)
    ・文字列型
    ・null型
本章では、これらの基本データ型の特性を説明します。これらの定数の表記形態(リテラ
ル)に関しては、別の章で説明しています。

●整数型
 整数の内部バイナリー表現には、各種の形式がありますが、本言語では、32-bit の2
の補数表現を基本にしています。この形式で表現可能な値の範囲は、
    -2147483648 〜 +2147483647 
です。この範囲を越える数や小数は、浮動小数点数型で扱います。

 整数は、加減乗除演算と剰余算だけでなく、ビット操作演算が可能です。どの整数演算
でも、オーバーフロー/アンダーフローは、無視されて、とにかく最後の 32-bit がその
演算結果になります。たとえば、
    0x12345678 * 0x100          →  0x34567800
    0x8000`0000 + 0x8000`0000   →  0
という演算結果になります。

 整数型と整数型との演算は、整数型で行なわれ、その演算結果は、整数型になります。
 整数型と浮動小数点数型との演算は、まず整数型のほうが浮動小数点数型に変換されて
から、浮動小数点数型で行なわれます。その演算結果は、浮動小数点数型になります。
 整数型と文字列型との演算は、通常できません。この場合、どちらかの型を他方の型
に明示的に変換してから演算させる必要があります。たとえば、
    12 + "34"
は、不正演算になりますが、次のようにすれば可能です。
    12 + "34"'int   → 46
    12'd + "34"     → "1234"
このように、どちらの型に合わせるかで結果は異なります。

 整数定数の表記法に関しては、「字句要素」の章で説明しています。

●浮動小数点数型(実数型)
 浮動小数点数には、各種の表現形式がありますが、本言語では、IEEE754規格(倍精度)
の 64-bit データを基本にしています。この形式では、符号 1-bit、仮数部 52-bit、
指数部 11-bit になります。これは10進数では、有効桁数が 15〜16 桁で、概ね
    ±2.2250738585072014E-308 〜 ±1.7976931348623158E+308
の範囲の数値になります。

 浮動小数点数は、加減乗除演算と剰余算が可能ですが、ビット操作演算はできません。
 浮動小数点数の演算で、オーバーフローが発生すると、それを表わす特別なビットパタ
ーンの浮動小数点数値になります。一方、アンダーフローが発生すると、値が 0 の浮動
小数点数値になります。いずれの場合も、例外は発生しません。

 浮動小数点数型と浮動小数点数型との演算は、浮動小数点数型で行なわれます。その演
算結果は、浮動小数点数型になります。
 浮動小数点数型と整数型との演算に関しては、既に述べた通りです。
 浮動小数点数型と文字列型との演算は、通常できません。この場合、どちらかの型を他
方の型に明示的に変換してから演算させる必要があります。たとえば、
    1.2 + "3.4"
は、不正演算になりますが、次のようにすれば可能です。
    1.2 + "3.4"'float   → 4.6
    1.2'g + "3.4"       → "1.23.4"
このように、どちらの型に合わせるかで結果は異なります。

 浮動小数点定数の表記法に関しては、「字句要素」の章で説明しています。

●文字列型
 文字列は、一連の文字コード列から成ります。この文字コード列は、任意の文字コード
の組合せが可能ですが、その最後だけは、値が 0 の特別なコードで終端されます。本言
語の文字列の内部バイナリー表現は、C言語と同様ですが、文法上の文字列のデータ型は、
文字の配列として扱うのではなく、あくまで独立した文字列型として扱います。

 文字コードは、現バージョンでは、ASCII と Shift-JIS に限定されます。Shift-JIS 
コードでは、半角カタカナは1バイト、全角文字は2バイトになります。ASCII コードの
範囲では、1バイトは1字に対応しますが、Shift-JIS コードでは、1字が1バイトの場
合と2バイトの場合があります。

 文字列の「長さ」または「サイズ」は、その文字列を構成するバイトの総数になります。
ただし、このバイト数には、終端の 0 のバイトは含みません。
 文字列の「字数」は、その文字列を構成する各文字の総数になります。この場合、半角
も全角も1字にカウントします。なお、終端の 0 は字数には含みません。
 文字の「桁数」は、等幅フォントでの文字の表示幅を示す数で、半角は1桁、全角は2
桁になります。
 従って、文字列の「桁数」は、ASCII と Shift-JIS の範囲では、文字列の「長さ」と
と同じです。しかし、UNICODE, EUC, JIS 等では、文字列の「桁数」と「長さ」は、必ず
しも一致しません。

 Shift-JIS コードの2バイトコードでは、論理上可能なコード値の範囲のうち、文字が
割当てられていない部分があります。この部分のコードは、文字コードとしては、不正に
なります。不正な文字コードが、文字列の中に含まれていると、その文字列内の正規の文
字コードが誤認される可能性があります。文字列は、基本的に、正規の文字コード列で構
成する必要があります。

 定文字列の表記法に関しては、「定文字列」の章で詳しく説明しています。
 なお、文字定数は、文字列型ではなく、整数型になります。これに関しては、「字句要
素」の章で説明しています。

●null型
 null型は、その値が null しかない特種なデータ型です。null は、無効値を示す予約
語で、文法上、定数や変数と同様に、式内でひとつの項になれます。null は、対象が無
効かどうかを判断する時や、対象が無効であることを示す時に使用します。また、演算結
果が null になることもあります。

 null 自身に対する真偽判定結果は、偽(0) になります。
 null どうしの演算は、以下のようになります。
    ! null          →  真(1)
    null == null    →  真(1)
    null != null    →  偽(0)

 箱に null を代入すると、その箱は空になります。その箱が破棄されるわけではありま
せん。空の箱の値は、null と等価です。なお、存在しない箱は、それを参照すると、例
外が発生するので、その値が、null になるとは限りません。

 null は、== と != 演算子で、任意の対象と比較でき、その結果は以下の通りです。
    A == null   →  A の評価値が null なら真(1)、さもなくば、偽(0)
    A != null   →  A の評価値が null なら偽(0)、さもなくば、真(1)

 null に対する演算は、以上述べた以外不正です。不正演算は、定値の場合なら、コン
パイル時にエラーになりますが、そうでなければ、例外が発生します。例外に関しては、
「例外処理」の章で説明します。

 関数は、null を引数として受けとることも、null を返すこともできます。関数が値を
返さなかった場合、その関数値は、null になります。

●注意事項
 箱には、どの基本データ型の値でも代入できますが、基本データ型は、クラスではない
ので、基本データ型の値が代入された箱は、オブジェクトではありません。オブジェクト
に関しては、「箱」「構造体」「クラス」の各章で説明します。