MikoScript3 言語仕様

 基本データ型

本言語では、以下のデータ型を基本にしています。
    ・整数型
    ・実数型(浮動小数点数型)
    ・文字列型
    ・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言語と同様ですが、文法上の文字列のデータ型は、
文字の配列として扱うのではなく、あくまで独立した文字列型として扱います。

 文字コードの符号化方式には、いろいろありますが、本言語では、UTF-16(LE) を内部
処理の基本にしています。この符号化方式では、1字は通常 16-bit(2-byte)ですが、
サロゲートペア―の場合、1字が 16-bit×2(4-byte)になります。

 文字列をファイルに格納したり、外部のプログラムやDLL等とやり取りする時には、
各種の符号化方式に変換できます。( ⇒ 参照 )

 定文字列の表記法に関しては、「文字列リテラル」の章で詳しく説明しています。

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

●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 になります。

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