なぜそんなに多くのプログラミング言語があるのですか?


130

私はC / C ++にかなり堪能であり、さまざまなスクリプト言語(awk / sed / perl)を回避できます。pythonを使用し始めたのは、C ++の気の利いた側面の一部とawk / sed / perlのスクリプト機能を組み合わせたためです。

しかし、なぜそんなに多くの異なるプログラミング言語があるのでしょうか?これらのすべての言語で同じことができると思うので、なぜ1つの言語に固執してそれをコンピューターのプログラミングに使用しないのですか?特に、コンピュータープログラマーとして関数型言語を知っておくべき理由はありますか?

関連する読み物:


2
オブジェクト指向と非オブジェクト指向にも違いがあります。さらに、いくつかの言語には、R、Maple、Matlab、Mathematicaなどの素晴らしいパッケージが付属しています。これらは他の言語にはないことが多いです。
アルテムKaznatcheev


4
プログラマーの質問はすでにprogrammers.stackexchange.com/q/7551/45322
alain.janinm

2
あなたが変更可能なオブジェクトを持っている場合は、並列アルゴリズムを実装するために、関数型プログラミングは、一般的に、優れている(あなたがに対処したい場合、それは他に、オブジェクト指向のパラダイムを使用することをお勧めします不変オブジェクト)それは機能モデルに変更し、より良いです。このシナリオは、並列処理に広く存在します。また、流interfaceなインターフェイスやメソッドチェーンなどの優れたオブジェクト指向パターンの一部は、機能的なパラダイムのように機能しています。

4
なぜそんなに車が多いのですか?なぜそんなに飛行機が多いのですか?そして、ボートはどうでしょう!つまり、本当に!あなたは海に降りると、すべての種類のくすんだものがあります!これらすべての異なる種類のことのポイントは何ですか?!?!?非効率です!もったいない!そして、それらすべての異なる選択肢の異常なは何ですか?!?!?ジーズ-賢明な人々!ユーゴー、F-150、オーシャンライナー以外に、誰も必要としないでしょう!ああ、そう、飛行機-MD-80はほぼすべての場合にうまく機能します。そこ。今ということだすべての決着... :-)
ボブ・ジャービス

回答:


116

プログラミング言語は進化し、時間とともに改善されます(革新)。

人々は異なる言語のアイデアを取り入れ、それらを新しい言語に結合します。改善された機能(継承メカニズム、型システム)、追加された機能(ガベージコレクション、例外処理)、削除された機能(gotoステートメント、低レベルポインター操作)。

プログラマーは、どの言語構成体でもサポートされていない特定の方法で言語を使用し始めます。言語設計者は、そのような使用パターンを特定し、そのような使用パターンをサポートする新しい抽象化/言語構成を導入します。アセンブリ言語の手順はありませんでした。Cにはクラスはありません。(初期の)C ++には例外処理はありません。初期の言語で新しいモジュールをロードする安全な方法はありません(Javaで簡単)。組み込みスレッドはありません(Javaでは簡単です)。

研究者は、計算を表現する別の方法について考えます。これにより、Lispと言語ツリーの機能言語ブランチ、Prologと論理プログラミングブランチ、Erlangとその他の俳優ベースのプログラミングモデルなどが生まれました。

時間の経過とともに、言語設計者/研究者はこれらすべての構成要素、およびそれらがどのように相互作用するかをよりよく理解し、多くの人気のある構成要素を含むように言語を設計します。これにより、オブジェクトとクラス(単一または多重継承の代わりに特性を使用して表現される)、関数型プログラミング機能、クラスシステムとパターンマッチングにうまく統合された代数データ型、およびアクターベースの並行性を備えたScalaなどの素晴らしい言語が実現します。

静的型システムを信じる研究者は表現力の向上に努めており、Javaの型付きジェネリッククラス(およびHaskellのすべてのすばらしいもの)などを許可するため、プログラマーはプログラムを実行する前に、物事が実行されないことをより保証しますうまくいかない。静的型システムは、多くの場合プログラマーに大きな負担を課します(型の入力)。そのため、その負担を軽減するための研究が行われています。HaskellやMLなどの言語を使用すると、プログラマーはすべての型注釈を省略できます(トリッキーな操作を行っている場合を除く)。Scalaを使用すると、プログラマはメソッド本体内の型を省略して、プログラマの仕事を簡素化できます。コンパイラーは、欠落しているすべてのタイプを推測し、起こりうるエラーをプログラマーに通知します。

