web-dev-qa-db-ja.com

LISPはまだ今日の世界で役立ちますか?最も使用されているバージョンはどれですか?

定期的に新しいプログラミング言語を教えようとしています。最近、LISPとその方言がC/C++のような言語から完全に逆の端にある方法を読んだので、それについてもっと知りたいと思いました。しかし、私には2つのことが不明確であり、それらについてのガイダンスを探しています。

  1. LISPは今日でも世界で実践/使用されていますか、それともFORTRAN/COBOLのようなレガシー言語ですか?つまり、既存のコードを維持することとは別に、新しいプロジェクトで使用されているのでしょうか?

  2. 最も広く使用されている方言は何ですか?私はSchemeとCommon LISPを2つの最も一般的な方言として見つけましたが、どちらが最も好意的/有用な方言であるかについてあなたの意見を知りたいと思っていました。

私が慣れ親しんでいる手続き型言語とは根本的に異なる言語を学びたいと思っていますが、完全に時代遅れになっているものに過度の労力を費やしたくないのです。アカデミックな視点でのみ...

116
TCSGrad

私はSchemeが好きです。JVMで作業したい場合は、JVMで動作するように設計されたLISPであるClojureをチェックしてください。そしてはい、LISPは、そのような最小限の設計がいかに強力であるかを知るために学ぶ価値があります! LISPを作成した人々はいくつかのことを本当に正しくしました。 LISPが1960年代に持っていた現代言語のクールな新機能の数は驚くべきものです。

埋め込みスキームについては、guileを試してください: http://www.gnu.org/s/guile/

59
Zachary K

質問2「最も広く使用されている方言」への回答:

「最も広く使用されている」の解釈に依存します。以下は、選択したいくつかの方言のそれぞれがどの程度使用されるかについての下限のナプキン計算です。

