実際のアプリケーションにLISP(の方言)を使用しますか?どこで、なぜ?[閉まっている]


31

LISP(およびScheme、Common LISP、Clojureなどの方言)は、かなり適切なプログラミング言語であるにもかかわらず、多くの業界からの支持を得ていません。(現時点では、彼らは牽引力を得ているようです)。

さて、これは質問に直接関係していません。生産プログラムにLISP方言を使用しますか?どのようなプログラムとその理由は?他のコード(Cなど)に統合される種類の使用法も含まれていますが、それはあなたの答えの意味であることに注意してください。幅広い概念が望ましいですが、特定のアプリケーションも同様に適切です。


6
emacsは「現実の」アプリケーションとしてカウントされますか? gnu.org/software/emacs/emacs-lisp-intro
S.Lott

1
@ S.Lott:はい。Emacsの拡張機能を作成するためにelispを使用する場合、それは問題なく、LISP方言の適用です。
Anto

GNU Guileはまさにこの目的のために意図されています。

1
おもしろいですが、この質問はこのサイトにふさわしくないと思います。複数の理由:1-広すぎる、2-回答のリストを招いている、3-「正しい」回答を決定する明確な方法がない、4-時間的にローカライズされている(「あまり業界からの支持を得ていない」)、 5-それは議論と議論を招きます。
アンドレスF.

回答:


18

生産プログラムにLISP方言を使用しますか?

絶対に

どのようなプログラムとその理由は?

Lispは汎用の動的言語です。現在、Microsoftによって公開されていない他の汎用動的言語と同じ基本的な困難があります:ネイティブスレッド、GUI統合、GCの確定的な操作、小さなメモリフットプリント。

ネイティブスレッドはLispWorksとSBCLによって実現されていると思います。おそらく他の人?私は完全に調査していません。

LispWorksとFranz Common Lisp-市販製品-は、GUIにある程度統合されています。それらを買うための$$を持っていないので、私はそれがどれだけうまく機能するかわかりません。私は彼らがかなりうまくいくと思う...

確定的GC操作は、(それが成功のいくつかのレベルにJavaで行われています)に行うことができますが、私は、既存のLispシステム(維持ものは)それを行うために任意のコードを持っているかどうかを知りません。

いくつかのLispによって小さなメモリフットプリントが達成されると信じています。

私の基本的なポイントは、Common Lispは技術的に実動システムを作成する準備ができているということです。そしてそれ

開発者の大多数は、動的言語、マクロ、括弧、お気に入りのIDEの欠如、大学での悪い経験、その中の多くの仕事ではない(1つを選ぶ)ことに驚いてしまい、それを使用しないでください。

個人的には、Common Lispで本格的なプロダクションシステムをチーム環境で一から構築することに飛びつきます。

編集:他の言語とは対照的に、なぜLispなのか、私は本当に答えませんでした。

私のLispの経験では-重要ではありませんが、「hello world」よりもかなり多く-最初の「Argh new language」の痛みの後、この言語は非常に使いやすいことがわかりました。大部分の言語は非常に規則的でかなり明白な方法で一緒に適合しますが、他の言語のようには動作しません。その一部は、式とステートメントのマージです。その一部は、コアリストデータ型です。その一部は型システムです。この一部はマクロシステムです。間違って私を得ることはありません、しかし、そこにある痛みのポイント。しかし、彼らは他の言語の問題点ほど私を蹴りません。

1つの単純な例は、Pythonのリストの長さのルーチンです。Pythonのアプローチはを呼び出すことlen(mysequence)です。しかし、考えてみると、長さはシーケンスのプロパティです。だから、mysequence.len()より適切なアイデアです。Lispは本質的にその構文上の区別を取り除きます。(length thing)関数呼び出し構文とメソッド構文の両方です。もちろん、一部の人々はそれをイライラさせ、構文上の違いを望んでいます。私はむしろ規則性を持ちたいです。

edit2:デスクトップで実行されているMS論文の一部をCommon Lispに変換しました。これまで作業できたことはとてもうれしいです。


2
私の意見では、LISPは本格的なプロダクションシステムで使用されますが、通常は他の言語よりもLISPでコーディングしやすい特定のロジック処理にのみ使用されます。ビデオゲームのAIと統計データの前処理は、かつて私に引用された例です。私はかつて、「十分に複雑なシステムには、中途半端なLISP実装が組み込まれている」という言葉を持ったマネージャーがいました。同様の言い回しは、「十分に肥大化したシステムにはメールリーダーが組み込まれている」というものでした。
FrustratedWithFormsDesigner

4
@Frustrated:ええ、それらはグリーンスパンのn番目の法則とjwzの法則です。
ポールネイサン

