プログラミング言語は進化し、時間とともに改善されます(革新)。
人々は異なる言語のアイデアを取り入れ、それらを新しい言語に結合します。改善された機能(継承メカニズム、型システム)、追加された機能(ガベージコレクション、例外処理)、削除された機能(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つのソフトウェア内でパラダイムを混在させることができることです。