書かれたほとんどの生のコード

  • 教育 アプリケーションのために、おそらくスキーム(すべての方言)が使用されます
    • 270の学校... 50人の学生/年、500行のコード/学生、10年の実行を想定してみましょう。 1,000,000以上の行はナプキンの計算に基づいています。
    • 500,000ラインのラケット自体とそのツール。
  • [〜#〜] ai [〜#〜] と、大量のオープンソースコードと製品コード(製品コードを参照)が原因で、おそらく共通のLISPが発生する可能性があります。
  • おそらくEmacs LISPが原因で...
    • Emacs自体: 1,000,000行以上
    • 公に書かれたemacs LISPの量-237モジュール、約200行/モジュールは、EmacsWikiだけで40,000 +行ですが、おそらくELPAではるかに多くなります。
    • さらに、emacs LISP、.emacsファイルなどで記述されたアプリケーション.
  • Clojure
    • 推定するのは難しい。ほとんどのドットコム。たくさんあるかもしれません。

受賞者:SchemeまたはCommon LISP。未知数が多すぎます。

ほとんどの「本番」コード

勝者:Common LISPだと思います。 Common LISPとClojureの使用に基づいて、質問1に「はい」と答えることができると思います。

ほとんどのエンドユーザー

  • 一般的なLISP
    • Orbitz、Bing Travel、Kayak.comなどのITA Softwareの顧客-おそらく数百万人。
  • Clojure
    • シティグループ(詳細なし)、アカマイ(詳細なし)、simple.com、その他多数。おそらく数百万。
  • スキーム
    • CSの学生、研究者、愛好家。バジリオン未満。
    • 未知のシリーズ- 500万以上
  • Emacs LISP-主にUNIXプラットフォームのプログラマー。百万人になる可能性があります。

勝者:Schemeは、Unchartedに販売数があるため、ここでの下限が最も優れていますが、かなり議論の余地があります。

結論

結論として、私はその大きなリンゴを見つけます。

68
Jesse Millikan

LISPはまだ今日の世界で実践/使用されていますか、それともレガシー言語ですか?

はい、そうですが、どこを見るかを知っている必要があります。 LISPを使用する人々はそれについてあまり大声で叫ぶ傾向はありませんが、過去20年間にLISPを使用して大きな影響を与えたいくつかの有名なスタートアップの例がいくつかあります。また、ヨーロッパの小企業にも人気があります。

最も広く使用されている方言は何ですか?

これは有効な質問ですが、答えるのは簡単ではありません。多くの実装は特定の焦点を持っているので、それが他の方法で広く使用されていることに基づいているのではなく、特定の問題に適合する場合に選択するのが最善です。代わりに、オプションについて少しお話ししますので、自分で決めることができます。

LISPは言語のファミリであり、これらの各言語には方言と実装のファミリがあります。広く方言は、「LISP」と「スキーム」の2つのグループに分類されます。

LISP:比較的最近まで、Common LISPが王様でした。これは、すべての異種LISPを統合する試みであり、不親切なことなく、LISPの「C++」でした。つまり、それは[〜#〜] huge [〜#〜]言語でした。それはすべてを持っていました。ここ数年、Clojureが登場しています。 Clojureは、Java仮想マシンで実行され、関数型プログラミングの哲学に根ざしたLISPです。伝統的に、他のLISPは厳密にマルチパラダイムでした。Clojureは、 LISPとJVMの両方の中で最高かつ最悪です。Javaベースの言語には多くの冗長性があり、構文はかなり自由で簡単なので、さまざまなもののためのノブとボタンがたくさんありますが、 'reallyデータ型に関する興味深いアイデアがいくつかあります。特に、関数型プログラミングのアイデアを適用するために考え出された実用的な方法がいくつかあります。

スキーム:スキームは、LISPの厳密なサブセットです。 SchemeはSteeleとSussmanによって発明され、初期の頃はMIT Computing 101 Lecture Courseで使用されたことで注目に値しました。Schemeは、「アルゴリズム言語スキームの改訂^ nレポート(RnRS ) "。はい:そこには数学のジョークがあります。Schemeは他のLISPとは異なる方法で標準化された言語です。これは実装間の移植性に大きく役立ちますが、特効薬ではありません。標準化の取り組みは保守的である傾向があります実装の革新、特にモジュールのようなものは、バラバラになる傾向があります。また、IETFのRFCプロセスに似た一連のSRFI(Scheme Requests for Implementation)もあり、必要に応じて小さなものを標準化するために使用されます。

スキームは、LISPとは異なり、満たす必要のある一連の厳しい要件があります。その1つは、再帰の効率化に役立つ「テールコールの最適化」です。したがって、再帰的なプログラミングスタイルは、LISPよりもSchemeではるかに人気があります。スキームは、LISPの "C"のような、不親切でもありません。つまり、それは小さな言語であり、一度にすべてを頭の中で保つことができるはずです。

現在、Schemeファミリは2つあります。第5バージョン(R5RS)に基づくものと、第6バージョン(R6RS)に基づくものです。 R6RSの複雑さは、その前身のどれよりもかなり大きく、R5RSの実装の多くはそれをスキップすることを選択しており、R7RSがR6RSよりもR5RSに似ていることを期待しています。 R7RSの標準化プロセスは現在進行中であり、最初のワーキンググループで小さな基本言語を標準化し、2番目のワーキンググループに大きな機能の標準化を委託することにより、R5RSの実装者の要望とR6RSの人々の要望の両方を含めることを試みました。これにより、言語は、小さな組み込みハードウェアとより機能的なマシンの両方で効率的で有用な実装を実現できます。

今私はより具体的になります:

PicoLispは本当に、本当にクールなLISPです。ちっちゃい!それは作者が自分で書いたもので、私が理解しているように、彼は1980年代から生計を立てています。彼の講演に参加する機会があったら、ぜひ参加してください。彼は本当に面白くて、彼のことをよく知っていて、主流や退屈なもののほんの少しの匂いすら得られないでしょう。

Common LISPの実装については詳しくないので、これ以上コメントしません。

ガイルは公式のGNUスキームです。

ラケットはR6RSスキームですが、最近ネットを広げたようで、「言語の作成、設計、実装のためのプラットフォームとして機能するように」試みています。

チキンは実用的なスキームになることを目指しています。これはR5RSに基づいており、Cにコンパイルされます。これは、既存のCライブラリを使用することが非常に簡単になるため、本当に非常に重要な利点になります。したがって、Chickenは、Perl、Python、Rubyなどを日常のスクリプト言語として置き換えるためのおそらく最も便利なスキームです。数年間、すべてのニーズに排他的に使用した人が何人かいます。インタラクティブなREPLとコンパイラーがあります。コミュニティー(メーリングリストとIRCの両方)は知識が豊富で、フレンドリーで親切です。

多数のモジュールを含む実装を探します。これは、それが広く使用できることを示しており、当面のタスクに役立つ何かがある可能性が高いことを意味します。

コンパイラ、または少なくとも、厳密にはIDEまたはREPLに基づいていない)実装を探します。多くの実装が教育は、汎用のスクリプトで使用するのが非常に困難です。

私が使用しているので、チキンをお勧めします。私は個人的なプロジェクトで使用しており、プロとして使用しています(現在使用しています)。

完全に時代遅れになっているものに過度の労力を費やしたくないのですが、それが専門的に「死んだ」のであれば、学問的な視点でのみそれを学びます...

Schemeは専門的には死んではいませんが、そのような状況で使用するには、ある程度の努力が必要になる場合があります。 Chickenのようなものは、学術的な追求以上のものであり、現在使用している高水準言語のほぼすべての基本を簡単にカバーできます。

43
andyjpb

すべてのLispを実際に話すことはできませんが、Clojureは現在間違いなくホットで関連性の高い言語です。今週はじめに行ったLondon Clojureユーザーグループには100人を超える参加者がいました。

過去1年間(JavaおよびC#での多くの経験の後)、LISPをClojureの形式で学習することは非常に啓発的な経験であることがわかりました。これの主な理由は次のとおりです。

  • 関数型プログラミングに重点を置いています(他のほとんどのLispよりも)。著者とBDFLリッチヒッキーは、言語設計のインスピレーションの1つとしてHaskellを頻繁に引用しています。つまり、完全に不変のデータ構造や遅延無限シーケンスなどを取得できます。
  • マクロメタプログラミング-LISPの「コードはデータである」という哲学は、実際に経験したことがなければ理解するのは難しいですが、Lispが非常に表現力豊かで生産的である理由の1つです。
  • multi-core concurrencyの素晴らしいサポート-実際、Clojureは現在の並行プログラミングに最適な言語です。これに関する啓発的なプレゼンテーションについては http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey を参照してください

また、次の理由により、実際の本番環境での使用には実用的な選択肢のようです。

  • 非常に簡単なJVMでの実行Java相互運用性により、Javaエコシステムのすべてのライブラリとツールにアクセスできます
  • デフォルトでは動的言語であり、ほとんどのボイラープレートでの開発やラピッドプロトタイピングに非常に便利です。ただし、静的型ヒントを追加して、必要な場所で非常に優れたパフォーマンスを得ることができます。

個人的には、いくつかの投資銀行や新興企業でClojureを使用していることを知っています。私はまた、自分のスタートアップの主要な開発言語としてClojureを選択したので、私の口がどこにあるかにお金を注ぎます:-)

27
mikera

私は現在LISPも学んでいます(そして私はそれが大好きです)。私はCommon LISPを使用していますが、 [〜#〜] sbcl [〜#〜]Arc もいじっています(注、LISPのPaul Grahamバージョンです)。 Vitor Bragaが作成したYahooストア/ Viaweb)と Allegro CL はVisual Studio for LISPに類似しています(ただし、GUIを作成できますが、私は使用していません)。

用途としては、人工知能でLISPがよく使用されていますが、正直なところ、LISPの他の「一般的な」用途の数はわかりません。 LISPで構築されたWebサイトの多くは、元々他の言語で書き直されているため、Web開発で使用されているとは言いがたい(そうでないとは言わないが、それを使用する大規模なサイトはもはやそうではない) )。クイック検索を実行した後(非常に迅速)は、Common LISPで Wikipedia から作成されたソフトウェアのリストです。

[編集] LISPを専門的に使用することに関しては、LISPを使用してもらうような仕事がそこにあります。 JavaまたはC#ジョブ)ほど多くはありませんが、存在します。LISPは、内部アプリケーションに使用される言語の1つであり、企業が競争力を発揮できる可能性があると思います彼らがLISPを使用していることを宣伝することによってあきらめたくありません。P.SEで、Smalltalkは金融業界でも似ていると述べた投稿を見たのを覚えています。

また、さまざまなパラダイムを学習できることを示すことができれば、仕事でLISPを使用していなくても、より多くの可能性を開くことができます。

「LISPは、最終的に入手したときに得られる深い啓蒙体験を学ぶ価値があります。その体験は、実際にLISP自体を頻繁に使用したことがなくても、残りの日のための優れたプログラマーになります。」 -エリック・レイモンド、「ハッカーになる方法」

[/編集]

9
Jetti

今日LISPを学びたい場合は、高速なスキームの実装であるラケット(まあ、実際にはスキームから少し離れているので、独自の方言です)、またはclojureを見てみましょう。それが実行されるJVM(そのため、膨大な数のライブラリが利用可能です。さらに、独自のJavaコード)と相互作用させることができます。

実際に使用する方法を学ばなくても、学ぶことは常に有益です。他の言語であっても、しばらくLISPに心を奪われたら、問題を考えて対処するための新しい方法を学びます。

8
Fabien

Amazonバックエンドの重要な部分はLISPにありましたが、現在はC++で書き直されているため、そう聞いたことがあります(信頼できるソースがないことを認めざるを得ません)。

Yahoo!ストアは、LISP Webアプリの典型的な例の1つです。 Yahoo! Paul Graham について聞いたことがあるかもしれません。グラハムは最も有名なLISP擁護者の1人であり、この主題について幅広く書いています。彼のサイトを読んで彼のポイントを知っておくとよいでしょう。

AutoCADには、マクロシステム用のLISP方言がありました。それがまだあるかどうかわかりません。

Schemeはクリーンな言語であり、非常にエレガントです。おそらく私のお気に入りのプログラミング言語なので、偏見があるかもしれません。今すぐ主要なアプリケーションを書くつもりなら、おそらくCでスケルトンアプリケーションを書き、Schemeでビジネスルールを拡張して定義します。これにより、Schemeを使用したり、Cを活用したりすることができます。スピードとほぼすべてのライブラリの可用性を実現するためです。

7
Vitor Py

LISPは今日でも世界で実践/使用されていますか、それともFORTRAN/COBOLのようなレガシー言語ですか?つまり、既存のコードを維持することとは別に、新しいプロジェクトで使用されているのでしょうか?

私はシリコンバレーのいくつかのスタートアップでLispをやっている人を何人か知っています。Amazon.comが最初からLISPを使用していることを知っています(何らかの理由でLISPをC++に置き換えると聞いたことがありますか?)

しかし、目を離さない会社の1つは Naughty Dog です。彼らのゲームはすべてLISP方言で書かれています。元々、彼らは独自にロールバックしましたが、UnchartedシリーズではMZSchemeを使用しています。

最も広く使用されている方言は何ですか?私はSchemeとCommon LISPを2つの最も一般的な方言として見つけましたが、どちらが最も好意的/有用な方言であるかについてあなたの意見を知りたいと思っていました。

Common LISP、Clojure、Scheme、およびEmacs LISPは最も広く使用されている4つの方言であり、そのうち、Schemeが最も一般的に展開されていると思います。もちろん、これをバックアップするものは何もありません。 :)

