web-dev-qa-db-ja.com

LISPが役立つのはなぜですか?

[〜#〜] lisp [〜#〜] 明らかに [〜#〜] ai [〜#〜] の利点ですが、表示されませんLISPはJava、C#、またはCよりも高速であると私には思います。私はLISPの達人ではありませんが、LISPでビジネスソフトウェアを作成することで得られる利点を理解するのは非常に困難です。

しかし、それはハッカーの言語と考えられています。

Paul Graham がLispを支持するのはなぜですか? ITA Software が他の高級言語よりもLISPを選択した理由これらの言語に対してどのような価値がありますか?

64
Geek

Common LISPに対応できるように取り組んでいるいくつかの理由があります。

  1. ホモコード。これにより、構造化された自己変更コードが可能になります。
  2. 構文認識マクロ。それらは定型コードの書き換えを可能にします。
  3. プラグマティズム。 Common LISPは、働く専門家が物事を成し遂げるように設計されています。原則として、ほとんどの関数型言語はそうではありません。
  4. 柔軟性。妥当な速度でさまざまなことを実行できます。
  5. いびき。現実の世界は乱雑です。実用的なコーディングは、厄介な構造を使用するか、発明する必要があります。一般的なLISPは、物事を成し遂げることができるほど十分に注意深いです。

間違いなく、Common LISPを選択しない本当の理由は、標準ライブラリに日付が付けられていることです。

私は手足を外に出て、一般的なケースでは、構文はプロのソフトウェアワーカーにとって問題ではないはずだと言います。

78
Paul Nathan

私はLISPが好きです

  • コードとデータの両方を表現する、統一されたシンプルでエレガントな方法。
  • 難しい問題を解決する上で重要な80ボーナスIQポイントを提供するユニークな視点(Alan Kayへの帽子のヒント付き)
  • 非常に俊敏でインタラクティブな会話型開発環境
  • 抽象化を作成および操作する前例のない力

プログラミングは複雑さと戦っています。抽象化は、(私たちの頭蓋骨のサイズが非常に限られており、一定しているため)ますます複雑化する問題に対処するための唯一の効果的なツールです。 LISPによる抽象化の管理は、n + 1の願望を持つ魔神を持っているようなものです。

24
Maglob

正しいLISPの答えは、より経済的だと思います。次のようなもの"質問する必要がある場合は、準備ができていません。"

次に、誰かがさらに質問した場合、正しい答えは"yes"どちらかまたは両方の質問の場合、または"準備ができていません。"のいずれかです。

21
glenatron

誰もが言及している 人工知能 (AI)フィールドでのLISPの利点は、やや歴史的な偶然だと思います... LISPはAIのために/に始まりましたが、それは汎用言語です。

言語の重要な側面は実行速度だけではないと思います(ただし、私は一度だけ行いました)。しかし、LISPについて私が気に入っている点の1つは、私にとって、PythonとCが1つに結合されていることです。宣言とプロトタイプなしで、すぐにそして非常に迅速に(ランタイムと [〜#〜] repl [〜#〜] はこのために非常に重要です。何かを実行した後、型宣​​言を追加し、コードを少しずつ「最適化」します。 [〜#〜] slime [〜#〜] でキーを押して、興味のある関数に対して生成された機械語を監視するのは不思議です。Pythonでは、型宣言がないため、速度を上げることはできませんが、Cの場合、何かをすばやく行うのははるかに困難です。この場合、LISPは非常に便利です。

そうは言っても、主にmacrosのためにLISPが好きです。マクロが何を達成できるかを最終的に理解すると、かっこは簡単に付けられると思います。また、 Emacs のようなエディターは、括弧自体を管理するので、その必要はありません。しかし、最初はそれほど悪い括弧を見つけられなかったことを認めます、そして、何人かの人々はそれらにただ耐えられないことを知っています。ただし、マクロの目的はコンパイル時にコードを生成することなので、LISPのコードは標準のデータ構造を使用し、括弧は単にコードをリストとして表したものであり、マクロを簡単に作成するために必要です。

LISPの使いやすさで問題をよりよく説明するための小さなサブ言語を作成できる他の言語は知りません。これは、Paul GrahamがBeating the Averagesで語っている利点です。それは極端なモジュール性と簡潔さです。 Javaでは、1つのアイデアを表現するためにたくさんの生のテキストを書く必要があります。LISPでは、そのコードを自動的に生成するマクロをいくつか記述し、その後それらを使用することができます。とにかく、これのいくつかの例を理解し、自分で判断します。「見た」とき、私はびっくりしました。それでも、LISPはこの理由だけでも最大の言語だと思います。一致するかどうかを確認するために、常に主流の言語でマクロを探しますLISPマクロの威力はありますが、今のところ見つかりませんでした。

最後に、ビジネスソフトウェアに関して、いくつかの批判を述べます。

  1. ビジネスソフトウェアにはライブラリと優れたライブラリが必要ですが、LISPはこれが得意ではありません。通常は必要ありませんが、必要な場合は、少数のユーザーが使用する不完全なソフトウェアの中から選択する必要があります。私はこれを修正するために貢献するべきだと思います...

  2. ビジネスソフトウェアは通常、大規模なグループによって構築されますが、基本的に言語を変更するため、マクロを使用するとコミュニケーションが妨げられる可能性があると思います。多くのプログラマーは、プログラムテキストが長くて反復的であっても、コード内の特定のパターンをより快適に検出します。 ITAでは、マクロに関していくつかのルールがあるか、コラボレーションを容易にする巨大なマクロライブラリがあると思います(または、より簡単に言えば、すべてのプログラマはLISPのエキスパートです)。

18
Pau Fernández

LISPは好きではありません。

(私はそれが使用する概念の多く、それが強力な技術をネイティブで利用可能にする方法などが好きです。

しかし、私は実際にそれを使用することに確信がありませんでした(( 数人が試したにもかかわらず )言語の利点はできる他のプログラミング言語で(一部は直接、一部は間接的に)達成されるため、時間をかけてそれを学び、恐ろしい構文に我慢するだけの十分なメリットはありません。

ただし、そうです。一部の人が気に入っている理由から、次のスタックオーバーフローの質問を確認してください。

それらの関連する質問にもおそらくいくつかあります。

13
Peter Boughton

「LISP」を「 Common LISP 」と解釈します。他の答えは「 Scheme 」となるでしょう。 (ヒント:LISPは言語のファミリーです。)

「速い」とはどういう意味ですか?ベンチマークを実行するのにかかる時間に関しては、いいえ、Cよりも速くはありません( ただし可能です )。

Joe Random Hackerが動作するプログラムを記述したり、大規模なソフトウェアシステムのバグを修正したりするのにどのくらいの時間がかかるかという点で「高速」ですか。ほぼ間違いなく。

thisハッカーについては、ボイラープレートではなくコードを記述したいので使用します。 一度書いて、継続的に繰り返したくないです。そして、私はそれを書いている間、プログラムと対話したいです。

9
Frank Shearar

LISPは私の考えを表現するための優れた媒体であるため、私はLISPが好きです。私の好きな言語の述語は「アイデアを表現するために何かを選ぶことができたら、それは何でしょうか?」です。現在、LISP *(具体的には Scheme )ですが、プログラミングノートを書いているところです。 [〜#〜] irl [〜#〜] のように、紙とペンのメモ。私がPHPまたはRubyまたはPythonで実装する必要があるプログラムについて考えているときでさえ。

これは私が独学で教えたトリックでも、オタクの信頼性を高めるために行ったものでもありません(とにかく、ノートブックの内部を見ることはできません)。それは、LISPが他のどの選択肢よりもはるかに自然である私にとってと考える方がいいということだけです。

*ただし、脚注と同じように、 Haskell は、詳細を確認することで、ギャップをかなり早く解消しています。

7
Inaimathi

Paul Grahamはこの質問にLISPの違いで自分自身に答えています。

彼が1990年代半ばの間に彼のスタートアップのためにそれを使用したので PythonRuby はその時点では本当に成熟していなかった(または生まれていないかもしれない)ことに注意してください。

LISPは基本的に動的言語のすべての利点を備えています。今日のほとんどのWebアプリケーションでは、PythonおよびRubyは非常に優れており、それらには利点がありますフレームワークとドキュメントと活気のあるコミュニティの。

キラー機能は、おそらくプログラム全体が式でできていることです。つまり、コードのブロックは式にすぎないため、コードのブロックを関数(またはマクロ...)に渡すことができます。

Pythonにはこの機能はありません。関数を定義して渡す必要があります。 Rubyにはブロックがあるようですが、LISPが実行できることと比べて、おそらく制限があります(わかりません)。

6
hasen

私は過去に Scheme に対してひどい反応を示しましたが、これでLISP( Clojure 、実際に)を試す準備ができました。

何年もかけて、Java、C#、C++、Pythonなどの言語を少しずつ取り入れてきました。

Clojureには多くの約束があり、非常にクリーンであるように見え、多くの実際の問題を解決できます。 Clojureのようなクリーンな言語の強力なケースは、マルチコアコンピューターの登場です。

やあLISP!

編集:ITAソフトウェアはMIT gradsによって設立されました。Scheme/ LISPはMIT gradsの多くが学んだ唯一の言語です。公平に言うと、実行中の本番システムでLISPアルゴリズムをホットスワップできます。これは大きな利点です。

6
Job

私がLISPについて好きなことは、それがパラダイムを超越するということです。 LISPは機能的だと言う人もいれば、宣言的だと言う人もいれば、マルチパラダイムだと言う人もいます。これらすべては要点を逃していると思います。 LISPを使用する場合、パラダイムはもはや制約ではありません。

オブジェクトが必要ですか?あなたはそれらを持つことができます。関数型プログラミングが必要ですか?きみにあげる。 Prolog -スタイルのロジックプログラミングが必要ですか?いくつかのマクロを記述します。 SQLスタイルの宣言型プログラミングが必要ですか?頑張れ。まだ発明されていないパラダイムを使いたいですか? LISPで実行できると確信しています。

Forth -likeの言語は別として、他の言語がこのレベルの柔軟性を提供するのを見たことはありません。

6
Jason Baker

問題は権力です。パワー=作業(プログラム機能)/時間

「私たちは、LISPプログラマーに勝つために出かけていたわけではありません。C++プログラマーの後にいました。それらの多くをLISPの途中までドラッグすることに成功しました。」

-Guy Steele、Java仕様の共著者

C++とJavaの間にある種の曲線をプロットします。続けると、線に沿ったある時点でLISPが見つかります。

6
compman

私はいくつかの理由でLISP( newLisp )を学んでいます。

理由その1:LISPは私に違った考え方をさせてくれます。これは私をよりよくするRubyコーダーです。

LISPで特定の方法を実行するのは非常に厄介なようです。たとえば、複数のリストを処理するネストされた反復などです。したがって、mapのような他のものを使用せざるを得ません。私のお気に入りの言語であるRubyは同じmapメソッドを持っていますが、慣れていないため、常に使用するわけではありません。私は貧弱な手法を使用して物事を行うことを学び、言語がその手法をサポートしているときは、それを使い続けています。

理由2:LISPは実用的であり、最新の優れたライブラリを備えています。

dragonfly と呼ばれる、newLisp用の非常に優れた軽量のWebフレームワークがあります。これにより、一部のタスクではPHPの代わりにnewLispコードを使用できます。PHPはあまり好きではありません。newLispは、Rubyよりもこの特定のタスクの方が楽しいようです。

理由その3:LISPは構文的にも概念的にも一貫しています。

私にとって、これはRubyとPythonの一貫性の大きな違いです。

5
philosodad

「高速」は測定するのが簡単なことではありません-それは実際にあなたがベンチマークしている側面に依存します。タスクとLISP実装に応じて、速度はCに近づきます。詳細については、 Great Benchmarking Shoot-Out を参照してください。 LISPのSBCL実装はJava 6サーバーと同等であり、RubyまたはPythonよりもかなり高速です。

しかし、純粋な速度がプログラミング言語を選択する主な理由ではありません-もしそうなら、私たちは皆 アセンブリ言語 でプログラミングしているでしょう?私にとって、LISPの毎日の喜びはコードがコンパイルされることですが、アプリケーションを削除してすべてを再コンパイルし、最初から実行する必要はありません。代わりに、単一の関数を変更すると、その変更がどこでも有効になり、アプリケーションですぐに効果を確認できます。さらに、非常に迅速な「書き込み、テスト、書き込み、さらにテスト」のアプローチにより、コードを書くときにすぐに前もってテストするのがはるかに簡単になります(そして、これらの対話型プローブを後で単体テストに変えることができます)。

すべての行の後に、思考を続ける前に、ボタンを押してメール出力を画面にコンパイルする必要があったメールを書いたと想像してください。それがJavaまたはそのような他の言語で書くのが私に適しています。時にはそれをする理由があり、Java結構ですが、LISPはより応答性が高く、作業を行うのが簡単です。

5
Michael H.

「ブランドの忠誠心」と言えますか?

私はFortranから始めました。私はそれが好きだった。

LISPに切り替えました。最初は嫌いでした。それから私はそれを愛し、Fortranを憎むことを学びました。

その後Pascal、C、C++、さまざまなアセンブラ、C#。 (実際にはC#は好きではありません。)

私は気まぐれだと思いますか?

4
Mike Dunlavey

LISPが作成されたとき、コンピューターサイエンス(まだ実際には存在していません)ではなく、数学から始めました。そして、LISPチームはいくつかのことを本当に正しく行いました。 LISPは1960年頃にガベージコレクションを行いました!彼らは本当に素晴らしい仕事をしました。

The Eternal Flameの曲がカバーしていると思います。

4
Zachary K

大きな魅力はコミュニティです。 LISPは、言語が発明されて以来、最も野心的で優秀な開発者を引き寄せてきました。 人工知能 (AI)研究、コンピュータービジョン、計画、知識表現、および複雑なヒューリスティック最適化のように、研究者が解決されていない問題を解決しようとするところはどこでも、LISPを見つける可能性があります。言語は、ボトムアップとトップダウンの両方で同時に問題を解決するのに役立ちます。これは、最も困難な課題に立ち向かうのに役立つようです。

マクロによる拡張可能な構文は、言語定義を拡張する必要がほとんどないことを意味します。より制限された言語での言語拡張を必要とするものの多くは、LISPを使用するだけでマクロになります。そのため、LISPプログラマは、新しい言語標準がなくても、また必ずしも実際の速度ペナルティがなくても、新しく発明された言語概念を自由に利用できます。基本的なレベルでは、小さな拡張機能によってボイラープレートコードの連なりが不要になります。 Prologスタイルの統合など、制御フローのまったく新しいアイデアは、拡張機能として効率的かつコンパクトに実装されます。

OOP system、 [〜#〜] clos [〜#〜] は、柔軟性の点で独自のクラスにあります。初歩的なC++/Java/C#に戻るOOP試してみた後 GoF 5つのデザインパターンは、簡単に直接表現できるため不要になります。

[〜#〜] ansi [〜#〜] 標準があり、多くの準拠する実装がありますが、言語には単一の企業所有者も単一の決定的な実装もありません。主要な新しい実装は10年ごとに行われ、古い実装はまだかなり活発です。専門家は、専門知識を長期にわたって使用することを計画できます。これは、いくらかの無秩序な摩擦とコミュニティの断片化を引き起こしますが、それはまた、カーペットが引き出されず、企業またはプロジェクトの政治的理由のために言語が瀕死になることができないことを意味します。常に複数の商用およびオープンソースの実装が行われています。よりパフォーマンスに重点を置いたものは、非常に高速で多額の資金が必要な言語実装の2倍の要素の中で定期的にベンチマークを行います。

初期のLISP商用化のアキレス腱は、言語のタイプセーフティ機能と、それらに含まれる高度なソフトウェア開発環境の両方に対応するメモリフットプリントでした。 64 MB Symbolics LISP Machine は、8 MBのSunワークステーションに対してコスト面で現実的ではありませんでした。今日、RAM価格は崩壊し、特に主流のJava、C#、PHP今日の言語は最低限しか進んでいないことを考えると、LISP言語には多大な関心があります。 30年前のもの。

現在、インテリジェントな開発者とのマインドシェアのためにLISPと競合している現代の言語があります:Python、 LuaErlangHaskell 、および OCaml 。しかし、成熟度、適応性、複数の標準に準拠した実装、および速度の同じ組み合わせを提供するものはありません。

2
bcaulf

私は実際にはLISPを行いません。しかし、私が働いている場所は 有限要素 であり、主にFortranの何百万もの行があります。ここで私が計算について最も尊敬している人(コード 計算流体力学 )は、理想的な組み合わせは外側のLISP(主にメモリ管理の厄介な問題を回避するため)とFortranが低レベルであると考えていますアルゴリズム(Fortranは [〜#〜] sse [〜#〜] / [〜#〜] avx [〜#〜] のベクトル機能を活用するのに最適です。このリードが閉じる可能性は低いと考えられます)。

1
Omega Centauri