Lispは明らかにAIの利点ですが、LispがJava、C#、またはCよりも高速であるとは思えません。 Lispでビジネスソフトウェアを書くことになります。
しかし、それはハッカーの言語と見なされています。
Paul GrahamがLispを擁護するのはなぜですか?ITA Softwareが他の高級言語よりもLispを選んだのはなぜですか?これらの言語に対してどのような価値がありますか?
Lispは明らかにAIの利点ですが、LispがJava、C#、またはCよりも高速であるとは思えません。 Lispでビジネスソフトウェアを書くことになります。
しかし、それはハッカーの言語と見なされています。
Paul GrahamがLispを擁護するのはなぜですか?ITA Softwareが他の高級言語よりもLispを選んだのはなぜですか?これらの言語に対してどのような価値がありますか?
回答:
Common Lispの能力を高めるために取り組んでいるいくつかの理由があります。
おそらく、Common Lispに対して選択する唯一の本当の理由は、標準ライブラリが古いことです。
私は手足に出て、一般的な場合、プロのソフトウェア労働者にとって構文は問題ではないだろうと言います。
Lispが好きです
プログラミングは複雑さと戦っています。抽象化は、ますます複雑化する頭蓋骨のサイズが非常に限られているため、絶えず複雑さを克服するための唯一の効果的なツールです。Lispで抽象化を管理することは、n + 1の願いを持つ魔神を持つようなものです。
(+ 1 n)
願いではなく、賢明な実用性ではあり(incf n)
ませんか?
私は正しいLispの答えはもっとグノミックだと信じています。何かのように:「あなたが依頼している場合、あなたは準備ができていません。」
さらに誰かがさらに質問した場合、正解は「はい」または「または」の質問の場合、または「準備ができていません」です。
誰もが言及する人工知能(AI)分野でのLispの利点は、やや歴史的な事故だと思います... LispはAIのために、またはAIで始まりましたが、それは汎用言語です。
言語の重要な側面は実行速度だけではないと思います(ただし、一度は行いました)。しかし、私がLispで気に入っている点の1つは、私にとって、PythonとCを1つに組み合わせていることです。宣言とプロトタイプを使用せずにコーディングをすぐに非常に迅速に開始できます(これにはランタイムとREPLが非常に重要です)。何かを実行した後、型宣言を追加し、コードを少しずつ「最適化」します。SLIMEでキーを押して、興味のある関数用に生成された機械語を見るのは不思議です。Pythonには型宣言がないため、速度を上げることはできませんが、Cでは、何でもすぐに完了しますもっと痛い。この場合、Lispは非常に便利です。
そうは言っても、私は主にマクロのためにLispが好きです。マクロが何を達成できるかを最終的に理解したら、括弧を簡単に我慢できると思います。また、Emacsのようなエディターは括弧を自分で管理するので、必要はありません。しかし、最初は括弧がそれほどひどくなかったことを認めます。そして、一部の人々はただそれを我慢できないことを知っています。しかし、マクロの全体的な目的はコンパイル時にコードを生成することなので、Lispのコードは標準のデータ構造を使用し、括弧は単にコードをリストとして表現するものであり、マクロを簡単に書くために必要です。
Lispの使いやすさで問題をより良く説明する小さなサブ言語を書くことができる他の言語は知りません。それがポールグラハムが平均を破ることで語る利点です。それは極端なモジュール性と簡潔さです。Javaでは、単一のアイデアを表現するために多くの生のテキストを書く必要があります。Lispでは、そのコードを自動的に生成するいくつかのマクロを書くことができ、その後はそれらを使用するだけです。とにかく、あなたはこのいくつかの例を理解し、それからあなた自身で判断しなければなりません。私がそれを「見た」とき、私は感動しました、そして、私はまだ、Lispがこの理由だけで最大の言語であると思います。私は常に主流言語のマクロを探して、それらがLispマクロの能力と一致するかどうかを確認しますが、今までのところ何も見つかりませんでした。フォースはすぐ近くです。
最後に、ビジネスソフトウェアに関していくつかの批判を行います。
ビジネスソフトウェアにはライブラリと良いライブラリが必要です。Lispはこれが得意ではありません。私は通常それらを必要としませんが、私が必要とするとき、私は少数の人々が使用する不完全なソフトウェアの少しの選択から選ばなければなりません。私はこれを修正するために貢献する必要があると思います...
通常、ビジネスソフトウェアは大勢の人々によって構築されますが、マクロは基本的に言語を変更するため、マクロとの通信が妨げられる可能性があると思います。多くのプログラマーは、プログラムのテキストがより長く、より反復的であっても、コード内の特定のパターンをより快適に検出します。ITAにはマクロに関するいくつかのルールがあるか、コラボレーションを簡単にする巨大なマクロライブラリがある(または、もっと簡単に言えば、すべてのプログラマーがLispの専門家である)と思います。
私はLispが好きではありません。
(私は、それが使用する多くの概念、強力な技術をネイティブで利用可能にする方法などが好きです。
しかし、私は実際にそれを使用行くことを確信されていなかっきた、((にもかかわらず、何人かの人が試してみました)言語の利点があるためできる十分な利益がないので、(一部直接、何らかの間接的に)他のプログラミング言語で実現すること私はそれを学び、恐ろしい構文に我慢する時間を費やすために取得します。)))
しかし、そう、いくつかの人々がそれを好むという理由で、これらのStack Overflowの質問をチェックしてください:
それらの関連する質問には、おそらくさらにいくつかあります。
「Lisp」を「Common Lisp」と解釈します。他の答えが「Scheme」と言うことは間違いありません。(ヒント:Lispは言語のファミリーです。)
「より速い」とはどういう意味ですか?ベンチマークを実行するのにかかる時間に関しては、いいえ、それはCより速くありません(しかし、それはできます)。
Joe Random Hackerが作業プログラムを作成するのにどれくらいの時間を要するか、または大規模なソフトウェアシステムのバグを修正するのにどれくらいの時間がかかるかという点で「高速」です。ほぼ間違いなく。
この私はコードではなく、定型を書きたいので、ハッカー、私はそれを使用しています。私は何かを一度書いて、自分自身を繰り返したくありません。そして、私はそれを書いている間、プログラムと対話したいと思います。
M-x eval-region
(またはeval-buffer
)する必要がありますが、それだけです。
C-j
(道徳的にはenterと同等)、すぐに有効になります。
Lispは、自分の考えを表現するための優れた媒体だからです。私の好きな言語の述語は、「アイデアを表現するために何かを選ぶことができたら、それは何でしょうか?」です。現在、それはLisp *(具体的にはScheme)であり、私はその中にプログラミングノートを書いていることに気が付きます。IRLとして、紙とペンのメモ。プログラムについて考えている場合でも、PHPまたはRubyまたはPythonで実装する必要があります。
これは私が自分で教えたトリックでも、オタクの信頼性のためにやったことでもありません(とにかく私のノートブックの内部を見ることはできません)。Lispは、私が考えるのに他の選択肢よりもはるかに自然であり、あなたに共鳴する言語はあなたの宝物です。
*しかし、脚注のように、Haskellは、私がそれをもっと学べば、すみやかにギャップを埋めようとしている。
問題は力です。電力=仕事(プログラム機能)/時間
「私たちはLispプログラマーに勝つつもりはありませんでした。C++プログラマーを追い求めていました。私たちはそれらの多くをLispに半分ほど引きずり込むことができました。」
-Java仕様の共著者であるGuy Steele
C ++とJavaの間のある種の曲線をプロットします。続けていくと、線に沿ったある時点でLispが見つかります。
ポール・グラハムは、Lispを別のものにしたもので、この質問に自分で答えています。
彼は1990年代半ばに彼のスタートアップにそれを使っていたので、PythonとRubyはその時点ではあまり成熟していなかった(あるいは生まれていないかもしれない)ことを覚えておいてください。
Lispには基本的に動的言語のすべての利点があります。今日のWebアプリケーションのほとんどでは、PythonとRubyは非常に優れており、フレームワークとドキュメント、活気のあるコミュニティという利点があります。
キラー機能は、おそらくプログラム全体が式で作られていることです。つまり、コードのブロックは式にすぎないため、コードのブロックを関数(またはマクロ...)に渡すことができます。
Pythonにはこの機能はありません。関数を定義して渡す必要があります。Rubyにはブロックがあるようです。おそらく、Lispでできることと比べて多少制限されているでしょう(わかりません)。
私は過去にSchemeに対してひざまずき反応をしましたが、今ではLisp(実際にはClojure)に打撃を与える準備ができています。
ご覧のとおり、Java、C#、C ++、Pythonなどの言語を少しずつ取り上げてきたので、これで問題はなくなりました。
Clojureには多くの約束があり、非常にクリーンであるように思われ、多くの現実の問題を解決できます。Clojureのようなクリーンな言語の強力な事例は、マルチコアコンピューターの出現です。
イェイLISP!
編集:ITA SoftwareはMIT卒業生によって設立され、Scheme / LispはMIT卒業生の多くが学んだ唯一の言語でした。公平を期すために、実行中のプロダクションシステムでLispアルゴリズムをホットスワップできます。これは大きなプラスです。
INTERCAL
。チャレンジが唯一の基準ではありません。実際の問題も迅速に解決できなければなりません。少なくともHaskellは多くの人に使用され愛されています。
PLEASE
?
私がLispで気に入っているのは、パラダイムを超越していることです。Lispは機能的であると言う人もいれば、宣言的だと言う人もいれば、マルチパラダイムだと言う人もいます。これらはすべてポイントを逃していると思います。Lispを使用するとき、パラダイムはもはや制約ではありません。
オブジェクトが必要ですか?あなたはそれらを持つことができます。関数型プログラミングが必要ですか?きみにあげる。したいPrologのスタイルの論理プログラミングは?いくつかのマクロを書きます。SQLスタイルの宣言型プログラミングが必要ですか?頑張れ。まだ発明されていないパラダイムを使用したいですか?Lispでできると確信しています。
脇からフォース様の言語、私は別の言語を提供柔軟性のこのレベルを見るためには至っていません。
「高速」は測定するのが簡単なものではありません。ベンチマークする側面によって異なります。タスクとLispの実装に応じて、速度はCに近づきます。詳細については、大ベンチマークシュートアウトをご覧ください。LispのSBCL実装はJava 6 Serverと同等であり、RubyやPythonよりもかなり高速です。
しかし、プログラミング言語を選択する主な理由は純粋な速度ではありません。もしそうであれば、私たちはすべてアセンブリ言語でプログラミングしているでしょう。私にとって、Lispの毎日の喜びは、コードがコンパイルされることですが、アプリケーションを停止し、すべてを再コンパイルして、ゼロから実行を開始する必要はありません。代わりに、1つの関数を変更するだけで、その変更がどこでも有効になり、アプリケーションでその効果をすぐに確認できます。さらに、この非常に迅速な「書き込み、テスト、詳細な書き込み、詳細なテスト」アプローチにより、コードを記述しながらすぐにテストすることがはるかに容易になります(そして、これらのインタラクティブプローブを後でユニットテストに変えることができます)。
すべての行の後にボタンを押して、思考を続ける前に画面に電子メール出力をコンパイルする必要がある電子メールを書くことを想像してください。それが私にとってJavaやそのような他の言語で書くことです。時々それをする理由があり、私はJavaが素晴らしいのが好きですが、Lispはちょうどより敏感で、仕事を終わらせるのがより簡単です。
Lisp(newLisp)を学ぶ理由はいくつかあります。
理由その1:Lispは私に違った考え方をさせ、それが私をより良いRubyコーダーにします。
Lispで特定の方法を実行するのは非常に厄介なようです。たとえば、複数のリストを繰り返すネストされた反復などです。そのため、のような他のものを使用せざるを得ませんmap
。私のお気に入りの言語であるRubyには同じマップメソッドがありますが、馴染みがないため、いつも使用しているわけではありません:貧弱なテクニックを使用して物事を行うことを学び、言語がそのテクニックをサポートしているとき、それを使用し続けます。
理由その2:Lispは実用的で、優れた最新のライブラリを備えています。
newLispと呼ばれるための非常に素晴らしい、軽量Webフレームワークがありますトンボが。これにより、一部のタスクでPHPの代わりにnewLispコードを使用できます。私はPHPがあまり好きではなく、newLispはこの特定のタスクにとってRubyよりも楽しいようです。
理由その3:Lispは構文的および概念的に一貫しています。
私にとって、これはRubyとPythonの大きな違い、一貫性です。
「ブランドロイヤルティ」と言えますか?
Fortranで始めました。私はそれが好きだった。
Lispに切り替えました。最初は嫌いでした。それから私はそれを愛し、Fortranを嫌うことを学びました。
後でPascal、C、C ++、さまざまなアセンブラ、C#。(実際、C#は好きではありません。)
私は気まぐれだと思う?
大きな魅力はコミュニティです。Lispは、この言語が発明されて以来、最も意欲的で優秀な開発者を引き付けてきました。人工知能(AI)の研究、コンピュータービジョン、計画、知識表現、複雑なヒューリスティック最適化のように、研究者が未解決の問題を解決しようとする場合はいつでも、Lispを見つける可能性があります。この言語は、ボトムアップとトップダウンの両方で同時に問題を解決するのに役立ちます。これは、最も困難な課題に立ち向かう際に役立つようです。
マクロを介した拡張可能な構文は、言語定義を拡張する必要がほとんどないことを意味します。より制限された言語で言語拡張を必要とするものの多くは、Lispを使用しないマクロです。そのため、Lispプログラマは、新しい言語標準がなく、必ずしも実際の速度を犠牲にすることなく、新しく開発された言語概念を自由に利用できます。基本的なレベルでは、ボイラープレートコードの連なりは、小さな拡張機能によって不要になります。Prologスタイルの統合など、制御フローのまったく新しいアイデアは、拡張機能として効率的かつコンパクトに実装されます。
OOPシステムであるCLOSは、柔軟性の点で独自のクラスです。味覚を得た後、初歩的なC ++ / Java / C#OOPに戻ることは非常に困難です。GoF 5のデザインパターンは、簡単かつ直接表現できるため不要になります。
この言語には、多くの準拠する実装を含むANSI標準がありますが、単一の企業所有者も単一の確定的な実装もありませんでした。主要な新しい実装は10年ごとに行われ、古い実装はまだかなり活発です。専門家は、専門知識を今後長い間使用する計画を立てることができます。これはアナキスティックな摩擦とコミュニティの断片化を引き起こしますが、カーペットは引き出せず、企業やプロジェクトの政治的理由で言語がmo死にならないことも意味します。常に複数の商用およびオープンソースの実装に取り組んでいます。パフォーマンスに重点を置いたものは、非常に高速で多額の資金を必要とする命令型言語実装の2倍の要素の中で定期的にベンチマークを行います。
初期のLisp商品化のアキレス腱は、言語の型安全機能とそこに含まれる高度なソフトウェア開発環境の両方に対応するメモリフットプリントであり、グラフィックを含む完全なオンラインドキュメントなどの素晴らしい機能を備えていました。64 MBのSymbolics Lispマシンは、8 MBのSunワークステーションに対してコスト的に実行可能ではありませんでした。今日、RAMの価格は下落しており、特に今日の主流のJava、C#、PHP言語が30年前に比べてわずかしか進歩していないことを考えると、Lisp言語に大きな関心が寄せられています。
現在、インテリジェントな開発者とのマインドシェアをめぐって、Python、Lua、Erlang、Haskell、OCamlなどの最新の言語がLispと競合しています。しかし、成熟度、適応性、複数の標準に準拠した実装、速度の同じ組み合わせを提供するものはありません。