最後に、一部の言語は特定のドメインをサポートするように設計されています。例には、SQL、R、Makefile、Graphviz入力言語、Mathmatica、LaTeXが含まれます。これらの言語の機能を汎用言語に(直接)統合することは非常に面倒です。これらの言語は、特定のドメインに固有の抽象化に基づいています。

プログラミング言語の設計に進化がなければ、私たちはすべてアセンブリ言語またはC ++を使用していました。

関数型プログラミング言語を知っている:関数型言語は、多くの場合、より簡潔に他のプログラミング言語を使用するよりも、あなたは違った計算を表現することができます。C ++とPythonの違いを考慮し、4を掛けます。さらに深刻なことに、別の回答で既に述べたように、関数型プログラミングは問題についての異なる考え方を提供します。これは、他のすべてのパラダイムに適用されます。いくつかの問題により適しているものとそうでないものがあります。これがマルチパラダイム言語の人気が高まっている理由です:必要に応じて、言語を変更せずに別のパラダイムの構造を使用できます。さらに難しいのは、1つのソフトウェア内でパラダイムを混在させることができることです。


1
完全に同意します。私は、マルチパラダイム言語(Scalaなど)が2、3年後にどこに来るのか興味があります。DSLの統合が容易であれば、実際に言語番号が徐々に減少する可能性があります。
ラファエル

2
非常に詳細な答え!ほとんどのプログラミング言語はチューリングと同等である可能性がありますが、それがサポートする抽象化がすべての問題領域に適しているという意味ではありません。
Cyber​​Fonic

アセンブリとC ++を同じボックスに入れると、胸が痛くなります。C ++が大きく進化しました!! 特にC ++ 11以降。
Peregring-lk

66

tldr:特効薬の言語はありません。

彼らが私を訴えないことを願っていますが、ここにスタンフォードのプレゼンテーションの1つからの写真があります。

ここに画像の説明を入力してください

言語を選択する場合、これらの3つの機能のうち2つだけを選択できます

そして、それが人々が悲しいので、3つすべてをカバーするスーパー言語を発明したい理由です。

実際、要件の膨大なリストがありますが(一部は他の回答で見ることができます)、コア機能に詳細を追加するだけです。さらに、ある言語を別の言語よりも好むという歴史的および政治的な理由があります。

このような要因の組み合わせにより、新しい言語が生まれます。

そして、私はすべての優秀なプログラマーが独自の新しい言語を作成すべきだと聞いたことがあります;)


11
時間が経つにつれて、コーナーが互いに近づいているという意味で、三角形は縮小しています。
デイブクラーク

1
パフォーマンスと一般性を比較することはできますが、言語の経験は特定の言語自体よりも生産性が高いことを付け加えます。「言語の生産性」だけを比較するのは公平ではありません。それらすべて、非常にありそうもない仮説。
Hernan_eche

これは興味深い声明であり、CAPの定理を思い出させます。これは単なる非公式の議論ですか、それとも三角形を証明できますか?
evnu

1
@evnu、ここに1つの部分の準形式的な議論があります:一般性とは、言語Lの任意の長さnの有効なプログラムがより大きな問題空間をカバーすることを意味し、問題の各部分空間は長さnのプログラムの一部のみでカバーされます。特定のサブスペース外の長さnのプログラムが代わりにサブスペース内にある場合、問題を解決する短いプログラムを見つける可能性が高くなります(したがって、生産性が向上するでしょう)が、言語は一般的ではありません。 -それは他の部分空間の問題をあまりよく解決しません(つまり、長いプログラムで)。
ジョナスケルカー

これは、少なくとも2つのプログラミング言語と多数のドメイン固有言語が必要であり、三角形の3辺すべてをカバーするという良い議論です。私たちにはそれ以上の、非常に多くの多くがあります。(そして、三角形の頂点にcを配置しましたが、それはかなり小さな問題です。)
ピーター

25

ワープロ、車、家のデザイン、飲料、キャンディ、ペン、シャベルなど、さまざまなバリエーションのあるもので世界はいっぱいです。私たちがたくさんある理由は、いくつかの原則に要約することができます。

  • 誰かが既存の製品を改善できると考えている
  • 現地の考慮事項によって異なる設計が必要になります(たとえば、高床式の家とコンクリートスラブの家)
  • 新しいカテゴリの製品は、以前は存在しなかったニーズを満たします

