一部の言語コミュニティ(RubyやPythonなど)が断片化を防止できる一方で、他の言語コミュニティ(LispやMLなど)ができないのはどうしてですか?


67

「Lisp」(または「Lispライク」)という用語は、Common Lisp、Scheme、Arcなど、さまざまな言語の総称です。MLなど、他の言語コミュニティにも同様の断片化があります。

ただし、RubyとPythonはどちらも、言語自体に変更を加えるのではなく、実装(PyPyやYARVなど)でイノベーションが発生したこの運命を回避することに成功しています。

RubyとPythonのコミュニティは、言語の断片化を防ぐために特別なことをしましたか?


10
断片化は悪いことだと言います。
ソニア

21
@Sonia市場シェアの観点から、断片化は多くの場合災害です。
chrisaycock

5
言語は互いに競合していますか?
バリーブラウン

32
@Soniaそれは悪いことです。たとえば、Python用に作成されたライブラリはほぼ確実に実装に依存しませんが、Lisp用に作成されたライブラリはSchemeでは機能しない場合があります。
クリスハーパー

2
@バリー・ブラウン:素晴らしい点!言語は互いに市場競争をしてはいけません。しかし、言語ベンダーはそうであり、これはしばしば言語設計に影響を及ぼします(ただし、これはRuby、Python、Lisp、MLの場合ではないと思います)。
ジョルジオ

回答:


77

RubyとPythonの両方には、慈悲深い独裁者がいます。それらは、実用的な懸念に深く根ざした言語です。これらはおそらくフラグメンテーションを抑制する最も重要な要因です。一方、LispとMLは、理論的には、学界で考案された「委員会による設計」言語に似ています。

Lispは、もともとJohn McCarthyによってコンピュータープログラムの実用的な数学表記として設計されました。彼は実際のプログラミング言語として実装したことはありません。最初の実装はSteve Russellによって開発されましたが、彼は慈悲深い独裁者ではありませんでした。やがて、Lispのさまざまな実装が登場しました。Common Lispはそれらを標準化する試みでした。

Lispはより多くの言語の「ファミリー」です。MLも同様で、Lispへの同様の進化的パスをたどりました。


4
うーん、Objective-C(iOSアプリの場合)やAda(国防総省の契約の場合)のような同種の言語コミュニティでは、間違いなく独裁者の地位が見られます。これらのケースでは、より高いパワーがアドヒアランスを要求し、開発者はそれらのウェアーズを販売するためだけにそれに従いました。しかし、C#(.Netコンポーネント)でコーディングする必要があるのと同じ意味で、Python(趣味のプロジェクト)でコーディングする必要はありませんでした。すなわち、私は、例えばCよりもPythonから簡単に逃げることができます。それ使用するというこの脅威がなければ、または売り上げを上げることができません。しかし、それは別の質問かもしれません。
chrisaycock

1
「慈悲深い独裁者」とは、すべての言語の変更は、言語を純粋に保つというビジョンを持つ1人の人を介さなければならないことを意味します。実用的な理由で人々はPythonを使い続けます。彼らは言語が好きで、その中で生産的です。しかし、すべての人とその兄弟がフォークすることを許可されているわけではなく、それをPythonと呼んでいます。
ロバートハーベイ

4
ロバートが言及しているように、@ HenrikHansen Haskellは標準です。したがって、HUGSコンパイラーは両方とも「Haskell」と呼ばれるため、GHCと互換性がなければなりません。同じ標準ベースの保護がCおよびC ++に拡張されるため、GCCとVisual Studioには互換性が必要です(独自の拡張機能を使用しない場合)。好奇心は、すでに標準(Common Lisp)があり、他にも多くのLispがあるLispに起こったことです。MLには、標準MLと他のMLがある場合と同じ問題があります。
-chrisaycock

4
- 「Common Lispはそれを前から存在したLispの発散バリアント標準化するために開発された」en.wikipedia.org/wiki/Common_Lispを。言い換えれば、標準が開発される前にすでに断片化がありました。
ロバートハーベイ

3
MLやLispは、PythonやRubyのような言語ではないとさえ言えます。LispとMLは、いくつかの異なる言語で実装された「概念」に似ています。
ベンジャミン

29

考えられる要因の1つは、単に年齢です。LispとMLはPythonとRubyよりずっと古いです:

  • Lisp:1958

  • ML:1973

  • Python:1991

  • ルビー:1995

LispとMLは、明らかにハードウェア機能のより大きな変化、コンピューターサイエンスのより多くの傾向、および何かを研究するために非常に多くの博士課程の学生を見てきました。


