なぜLispはもっと普及していないのですか?[閉まっている]


50

私はSICPビデオでSchemeを学び始めています。次にCommon Lispに移りたいと思います。

この言語は非常に興味深いようであり、ほとんどの人々はそれについて本を書いており、比類のない表現力を持っていると主張しています。CLにはまともな標準ライブラリがあるようです。

なぜLispはもっと普及していないのですか?それが本当にそんなに強力であるならば、人々はそれを全面的に使用するべきですが、代わりに、例えば、Lisp求人広告を見つけることはほとんど不可能です。

しばらくしてからは大きな問題ではないので、括弧だけではないことを願っています。



5
Steel Bank(common)LISPは、実際には想像よりも人気があります。LISPのようなマクロプロセッサ(M4など)も広く使用されています。選択したドメインでは表示されない場合がありますが、まだあります(良くも悪くも)。
ティムポスト

8
最近の地震と津波は、日本の括弧工場を一掃しました。:-(
oosterwal

1
どのバージョンのLispを使用すべきですか?Lisp方言は多かれ少なかれ互換性がないことに注意してください。

2
LISP(または方言)は、全ての例のAutoLISPはAutoCADのが使用するLISPの方言である場所で使用されるen.wikipedia.org/wiki/AutoLISPまたはEMACS en.wikipedia.org/wiki/Emacs_Lisp
ジェイディー

回答:


68

表現力は、企業環境において常にポジティブな言語特性とは限りません。Javaは、学習しやすく、書きやすく、読みやすいため、非常に人気があります。コードが冗長で洗練されていなくても、平凡なプログラマはJavaで非常に生産的です。

さらに、表現力豊かな言語を乱用するのは簡単です。熟練したJavaプログラマは、不十分なコードをすばやくリファクタリングできます。言語の表現が豊かになるほど、恐ろしいコードの理解とリファクタリングが難しくなります。LISPマクロは良い例です。マクロは、右手の強力なツールです。間違った手では、混乱を招き、デバッグが困難になる可能性があります。

LISPは上級管理職にとって危険な選択です。物事がうまくいかない場合、誰もOracleやMicrosoftのような大企業に支えられた人気のあるオブジェクト指向言語を選んだことで管理を非難するつもりはありません。人気のある、習得しやすい言語の経験を持つプログラマーを雇うのがはるかに簡単です。

より強力な言語を使用しようとする進歩的な企業でさえ、通常はLISPを選択しません。これは、多くの新しい言語がLISPから強力な機能を取り入れることで妥協しようとする一方で、大衆にとっては簡単に学べるからです。ScalaとRubyはこのモデルに従います。悪いプログラマーはすぐにそれらを拾い上げ、Javaでやったのと同じ平凡なコードを書き続けることができます。優れたプログラマーは、より高度な機能を利用して美しいコードを作成できます。

括弧は問題ではありません。 Haskellは、PythonやRubyに似た構文を持つ信じられないほど強力で表現力のある言語であり、LISPと同じ理由の多くで広く採用されていません。

これにもかかわらず、私は願っています...

Clojureは人気が出る可能性があります。 JVM上で実行され、Javaとの優れた相互運用性を備えており、同時プログラミングをはるかに簡単にします。これらはすべて、多くの企業にとって重要なことです。

*これは、Java、Clojure、JR​​uby、およびScalaの経験を持つプロのJVMプログラマーとしての私の見解です。


24
資格のあるプログラマを見つけるのが難しいという異議は、尾を追いかける犬のようなものです。Lispがもっと普及していれば、優秀なプログラマーを見つけるのは簡単だろう。
アンドレア

2
@Andreaそれは間違いなく本当です。しかし、Lispを習得するのは難しく、これも問題の原因になります。多くの教授がスキームを第一言語として教えているので、それは議論の余地があるかもしれないことを理解しています。
dbyrne

8
はい、APLは表現言語の優れた例です。また、表現力が最も重要でない理由の良い例;)
dbyrne