オフィス用品店に行って、「筆記具」セクションを見てください。何百種類ものペンがあります。それらはすべてほぼ同じことを行います:インクを筆記面に届けます。しかし、上記の3つの理由の1つが理由で、販売用に表示される各ペンがあります。

  • カートリッジ式万年筆は、ディップ式万年筆の改良版であり、それ自体が羽根ペンの改良版です。
  • NASAは重力がなくても書くことができるペンを必要としていたので、加圧ローラーボールペンが発明されました。
  • 最初のペン自体は、タールまたは血液に浸した先の尖った棒であった可能性があります。それ以前は、人々は岩をかき集めたり、毛のある壁に色素を塗りつけていました。(推測だけです。)

すべてのユーザーのニーズに合う製品はないため、ペンの進化は続きます。安価で使い捨てのペンもあれば、高価で高品質の素材で作られたペンもあります。ゲルを使用するもの、インクを使用するもの、顔料を使用するものがあります。ツイストオフキャップがあるものもあれば、まったくキャップがないものもあります。広い樽、狭い樽、丸い樽、四角い樽; ロングショート; 赤、白、黒、青。等など

しかし、ペンについては十分です。

現在の無数のプログラミング言語は、1940年代の初期のコンピューターの数値マシンコードである最初の言語にまでさかのぼることができます。原始的で、使いにくく、コンピュータに入るのは面倒ですが、彼らは仕事をしました。プログラマーがニーモニックワード(ADD、CALL、LOADなど)をマシンコードに割り当ててから、「アセンブリ言語」と呼ばれる言語のクラスが誕生しました。

基になるマシンの特定の機能に応じて、さまざまなニーモニックコードを必要とするさまざまなプロセッサアーキテクチャ。これらの違いを考慮することは、異なるアセンブリ言語を考案することを意味しました。

(たぶん、あなたはこれがどこに向かっているのか見ることができます...)

プログラマーは、アセンブリ言語プログラムを見て、パターンを見ました。ループ、条件、変数の割り当て、関数呼び出しなどを形成するために、同じ命令シーケンスが使用されます。したがって、手続き型プログラミング言語が生まれました。これらの言語は、「if」、「while」、「let」などの包括的な用語の下で命令のグループをカプセル化しました。

コンピュータープログラミングの数学的分析から、関数型言語が登場しました。これは、まったく新しい計算の見方です。良くも悪くもなく、ただ違います。

そして、オブジェクト指向、静的型付け、動的型付け、遅延バインディング、早期バインディング、低メモリ使用量、高メモリ使用量、並列化可能、特定用途向けの言語などがあります。

最終的に、異なるプログラミング言語が必要なため、異なるプログラミング言語があります。すべての言語設計者は、「夢」の言語がどのように見え、動作するかについて独自のアイデアを持っています。多様性は良いことです。


ここに挙げた説得力のある理由は、人々が何らかの理由で望んでいること以外に複数の言語が必要な理由とは思えません。
ラファエル

それだけです。プログラマーは本質的に問題解決者です。問題を解決するには、多くの場合プログラミング言語の形をとるツールが必要です。ツールを使用しても問題を解決できない場合は、新しいツールを開発します。このように考えてください。ツールはソフトウェアであり、新しいソフトウェアは新しい問題を解決するために書かれているため、ツール自体が解決すべき問題になる可能性があります。これらの問題は、新しいツールを作成することで解決されます。
バリーブラウン

ほんの一言:言語の機能分岐は、最初のコンピューターの約50年前に考えられ始めた、今日の「コンピューティング」と呼ばれるものを表現する方法についての数学者のアイデアのショットです。LISP(なんらかの形で)が今でも2番目に古い言語であり、最初の言語がFORTRANであることは何の理由もありません。
フォンブランド

20

関数型プログラミング言語は、通常、異なる計算モデル(ただし、同等の計算)ラムダ計算に基づいています。LISP、Scheme(広く知られているコンピュータープログラムの構造と解釈で使用される本/コースで使用される)、Haskell、ML、F#などの静的に型付けされた言語など、型付けされていない(Pythonに似た型付けを持つ)言語がいくつかあります。

SICPは関数型プログラミングに私を導いたものですが、他の人たちはJohn Hughesによるこの論文と彼とのこのインタビューを推奨しています。

関数型プログラミングは現在、Microsoftによってプッシュされています。たとえば、VS2010および11にF#(.NETの関数型言語)が含まれています。また、MSR、IIRCでHaskell開発者を採用しています。

パターン一致と書き換えに基づくRefalなど、ラムダ計算以外の関数型プログラミング言語もいくつかあることに注意してください。