私は他の人が示唆するようにSICPとLittle Schemerが好きですが、 Land of LISP も推奨します。 :)

4
greyfade

それは、それをどのように処理したいかに依存していると思います。プログラミングのさまざまな概念についての洞察を深め、自分をより優れたプログラマーにするためには、少なくともLISPの少々を学ぶ価値があると思います。この言語で仕事に就くために、履歴書に追加するさらに別の言語を探している場合は、おそらく他の場所を探すことをお勧めします。 LISPの仕事はそれほど多くありません。

私は個人的にSBCLを使用するか、最近ではClojure(および一部のEmacs LISPを使用していますが、これは私がEmacsの長期ユーザーであるためです。LISPを学習するときにEmacs LISPを習得しようとします)。今私がしなければならないことは、実際にそれらの言語で遊ぶ時間を見つけることです...

2
Timo Geusch

LISPにはたくさんの仕事があることを知りません。確かにそれらを見ることができません。しかし、私は彼らがLISPを実行していて、地球から新しいコードを挿入することができたいくつかのNASAプローブについて長い間読んだことを覚えています。

またニューヨークでは、clojureのミートアップグループが巨大です。興味があり、clojureのミートアップグループに参加すると、ネットワークを作って仕事を見つける機会が見つかるかもしれません(clojureの仕事ではなく、Java/C++など)。それはニューヨーク地域で絶対に巨大であるようで、他の地域は異なるかもしれません。