2
これらの多くは、Javaと互換性があり、Javaに置き換わるように特別に設計されているため、Clojureによって解決されています。ただし、もちろん、JVM用のSchemeおよびCL実装もあります(Kawa、ABCLなど)。
ヨルグWミットタグ

4
Clojureは、もう1つの断片化であるため、漠然と迷惑です。
ポールネイサン

断片化は悪いことではありません。Clojureで本当に迷惑なのは、点線のペアがないことです。このような基本的なことなく、Lispのような言語として数えることができますか?
SKロジック

11

私は個人的に、ロンドンのいくつかの投資銀行や新興企業でClojureの形でLispを使用している人々を知っています。また、私は自分のスタートアップの主要な開発言語としてClojureを選択しました。そのため、私は自分の口のある場所にお金を入れたいと思います:-)

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

  • 関数型プログラミング(他のほとんどのLispよりも)に非常に重点を置いています。著者とBDFLリッチヒッキーは、言語設計のインスピレーションの1つとしてHaskellを頻繁に引用しています。
  • マクロメタプログラミング -Lispの「コードはデータ」という哲学は、実際に経験していない限り理解するのは困難ですが、それがLispが表現力豊かで生産的である理由の1つです。基本的に、問題のドメインに合わせて言語を拡張することができます。
  • マルチコア同時実行性の素晴らしいサポート-実際のところ Clojureは同時プログラミングに最適な言語だと思います。これに関する啓発的なプレゼンテーションについては、http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickeyを参照してください
  • REPLでのインタラクティブな開発は、アプリケーションを構築するための優れた生産的な方法です。実行中のアプリケーションコードを動的に変更し、ライブデータ構造をプログラムで検査する力を実感できます。

また、以下の理由から、実際の実稼働での使用には実用的な選択のようです。

  • 非常に簡単なJava相互運用性を備えたJVM上で実行すると、Javaエコシステム内のすべてのライブラリとツールにアクセスできます。
  • エンタープライズアプリケーション用の実証済みのプラットフォームであるJVMで実行しています。Clojureは、優れたGCおよびJITコンパイルなどの優れたJVM機能をすべて無料で利用できます。
  • デフォルトでは動的言語であるため、ほとんど定型化されていない開発やラピッドプロトタイピングに非常に便利です。ただし、静的型ヒントを追加して、必要な場所でかなり良いパフォーマンスを得ることができます。
  • それは実用的で役立つコミュニティです。人々が物事を成し遂げ、実際の問題を解決する適切に設計されたソリューションに焦点を当てているような文化です
  • あるツールのサポートは、複数のIDEに。私は個人的にEclipseをCounterclockwiseプラグインで使用しています(Java統合が必要なため)が、他にもたくさんのオプションがあります。

8

仕事に最適な選択肢である場合は、LISPを使用します。「最良の選択」に影響を与えるいくつかのこと:

  • ベンダーサポート。私たちが使用するLISPの実装-何かがうまくいかず、開発を妨げ、その結果として締め切りが妨げられた場合、ベンダーは私たちと一緒に解決に向けて取り組みますか?
  • ライブラリのサポート。利用可能なライブラリは何ですか?文字列操作、数学、データアクセス、Webサーブレット(またはLISPに相当するもの)、ウィンドウツールキットなど。
  • ツールのサポート-IDEはどの程度優れていますか?固体/安定またはフレーク状?優れたエディターサポート?統合デバッガー?LISPでGUI開発を行う必要がある場合、視覚的なIDEがありますか、それとも手作業でGUIレイアウトをコーディングする必要がありますか(そうするのはです)。
  • 開発者の賛同(チームメイトにまったく新しい言語を教えるのにあまり時間をかけたくありません)

LISPがプロジェクトに適しているかどうかを判断する際には、これらすべての要因を考慮する必要があります。企業の世界では、私はそれを経験したことがありません。


生産性は多くの場合、言語自体よりも利用可能なツールとライブラリの影響を受けます(言語が基本的な機能を提供している場合)。
ジョルジオ

6

絶対に。ポールグラハムはそれをうまく説明します

... 1995年、私たちは競合他社が理解していないと思うことを知っていましたが、今でもほとんど理解していません。自分のサーバーで実行するだけのソフトウェアを作成しているときは、好きな言語を使用できます。 ..

Lispを選びました。一つには、この市場では急速な発展が重要であることは明らかでした。私たちは皆、ゼロから始めていたので、競合他社が大きなアドバンテージを得る前に新しい機能を実現できる会社でした。Lispはソフトウェアをすばやく作成するのに非常に優れた言語であり、サーバーベースのアプリケーションは迅速な開発の効果を拡大します。

