なぜRubyでx86コンパイラを書くのか

最近Rubyx86アセンブリコンパイルを行うリポジトリをシコシコと書いています。

https://github.com/myun2/portable-binary

なぜRubyx86アセンブリコンパイラを書くのか?

単純な興味本位ではあります。昔同じような事をやろうとしていたけど、その後やめてしまったものの再び再開したと言うのがあります。

じゃあなぜ再開したかといえば、最近バイナリコードをあれこれしているような人をフォローしたり、最小のDockerfileを作ってみたら楽しかったというのがあります。

 

こっからは蛇足に近いので、特に読み飛ばしていただいても結構です。

富豪的プログラミングからの揺り戻し

昨今は、富豪的プログラミングと言う、CPUリソースやメモリリソースが圧倒的にあるのだから、プログラマは細かいことを気にせずガンガンコードを書けよと言う流れがあります。しかし実際には、LLで書くとリソースを食い潰してしまうので、Go等の高速に動作するコンパイル言語で書き直す揺り戻しの流れも出来ているかと思います。

Webシステムはクライアントサーバシステムですので、例え1クライアント辺りの専有リソースがさほど大きくなくとも、大量のリクエストが来ればサーバのリソースを食い潰してしまう自体は多く発生します。そのため、そうならないようにWebエンジニアは日々四苦八苦している訳です(Goで書き直すといったようなものも一つの手段)。

揺り戻しは果たしてどこまで進む?

最近では観測範囲の問題かも知れませんが、Rustがどうこうと言う話を見掛けるようになった気がします。

Rust自体がそれなり認知されたのは5年程前だと記憶しているので、恐らく1.0が登場したタイミングでしょうか。その当時は国内Ruby on Rails最盛期であり、もしくはScalaが一つのブーム的な兆しを見せていた頃だと思います。

その頃のRustは「そう言う変わった言語もあるよね」と言った雰囲気でしたが、最近では積極的に取り入れようとしている流れが見えてきたような気がします。ただまぁ実プロジェクトとして採用した例は見掛けていないので「これから導入されるプロジェクトが生まれるかも」程度かも知れませんが

なぜ今Rustがもてはやされるのか

まず、これにはその前段としてGolangの話が出てくるでしょう。

Golangで書き直すとその部分が圧倒的に早くなるので「コンパイル言語すげぇ!」と言う流れが生まれたと思います。とは言えGolangの言語機能は非常に貧弱。これはGolangの思想として敢えて機能を絞っている物と思いますが、オブジェクト指向言語のような非常に潤沢な機能を持った言語を使い慣れている人間からすると「あれも足りない。これも足りない」となってしまいます。

一つの解としてはJavaがあるでしょう。JavaJITコンパイラによってある程度かなり高速に動作をします。しかしそれでも完全なネイティブコンパイル言語と比較すると見劣りするようで、「何かいい物がないか」と思案しているプログラマから「丁度良いものがあるじゃないか」と見初められた物がRustだと思っています。

Rustについては初心者なのですが

実際僕はRustについてはチュートリアルを少し読んだ程度の初心者な訳ですが、認識としてはC++よりも安全にメモリが管理されたもの、逆を言えばメモリが安全に管理されるようになっただけのC++だと思っています。

言ってしまえばC++への揺り戻しです。…と言うのは強引な結論かも知れませんが、実際には求められている事(パフォーマンス、高機能な言語仕様)はC++それそのものであり、ただ安全にC++を使いたい。という事だと思っています

RustでもC++でも良いけれど…

話を戻すと、私自身は元々C++を書いていた人間なので今更C++を書いてもと言う気になりますし、Rustについても同様です(業務上必要になれば書くこともありますでしょうが)。

それよりは冒頭の流れもありアセンブラに対して興味がある感じです。

じゃあそこからアセンブラへの流れは来るのか?

話が長くなってしまいましたが、じゃあそこからアセンブラまで揺り戻しが来るかと言えば、どうなんでしょうね・・・

ただ、wasmと言った流れ、GPGPUではCuda等を使うとC言語のような記述が出来ますが、実際にはGPUの動作をイメージしながら(?)書くと思いますので(多分)、最終的には「ええい、それならアセンブラで書いてしまえ!」と言う流れはゼロでは無いかなとは思っています。

…まぁこれはきっと希望的観測でしょう。しかし数年か10年程前よりかは0より1に近づいた気がしていて、ゼロや衰退する流れではないような気はしています。

機械語を書くのと手続き型やオブジェクト指向言語を書くのは全く脳みその使い方が異なりますので、いきなり「書け」と言う流れが出来たとしても多くのプログラマが挫折してしまうでしょう。それまでのCやCOBOL等の手続き型プログラミング言語でしか書いて来なかったプログラマが、急に「明日からはオブジェクト指向言語だ」と言われても、ついていけなかったり、時代錯誤な「手続き型言語のような」コードを書いてしまうように。

このWebと言うか、Webに限らずコンピュータを使う全般の界隈では非常に流れが早いので、その流れが一瞬で、これまで以上のスピードで置き換えてしまう可能性はあります。

この記事を書いている私自身、そういった「取り残された」人々を見て来た年齢であり、今はそういった「取り残されていった」人たちの年齢に到達しつつあると言う危機感もあります。

まぁ言ってしまうと、ディープ・ラーニングや量子コンピュータ等もそうなのですけどね・・・。ただそれらは僕には「勉強しようとしても理解できなかった」物なので諦めがあります。

それよりは、今までの経験を活かせる分野に対して全力で投資したほうが「まだ生き残れる可能性があるかな」と思った次第です。

CやC++COBOLでさえ「必要な所は必要としている」ものですので、苦手な所を伸ばすよりは得意な所を全力で、目指すは業界第一位くらいで磨いていった方が生き残れる可能性があるかな?と言った気持ちですね。

生き残れなかったら・・・田舎で畑でも耕してますかね・・・(苦笑)