また、LISPは別の考え方です。さらに、LISPとSQLの両方で、大量のネストされた式が使用されます。私はSQLを1トン使用しましたが、LISPの方が理にかなっていることに気づきました。しかし、LISPを使用しているときにSQLがスーパーネストされた括弧と式に慣れるのに問題がある場合は、SQL式を理解しやすくなるでしょう。

古典的な例は、MAX(a、b、c)の実装方法です。一連のifステートメントで複雑な関数を作成できます。またはあなたはただ言うことができます

MAX(MAX(a、b)、c)

そして、2つの項目MAXの2つの単純なネストされた呼び出しを使用します。パフォーマンスが問題である場合は、逆の方法で実行することもできますが、各メソッドを使用するときに比較の数を数えることはしませんでした...また、Cマクロまたはその他のメソッドを使用してMAXを実装している場合、式が複数回評価される可能性があるため、式を複数回使用すると、期待した結果が得られない可能性があります。

2
Cervo

2つの追加ポイント:

まず、LISPは、関数やデータ間の相互作用が複雑になることが多いコードを記述するための優れた言語です。多くの一般的な言語では、プログラムが実行している理由がわからない場合は、特別な関数を記述して、プログラムの内部状態を調査する必要があります。一部の言語では、コードが再コンパイルされるのを待つ必要があります。もちろん、これを助けるデバッガなどのツールがあるかもしれません。ただし、LISPで必要なのはプログラムを停止する方法だけであり、通常はLISPでeverythingにアクセスできます。 Common LISPでは、^ Cと入力するか、errorへの呼び出しを1つの関数にスローすることがあります(これは、再コンパイルする必要がある唯一のものであり、再コンパイルするために何もする必要はありません)。 。プログラムを停止すると、すぐにデバッガーにスローされますが、デバッガーはLISPのすべての機能を提供し、デバッガーを終了したり、特定の関数を呼び出したりできます。データ構造を簡単に調べることができます私のプログラムで。ほとんどのスキームは同様の慣行を許可するべきです。 LISPはこの点で一意ではありませんが、LISPが提供するものは、多くの一般的な言語が提供するものを超えています。