関数型言語の抽象化のレベルは異なるため、関数型プログラミング手法を使用すると、問題を解決する態度が変わります。一般的にはあなたがより良いプログラマになることができると言う人もいます。


1
別の興味深いクラスの言語は、Prologなどの論理プログラミング言語です。DataLogの使用経験は非常に限られていたので、他の誰かがそれらについての回答を書くことができますか?
ダニエル

2
プログラミングのパラダイムごとに、命令型、オブジェクト指向、宣言型、関数型などのプログラミング言語が必要であることに同意します。しかし、これは、オブジェクト指向言語が非常に多い理由を説明していません。

@Dai、まあ、私たちは本当に?理論的基礎だけが言語の特徴ではありません。たとえば、JavaまたはC#の主要な機能は(C ++と比較して)仮想マシンであると言うかもしれません。
ダニエル

しかし、C#とJavaの両方が仮想マシンの概念を使用している場合、なぜ両方の言語に同一の構文を使用しないのでしょうか?すべてのデザイナーは、自分の言語がどのように見えるかについて強力なアイデアを持ち、独自の標準を作成する傾向があると思います。
ダイ

@Dai、結局のところ、C#とJavaの間には小さな違いがたくさんあります。さらに、Windows用のJava VMまたはそのようなものに関して、いくつかの法的論争があったと思います。
ダニエル

19

特に、コンピュータープログラマーとして関数型言語を知っておくべき理由はありますか?

はい。haskellが私の考え方を変えたからです。あなたの考え方も変わるかもしれません。

ストーリー:私は学ぶことができることを考えるために使用される任意の日にプログラミング言語を。ある日、私はHaskellを始めました。私は半日でモナドの前に来るすべてを終えました。今ではその日から1年が経ちましたが、私はまだモナドで絶望的に立ち往生しています。

読む:

  1. 言語と思考ウィキ

  2. Kenneth E. Iversion、チューリング賞講演による思考のツールとしての表記法

しかし、なぜそんなに多くの異なるプログラミング言語があるのでしょうか?

表記法は思考のためのツールです。さまざまな考えを快適に処理するために、さまざまなテーラーメイドの表記法が必要です。そこで、新しい言語を作成します。

また、読んでください。;-)


5
再帰するのは神です!
プラティックデオガレ

4
反復するのは人間ですか?
-Suresh

1
それがHaskellにとって良い広告であったかどうかはわかりません。;)
バリーブラウン

@Pratik Deoghare。Haskellを1日で学ぶことは、おそらく良い考えではありません。BirdやWadlerなどの関数型プログラミングに関する優れた教科書を読んで、時間をかけてやってください。その場合、モナドはそれほど難しくないかもしれません。
ウダイレディ

「モナドの前に来るすべてを半日で終えた。」本当に?タイプクラス、ファンクター、ADT、種類などを半日で学びましたか?それ無理。完全な定義は、第14章にある- LYAHはRWHは、第6章まで何もモナドを持っていない、と彼らは非常に徐々に導入されている14のうち第12章でモナドを持っている
sdcvvc

13

ある時点で、使用している言語の制約にイライラせず、かゆみをかくことにしたプログラマーはほとんどいません。したがって、新しい言語、または既存の言語の方言が生まれます。

「オブジェクトの理論」のAbadiとCardelliは、オブジェクト指向の基盤からプログラミング言語のファミリー全体を開発しています。彼らは、関数型プログラミングがオブジェクト指向の特殊なケースであることを証明していますが、その逆ではありません。

新しいものを発明することは楽しいです。だからこそ、人々は既存の言語をより良くすることに貢献するよりも、さらに別の言語を作成する可能性が高いのです。もちろん、ビジョンの変更を歓迎しない言語のカストディアンもいます。最も良い例は、Common LispとSchemeサポーターの間の溝です。


3
オブジェクトの理論は、使用可能なプログラミング言語のファミリー全体を提示するものではありません。これは、オブジェクト指向プログラミング言語の基礎となるものであり、クラスに基づいていないという点で奇妙なものです。「オブジェクトの理論」と関数型プログラミングの関係はわかりません。オブジェクト計算には、たとえば、怠notの概念はありません。たとえば、90年代後半のPierceの研究など、機能とレコードの観点からOOの概念をエンコードする研究もあります。
デイブクラーク

12

他の人がすでにこの質問に対して良い答えを出しているので、アラン・ペルリスを引用します。

