プログラミング言語開発記Ⅰ - 概要

少し前から自作のプログラミング言語、Laiskを開発している。自身の思考の整理や今後似た試みに手を出す方への助けとなればと思い開発記録をブログ記事として書き残していく。

発端

今学期に私が大学で履修している講義で、木構造による数式の表現に面白さを覚えたこと。その直前に参加したAtCoderのコンテストでRubyによる競技プログラミングに速度面の限界を感じたこと。

ちゃんとC++コーディングを練習しなければなあと思いつつもどうしても面倒臭かったので、いっそプログラムにプログラムを吐かせてしまったらどうかという発想である。ものぐさの境地といったところであるが、常に「技術の発展は怠惰から」と私は考えている。

概要

第一の特徴に、LaiskコードはC++ソースコードコンパイルされる形で実行可能となる。この形式を取る2つの大きな利点として、機械語アセンブリ言語に直接触れないまま既存のプログラム資源を有効活用して高速にプログラムを実行できることと、あくまでC++コードを生成するためオンラインジャッジで提出可能であること、があるかと思う。発端が競技プログラミングということもあり、言語よりは「自分で書き貯める競プロライブラリの延長」という感覚に近い。

その他、いくつか言語仕様の特徴を挙げる。

    • 突き詰められた式指向・関数型言語

      Laiskコードはパースされた結果、"root"関数で括られて引数に関数の入れ子が繰り返された巨大な1つの木構造となる。ifやwhileや代入など全ての関数はそれぞれの規則での明確な返り値を持っている。
    • 短い組み込み関数名、豊富な糖衣構文

      元々記述を楽にするために作られているため、組み込み関数の名前は意味が判別可能な範囲で短くされている。また、例えば「0~100」は0から99まで100個の整数が順番に入った配列を生成するというように直感的な記述が可能である。
    • 変数は宣言不要、全て動的型(要検討)

      新出の変数は勝手にその場で宣言される。さらに、C++のライブラリであるboost::anyを利用し、スクリプト言語のような動的型を実現する。ただし、パフォーマンス面等も考えて今後検討していく。

コード例

以下に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++で書くというわけのわからないことになっているが突っ込んではいけない。これから詰まった点や進んだ点を少しずつこの場で報告しければと思う。