最近作ってるプログラミング言語


はじめに

この言語の名前はAWS(AWScript)です。
"AWSはプログラミング言語"というネタがTwitterなどで散見される中、言語の名前をDiscordで募集した結果 Air Water Script、 略してAWS という非常に紛らわしい案が出たので採用しました。
何かしら実害が出たら変えます。
まぁ普及するわけもないので多分大丈夫
※この言語は互換性も実用性も皆無です

コード

今のところこんな感じのコード

#func main() : int
    var car : Car = Car(5);
    car.put();
    return 0;
#class Car(speed : int)
    var me.speed : int = speed;
    func put() : int
        me.speed.print();

これはC++の

#include<iostream>

int main(){
    Car car(5);
    car.put();
    return 0;
}

class Car {
public:
    int speed;
    Car(int s){
      speed = s;
    }
    int put(){
      std::cout << speed;
    }
}

と同じ意味になる。

文法

  • 型の表現
    to 型でポインタ型
    func(型, 型, …) -> 型で関数型
    を表す。
    例えば、C言語のsignal関数の型は
    func(int, to func(int)->void)->to func(int)->void
    と表せる

  • 変数定義
    var 変数名 : 型 [= 初期値], …でローカル変数を定義出来る。
    コンストラクタ内で変数名にme.をつけるとメンバ変数の定義になるが、
    var val : int, me.val : int;のような書き方も出来るので少し分かりづらい

  • 関数定義

#func 名前(引数1 : 型, …) : 戻り値の型
    //statements

で関数を定義でき、関数名はその関数を指した関数型の変数として扱える
(C言語と似た感じ)

  • クラス定義
#class 名前(コンストラクタの引数1 : 型, …)
    //statements of constructor
    func メンバ関数名(引数1 : 型, …) : 戻り値の型
        //statements

クラスの名前と一緒にコンストラクタの引数リストを書き、その後にコンストラクタの中身を書く。
コンストラクタの定義のためにクラス名をもう一度書く手間が省ける

特徴

  • 関数とクラスの終わりの判断
    関数⋯#func
    クラス⋯#class
    メンバ関数⋯func
    を先頭に置くことで、次の関数orクラス定義までを定義の終端と判断する。
    この仕様のため、Pythonのようなコードになっているが、インデントは文法に関係ない

  • オブジェクト指向
    クラスの継承とvtableによる多態性を実装しているので下のコードが動かせる

#main() : int
    var a1 : t1 = t1();
    var a2 : t2 = t2();
    var p1 : to t1 = &a1;
    var p2 : to t1 = &a2;
    p1->put(); //1
    p2->put(); //2
#class t1()
    func put() : int
        putchar('1');
#class t2() : t1
    func put() : int
        putchar('2');

おわりに

この言語を作っていて、間違ったコードが入力されたときに正しくエラーを返すのが難しかった。
var : int = 5のような想定する入力が欠けたコードが入力されると無限ループになったり落ちたり。

改めて世のコンパイラは凄いと思いました(小並感)