チューリングタールピットに注意してください。すべてが可能ですが、興味のあるものは簡単ではありません。

また、 http://weblog.raganwald.com/2004/10/beware-of-turing-tar-pit.htmlは、よく読んでください。


11

なぜ世界にこんなに多くの国があるのですか?5つか6つの超大国、あるいは1つの地球の万国さえあれば、もっと簡単になりませんか?なぜそれが良くないのかを議論するのは簡単です-始めに、競争は異なる国が進歩につながる可能性があり、民主主義、人権などの観点から、多くの国が1つより良いかもしれません- -しかし、これは私たちが多くの国を持っている理由を説明していません。多くの国がより良い理由を説明するだけです

同様に、なぜそんなに多くの異なる人間の言語が必要なのでしょうか?ポーランド語、アラビア語、北京語... 1つの言語しかなかったらもっと簡単になりませんか?あなたはどちらの方法でも議論することができますが、それらは、人生がどちらかの方法であった方が良い理由の理由になるでしょう。それは、非常に多くの異なる人間の言語がある背後にある原因を説明しません。

大事なことは、地球上にたくさんの人がいて、私たち全員が自分たちのことをやっている、私たち全員が意見を持っている、私たち全員が責任を持ちたい、そして自分の国またはプログラミング言語を持っている、そして私たちはよく知っているとしばしば思う他の人よりも、または少なくとも他の人が提供しなければならないものを理解することを気にしないでください。

この非常に啓発的なブログ記事、なぜ多くのPython Webフレームワークを読むのですか?どうやら、Python には約50の Webフレームワークがあります。これはばかげています。そのための合理的な合理的な理由は絶対にありません。しかし、投稿の著者は答えています。PythonWebフレームワークは非常に簡単に作成できるため、非常に多くあります。python Webフレームワークやプログラミング言語が増えている合理的な理由は必要ありません。人々は、すでに利用可能なものがわからないため、またはお金を稼ぐことを望んでいるため、または単に新しいものを作成することが楽しいために、新しいものを作成し続けます!

個人的な例を説明しましょう。約10年前、フィンランドの会社のためにC ++コードを書いていました。フィンランドには、長距離を移動し、ある場所から別の場所に多くのものを運ぶ巨大なトラックがあります。確かに、アメリカにもそのようなトラックがあります。そのため、一般的な問題は、24本程度のタイヤがすべて正常であることを確認することです。もちろん、実績のあるテクノロジーがあります。圧力と温度を監視でき、劇的な変化は何かがうまくいかなかったことを示します。もちろん、この技術はすべて独自の技術であり、特許を取得しています。(覚えておいてください:特許はイノベーションを促進することになっています!)このフィンランドの会社は...音でタイヤの状態を検出したかったのです。アイデアは、すべてのタイヤから来る音を聞くためにマイクを取り付け、それらの音に何らかの信号処理の魔法をかけて、タイヤのいずれかに何らかの問題があるかどうかを確認し、プロトタイプを作成することでしたこの狂気の。(サンプルサウンドを録音するための専用のラボさえありました.5トンまたは10トンの圧力にさらされ、ばかげた温度に加熱された後にサンプルタイヤを爆発させた特定の機会の印象的なビデオレコードを私に送ったら。)明らかに、繰り返しますが、この開発には特定の合理的な理由はありませんでした。そのため、誰かが新しいプログラミング言語の開発を開始する理由については、非常に多くの理由があることも理解してください。それらすべてを学ぶ必要はないし、可能性すらありません。(サンプルサウンドを録音するための専用のラボさえありました.5トンまたは10トンの圧力にさらされ、ばかげた温度に加熱された後にサンプルタイヤを爆発させた特定の機会の印象的なビデオレコードを私に送ったら。)明らかに、繰り返しますが、この開発には特定の合理的な理由はありませんでした。そのため、誰かが新しいプログラミング言語の開発を開始する理由については、非常に多くの理由があることも理解してください。それらすべてを学ぶ必要はないし、可能性すらありません。(サンプルサウンドを録音するための専用のラボさえありました.5トンまたは10トンの圧力にさらされ、ばかげた温度に加熱された後にサンプルタイヤを爆発させた特定の機会の印象的なビデオレコードを私に送ったら。)明らかに、繰り返しますが、この開発には特定の合理的な理由はありませんでした。そのため、誰かが新しいプログラミング言語の開発を開始する理由については、非常に多くの理由があることも理解してください。それらすべてを学ぶ必要はないし、可能性すらありません。サンプルタイヤを5トンまたは10トンの圧力にさらし、あるばかげた温度に加熱した後、サンプルタイヤを爆発させた特定の機会の印象的なビデオレコードを私に送ったら、明らかに、再び、特定の合理性はなかったこの開発の理由は、それが楽しいことと、一部の人々がお金を稼ぐことを望んだことを除いて。だから、誰かが新しいプログラミング言語の開発を開始する理由については非常に多くの理由があることも理解してください。それらすべてを学ぶ必要はないし、可能性すらありません。サンプルタイヤを5トンまたは10トンの圧力にさらし、あるばかげた温度に加熱した後、サンプルタイヤを爆発させた特定の機会の印象的なビデオレコードを私に送ったら、明らかに、再び、特定の合理性はなかったこの開発の理由は、それが面白く、一部の人々がお金を稼ぐことを望んだことを除いて。そのため、誰かが新しいプログラミング言語の開発を開始する理由については、非常に多くの理由があることも理解してください。それらすべてを学ぶ必要はないし、可能性すらありません。