9
この定義が表現力の意味を実際に伝えているとは思いません。個人的には、言語を表現力豊かにする前に、自分が書いたものを読むことができるようにします。たとえば、Cのループ初期化子で非自明なロジックを使用すると、コードの数行を節約できる場合がありますが、それは容易には理解できません。一方、Pythonでリストの内包は、行のカップルを保存することができますし、読みやすくなります。それで、あなたは実際にあなたがより簡潔に意味することを表現する方法を見つけました。読みにくい場合は、何かを表現する方法がまったくありません。
アンドレア

3
たぶん、私はLispが好きではない人として出てきていると思います。実のところ、私はそれが大好きです。Clojureは信じられないほどの言語です。ある種の会社が使用するには非常に実行可能な選択肢だと思います。私はそれが意味をなさない多くの企業があることを指摘しているだけであり、Scalaのようなものを使用することははるかに実用的な選択です。
dbyrne

17

なぜLispはもっと普及していないのですか?それが本当にそんなに強力なら、人々はそれを全面的に使用するべきです

言語が技術的なメリットのために選ばれていると信じているなら、あなたは魂を砕く失望に直面しています。

このような決定は、ストリッパーとステーキに基づいて行われます。Microsoftはそれらを購入する余裕があります。Oracleはできます。SunはJavaの宣伝に多額のお金を費やし、破産しました。二回。分散化された異質なボランティアコミュニティは、それに対抗できません。

しかし、代わりに、たとえば、Lispの求人広告を見つけることはほぼ不可能です。

