プログラミング言語開発記Ⅰ - 概要
少し前から自作のプログラミング言語、Laiskを開発している。自身の思考の整理や今後似た試みに手を出す方への助けとなればと思い開発記録をブログ記事として書き残していく。
発端
今学期に私が大学で履修している講義で、木構造による数式の表現に面白さを覚えたこと。その直前に参加したAtCoderのコンテストでRubyによる競技プログラミングに速度面の限界を感じたこと。
ちゃんとC++コーディングを練習しなければなあと思いつつもどうしても面倒臭かったので、いっそプログラムにプログラムを吐かせてしまったらどうかという発想である。ものぐさの境地といったところであるが、常に「技術の発展は怠惰から」と私は考えている。
概要
第一の特徴に、LaiskコードはC++のソースコードへコンパイルされる形で実行可能となる。この形式を取る2つの大きな利点として、機械語やアセンブリ言語に直接触れないまま既存のプログラム資源を有効活用して高速にプログラムを実行できることと、あくまでC++コードを生成するためオンラインジャッジで提出可能であること、があるかと思う。発端が競技プログラミングということもあり、言語よりは「自分で書き貯める競プロライブラリの延長」という感覚に近い。
その他、いくつか言語仕様の特徴を挙げる。
-
短い組み込み関数名、豊富な糖衣構文
元々記述を楽にするために作られているため、組み込み関数の名前は意味が判別可能な範囲で短くされている。また、例えば「0~100」は0から99まで100個の整数が順番に入った配列を生成するというように直感的な記述が可能である。
コード例
以下にLaiskコードの例としてフィボナッチ数列の先頭100項を空白区切りで出力するものを挙げるが、あくまで理想的な完成像に基づいている。
(f=0~100).map!(i){i<2?i:f[i-2]+f[i-1]}.put
現状
現時点でそれなりに開発を進めて来ていたのだが、このたった2週間で私の無計画さが如実に顕れた紆余曲折を経ている。
- Webページ上でコンパイルできると楽そうなのでJavaScriptで書き始める
- 軽く形になったが生成コードの美しさに納得が行かずC++生成方式を変えてほぼ一から書き直す
- ようやく良い感じになったが後々のことを考えるとコンパイラ自体もC++で書いた方がよいのでは?と考え一からC++で書き始める
-
せっかくなのでコード生成方式も全く別スタイルに切り替えよう←今ココ
要は、結局まだ(約3回目の)振り出しである。C++を勉強したくないが為にC++コードを生成するコンパイラをC++で書くというわけのわからないことになっているが突っ込んではいけない。これから詰まった点や進んだ点を少しずつこの場で報告しければと思う。