7
おそらく、しかし、私はFortranがこの程度の分岐を持っていたことを思い出しません。(Fortran Dのようなものがありましたが、ほとんどのFortranは標準化されています。)おそらく、合体の時代が要因かもしれないと思います。
chrisaycock

2
おそらく、Fortranには多くの非互換性と非標準の拡張機能があり、標準委員会が徐々にそれを打ち出すまで、さまざまな実装がありました。おそらくLispやMLよりも普及していたからでしょう。
erjiang

@erjian:ビジネスの使用に対する深刻なインセンティブがあったため、FORTRANの非互換性が打ち出されました。主に学問で使用されるLISPには、これほど贅沢なものはありませんでした。すなわち、その使用がどれほど広まったかではなく、そのユーザーがどれだけ裕福だったかということです。
MSalters

2
あるいは、バリアントはFORTRANと呼ばれていません。BASICは、出てきたとき、単純化されたFORTRANのように見えました。
デビッドソーンリー

1
@MSalters Common Lispは、実際には(かなり成功したIMO)作業であり、ビジネスで使用することで特に口述されるさまざまなmaclisp方言の非互換性を打ち出しました(そしてDARPAは、資金を提供したすべての研究室がコードをより簡単に共有できるようにしたかった) 。現在、スキーム、clojure、およびCommon Lisp以外に、実用的な汎用のLispはありません。これら3つは十分に異なり、JavaとC ++よりも同じ言語の方言として数えないように、異なる文化と歴史を持つ非常に別々のコミュニティを持っています。
パベルペネフ

24

基本的にはすべて実装定義の言語です

既存のコードとほぼ互換性のある言語の新しい実装を作成するのが簡単な場合、ハッカーはハッカーであり、それを実行します。いずれかの時点で、誰もがLisp実装を作成します。MLコンパイラーは、言語設計の大学院生にとってほぼ必須です。言語は、結局のところ、よく文書化されています

一方、アドホック言語と実装定義言語があります。または、実行可能な代替実装を作成するための重要な障壁であるほど複雑な言語:

  • ルビー; perl; python-実行可能な代替物を生成するために実装定義が多すぎる
  • ghc haskellおよびerlang-明確に定義されていますが、ghc(またはerlang)と競合するものを実行するのは非常に難しく、人々は通常は気にしません

これは欠点のように見えます-実行可能な代替を作成するのが難しすぎる言語には大きな利点があります:開発者のリソースが乏しいため、真の実装に集中しています。


歴史的なメモとして、Haskellコミュニティのいくつかは、開発と開発の努力の統合と集中を積極的に追求しました。開発コミュニティの分裂は成功しないことを意味します。GHCが選ばれ、優勝しました。


2
「積極的に追求された合併と集中」についてもっと知りたいです。
サムトビンホッホシュタット

フラグメンテーションは自然です。PythonやRubyなどの言語は、使用されていないバリアント(ChinesePythonなど)や以前のバージョンで停滞しているバリアント(Jythonなど)をカウントしないと、メインで断片化されない変則性です。Nermerle、Groovy、Beanshell、Booなど、独裁者を含むほとんどの言語はあまり一般的ではないため、実際にはおそらく何千もの言語が存在するため、ここにも生存バイアスがあります。
ヴォルグヴァンガイア

1
それでも、HaskellはPython / Rubyの成熟ステータスに到達するためにより実用的です。Haskell's cabalは使用するのに楽しいツールではなく、簡単に破ることができます。Yesodでさえ認めています:yesodweb.com/blog/2012/04/cabal-meta PythonとRubyはパッケージ管理に関してはるかに優れています。
Ehteshチョードリー

1
@Shurane PythonとRubyは、統合前にパッケージのタイプチェックを行いません...
Don Stewart

2
-1:「ruby; perl; python-実行可能な代替を生成するためにすべて実装が定義されすぎている」Jython、IronPython、JRuby、IronRuby、PyPy、Stacklessは、実装に関して間違っていることを証明します(そしてこれらは単なる主要なものです)。また、CPythonはリファレンス実装ですが、言語定義ではあり
vartec

12

一つの要因は、プラットフォームを定義することです。Haskellの場合、プラットフォームはHaskellの標準であり、GHCです(想像できます)。Rubyの場合、Ruby開発プラットフォームを「定義」したのはRuby on Railsでした。Cの場合はUnixでした。