おもしろいことに、Lisp企業はまったく逆のことを言っています。彼らは常に求人を持っていますが、それらを満たすために十分な人を見つけることができません。(Haskell、ML、O'Caml、Forth、Smalltalkなどにも同じことが当てはまります。)


3
私が住んでいる場所(イタリア)では、Lispの会社が1つでも存在するのではないかと疑っています
アンドレア

1
Ruby、Python、JavaScriptを推進している大企業はどれですか?JSは確かに特別なケースですが、他の2つは大規模な企業/ベンダーの支援なしで十分に人気があるようです
ベンヒューズ

はい、他の言語でも同様です。ほとんどの優れたCOBOLコーダーはすでに仕事をしていて、とにかく広告を読んでいません。なぜ広告を煩わせるのですか?
ボーパーソン

えっ、ほんとう?Haskellの音は私の頭上で聞こえますが、私は主流ではない言語でコーディングします。私がコーディングした少量のコードは非常に美しいものですが、良いメンターがいなければ、各MonadとApplicative Functorをいつ使用するかわかりません。
aoeu256

9

私は実際の会社で働いた経験はありませんが、LISPを使うのが難しい理由を知っています。

まず、これはこのブログ投稿を思い出させます:http : //steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html

私がLispで抱えている主な問題は、「which Lisp」の質問です。私は通常、メインプラットフォームとしてLinuxを使用していますが、作成するものはWindowsと互換性がある必要があります。つまり、使用するテクノロジを評価するとき、根本的に異なる2つのオペレーティングシステムで作業するとき、私の人生を楽にする必要があるということです。この要件は好きではありませんが、要件である実際のプロジェクトで使用することです。これで、個人的なサイドプロジェクトにはWindowsであまりサポートされていない言語を使用しますが、大規模なソフトウェアプロジェクトを作成する機会がないため、必要な経験がありません。

今、関数型言語を学ぼうとしていたとき、私は本当にCommon Lispを学びたかったのです。それは正しいことのように思えた。私は実際に組み込み関数を知らず、Lispで作業するプロジェクトが必要だったため、Practical Common Lispを出発点として読み始めました。S式は美しくて簡単でした。これらの括弧はすべて、コードで何が起こっているのかが日ごとに明らかだったので、信じられないほど美しいものでした。

それで、本の外で最初のプログラムをLispで書こうとしています。コードの行をカウントし、コードカウントから些細な行を削除するコマンドラインツールが必要でした。最も便利なツールではありませんが、楽しいことです。これには、ファイルアクセス、少しの解析、およびカウントが含まれます。約1週間前に同じツールをPythonで実装していました。

コマンドライン引数にアクセスする必要があります。次に、コマンドライン引数を取得する標準的な方法がないことを学びます。それらはすべて非標準の機能です。クロスプラットフォームではありません。言語には多くのライブラリが組み込まれていないため、そこからほとんど悪化します。私は結局Haskellに切り替えましたが、Common Lispにあまり深く入り込むことはありませんでした(したがって、私の苦情は有効ではないかもしれません)。

この種の非標準的なことは、過去に私にとって常に苦痛でした。C ++にも同じ問題がありますが、Boostのようなライブラリを使用すると、これらの弱点を回避できます。

また、S式以外のすべてのLisp構文が少しlittleいことも助けにはなりません。


1
PLTラケット(旧PLTスキーム)は、LinuxとWindowsの両方で正常に動作します。
ラリーコールマン

興味深いことに、Common LispはSchemeよりもはるかに標準的で実際のアプリケーションで使用できると期待しています。(私は今Practical Common Lispを読んでいます。)
ジョルジオ

Haskell(私の意見ではより良い言語です)を選択したことを称賛しますが、Clojureはどうですか?JVM上で実行されるため、移植性があり、必要なすべてのライブラリにアクセスできる必要があります。
アンドレスF.

コマンドライン引数はC ++で使用するのが難しいですか?本当に?
ニックケイリー

LispをSchemeからClojureに変更するクロスコンパイラを作成するのは簡単ではありませんか?なぜ人々はそれらを使用しないのですか?
aoeu256

8

IMO、主な原因は次のとおりです。

  • 不十分なライブラリサポート。確かに、Quicklispがあります。これはライブラリのインストールを簡単にしますが、それらがまだかなり少ないことを補うものではありません。Pythonと比較して、重要なLispアプリケーションを(特定の方言に関係なく)書くには、おそらくホイールまたは2つ以上の部分の再発明が必要になる可能性が十分にあります。
  • 開発ツールで採用されているモデルに精通していない。私が知っている人々のほとんどは、SLIMEとEmacsを使用しなければならないことにかなり脅かされています。SLIMEとEmacsは、EclipseとVisual Studioに慣れている人には理解できます。Eclipseプラグインは2つありますが、数年前にそのうちの1つしか試していませんでしたが、かなりバグがありました。Lispエコシステム全体は、本格的なLisp実行システムの一部であった時代と、もう1つの別の言語の現代標準の一部であった日々の中間に立ち往生しているように見えます。Lispの学習は、新しい言語の学習に限定されるものではありません。また、まったく異なる働き方や考え方を学ぶ必要もあります。趣味としてやっているのなら大丈夫ですが、ビジネス。

しかし、特にClojureが登場することで、状況は少し良くなり始めています。


1
「私が知っている大部分の人々は、SLIMEとEmacsを使用しなければならないことにかなり脅かされています。これは、EclipseとVisual Studioに慣れている人にとって理解しやすいものです。」
ジョルジオ

2
「また、まったく異なる働き方や考え方を学ぶ必要があります。趣味でやっているのなら大丈夫ですが、ビジネスでやる価値があるかどうかは疑問です。」:生産性の向上は、十分な理由は?
ジョルジオ

この「生産性の向上」は実証されていますか?確かに私には明らかではありません(はい、私はLisp方言でプログラミングしました)。銀の弾丸はありません。
ニックケイリー

5

10年前に大学でLISPを学びました。

LISPはFORTHと同様、ロジックに最適です。しかし、ほとんどのプログラミングはロジックに関するものではなく、退屈な機械的な方法でデータを操作することです。たとえば、当時は数値出力を右揃えする方法がありませんでした。

LISPはネストされた機能に関するものであり、人々はそのように考えていません。彼らはDO A、B、C、D、Eの観点から考えます。BとC、そしてDとEを含むAを実行しないでください。「所得税申告書を提出する」などの事前定義されたタスクを除き、人々は同時に考えるのではなく、順番に考えます。これが、手続き言語が今日支配的である理由です。

その結果、JavaとCに対応した手続き型コードを簡単に英語に翻訳できます。LISPコードはできません。人間の言語はそのように構成されていません。

そのため、問題解決には最適ですが、プログラミングでは問題解決はそれほど重要ではありません。データの入力、検証、出力の書式設定、すべてLISPは非常に苦手でした。


7
問題解決が私たちのすべてです。JavaやCではデータの操作は簡単ではありません。コンスセルでのデータの操作は、Lispやその他の関数型言語でははるかに簡単です。データに対する操作のほとんどはまったく同じであり、データを処理する順序は関係ありません。これらは、mapへの呼び出しと関数ポインターを使用して簡単に実行できます。また、手続き型の機能よりもネストされた機能の方が簡単に考えることができます(1つはあなたの目標を詳述し、もう1つは上記の目標を実行する方法を詳述します)が、その証拠はありません。いずれにせよ、これがLISPが使用されない理由だとは言いません。
jsternberg

4
プログラミングは問題解決ではありませんか?そうは思いません。ちなみに、私もあなたが大学で言語を学ぶことができるとは思いません。
アダムアロルド

+1は、Lispを知らない私にとって非常にもっともらしい。企業規模のソリューションでは、C / JavaがPythonより優れているのと同じ理由を述べたいと思います。
ジョナスビストレム

これが機能対手続きの巨大なトピックを提起した唯一の答えですが、手続きの考え方は、同期の問題を引き起こす多くの場所とスレッドから触れることができるあらゆる場所でvarsのデータの塊をいじるのが好きになる傾向があることを忘れないでください。機能的なものはこれにすぐに苦しむことはなく、適切に記述された機能的なものはまったく苦しみません。
maxpolk

1
プログラマーは、データフロー図を使用してforループを表現する最善の方法を尋ねました。そのような人々にとって、非手続き型の言語は意味がありません。FORTRAN の考え方
ニックケイリー

5

まだ言及されていないLispの問題の1つは、平凡なまたは初心者のプログラマー(私のように、私は自由に認める)にとって、Lispコードをどのように大きなプログラムに変えるかを見るのは難しいことです。書くのは簡単ですが、設計するのは難しいです。概念のどれも特に難しいとは思いませんが、DIYのメンタリティは非常に強いので、どこから始めても途方に暮れると感じることがよくあります。

JavaやC#などのOOP言語を使用すると、型システムを使用して、作業モデルに向かって自分自身を後押しし、それを構築することができます。Lisp(またはLua、またはJavascript)を使用すると、外出して好きな方法で実行できるという概念があります。OOPが必要な場合は、独自のOOPシステムを作成してください。独自のOOPを作成したり、他の人のOOPを学習したりすることは、使用可能なプログラムを入手する前の言語の新しい障壁です。さらに、私は常に、LispのOOPまたはLuaが実際に存在しないように感じます。本当に必要な場合は単に無視できるので、ポイントは何ですか?

要するに、Lispでのプログラミングにはかなりの規律が必要だと思いますが、それは非常に難しいことです。厳密に型指定された言語とOOP言語はどちらも一種の組み込みの規律を提供するため、プログラマーは言語を微調整するのではなく、限られた領域をプロジェクトの仕上げに集中させることができます。

編集:ちょうど私を驚かせたアナロジーとして、それはあなたがいくつかの木の仕事をする必要があり、二人があなたに彼らのツールボックスを提供する場合のようなものです。ある人のツールはちょっと不器用ですが、基本的には少しの努力で仕事を成し遂げるでしょう。他の人は部品の大きな箱を持っていますが、それらの部品を組み合わせて、これまで使用したことのない最高のツールを作ることができると約束しています。最初にそれらを構築する必要があります。


2
少なくとも、Common Lispは明示的にオブジェクト指向言語です。CommonLisp Object Systemは標準の一部です。
フランクシェラー

確かに、私が理解しているように、それは非常に強力なものですが、言語の副次機能として私に伝わります。1日目からオブジェクトを理解する必要があるのはJavaのようなものではありません。PracticalCommon Lispは、第16章までCLOSに触れません。 。
CodexArcanum

Lispでは、軽量OOPのオブジェクトの代わりにクロージャー(let-over-lambda)を使用できますが、CLOS経由でOOPを使用するように簡単にアップグレードできると思います。
aoeu256

2

私はずっと同じことを不思議に思っていて、Lispカンファレンスに行って、誰もそれを採用することを妨げているこのLisp「ダークサイド」とは何かを理解しようと試みました。

完全なまともな答えは見つかりませんでした。

無知が人気の欠如の理由かもしれませんが、私をより困惑させているのは、Lisp(たとえばGoogle-Peter Norvigが彼らのために働いている)を確実に知っている人でさえLispを使用していないことです。

私が思いついた唯一の部分的な説明は、Lispの素晴らしいアイデアのほとんどが今では当たり前であり、本当に重要な欠落しているもの(非常に重要なものはIMO)はメタプログラミングの容易さであるということです。

残念ながら、他の言語でこの概念を吸収する簡単な方法はありません。メタプログラミングをうまく行うには、ホモイコニックで通常の言語が必要だからです(私は一般的なメタプログラミングについて説明しています。言い換えれば、基本的には、構文に対するLispアプローチが必要です。コードはデータであり、データはコードです。ASTを操作する構文豊富な言語でコードを記述することは、コードの記述方法とASTの記述方法の2つの言語を知る必要があるため、より困難です。これは、ASTが固定されていて、多くの異なるノードタイプで複雑で不規則な場合、特に困難です。代わりに、Lispには適度に規則的な(そして拡張可能!)ASTがあり、あなたはすでにASTを直接書くことですでにコードを書いています。

メタプログラミングも本質的に難しく(さらにメタメタプログラミングなど)、ほとんどのプログラマーとマネージャーは「誰もそれを必要としない」という答えを好むようです。

go必要なときにテキストベースのメタプログラミングを使用するような「新しい」言語(テキストファイルを作成する外部コードジェネレーター)と「魔法」(つまり、コンパイラーがプログラマーができないことを実行できる)が特に悲しい。

複雑さの問題の解決策は強力なツールと教育だと思います。その傾向は明らかにツールを鈍らせており、問題のふりをすることはありません。


+1「複雑さの問題の解決策は強力なツールと教育だと思う」
ジョルジオ

50年後、「無知」の言い訳はかなり薄く着ています
ニックケイリー

1
@NickKeighley:依存します。今日でも、ほとんどのプログラマーはLispについて何も知りません(たとえば、ほとんどの場合、関数型言語として記述されたLispを聞きます)。Lispを「知っている」人でさえ、マクロのアイデアを十分な詳細で見た人はほとんどいませんでした(私はスキームの馬鹿げたバージョンについてではなく、それがより適切なときに準クォートの利便性を備えた完全なアルゴリズムの力について話しています)。
6502

@ 6502:純粋に機能的ではありませんが、IMO Lispは、C#、Java、C ++などの多くの主流言語よりもはるかに優れた機能プログラミングをサポートしています。多くのプログラマーにとって、FPは時々ラムダ式を使用することを意味します。これらのプログラマーはLisp、Clojure、Haskellを見逃しません。(1)LispはFPを十分にサポートしており、機能的なプログラマーはそれから利益を得るでしょうが、(2)FPとその利点に関する無知は、Lispが頻繁に使用されない理由の1つです。
ジョルジオ

1
@ 6502:リストを基本データ構造として使用し、リストに通常の高次関数を使用することも、Javascriptにはない機能です。そして、私が覚えている限りでは、Javascriptには二重性ステートメント/表現もあります。私は間違いなく、Lisp(Common Lisp)をJavascriptやPythonよりもFPの方向に数歩進めます。これにより、Common Lispが純粋に機能的な言語であることを意味するのではなく、マルチパラダイムであることに同意しますが、他のマルチパラダイム言語よりもはるかに優れたFPをサポートします。
ジョルジオ

1

CLでさえ、ライブラリのサポートがあまり良くないようです。少なくとも、LispからPythonに切り替えた人によると:

http://www.redmountainsw.com/wordpress/archives/reddit-switches-from-lisp-to-python

個人的には、Schemeをいくつか知っていて、それで遊んで楽しんでいますが、その言語で重要なプロジェクトを行うことは想像できません。


2
これはもはや真実ではありません。Quicklispはその問題を解決しました。

2
CFFIでは、Common Lispから任意のCライブラリを使用できることにも言及する価値があります。CFFIは十分に文書化されており、うまく機能しています。一方、C関数のラッパーの作成に数時間を費やすことがプロジェクトに大きな影響を与える場合、Lispはおそらくそれにとって正しい選択ではないでしょう。
ラリーコールマン

私はSchemeで重要なプロジェクトを行い、いくつかの製品にScheme(チキンスキーム)を使用している会社を知っています。
ジョルジオ

1

強力であることは、必ずしも広範な使用を意味するわけではありません。「一般的なケース向けに最適化する」という言葉を聞いたことがありますか?あいにく、多くの人が平凡さの前に言ったように、多くの失敗を伴う大ヒットよりも一貫して保証されている方がずっと良いと人々は考えています。

これはLispだけではなく、多くのテクノロジーにも当てはまります。Unixのテキスト処理ツールであるawk、sed、perlに触れると、プログラミングの日数を節約できます。残念ながら、他のツールでこれらのタスクを数日かけて、数分でこれらのツールでより効率的に行うことができたはずの作業を、人々が数日かかるのを見てきました。しかし、人がすべての人生を日食に費やしているならば、彼はこれらのことの価値を認めることは決してないでしょう。読みやすさと保守性などを備えた巨大なプログラムを作成することもできますが、そのようなプログラムを作成せずに作成することの全ポイントは、作業を簡単に完了できたはずです。

最近のツールを設計する際の別の側面は、問題を解決するためにツールを直接使用することで、箱から出してどれだけ役に立つかということです。汎用的なものを構築してから、ライブラリとフレームワークを介してそれらすべてをヘッジすることはできません。そのように物事を解決するのは少し難しいです。良いツールは、周囲の環境や問題とうまく調和します。php、perl、awkなどのツールは、無限のトローリングやバッシングにもかかわらず関連性を保ち続ける理由です。なぜなら、それらは捨てるにはあまりにも便利であり、多くのライブラリとフレームワークがボルトで固定されている一般的な言語よりも多くの作業を行うためです。

同様に、Java / Pythonのような言語は非常に優れており、特定のタスクに最適と言えます。特にPythonは非常に優れており、簡単に習得して記述できます。また、これらの言語は、データのエンドポイントが標準であれば非常に優れています。ある種のデータベース、XML、またはその種のデータ。基本的に構造化されたデータ。

Lispは長い間存在しますが、必ずしも広く普及しているわけではありません。ご覧のとおり、各ツールにはニッチがあります。そして、彼らは特定の問題をすぐに解決します。私は思うに、Lispはうまく解決するように設計された分野や問題でうまくやっていると確信しています。


「一般的な場合に最適化」の原則を引用して+1。
ジョルジオ

ええ、LISPのクロージャーは、オブジェクトの一般的なケースに対する最適化です。また、LISPのコードベースをツリーとして扱い、JQuery for HTMLのようにクエリを実行することで、LISPのコードベースを変更する人がいるのではないかと思っていました。
aoeu256

1

Lisp方言を使用したWeb開発では、鶏と卵の問題が少し発生する可能性があります。Lispを使用する人はほとんどいないため、ホストはLispを許可しないか、簡単にしないか、簡単ではないため、人が少ないこれを使って。しかし、実際には、ホストでLispを実行することは、彼らの独創的なPHPサービスよりも少し多くの作業が必要な場合でも、思っているよりも簡単です。私は最近、ちょっとした努力でここで動作するGuile Schemeアプリを手に入れました。


0

IMO、それはほとんどタイミングが悪いという問題です。Lispは、ほとんどの人や用途にとって実用的になるずっと前から古く(そしてほとんど定義上、もはやエキサイティングではありませんでした)。Clojure(一例)は、はるかに良いチャンスです。ただし、その成功は、Java(およびJVMで実行される他のすべて)との相互運用性よりも実用的なものよりも、新しくてファッショナブルでクールだと認識されることに大きく依存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.