次に、LISPの方言を試してみる場合は、(a)括弧に一致するエディターを使用し、(b)適切なLISPインデントを学習せずにそれを実行します。また、適切なインデントに近いエディタを使用することもお勧めします。 C/C++/Javaスタイルのコード形式は、LISPよりも括弧/中括弧/括弧が少ない言語用に設計されています。 LISPのかわいらしい印刷スタイルは、慣れればうまく機能し、括弧で混乱したり、スペースの半分を無駄にして1行に1つの閉じ括弧を置いたりすることがなくなります。

2
Mars

Common LISPとSchemeについていくつかの視点を追加したいと思います。 JVMが原因でclojureを回避したので、私はそれについて多くの見方をしていません。

Schemeは美しく簡潔で明確な言語です。これは、CLがレガシーのために行わなければならない多くの決定を行い、より純粋なアプローチを採用しました。たとえば、変数と関数は同じ名前空間にあります。デフォルトの言語は小さくて簡潔です。これは、LISPが得意とする種類のことを教えるのに適しています。たとえば、デフォルトでは反復ループがなく、末尾呼び出しの最適化が必要なため、反復ではなく再帰の使用を圧迫します。 。スキームには非常に興味深い衛生的なマクロシステムがあり、これは学習に大きな価値があります。しかし、IMO、私は最初にCLスタイルの非衛生的なマクロを学習することをお勧めします。そのほとんど(?)方言は、仕様の一部ではない場合でも、少なくとも1つの実装を提供します。学習のために言語を学びたいように思えるので、Schemeをお勧めします。さらに、その概念の多くは他のLispや一般的な動的言語に簡単に移行できます。