Lispと比較してください。Lispでは、言語がどのようなものであるかを定義する独自のキックプラットフォームはありませんでした。正しく思い出せば、各Lispマシンにはモデルとメーカーによってわずかな違いがありました。Common Lispは何らかの理由で定義されていませんでした。競争が激しく、別のプラットフォームに移行するのをためらっている可能性があります。

もちろん、これは私の側からの完全な推測です。この考えは、ハーベイの答えに対するコメントの回答から来ました。ただし、定義するプラットフォームにはさまざまな形があるように見えますが、一般的な特性は、それが人気を得ていることです。


私は実際にこのアイデアが好きです。Lispには「キラーフレームワーク」がないため、多くの形式のLispを使用できますが、Railsを使用する場合は、標準のRubyに固執する必要があります。確かにそれが唯一の答えではありませんが、私はあなたの仮説が好きです。
-chrisaycock

プラットフォームの部分に同意します。言語を実行できる翻訳者が1人いる場合は、断片化はあまりありません。
c69

人々は特定の事柄、例えば衛生的なマクロについて強い意見を持っていたため、Common Lispは早期に単一の定義に落ち着きませんでした。
ロバートハーヴェイ

私はこれに同意し、反対します。「キラーフレームワーク」はコア言語に貴重な機能をパッチし、成長を促進し、標準仕様外の迅速なイノベーションを可能にするため、私は同意します。フレームワークのメンテナーがあまり注意を怠ると、イノベーションの急速な増加が、膨大な膨張やリークを引き起こし、不安定になる可能性があるため、私は同意しません。
エヴァンプレイス

1
(続き)言語コア機能を理想的に拡張するjQueryのようなフレームワークは、これらのフレームワークによって与えられる最も価値のある貢献が標準化され、コアに組み込まれるため、将来消滅します。私見では、開発者は一般にコードベースが安定するにつれて依存関係を減らす/排除することを好むため、フレームワークは最も速く死ぬ傾向があります。言語開発者が関連性を維持したい場合、フレームワーク機能を適応および採用し、ユーザーにサードパーティのフレームワークへの依存を減らすことを奨励することにより、プロセスを簡単にします。
エヴァンプライス

7

言語の発展を促進する文化を評価することを忘れないでください

また、python / phpでの開発は積極的に公共で行われているという事実を重視します。誰でも誰でも自由に利用できる標準仕様を作成する個人のグループが1つあります。

W3CがHTML / CSS標準で行うように。あなたは言語が達成するために設計されているもののより詳細を制御する意欲的な個人の小さなグループを持っています。すべてが公開される前に、明確に定義された仕様に組み込まれます。

LISPのような言語は、言語の「最適な使用」に関する彼らの見方が正しいと真に信じている教授や他の個人によって、密室で分岐しています。一部の実装は特定の点で優れているため、それらは同時に正しいことと間違っていることがあります。どれも最高のものではありません。

多様性はイノベーションを生み出すため、必ずしも悪いことではありません。LISPのような言語は、理解の境界を押し広げるため、学習および研究に最適な言語です。

しかし、環境を革新に適したものにする性質は、安定性に必ずしも有益ではありません。逆に、環境を安定させるのに適した性質は、必ずしも創造性に適しているとは限りません。

開発がアクティブなコラボレーションに基づいている場合、個人がより大きな全体の利益のために譲歩を強いられることがあります。研究には不向き/一貫性には良い。


事実、私たちはプログラミング言語開発の未開の地に住んでいます。「理想的な言語」を設計する問題は非常に大きいので、記念碑的な努力にもかかわらず、誰もそれを解決することに近づいていません。

研究/学界では、まだ改善と革新の余地がたくさんあります。商業部門では、実際のアプリケーションで使用されるソフトウェアの指数関数的な成長があり、原動力は単純さと一貫性です。

前者に特化した言語もあれば、後者に特化した言語もあります。両方に特化しようとするものは、通常あまりうまくいかず、死に絶えます。

両方とも、私はVB / C#/ Javaのようなモノリシック言語に言及しています。言うのは時期尚早ですが、10年後にC#とPythonがどのように見えるかを見てみたいと思います。現在のペースでは、C#は機能と一貫性をかなり厳しく見せる速度で成長しています。優れたドキュメントであっても、言語に含まれるすべての微妙な詳細や癖を覚えるのは非常に苦痛です。単一の開発者にとっては素晴らしいことですが、独自のスタイルを持つ開発者を投入するとすぐに、コードベースの一貫性が失われ、品質が低下し、誰も勝ちません。Perlが実稼働環境で提示する困難から学ぶべきことがたくさんあると思います。


はしご?後者のことですか?
ジョルジオ

@Giorgioはい、スペルを間違えたら嫌いです。
エヴァンプライス

