web-dev-qa-db-ja.com

現実のアプリケーションにLISP(の方言)を使用しますか?どこで、なぜ?

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

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

31
Anto

プロダクションプログラムにLISP方言を使用しますか?

絶対

どんな種類のプログラムで、なぜですか?

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

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

LispWorksとFranz Common LISP(商用製品)はGUIに統合され、ある程度成功しています。それらを購入するための$$を持っていないので、それがどれほどうまく機能するのかわかりません。彼らはかなりうまくいくと思います...

確定的なGC操作を実行できます(Javaである程度の成功を収めています)が、[〜#〜] i [〜#〜]既存のLISPシステム(維持されているシステム)がそれを行うためのコードを持っているかどうかはわかりません。

小さなメモリフットプリントは、一部のLispによって実現されていると思います。

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

開発者の大多数は、動的な言語(マクロ)、マクロ、括弧、お気に入りのIDEの欠如、大学での経験不足、それにあまり多くの仕事をしていないため、使用していません。

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

編集:他の言語とは対照的に、なぜLISPなのかについてはあまり答えませんでした。

私のLISPの経験では、重要ではありませんが、「hello world」よりもはるかに優れています。最初の「新しい言語」を試した後、その言語は非常に使いやすいことがわかりました。言語の大部分は非常に規則的でかなり明白な方法で組み合わされており、他の言語のようには動作しません。この一部は、式とステートメントのマージです。この一部は、コアリストのデータ型です。これの一部は型システムです。この一部はマクロシステムです。誤解しないでください。ただし、問題点があります。しかし、彼らは他の言語の問題点ほど私を怒らせません。

単純な例の1つは、Pythonのリストの長さルーチンです。 Pythonアプローチはlen(mysequence)を呼び出すことです。しかし、それを考えると、長さはシーケンスのプロパティです。したがって、mysequence.len()はより適切なアイデアです。LISPは基本的にその構文の違いを取り除きます。(length thing)は関数呼び出しの構文とメソッドの構文の両方です。もちろん、一部の人々はその不満を感じて構文の違いを望んでいます。

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

18
Paul Nathan

ロンドンのいくつかの投資銀行とスタートアップで、Clojureの形でLISPを使用している人々を個人的に知っています。私はまた、自分のスタートアップの主要な開発言語としてClojureを選択したので、口の中にお金を入れても構わないと思っています:-)

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

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

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

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

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

  • ベンダーサポート。私たちが使用するLISPの実装-何かがうまくいかず、開発が妨げられ、結果として締め切りが生じた場合、ベンダーは私たちと一緒に解決策を目指しますか?
  • ライブラリのサポート。どのライブラリーが利用できますか?文字列操作、数学、データアクセス、Webサーブレット(またはLISPと同等のもの)、ウィンドウツールキットなど...このようなものを最初から作成する必要はありません。
  • ツールのサポート-IDEはどの程度優れていますか?固体/安定または薄片ですか?エディターのサポートは良好ですか?統合デバッガー? LISPでGUI開発を行う必要がある場合、視覚的なIDEまたはGUIレイアウトを手動でコーディングする必要がありますか(I hate実行中))。
  • 開発者の賛同(チームメイトにまったく新しい言語を教えるのにあまり多くの時間を費やす必要はありません)

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

もちろんです。ポールグラハム よく説明しています

... 1995年に戻って、私たちは競合他社が理解していないと私が思う何かを知っていました、そして今でも理解している人はほとんどいません。 ..

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

他の企業がLISPを使用したくない場合は、はるかに良いでしょう。それは私たちに技術的なエッジを与えるかもしれません、そして私たちは得ることができるすべての助けを必要としていました...

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

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

競合他社には、ある種の秘密兵器があったように見えたに違いありません-私たちは彼らのエニグマトラフィックか何かをデコードしていました。実際、私たちは秘密兵器を持っていましたが、彼らが気づいたよりも簡単でした。誰も彼らの機能のニュースを私たちに漏らしていませんでした。誰もが考えられるよりも速くソフトウェアを開発できた...

7
kevin cline

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

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

6
S.Lott

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

4
Joris Geer

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

2
SK-logic

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

2
Dave Kincaid

現在、私は Dragonfly フレームワークを介して、私の個人的なWebサイトでPhpの代わりにnewLispを使用しようとしています。 Apacheでニースをプレイする方法を見つけられたら、それを使用します(組み込みのWebサーバーは非常にうまく機能しますが、Apacheを介して作業するほうがはるかに便利です)。そして、それが発生したら、Phpを使用する場所ならどこでもnewLispを使用します。なぜなら、私はPhpが好きではなく、newLispが好きだからです。

現時点では、ClojureはAndroidアプリの場合)には適していませんが、他の人が取り組んでいることはわかっています。そのため、それが理解できれば、方言を使用する別の場所になるでしょう現実世界のアプリケーション向けのLISPの...しかし、これも私がJavaが好きではないためです。

しかし正直なところ、私はLISPよりもRuby ...を好みます...しかし、これは主にコミュニティとドキュメントの問題です。

0
philosodad

Common LISPに独自の商用アプリケーションを実装しました 短観と呼ばれます ネイティブの実行可能ファイルとしてMicrosoft Windowsで実行します.

日本の漢字を覚える練習をするプログラムです。

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

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

LISPプログラムは、ユーザーの入力履歴とさまざまなオブジェクト間のさまざまな関係を含むかなり複雑なセッション状態をメモリに維持します。 LISPの循環オブジェクト表記(*print-circle*変数によって有効化)とカスタムCLOS print-objectメソッド全体での動作は、永続性の実装に非常に役立ちます。ユーザーは状態をディスクに保存し、残した場所から再開できます。オフ。 UIの状態を含むすべてが保存されます。オブジェクトグラフには多数の共有サブ構造とサイクルがあります。さらに、辞書エントリオブジェクトのコンテンツのように、永続化する必要のない多くの静的な残骸。 ANSI Common LISPのカスタムプリントオブジェクトメソッドを使用すると、マシンで読み取り可能なオブジェクトの圧縮された印刷表現を作成でき、循環参照を保持できます。

JavaScriptはほとんどWeb UIで使用されていません。 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と呼ばれるファイルに連結されており、それだけです。

0
Kaz