とは言っても、Schemeのコミュニティは断片化されており、いくつかの小さなポケット以外では、実際の作業を完了するための研究に専念しているようです...たとえば、すべての方言には独自のパッケージマネージャーがあり、パッケージはほとんどの場合ポータブルではありません方言全体で、これはスキームコミュニティの大きな問題です。

一方、一般的なLISPは、言語を開発するためのはるかに実用的なアプローチのようです。多くのLISPコードは実装間で移植可能であり、多くのコンパイラは高速で十分に最適化されています。多数のパッケージセットがあり、その多くは実装間で移植可能です。そして、(比較的)大量の実際の製品が言語で作成されているようです。そして言うquicklispで、それはパッケージ管理がRubyやNodeのような現代のコミュニティで得られるものにかなり近いと感じています。 CLは、欠点がないわけではありません。スキーマと比較すると、現時点では非常に大きな仕様です。従来、Lispでライブラリとして記述されているオブジェクトシステムCLOSでも、仕様IIRCの一部です。そして、あなたは大量のシステムを通して定着した遺産を感じることができます。たとえば、コンパイルのためにイメージを抽出する標準のビルドシステムアプローチは、特定の難解な感じがします。

さもなければ、私はclojureについて話すことができないと述べました、そしてあなたの目標がEmacs拡張を書くことであるなら、Emacs LISPは明らかに適切な選択であり、他のソフトウェアには適切な選択ではありません。

TLDR;あなたの目標が学ぶことであるなら、私はSchemeを勧めます。ただし、ソフトウェアを作成する場合は、2つの主要なLISPバリアントのCommon LISPをお勧めします。

1
Arelius

現在、LISPは主にコンサルティングショップで使用されているように感じます(コンサルティングショップではほとんど使用されていません)。

それは実用的なソフトウェアにとってはちょっとおかしいと考えられています。主に人々がそれに慣れていないからだと思います。

従来、SchemeはLISPのかなり学術的な方言であり、Common LISPは業界の方言でした。

LISPは、シンボリック操作とリフレクション風の機能に特に役立ちます。

例として、私がLISPを学ぶために書いたコードは、ランダムなラムダ関数を構築し、それらを評価してから、ターゲット関数との関数の差を最小化するためにそれらを操作するプログラムでした。それはすべて直接操作でした。 C++やJavaのような言語では、コンピューターが操作する関数の表現を発明しなければなりませんでした。

1
Paul Nathan

学習するLISPの方言を選択する際に考慮すべきもう1つの要素は、実装の数と品質かもしれません。方言に実装が1つまたは2つしかない場合は、それらの欠陥が修正されるまで、その欠陥で立ち往生しているため、人々は常に実装の改良をやめる可能性があります。それ自体は、LISPの単一実装の方言を使用しない理由ではありませんが、考慮する必要があります。 SchemeとCommon LISPの利点は、これらの方言の多くの実装があることです。どちらの言語も標準を公開しているため、比較的最近の実装ではほとんど同じコードが実行される可能性があります。これらの実装の一部は長い間使用されてきましたが、まだ活発に開発中です。現在、これらは高品質の実装であり、まだ洗練されています。 (たとえば、上記のSteel Bank Common LISP(SBCL)は非常に高速です。JVMベースのLISPをこれほど速く簡単に作成できると思います。)

0
Mars

答えから多くを学びました。この啓発的な会話に貢献してくれたすべての人に感謝します。

私は newLISP について言及する必要があります。 CLとSchemeの両方とは少し異なりますが、非常に便利な機能を数多く実装しています。 httpサーバー、マルチプロセッシング機能(Cilk)、およびリモート評価関数は、非常にクリーンで使いやすいと思います。

単一の実行可能ファイルは小さく、高速で、多くのクールなバッテリーが含まれています。

0
CyberFonic