2

PythonやRubyのような言語は断片化されていないと言うのは正しくないと思います。すでに断片化の影響が見られ始めています。たとえば、Python 3はPython 2と完全に後方互換性があるわけではないため、両方のバージョンを維持する必要があり、既存のコードの多くはPython 2でのみ機能します。PyPyを含むPythonスピンオフもあります。

別の要因は、言語の年齢です。フラグメンテーションに最もさらされているのは古い言語であるため、進化と改訂の圧力を受けます。Lispは数十年前に発明されたので、そのアイデアのいくつかを取り入れて新しい言語に組み込む十分な時間がありました。Cは、断片化された言語の別の例です。Cには言語自体に1つの本当に大きなリビジョン(K&RからANSI)しかありませんでしたが、C ++、Not Quite C、およびCのような構文を共有する他のすべてを含む多数のスピンオフがありました。

Ruby自体は、以前の言語の「断片化」です(もしそうなら)。C、Smalltalk、Perl(など)のアイデアが組み込まれているため、現在は断片化を行う言語です。将来、Rubyと他の言語とのさらなるコンボリューションが見られない理由はわかりません。


6
-1:(1)Python 3.xは断片化ではありません。これは、言語の進化における次のステップにすぎません。Python 2.xは数年後に完全に削除れます。(2)99%の互換性があり(1%が実装の詳細であり、ほとんどが不明瞭)、言語の定義に参加することを積極的に拒否する他の言語実装は、断片化ではありません。(3)いくつかの共通点を共有し、ある程度互換性のある(C ++からCへ)非常に異なる言語は、ほとんど断片化されません。(4)既存の言語からアイデアを受け入れることは断片化ではなく、言語を設計する唯一の方法です。

2
@delnan:Python 2.xは数年後に完全に削除されますか?COBOLとFortranがまだ存在しているとき、それは少し愚かなことです!
メイソンウィーラー

3
@MasonWheeler開発について話しています。VCSにはまだ古いコードがアーカイブされてお​​り、非公式のバイナリダウンロードは何十年も続く可能性があり、一部のショップは移植を避ける可能性があります。しかし、いつか遠くない日には、Pythonプログラミングの大部分がPython 3で行われることを期待しています。結局、2.xの機能開発はしばらく前に終了しました(そして、python-devを洗脳しない限り再開されません) 、バグ修正/セキュリティアップデートは永遠に続くことは想定されておらず、ライブラリの大部分はPython 3に移植されており、他のほとんどのライブラリはDjanoなどを楽しみにしているか、メンテナンスされていません。

1
@MasonWheelerああ、FortranとCOBOLに関しては、Fortranは2008年に新しい標準改訂版を取得し、COBOLは2002年にそれ以降、いくつかの技術レポートとともに取得しました。

@MasonWheeler最新のCOBOLでオブジェクト指向プログラミングが可能であることをご存知ですか?

2

Lispは非常に強力なモデルであり、かつてないほど驚くべき言語であるため、断片化されています。今日のほとんどの言語は、最初にLispで実装されたものを借用しているため、すべての言語はこの特定の断片化の一部であると言えます。たとえば、SmalltalkはLispから大きな影響を受け、RubyはSmalltalkから大きな影響を受けました。JavaScriptはJava変装のLispなどです。すべてが接続されており、すべての言語発明者がお気に入りの作品を他の言語から選択します。

もう1つの要因は、おそらくLispを実装するのが最も簡単なプログラミングコンセプトであることです。これが、Lispが何度も何度も実行される理由です。


1

Lispに似た言語は、基本的かつ理論的すぎて劇的に変更できません。文法的な変更(コマンドの名前を変更するだけではありません)は、それらの背後にある関数型プログラミング理論に適合しません。

しかし、Lispのような言語があるという事実は、とにかく「変更」がすでにLispに対して行われたことを示しています。言い換えれば、Lispまたはその背後にある理論に触発され、同様の新しい言語を作成した人々によって作られた言語があります。

Pythonに触発された言語もたくさんあります。例えば、ジュリア、CoffeeScriptなど、独自のホワイトスペースに敏感なオブジェクト指向言語のファミリーを形成します。

Pythonのような言語の基本的な基本は実際に変わることはないと思います。Pythonはオブジェクト指向であるため、C ++およびJavaと類似していますが、動的であるため、多くのスクリプト言語とも類似しています。

誰が実際に言語を気にしているのですか?大切なのは目的です:フランス語はラテン語に似ていますが、フランス語を理解している女の子はずっと暑いです;)

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