川合のプログラミング言語自作のためのテキスト第二版#0011

  • (by K, 2019.07.04)

(19) 考察

  • text0010での主張を再掲しつつ、分析したいと思います。

  • 1億回ループでのベンチマーク
    言語処理系行数タイプ説明実行時間(gccの-O3を1.00としての相対値)リンク
    TL-3c119行単純インタプリタ代入・加算・減算・print・whileのみサポート627.85倍text0012
    TL-3d123行単純インタプリタTL-3cを高速化したもの55.35倍text0013
    TJ-03a185行JITコンパイラTL-3dをJITコンパイラ化したもの6.78倍text0014
    TJ-03b224行JITコンパイラTJ-03aにレジスタ変数を追加して高速化1.70倍text0015
    TJ-03c247行JITコンパイラTJ-03bにdo~whileを追加して高速化1.00倍text0016
    • JITコンパイラ(註:JITコンパイラはインタプリタ実行のための技術)によって、コンパイラのほうが高速であるという時代は終わりました。

  • ライブラリの威力
    言語処理系行数削減率実行時間(gccの-O3を1.00としての相対値)
    TL-1k(TL-1c相当)52行→31行40.4%削減text0017
    TL-2k(TL-2c相当)104行→31行70.2%削減text0018
    TL-3k(TL-3d相当)123行→45行63.4%削減46.00倍text0019
    TJ-03x(TJ-03a相当)185行→61行67.0%削減6.78倍text0020
    TJ-03y(TJ-03b相当)224行→78行65.2%削減1.70倍
    TJ-03z(TJ-03c相当)247行→88行64.3%削減1.00倍
    • 仮に言語を自作としたとして「私の自作言語を使うことで、コードが6割以上削減できます!」みたいな主張ができたらかっこいいですよね。でもこのように、新言語を作らずともライブラリを作るだけで、同じような効果を得ることができるのです。
    • 一般にライブラリを作るのは言語を作るよりもずっと楽です。既存言語の上に付け足すだけだからです。
    • ちなみにJITコンパイラが100行未満で作れちゃうのは、「かなり優秀」だと自分では思っています!

  • このシリーズが主張していること:
    • [1] プログラミング言語を作るのは難しくない!
    • [2] JITコンパイラはとても高速。しかも難しくない!
    • [3] うまくライブラリを作ると、有用な言語を自作するのと同じくらいの効果がある
  • [1] TL-1cが52行だったので、プログラミング言語は、難しい仕様さえ選ばなければ、十分に簡単に作れるということは明らかになったのではないかと思います。もう少し現実的な仕様のTL-3dでも123行でしかありません。
  • 言語を作るのは難しいとは思わないでください。そんなふうに思い込んでもいいことは何もないはずです。難しくしているのはあなたがそういう仕様を選んでいるからなのです。
  • もし言語づくりが難しすぎて開発が止まってしまうようなら、もっと作りやすい仕様を考えましょう。本当にその機能は必要なのか、他の機能で代用できるのではないか、苦労してまで必要な機能なのか。
  • ・・・私たちは使うだけではなくて作る側でもあるのですから、むやみに高い理想を目指すべきではないと私は思います。
  • [2] JITコンパイラについて、その高速性は十分に示せたと思います。
  • そしてTL-3dからTJ-03aへの行数の増加量は1.5倍程度でした。だから1.5倍書く気になれば、JITコンパイラは実装できるのです。それだけで実行速度は8倍(=55.35/6.78)も速くなるのです。
  • さらに速さが欲しければ、行数を増やしていくことでそれも実現可能です。もちろん実行速度が速いのはいいことですが、速くするためには労力(行数)も必要になるので、自分の言語にはどのくらいの速度があればいいのか、それを意識することがとても重要なのではないかと私は思います。
  • [3] ライブラリをうまく作れば、行数削減率65%くらいを達成することができます。これはつまり行数を1/3にできるということであり、おおざっぱに言えば3倍速く開発ができるようになるということです。
  • 一般に言語を乗り換えただけで2倍も3倍も開発が速くなる(行数が削減できる)ということはかなり珍しいケースなので、これは言語拡張という視点で考えると相当に良い成果なのではないかと思われます。
  • 一方で、ライブラリを使って行数が減るケースはよくあります。特にライブラリに処理のほとんどを任せられるような場合です。そういうライブラリは得手不得手がはっきりしやすく、複数のプログラムに対して汎用的かつ一定の割合で減らす効果はありません。
  • 複数のプログラムに対して汎用的かつ一定の割合で減らす傾向を持つのは言語拡張っぽいライブラリの場合だけで、たとえばそれは標準ライブラリなどが該当します。
  • だから今回私が作ったのは標準ライブラリっぽいライブラリだということができます。

次回に続く

  • 次回: text0022?

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-07-04 (木) 14:54:26 (79d)