他の企業がLispを使いたくないのであれば、もっと良い。それは私たちに技術的優位性を与える可能性があり、私たちが得ることができるすべての助けが必要でした...

したがって、Lispの使用は実験であると言えます。私たちの仮説は、Lispでソフトウェアを作成すれば、競合他社よりも早く機能を実行できるようになり、ソフトウェアではできないことを実行できるようになるというものでした。また、Lispは非常に高レベルだったので、大きな開発チームは必要ないので、コストは低くなります。もしそうなら、より少ないお金でより良い製品を提供し、それでも利益を上げることができます。最終的にすべてのユーザーを獲得し、競合他社は何も獲得せず、最終的には廃業します。とにかく、それが実現したいと思っていました。

この実験の結果はどうでしたか?意外なことに、うまくいきました。最終的には20から30のオーダーの多くの競合他社がいましたが、競合するソフトウェアはどれもありませんでした。サーバーで実行され、デスクトップアプリケーションのように感じられるwysiwygオンラインストアビルダーがありました。競合他社にはcgiスクリプトがありました。そして、私たちは常に機能においてそれらよりもずっと先を行っていました。時には、必死になって、競合他社は私たちが持っていない機能を導入しようとするでしょう。しかし、Lispの開発サイクルは非常に高速であったため、競合他社がプレスリリースで発表した1日か2日以内に新しい機能を複製することができました。プレスリリースを報道しているジャーナリストが私たちに電話することになった頃には、私たちも新しい機能を持っているでしょう。

競合他社には、何らかの秘密兵器があるように思われたに違いありません。エニグマのトラフィックなどを解読しているようです。実際、私たちには秘密兵器がありましたが、彼らが思っていたよりも簡単でした。誰も彼らの機能のニュースを私たちに漏らしていなかった。誰もが考えていたよりも早くソフトウェアを開発することができました...


8
「...ポールグラハムはもともとコーヒーを待っている間にナプキンの裏にlispでredditを書いた。それは非常に強力だったので、普通のコンピューターが理解できるようにPythonで書き直さなければならなかった。 Lispで書かれていたので、全体を書き換える努力はほとんどなく、書き換えは2プロセッササイクルの間に完了しました。PaulGraham自身は、Lispで書かれていました。 Lispの以前のバージョン。Lisp、paul graham、lisp、paul graham、ずっと下にあります。」
ジョン・カートライト

5

Emacsは、LISPを使用する実際のアプリケーションです。

理由:キーストロークとアクションのマッピングを表現するのに最適な方法でした。解釈され、高速で、明確に定義されており、シンプルです。


私はそれがketstrokesとアクションの間のマッピングを表現するために良好であった理由を言って、この答えを延長する
ANTO

@Anto:私の経験では、Lispはそれは本当に簡単に透過的に表現することができる強力な抽象化を作成することができます任意のあなたがエディタで実行できるアクションは非常に一貫性のある方法を-ビットのためにEmacsを使用した後に、あなたはほとんど何がどのように行われるかを推測することができます。これにより、エディターでできることはすべてキーストロークにマッピングできます。各バインディングは、他のバインディングと非常によく似ているため、記述と保守が容易になります。
ティコンジャービス

4

MacsymaAutocadはどちらもLispの方言に基づいています。私はそれらを「実世界」とEmacsに分類します。


MathematicaはLispに基づいていません。
ライナージョスヴィッヒ

2
AutoCADはAutoLISPをAPIとして提供していますが、C ++および.NETマネージコードで記述されています。
CADが11

1
@RainerJoswig Macsymaは、おそらくMathematicaの代わりに意図されていました。
user40989 14年

2

絶対に考えます。特に、並列計算の可能性がある新しい開発作業の場合。これは、これらのタイプの関数型言語のスイートスポットのようです。


2

Lispは、コンパイラを実装するための最良の選択肢の1つです。そして、DSLとeDSLの使用が現在増加しているため、Lispの価値が高まっています。DSL関連のすべてのタスクにLisp方言を使用しています。


0

現在、私は個人のWebサイトでDragonflyフレームワークを介してnewLispをPhpの代わりとして使用しようとしています。Apacheをうまく動作させる方法を理解できれば、それを使用します(組み込みのWebサーバーは非常にうまく機能しますが、Apacheを介して作業する方がはるかに良いでしょう)。そして、それが起こったら、Phpを使用するどこでもnewLispを使用します。これは、Phpが好きではなく、newLispが好きだからです。

現時点では、ClojureはAndroidアプリには適していませんが、人々はそれに取り組んでいます。それがわかったら、それは私が現実世界のアプリケーションにLispの方言を使用する別の場所になるでしょう...しかし、これは私がJavaが好きではないからです。

