チェスのプログラムを作って各プログラム言語の比較評価をした
これは、とある方が7つのプログラム言語を用いて、同じチェスのプログラムを作成した話です。
7つの言語とは、C++
、C#
、Go
、Zig
、Odin
、Python
、Rust
の7つの言語を用いて、それぞれチェスプログラムを作成して比較した結果を動画にまとめています。
何故、各言語で評価したのかは、それぞれの言語でのプログラム生産コストとパフォーマンスを評価するためです。
0:00 イントロ
1:18 アルゴリズムの説明
6:10 C++言語のコード評価
9:25 C#言語のコード評価
10:48 Go言語のコード評価
12:36 Zig言語のコード評価
15:10 Odin言語のコード評価
16:14 Python言語のコード評価
18:15 Rust言語のコード評価と不満
23:10 結論
0.アルゴリズムの説明
通常は、ボードの配列は8x8の64配列を設定し、各駒には定数を設けて設定を行うのですが、今回のアプローチは、ビットボードを使用して行っています。
つまり、u64変数をボードとして見立て、それぞれに駒の位置を示す手法を取っています。
1.各言語の評価
各言語毎に内容を要約してみました。
1-1.C++言語の評価
グローバル変数と構造体を用いて作成してみた
1-2.C#言語の評価
ヒープを使用せずに、スタック上にデータを置いている。
1-3.Go言語の評価
Goはガベージコレクション機能を差し引いても、コードはシンプルで、1-2時間でコーディングが可能で、初心者にもおすすめ出来る言語であると思う。
1-4.Zig言語の評価
Zigは非常に厳密な型システムであるため、ビット操作が面倒であった。
1-5.Odin言語の評価
Odinは最も簡単に作成し動作する事ができた。
基本Goと同じなのでGo言語のコードをコピーして貼り付けただけで動作する。
Odinの奇妙なところは定数の設定が何か変なところぐらい。
1-6.Python言語の評価
Pythonは全然好きじゃないが、セミコロンや中括弧を使わない所が好き。
Pythonはu64型変数を扱えないが、numpyが固定長uint64を扱えるのでnumpyを使って動作させている
動作自体は遅かったが、コーディングは再帰も含めて正常に動作する
1-7.Rust言語の評価
Rustは愚痴しか出ない。
コーディングに3日かかり、他の言語に較べて扱いずらい。
Rustはデバックモードでのスタックサイズが限られていて、これが非常に愚かだ。
安全な言語なのにスタックサイズに制限がある事は愚かだ。
スタックのオーバーフローが発生し、後にも先にも進まない。
2.評価結果
2-1.作った各言語のコーディングのしやすさ比較
Go言語は、操作も楽だし、直ぐに作成する事が出来た。
Odin言語は、Go言語と似ているため、Go言語を作成した後、コピペすれば直ぐに作成できた。
Rust言語は、コーディングに3日を要した。(理由は言語評価を参照)
2-2.パフォーマンス順
順位 | 言語 | 速度(ミリ秒) |
---|---|---|
1 | C++ | 347 |
2 | Zig | 482 |
3 | Rust | 528 |
4 | Odin | 534 |
5 | Go | 730 |
6 | C# | 1315 |
7 | Python | 1312888 |
Python
はグローバル変数の扱いに問題があり、かつガベージコレクションなので、極端に遅い結果になった。Rust
、Odin
、Zig
では、これら3つのパフォーマンスを考えれば、Odinプログラムがもっとも使いやすく楽にコーディングを行えた。
Java
はunsigned logをサポートしていない、64ビット整数型は扱えるが、unsignedはサポート外であるため、評価対象外である。同様にNim
も同じ。
おわりに
こんな事を書いたら、後からクレームのコメントがバンバン来るだろうなとは思ってますが、この動画で私が共感したのは、Rustは糞だと言う事です。
一概に、Rust
が早くて安全と言う事は、決してありません。
以前からエンジニアに愛されているプログラミング言語とありますが、本当かよ?っていつも思ってますし、コーディングのしずらさを含めて言うなら、Rust
は覚えるに値しない言語だと、個人的には思います。
Rustのエンジニアさん、ボロクソに言って、ごめんなさい。
Discussion