もちろん、これはすべて、進化を信じている場合にのみ当てはまります。何らかの形のインテリジェントデザイン、つまり神がすべてのプログラミング言語を作成したと信じている場合、この多数の背後にある目的を見つける必要があります。おそらく神は、ソフトウェア開発の芸術が最高の状態に到達するために、異なるプログラミング言語間の競争を促進したかったのでしょう。

結論として、多くの人々、多くの国、多くのプログラミング言語があります。これはまさに人生の性質です!それに感謝しましょう。これは、プログラミング/コンピューターサイエンスの分野が非常に活発で繁栄していることを意味しています。


非常に完璧な答え、なぜ受け入れられなかったのか分かりません!
Am_I_Helpful 14年

8

なぜ多くの異なるプログラミング言語があるのですか?

行うべき選択があるため:

  • 仕様のモード:命令型と機能型
  • 入力:静的に型付けされたものと動的に型付けされたもの
  • 評価の順序:値による呼び出しと名前による呼び出し
  • モジュール性:クラスベースと抽象データタイプベース
  • 実行モデル:シーケンシャルvsコンカレント

幸いなことに、最後の2つは重要ではない二分法です。つまり、両方の選択肢を1つのプログラミング言語に入れることができます。しかし、最初の3つの二分法は8つの組み合わせをもたらします。したがって、理想的な世界であっても、少なくとも8つのプログラミング言語が存在します。ドリルダウンすると、特定のパラダイム内でさらに微妙なデザインの選択肢があります。たとえば、クラスベースの静的型付け言語を実行することに決めた場合、型システムを設計するさまざまな方法があります。それを行う標準的な方法はまだありません。並行プログラミング言語を使用する場合、並行性を表すさまざまな方法があります。セマフォ、条件付きの重要な領域、モニター、メッセージの受け渡し(同期と非同期)。同期メッセージパッシング内で、

プログラミング言語理論で行う研究の一部は、これらの二分法を解決することに専念しています。たとえば、「割り当て言語への割り当て」と呼ばれる論文で命令型プログラミングと関数型プログラミングの二分法の解決に取り組みましたが、Haskellがこの方法を採用し、関数型言語と命令型言語の両方になりました。それは二分法が完全に解決されることを意味しません。Haskellプログラマーは、問題を機能的に解決するか、命令的に解決するかの選択に依然として直面しています。Luca Cardelliは、静的タイピングと動的タイピングの二分法の解決に取り組みました。ポール・レビーは、値による呼び出しと名前による呼び出しの二分法の解決に取り組みました。これらの結果のすべてが実際のプログラミング言語でまだ実装されているわけではありません。


これらのすべての言語で同じことができるのであれば、なぜ1つの言語に固執し、それをコンピューターのプログラミングに使用しないのですか?

現実のプログラマーにとっては、何かをするだけでは不十分だからです。それがどのように行われるかも重要です。適切に実行されると、問題の領域がプログラムに忠実に表され、問題のモジュール性が保持され、プログラムの理解、変更、および保守が容易になります。これらはすべて、プログラムの開発と保守のコストに影響します。また、ソフトウェアの信頼性とセキュリティにも影響します。

たとえば、多くの人が金融口座に「Quicken」と呼ばれるプログラムを使用しています。元のプログラムはVisual Basicの社内バージョンで開発されたもので、非常に優れていました。しかし、それを拡張して維持することは困難でした。同社が長年にわたって新しい機能向けに拡張しようとしていたため、プログラムはどこでも何百万人もの不満のある顧客を抱えてますますバグが多くなりました。彼らはおそらく、強く型付けされたオブジェクト指向プログラミング言語でソフトウェアを再設計することから恩恵を受けるでしょう。


