Clojure — A “Learn once, run anywhere” candidate you probably didn’t know about
Clojure - あなたが知らない「一度学べばどこでも使える」候補
from https://shivekkhurana.medium.com/clojure-a-learn-once-run-anywhere-candidate-you-probably-didnt-know-about-603d06c91478
ClojureはRich Hickeyによって書かれた関数型LISPの方言です。Paul GrahamやUncle Bob MartinはClojureを現代のLISPとして推奨しています。
Clojureの魅力とは?
Clojureは、使い勝手がよく、かつ純粋な言語です。HaskellやOcamlのように厳格ではなく、JavaScriptやPythonのように寛容でもありません。関数型な側面に忠実で、シンプルなシステムを構築することの重要性を強調しています。
また、VM上で動作するのではなく、既存の言語のVM上でホストされています。Clojureには3つの公式ポートがあります。
- Clojure - JVM上で動作します。
- ClojureScript - Node、Browser、IO、およびその他のJSランタイム上で動作します。
- ClojureCLR - .NETランタイム上で動作します。
公式の移植版に加えて、Go、Rust、Bash、C++、Erlangの上でClojureを実行するコミュニティ主導の取り組みが数多くあります。このようなホスト型の性質により、開発者は既存のエコシステムを利用し、ホスト言語の1つで書かれた既存のコードベースをClojureで拡張することができます。
また、Clojureは、ホストコードとClojureコードの混在を容易にします。Clojureの橋を渡って、ホスト言語でコードを書くことが簡単にできます。Clojureには独自のコンパイラや開発者ツールが付属していますが、基本的には成熟したVM上でホストされているメタ言語です。
この特性により、Clojureは他のLISPとは異なる領域にあります。LISPは決して「主流」ではありませんでしたが、その理由の1つはコミュニティの欠如です。誰もLISPを使わなければ、LISP用のパッケージは存在せず、新しい開発者を惹きつけることができません。
Clojureは、既存のコミュニティを活用することで、コミュニティの問題を回避しています。Clojureのコミュニティが強くないと言っているわけではありませんが、全く逆です。Clojureのコミュニティは豊かで歓迎されていますし、他のエコシステムを利用できることは単なるおまけです。
なぜClojureなのか?
表現力
LISP族はシンタックスフリーです。C言語と比較して、覚えるべき構文が少なく、豊富な標準ライブラリによりデータ操作が容易です。Clojureで書かれたコードは、ほとんどの場合、Cスタイルのコードよりも表現力が豊かです。
Clojureはホモ・アイコニックな言語です。これは、コードがデータ構造を使って書かれていることを意味します。そのため、簡潔な表現になります。
REPL
Clojureには、他のLISPのように、超強力なREPLが付属しています。REPLは、ソースコードとランタイムの間の架け橋です。REPLは、コードコンプリートやインラインevalなどの複数の機能を提供します。REPLは、光のように速いフィードバックをもたらし、最終的には生産性の向上につながります。Clojureのこの側面は非常にユニークで、私はこの点について全体の記事を書きました。
透過的な相互運用
Clojureは他の言語の上で動作し、ホストと直接対話することができます。MavenやNPMのような一般的なパッケージマネージャを使って、ホストのパッケージをインストールして使うことができます。
また、Clojureをバイパスして、JavaScriptのPromisesやJavaのClassesのようなホスト言語の機能を使って、金属(ホスト言語)に近いコードを書くこともできます。Clojureはホストを隠さないようにしています。Clojureはホストを隠さないようにしていますが、ホストが存在しないふりをすることはありません。
並列処理
Clojureは、GoやErlangと同じようなCSPモデルの同時実行管理を実装しています。Clojureの生みの親であるRichは、この実装がどのようにして生まれたかについて講演を行いました。プロミス(つまりアクターモデル)に対するCSPの利点を理解したい方は必見です。
CSPモデルでは、プロセスAが完了時にプロセスBを呼び出すコールバックの代わりに、キューを導入しています。これにより、プロセスAはプロセスBから独立し、その結果をキューに入れるだけになります。そして、プロセスBは、プロセスAと対話することなく、キューを解除して処理を進めることができます。
ファーストクラスの不変性と怠惰性
すべてのClojureデータ構造は、不変性と遅延性を備えています。これは、特にJSのバックグラウンドを持っている人には、最初は理解しにくいかもしれません。しかし、この考え方に慣れてくると、コードがローカルになり、副作用をシステムの端に追いやることになります。
これは自分で体験しないと意味がないかもしれません。
安定したエコシステムと強力なコミュニティ
この言語にはほとんどシンタックスがないので、後方互換性は抜群です。重視されているライブラリが何年も更新されていないというのはよくあることです。数年というのは大げさかもしれませんが、数ヶ月は確実にあります。これは、プロジェクトが放棄されたことを意味するものではありません。ほとんどの場合、それはプロジェクトが平衡状態に達し、安全に依存できるようになったことを意味します。
DatomicやIntegrantなどの技術は、あまりにも先進的で、まるで未来から来たかのようです。SlackやRedditのグループは活発で親切です。
なぜClojureはニッチなのか?
コインには裏表があり、目的に合った方を選べばいいのです。Clojureには「下」の部分もあります。
動的な性質と型の欠如
これは,おそらくClojureの最も議論されている点であり,Clojureに静的解析を導入するTypedClojureという有名なオープンソースの取り組みがあるほどです.
コミュニティや言語作者は、型の価値を認めていますが、Haskellのような型付けは最善の方法ではないとも考えています。core.specという有名なライブラリは、もう何年も前から開発されています。これは別の方法で型付けを実装しており、オプションで使用することができます。なぜspecが良いのかについては、Richのこの講演をチェックしてみてください。
しかし、Microsoft のような企業が、必要な言語として Typescript のマーケティングに \(\) を投入している場合には、これは破談になるかもしれません。
開発ツールとセットアップ
Clojureの開発は、迅速なフィードバックを提供することを目的としていますが、これはエディタとの統合が厳しいことを意味します。歴史的に、ほとんどのLISPerはEmacsを選択してきましたが、VS Code用のCalva、IntelliJ用のCursive、Vim用のConjureのようなパッケージによって変化しています。
このようなパッケージがあるにもかかわらず、ツールの効率的な使用方法に関する知識は普及していません。
LISP構文
初めてLISPコードを目にしたとき、おそらくあなたの脳はそれを拒絶するでしょう。括弧の位置が間違っていたり、なんでこんなにごちゃごちゃしているんだろうと思うかもしれません。
この問題は、時間の経過とともに解消され、コードを木のデータ構造として見るようになります。LISPプログラマーの間では、括弧が見えなくなるとよく言われています。
さらに悪いことに、コードを書いている最中にも括弧を入れて、閉じた括弧を見落とさないようにしなければなりません。
一見、大きな問題のように見えますが、実際には括弧の扱いは問題ではありません。PareditやRainbow Paramsのようなパッケージを使えば、LISPコードの管理がとても簡単になります。ただし、これらのパッケージがどのように動作するかを学ぶために時間を割く必要があるのが難点です。
メンタルモデル
Clojureは関数型言語であり、その意味では、すべての関数型言語は習得が難しいと言えます。変数を定義するような些細な作業は、特にCスタイルの言語から来た人には難しく感じるかもしれません。
これは、すでに関数型技術に精通している場合にはデメリットにはなりません。
就職の機会が少ない
JSやPythonに比べて、Clojureを使う企業は非常に少ないです。これは事実ですが、状況は変わりつつあり、Clojureを使った仕事の機会は増えています。しかし、他の言語に比べれば、まだまだ少ないのが現状です。
多くのClojuristは、会社にClojureを紹介したり、時には他の言語をフルタイムで使ったりしています。関数型言語を書くことで、問題への取り組み方が変わり、その概念は他の言語にも応用できます。
シンプル vs イージー
もしあなたがClojureを学ぶことに少しでも興味があるなら、Rich Hickeyから直接次のような理由を聞くべきです。
しかし、もしあなたが私の中途半端で正確でない説明を望むなら、次の段落を読んでください。
シンプルとイージーは同じ意味で使われていますが、2つの全く異なるコンセプトを意味しています。シンプルというのは、層になっていないとか、結び目のように編み込まれていないという意味で、複雑の反対です。一方、easyは近さ、手の届くところにあるものを意味し、hardの反対です。
npm install complexityは簡単です。コマンドを発行するだけで、複雑なユースケースを解決することができます。しかし、これは簡単ではありません。あなたは、ライブラリが裏で行っているダークマジックを知っているとは限りません。簡単な解決策に頼ると、将来的に複雑になる可能性があります。簡単な解決策に頼ることは、将来到来する複雑さに対処することになります。
Clojureはシンプルを簡単にしようとします。しかし、これでは簡単さに勝てません。後で利益を得るためには、前もってより多くの仕事をする必要があります。これは、導入された複雑さを考慮することなく、ほぼすぐにすべてを動作させることができる、他の人気モデルとは対照的です。このアプローチの問題点は、物事が手に負えなくなったときに、システム全体をTypescriptを使って書き直さなければならないことです。もう一度。
Clojureはあなたに向いていますか?
Clojureはあなたを開発者として成長させてくれるでしょう。JSやPythonなどを書くときのスタイルが変わります。自分の選択に理由をつけて疑問を持つことができるようになります。そして、おそらくより良い意思決定につながるでしょう。
ClojureのBDFL(Benevolent Dictator for Life)であるRich Hickeyを好きになったり嫌いになったりするでしょう。しかし、彼の話はあなたを変え、あなたの成長を助けるでしょう。
そうは言っても、もしあなたがインターネット上の記事で「私にはClojureが向いている」という答えを探しているなら、Clojureはおそらくあなたには向いていません。今使っている言語で満足して快適に書けているのであれば、乗り換える意味はありませんが、限界や制限を感じているのであれば、試してみてもいいかもしれません。
www.DeepL.com/Translator(無料版)で翻訳しました。