* 川合のプログラミング言語自作のためのテキスト第二版#0011 -(by [[K]], 2019.07.04) ** (19) 考察 -[[text0010]]での主張を再掲しつつ、分析したいと思います。 ---- -1億回ループでのベンチマーク |言語処理系|行数|タイプ|説明|実行時間(gccの-O3を1.00としての相対値)|リンク| |TL-3c|119行|単純インタプリタ|代入・加算・減算・print・whileのみサポート|RIGHT:627.85倍|[[text0012]]| |TL-3d|123行|単純インタプリタ|TL-3cを高速化したもの|RIGHT:55.35倍|[[text0013]]| |TJ-03a|185行|JITコンパイラ|TL-3dをJITコンパイラ化したもの|RIGHT:6.78倍|[[text0014]]| |TJ-03b|224行|JITコンパイラ|TJ-03aにレジスタ変数を追加して高速化|RIGHT:1.70倍|[[text0015]]| |TJ-03c|247行|JITコンパイラ|TJ-03bにdo~whileを追加して高速化|RIGHT:1.00倍|[[text0016]]| --JITコンパイラ(註:JITコンパイラはインタプリタ実行のための技術)によって、コンパイラのほうが高速であるという時代は終わりました。 ---- -ライブラリの威力 |言語処理系|行数|削減率|実行時間(gccの-O3を1.00としての相対値)|| |TL-1k(TL-1c相当)|RIGHT:52行→''31行''|40.4%削減||[[text0017]]| |TL-2k(TL-2c相当)|104行→''31行''|70.2%削減||[[text0018]]| |TL-3k(TL-3d相当)|123行→''45行''|63.4%削減|RIGHT:46.00倍|[[text0019]]| |TJ-03x(TJ-03a相当)|185行→''61行''|67.0%削減|RIGHT:6.78倍|[[text0020]]| |TJ-03y(TJ-03b相当)|224行→''78行''|65.2%削減|RIGHT:1.70倍|| |TJ-03z(TJ-03c相当)|247行→''88行''|64.3%削減|RIGHT: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]] *こめんと欄 #comment