概要
この記事は「ペントミノ・ソルバーをいろんな言語で書いてみる」で扱ったプログラミング言語に対する私の感想です。
理解不足や偏見がありますのでご注意ください。
-
Ruby
シンプルで一番好きです。慣れてることもあり「考えていることをそのまま書く」ことができます。特に、メソッドチェーンを使ってシンプルに書けるところが良いです。 -
Python
Rubyと同程度にシンプルに書けます。が、メソッドチェーンで不自由を感じました。実行速度は意外に遅いです。内包表記や3項演算子などが他の言語と比べて独特で取っ付きにくいです。インデントも賛否両論・・・。ユーザの多さや豊富なライブラリはメリットと言えますが、言語として好みではありません。 -
JavaScript
実行速度が非常に速いので驚きました。JITの効果を体感できます。言語仕様もいい感じで癖がないと思います。let と var の使い分けは少し億劫です。solver.js では使っていませんが、JavaScript の非同期処理の書き方は直感的でなくて好きではありません。 -
TypeScript
型チェック、、、頑張ってるなぁと思います。もちろんパフォーマンスは JavaScript と同じです。tsc 自体が JavaScript で書かれていることにも驚きです。
オプション指定はtsconfig.jsonを使うのが作法のようですが、ファイル1個を動かすだけだしコマンドラインオプションで対応しました。結構試行錯誤しました。 -
Julia
着実に進歩してますね。数値計算に向いてるらしいのでオブジェクト指向でガンガン...というのではないようです。配列が [1] から始まるのが... -
Lua
コンパクトなのにパフォーマンスが良くて、面白い言語です。 メンバ変数は '.' なのに メソッドは ':' とか、配列が [1] から始まるのが残念です。玄人向けだと思います。 -
Squirrel
Lua と同じくコンパクトで、C++ を知ってれば使えるという感じです。拡張子が nut なのがおしゃれです。
グローバル変数の扱いに戸惑いました。ローカル変数につけないといけない local が目につきます。エラーメッセージが判りにくいのと REPLが使いにくいのが残念です。 -
Groovy
ググったら JAVA VM で動く動的言語が見つかったので味見してみました。型があるけど Ruby に似てる感じがあって抵抗なく使えました。
ファイル名と同じ変数名が使えなくて Java のニオイがしました。solver_ = new Solver( 6, 10 )と _ を付けているのはエラー回避のためです。 -
Perl
ローカル変数がmyって・・・・イケてないと思います。配列変数が@や$だったり、参照渡しの場合は\や[]が必要だったり、、、戸惑うし理解が難しいです。$Pieces{"F"} = [@{$Pieces{"F"}}[0..1]]なんて変態です。
間違っていても中途半端に動いてしまうことがあり、初学者には難しいだけでなく危険だと思います。 -
AWK
ペントミノは AWK にとって可哀そうだけど頑張りましたって感じです。 AWK の連想配列はすばらしいです。配列が [1]から始まるのは AWK だから許します。
mawk, nawk, gawk などの派生がまだ使われていて AWK の歴史を感じるけれど、プログラミング言語としては過去の言語だと思います。 -
PHP
WEB開発用の言語でしょ?ということぐらいしか知らず、ペントミノをPHPでやるもんじゃないと思いながらもやってみたらできました。言語としてはシンプルで理解しやすいし、パフォーマンスも悪くないです。
やたらと$と->が目に付くのでそこは好きになれないです。行末の;を忘れて怒られることが多いです。 -
C
C言語を使うことはホントに少なくなりました。メモリを意識しないといけないし、文字列の扱いが不自由だし、、、不便な言語です。実行速度はもちろん速いです。使い勝手としてはセンブリ言語みたいな感じがします。 -
C++
STL を使えば使い勝手はスクリプト言語に(少し)近づきます。STLの多用は実行速度に影響するので、書きやすさとパフォーマンスはトレードオフです。template は変態的で理解が追いつかないです。 -
C#
あまり親しみがないのでこんなものなのかな・・・という感じです。Java や C++ を知っていれば使えるのでしょう。Linuxでも動くのでもう少し使ってみようかな・・・ -
Java
面倒くさい印象があり、昔から使い易い(書き易い)とは思っていません。食わず嫌いです。ファイル名を小文字の solver.java にできなかったのが悔しいです。
ubuntu の java はバージョンが古くて Text Block に対応してないので、それに合わせてPIECE_DEF_DOCはベタな書き方にしています(残念)。 -
Kotlin
Java よりも格段に良いです。Java の面倒くささを隠蔽してくれて、メソッドチェーンも良い感じに書けて使いやすいです。これで Java を使わずに VM のアプリが作れます。実際に私は Android アプリを Kotlin で作りました。 -
Rust
私には無茶苦茶とっつき難いです。コンパイルエラーを消すのに試行錯誤・・・どうしても unsafe を取ることもできず・・・。腰を落ち着けて勉強しないとだめですね。ポインタをガチャガチャいじるようなアプリには向いてないのかもしれません。
エラーメッセジーはとても親切です。 -
Go
文法に独特感があって、触ってないと忘れてしまいます。このソルバープログラムを備忘録にします。 -
Swift
Objective-C を試そうと思ったけれど Mac以外で環境を作るのが面倒そうだったので諦めて、代わりに Swift を選びました。
引数の型宣言が面倒でしたがあまり癖は感じなかったです。Mac以外で使うことあるのかなぁ・・・ -
LISP
今まで避けていましたが、興味があったので使ってみました。なんとなくLISPの心が解った気がします。でも、独特過ぎて書き易いとも見易いとも思いません。emacs の 設定が読めるようになった(たぶん)のでトライして良かったです。 -
Crystal
存在を知りませんでした。 ほぼ Rubyのように書けます。頑張ってると思います。C や C++ と同じとは行きませんが実行速度は速いです。頑張ってると思います。 -
Elixir
関数型言語の特徴を体験できます。表記方法に Ruby のニオイがします。すべてのデータが imutable なので、List、Map の要素を書き換えるという基本的な操作に手間取ったり、グローバル変数という概念がないので面食らいます。従来のプログラムではいかに副作用に依存していたかということを痛感します。パイプ演算子(|>)は面白いです。 -
F#
Elixir 以外の関数型言語もと思い試してみました。実行速度は速いです。表記方法は Python のニオイがするし、他にもクセの強さを感じました。また、match ~ with が難しい、エラーメッセージが解りにくい、など難しさも感じました。 -
D
コンパイル型言語なのにスクリプティング言語みたいな書き易さがあり、C++のような変態性がなく、センスのいい言語だと思います。もっとメジャーになって欲しいです。Uniform Function Call Syntax (UFCS) と Range が素晴らしい!
そんなD言語の設計者 Walter Bright氏⋯⋯と言えば Zortech C++コンパイラ! あれはコンパクトで使いやすかったです。 -
Dart
JavaScript がベースらしいので、ChatGPTに手伝ってもらいながら solver.js を書き直してとりあえず動くものはすぐにできました。ペントミノソルバー程度のプログラムを書く分には特に JavaScript 以上のメリットは感じないです。 -
Zig
C と C++ の中間のイメージでしょうか。安全なコードを強要される感があります。最初は Slice の表記方法に戸惑いましたが面白いです。メモリ(スタック、ヒープ)やポインタを全く意識しないで書くことはできないので、C言語の知識は必要でしょう。実行速度はかなり優秀です。 -
Nim
Python と似た表記なところは好きではないですが、Pythonを知っていれば違和感なくコーディングでき、コンパイル系なので Python よりはるかにパフォーマンスが良いです。lambda は Python より書きやすいと思います。 -
Pascal
有名な言語ですが初めて触りました。古い書き方を強要されるなぁ、いろいろ宣言しないといけないのが面倒だなぁ、という印象です。インデントが深くなると読み難くなります。ドキュメントは多いようですが、親切ではないように思いました。 -
Bash
自力では無理で ChatGPT に助けてもらって動くようになりました。ペントミノのようなプログラムには全く不向きですが、達成感はあります。bash の変態的な機能の勉強にはなると思います。
少し修正して zsh 版も作りました。 -
Visual Basic
.NET なのでパフォーマンスは良いです。
変数や関数の宣言がやたら面倒に感じます。大文字小文字の区別がないのは自由すぎて好みではありません。プロジェクトファイル(.vbproj)を作らないといけない、obj/や bin/ にいろんなファイルが展開される、といったことが鬱陶しく感じます。 -
Scala
Mac も Ubuntu も Windows も Scala-CLI を使いました。
Kotlin版をベースに比較的簡単に移植できました。case class や match~case、for~case など独特感があり、また、カリー化メソッドなども面白いです。JVM ベースでなければもっと好きになれるかも。 -
Prolog
GNU-Prolog と SWI-Prolog があって、SWI- の方がメンテされてるようなので SWI- を使いました。Prolog の存在は何十年も前から知っていたけれど、過去の言語・・・という印象で何かに使えるようなイメージは全然なかったです。何もかも独特すぎて、どう書けば思い通りの動くのか試行錯誤ばかりで、、、Gemini に感謝。
ファイルの拡張子は Perl の .pl と区別するため SWI-Prolog の s を付けて .spl とした。 -
Haskell
関数型言語の王道だけに難しかったです。Geminiの助けなしでは到底動かなかったでしょう。Haskellの気持ちは感じ取れましたが、何もかも私には向かないです。今まで右手で自由にできていたことを左手でやらされているようなもどかしさがあります。 -
OCaml
関数言語的な書き方にはどうしても馴染めず、手続き型&オブジェクト指向的に書いてしまいました。Elixir と同じようにパイプ演算子(|>)が使えるのが嬉しい。コメントが (* ... *) って、数十年前のZ8000アセンブラと同じだったので懐かしく感じました。実行速度は MacOSよりUbuntu や Cygwin が2倍程度速く、未確認ですが OSかバージョンに依存するようです。 -
Clojure
LISPよりも易しく感じましたが、やはりリストはリスト・・・・馴染めないです。ほとんど Gemini に書いてもらいました。clj コマンドは .clj ファイルをコンパイルしてJVMで実行しているらしいけれど、kotlin, Scala などのJVMベースの言語よりも実行速度は10倍以上遅い。インタプリタ―のような使い勝手なのは良いのだけれど。
参考記事