しかし、正直なところ、私はLispよりRubyを好んでいます...しかし、これはほとんどコミュニティとドキュメントの問題です。


0

私は、Microsoft Windows上でネイティブ実行可能ファイルとして実行されるTankan呼ばれる Common Lispのプロプライエタリな商用アプリケーションを実装しました。

これは、日本語の漢字を暗記するように自分を訓練するためのプログラムです。

プログラムはバックグラウンドHTTPサーバーとして実行されます。このサーバーの実行とページへの移動は、Visual C ++を使用して開発した小さなシステム通知領域(別名「トレイ」)アイコンアプリケーションによって調整されます。

小さなトレイアイコンアプリケーションは、Lispベースのサーバーを起動、監視、および停止し、その標準入出力に関連付けられたWin32パイプを使用してLispサーバーと通信します。パイプを介して、Lispサーバーはトレイアイコンアプリケーションに正しいポート番号で正確なURLを通知し、そのトレイアイコンアプリケーションはシェルAPIを介してブラウザを起動してそのURLを閲覧できます。ユーザーはアイコンをダブルクリックするだけでUIが表示されます。

Lispプログラムは、ユーザーの入力履歴とさまざまなオブジェクト間のさまざまな関係を含むかなり複雑なセッション状態をメモリ内に維持します。Lispの循環オブジェクト表記(*print-circle*変数で有効)とカスタムCLOS print-objectメソッド間での動作は、永続性の実装に非常に役立ちます。ユーザーは状態をディスクに保存し、中断したところから再開できます。UIの状態を含むすべてが保存されます。オブジェクトグラフには、サイクルと同様に多くの共有サブ構造があります。さらに、ディクショナリエントリオブジェクトのコンテンツのように、永続化する必要のない多くの静的な問題。ANSI Common Lispのカスタム印刷オブジェクトメソッドを使用すると、それでも機械可読なオブジェクトの要約印刷表現を作成できます。

Web UIではJavaScriptはほとんど使用されません。UIの一部を非表示および表示するためのコントロールでさえ、フォームの送信とHTMLの再レンダリングによって実行されます。したがって、UI状態のすべての詳細はサーバーにあり、ユーザーが保存するときに保持されます。HTMLの再生成は非常に高速です。それは、マクロを生成するHTMLをフィードする巨大なLispバッククォート式によって行われます。Clozure Common Lisp(CCL)によってコンパイルされたコードにより、これが非常に速く行われるため、UIの[+]ボタンをクリックして何かを開くと、サーバーにリクエストを送信し、単なるローカルJavaScript要素を実行してローカルドキュメント要素の可視性を変更するだけではなく、完全なページです。

このプログラムはもともとCLISPで開発されました。ANSI CLは標準言語であるため、実装が適切に行われ、言語の卑劣な落とし穴(「未定義」または「実装定義」の動作)があまり多くないため、CCLに簡単に移植できます。

CLISPは放棄されていません。同じ一般的なコードベースの多くを使用して、ライセンスバックエンドを強化するために引き続き使用されます。

IronCladライブラリが提供する楕円曲線暗号を使用して、プログラムのオリジナルライセンスシステムを開発しました。これは、ライセンスサーバーがライセンスに署名してそれらを認証するために使用されます。(OpenSSLのコマンドラインプログラムを使用して、サーバーキーのECパラメーターを生成した可能性があることを覚えているようです。)

ライセンスはLispオブジェクトとして表されます。Clozure Common LispによってコンパイルされたWindowsプログラムがS式ベースのライセンスを生成でき、Debianサーバーで実行されているCLISPプログラムがそのオブジェクトの欠落しているデジタル署名フィールドを埋めて送り返すことができることは、Lispの移植性へのオマージュです署名を検証できるWindowsプログラム。

サーバーでは、CGIベースのライセンスサービスに加えて、ライセンスを管理するための簡単なコマンドラインAPIを使用します。ライセンスを一覧表示し、特定のライセンスを見つけ、その属性を編集できます。たとえば、一時ライセンスの有効期限を編集して、ユーザーに例外を付与するなどです。ライセンスバックエンドも電子メールを生成します。サーバー側のCGI処理にライブラリを使用しませんでした。Apache環境変数とコマンドライン引数を処理するために、手巻きのLispコードを使用しました。(ただし、URLエンコードとHTML生成の処理にはライブラリコードが使用されます。)ストレージにデータベースは使用されません。ライセンスは呼ばれるファイルに連結され、licenses.lispそれだけです。


-1

誰かが私に支払ったなら、確かに。

彼らはおそらく言語を知っている人にお金を払うことにもっと興味があるでしょう。私はelispとschemeで数回だけプレイしました。

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