特に、コンピュータープログラマーとして関数型言語を知っておくべき理由はありますか?

歴史的に、「関数型プログラミング」は標準的な数学的実践に従ってGodel、Kleene、Churchによって発明され、「命令型プログラミング」は機械計算の概念を突き止めるためにTuringによって発明されました。チューリングの前に、数学が命令型プログラミングのアイデアを分析したという証拠はありません。(従来の数学アルゴリズムはすべて「命令型」で表現されていましたが、その本質的な内容は依然として機能的でした。)したがって、命令型プログラミングは人間文明にとって非常に新しく、その数学はまだあまり理解されていません。誰もが関数型プログラミングを知っておくべき第1の理由は、プログラミングがどのように数学的になるかを理解するためです。(命令型プログラミングが非数学的であることを認めていませんが、これは、機能プログラマーがあなたに信じさせるものです。しかし、現在の最新技術では、命令型プログラミングを数学的に行う方法がまだわからないことに同意します。私たちの多くは、まさにその問題に取り組んでいます。)


1

進化とみなすかもしれません。

当初、コンピューターは純粋にバイナリコードでプログラムされていました。その後、使用されるCPUに大きく依存するニーモニックとアセンブリ言語が導入されました。

その上位レベル(第3レベル)言語(Pascal、C、ADA、Cobol)が導入された後、非常に汎用的な(Cなど)、データ処理に適した(Cobol)、計算に適した(Fortran)ものがあります。

その後、ロジック言語(Prologなど)のように、第4レベルの言語が登場しました。最も一般的な言語は、第3レベル言語の後継です。それらのいくつかはJava、C#です。

また、ASP.NET、PHPなど、インターネット/ Webに固有の言語もあります。

また、特定のドメイン(DSL)の言語は、ほとんどが汎用言語と連動します。

次に、子供たちがロゴのようなプログラミングを学ぶための言語があります。

Python、Rubyなどのコードを高速に記述するための言語、XML(XSLT)を処理するための言語。

そして、私はおそらく多くの言語、さらには言語のカテゴリーさえ忘れてしまったでしょう。


1
あなたの年表は混乱しています。プロローグは、Ada(1983)よりも若い1972年のものです。「第3レベル言語の後継者」とはどういう意味かわかりません。CやPascal(Adaが生まれた)など、Fortranの子孫ではない言語はほとんどありません。
-prosfilaes

1
@prosfilaes、混乱。FORTRANはまだ使用されている最初の言語であり、LISP、COBOLの順に登場しました。Algolは、マシン使用ではなく、公開アルゴリズム用に定義されました(ただし、ある種のコンパイラはとにかくなりました)、ofshots PascalおよびC
フォンブランド

1

他の答えは良いです、いくつかの新しい角度を追加します。DCの書き込み言語は、実際の人間の言語のように進化します!そして、彼らは再び本物の人間の言語のようにお互いから概念と構文を借ります。言い換えれば、コンピューター言語の語源に関するかなり現実的な研究もあります。

これはまた、1930年代前後にラムダ計算で主に始まった長い歴史タイムラインがあったことを意味します

理論とプログラミング言語のアプリケーションの間には、強力な相互作用/相乗効果/共生があります。新しい理論につながる新しいアプリケーションが発明され、その逆も同様です。プログラミング言語は多くの意味で理論とアプリケーションの橋渡しです

歴史から興味深いケーススタディはFortranです。よく知られていませんが、Fortranの以前のバージョン(ほとんどがFortran77より前)には、あいまいな文法がありました。これは、複数の有効な「解釈」があったため、同じコマンドがコンパイラーによって合法的に「解釈」/コンパイルされる可能があることを意味します(これは「解釈」言語の技術的意味とは異なります)。

そのため、正式な文法に関する理論は、Fortranが発明された頃に開発され、言語の曖昧さの問題が発見されたときの小さな危機でした。Fortan構文は、この曖昧さを避けるために再定式化され、後の言語は、その設計における文法の曖昧さに対してより敏感になりました。OOPは、多くの既存の言語に「影響」または「波及」してそれらを変換するプログラミング言語の理論的概念/前進の非常に重要/最前の例でもあります。

他のケーススタディは、新しい技術の発明です。たとえば、リレーショナルデータベースの発明は、たとえばSQLおよびその言語へのコンピューター言語インターフェイス(たとえばjava、 "JDBC")を使用して、コンピューター言語に大きな影響を与えました。同様に、World Wide Webはさらに大きな影響を与えます。右周り時限言語の爆発があるように見えたドットコムブーム、主にWWWの初期の成長と一致と比較されることがあります進化の爆発

また、大規模の指数関数的に増加する処理能力と一緒に新しいプログラミング言語の上昇の長い傾向があるように思われるんムーアの法則一部が鈍化することができると思います。

プログラミング言語の現在の長期的な傾向は、たとえばMapReduceを使用したビッグデータ並列化に向かっているようです。閉鎖に対する現在の関心もあります。

言語の別の重要な側面は、それらが抽象化のレベルを増加させることです。下位レベルの抽象化に基づいて構築され、上位レベルの抽象化が作成されます(ピラミッドに似ています)。このように、コンピュータ言語の進化の進歩はおそらく無限であり、重要な新しいものが今後もずっと発明され続けると確信しています。これはおそらく、チャンクと呼ばれる心理学の同様の概念に類似しています。大まかに言うと、下位レベルの構成要素から上位レベルの精神的概念を構築します。

多くのコンピューター言語を学んだ人は、群れのメンタリティを観察できることを認めなければなりません。中核的なアイデア/変更の一部は残っていますが、(過剰な)誇大広告は消えています。この意味でプログラミング言語も流行に陥ります。私の意見では、最後の半年から実際に有用であるが誇張された2つのケース:

ますます多くの主要言語間で自己相似性が観察されるようになり、すべての言語が独自の方法で多くの同様の機能を実装する方向に収束する傾向があります。


多くの場合言語を横断し、言語で実装されるデザインパターンも参照してください。語学/機能のもう一つの重要な側面は、機能が実装されているライブラリ
vzn

FORTRANには正式な記述はなく、文法の曖昧さ(はい、私はPDQ FORTRANと呼ばれる憎しみの中でプログラミングを始めました。後でFORTRAN IV)の言語の(非常に恥ずかしい)曖昧さは、文法に明らかになったアルゴルは、文法で定義された最初の言語です。
フォンブランド

オリジナル/初期のFORTRANについて述べたが、後のバージョンはより厳密な文法定義でより形式化された。言語理論とともに言語の進化を示す事例研究。
vzn

FORTRANは文法を強制的に与えられましたが、文法を中心に設計されたことはありません。アルゴルはその傾向を開始し、それはパスカル、モジューラファミリー、オベロン、C、そしてそれはofstpring、PL / 1、Adaなどによって続けられました。文脈のない文法技術と構文解析の理解を考えると、今日では文法を定義し、それをエラーのないパーサーに翻訳することはほとんど些細なことです。
フォンブランド

補遺、新しい/新興言語のケーススタディ:Google gonode.js、Apple swift
vzn

-3

そうではなく、単なるマーケティングの仕掛けです。言語をちょっと「C」のように見せると、見かけ上の障壁が低くなります。

Cの影響がまったくないもの:SQL、Pascal、Delphi、FORTRAN、COBOL、Ada、PowerBuilder、HyperTalk、Lisp、Simula、FOCAL、BASIC、PL / I、Algol、Algol-68、SNOBOL、Modula、Visual BASIC、講師、ロゴ、Forth、DIBOL、Helix、AppleScript、Python、Erlang、Ruby、Pick、英語、RPG、PL / SQL、ASP、Prolog、SmallTalk、Perl、bash、Wand BASIC、REXX、DOSバッチ言語。

ちょっと見た目はCに似ていますが、共通点はほとんどありません:JavaScript、Java、C#、(ほぼ間違いなく)Objective-C。

それはすべてマーケティング、Java、C ++、およびJavaScriptのようなものです。


5
「彼らはそうではなかった」-何がそうではなかったのか?いずれにせよ、これがどのように質問に答えているのかわかりません。これは単に言語のリストであり、マーケティングは何らかの形で関与しているという完全に根拠のない主張です。
デビッドリチャービー16年

2
「Cの影響をまったく持たないもの:... Algol、Algol-68、...」-おかしいのは、CがAlgolから生じたということです。「言語をちょっと「C」のように見せると、見かけ上の障壁が低くなります」-iirc、これは間違っていることが証明されています。プログラミングに事前にさらされていない学生は、他の言語でより速く学習します(彼らはその研究でHaskellを使用したと思います)。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.