回答
言語をどのように分類するかによって異なります。基本的に、言語は2つのタイプに分類できます。命令型コンピュータにどのように指示する言語>タスクを実行するため、および宣言型コンピューターに何をするかを指示する言語。宣言型言語はさらに、機能的言語に分類できます。この言語では、プログラムは関数を構成することによって構築されます。 logic プログラミング言語。プログラムは一連の論理接続を介して構築されます。命令型言語は、レシピのように、問題を解決するためのステップのリストのように読みます。命令型言語には、C、C ++、およびJavaが含まれます。関数型言語にはHaskellが含まれます。論理プログラミング言語にはPrologが含まれます。
命令型言語は、次の2つのサブグループに分けられることがあります。手続き型 Cなどの言語、およびオブジェクト指向言語。ただし、オブジェクト指向の関数型言語(OCamlとScalaが例)があるため、オブジェクト指向言語はグループ化に少し直交しています。
次のように入力して言語をグループ化することもできます: static および dynamic 。静的に型付けされた言語は、プログラムを実行する前に(通常はコンパイル段階で)型付けがチェックされる(そして通常は強制される)言語です。動的型付け言語は、型チェックを実行時に延期します。 C、C ++、およびJavaは、静的に型指定された言語です。 Python、Ruby、JavaScript、Objective-Cは動的に型付けされた言語です。 untyped 言語もあります。これにはForthプログラミング言語が含まれます。
言語を次のようにグループ化することもできます。彼らのタイピング規律:弱い型変換、暗黙の型変換をサポート、および strong 型付け。これにより、暗黙的な型変換が禁止されます。 2つの間の線は少しぼやけています。いくつかの定義によれば、Cは弱い型の言語ですが、他の人は強い型の言語であると考えています。とにかく、規律を入力することは、言語をグループ化するための実際には便利な方法ではありません。
コメント
回答
これらが主なものですが、「他にも多くのパラダイムがあり、それらの間には多くの重複があります。
コメント
回答
回答
回答
には、実際、他のほとんどの人々の'分類が含まれています。 (もちろん、それは単語の意味がほとんどなく、肉がそのような細分化されていることを意味するだけです)
これに答えるにはさまざまな方法がありますが、それらは次のように分類できます。
機械語:機械語は低レベルのプログラミング言語です。コンピュータでは簡単に理解できますが、人には読みにくいです。これが、人々が高級プログラミング言語を使用する理由です。高水準言語で書かれたプログラムも、コンピューターが実行できるように、機械語にコンパイルおよび/または解釈されます。
アセンブリ言語:アセンブリ言語は機械語の表現です。つまり、各アセンブリ言語命令は機械語命令に変換されます。アセンブリ言語のステートメントは読み取り可能ですが、ステートメントはまだ低レベルです。アセンブリ言語の欠点は、各プラットフォームに特定のアセンブリ言語が付属しているため、移植性がないことです。
高級言語:高級言語は、今日ほとんどのプログラマーが使用しているものです。 C、C ++、Javaなどの言語はすべて高級言語です。高水準言語の利点は、非常に読みやすく、移植性があることです。高水準言語の欠点は、アセンブリ言語よりも強力ではないことです。高水準言語の単一のステートメントが多くの機械語ステートメントに翻訳されるためです。
高級言語はさらに次のように分類できます:
-
関数型言語:関数型言語では、プログラムは関数定義に分割されます。関数型言語は一種の宣言型言語です。それらは主に、定数を持つ型付きラムダ計算に基づいています。有名なFunction言語には、Scala、F#、Clojure、Lispなどがあります。
-
手続き型言語:手続き型言語では、プログラムは次のように記述されます。結果を生成するために従う必要のある一連の手順。 COBOL、FORTRAN、およびCは、いくつかの手続き型言語です。
-
オブジェクト指向プログラミング言語: OOP言語では、プログラムはデータを含むオブジェクトと、データを操作するメソッドに分割されます。 Java、C#、およびC ++はOOP言語です。
-
論理プログラミング言語:論理言語は、次のようなプログラムを作成するために使用されます。コンピュータが論理的に推論できるようにします。例:論理言語
詳細な調査については、以下を確認してください:
機能の観点から考える傾向があります:
構文:
Cベースまたはwhat-have-you。 JavaにはCベースの構文があります。 PythonやRubyのようなものを試して構文から頭を下げ、特定の言語がどのように機能するかについての基本的な観点からもっと考えることを強くお勧めします。私は、構文がCベースよりも大きくなる必要はなく、空白の周りのビルディングブロックに問題がないという意見です。
コンパイル済みと解釈w。ビルドプロセスとインタープリター/コンソール:
コンパイル時とランタイム環境の問題についてはほとんど詳しくありませんが、それはわかります。そこには「私がめったに考えない懸念の袋全体があります。
同様に、Javaのように仮想マシン内で実行するためのコンパイルっぽいプロセスのようなものをまだ持っているインタプリタ言語がたくさんあります。変更を確認するには、再構築する必要があります。
次に、ライブ環境のコンソールでコマンドごとにコマンドごとに実行できるJavaScriptとPythonがあります。3つすべてがコードの記述方法は大きく異なります。
動的入力と厳密な入力:
私はこの2つを設計上のトレードオフと見なす傾向があります。レベルがはるかに低く、パフォーマンスが重要な場合、静的型付けは非常に理にかなっています。「一方が他方よりも「安全」であるというこの概念を理解したことはありませんが、私は基本的に、タイピングシステムがどのように機能し、何を期待するかを学ぶだけの、非常に柔軟で動的な言語で登場しました。 JSでは、タイプのシェナニガンが私にとって心配になることはめったにありません。いくつかの点で、柔軟性によって物事がより堅牢になりますが、言語のポットホールのいくつかについて知らない場合は、確かに、よりジュニアレベルの開発者にとっては少し難解です。
ブロックレベルスコープvs.関数スコープvs.?:
ブロックレベルが最も一般的です(何でも)ほとんどのcベースの構文言語では{}の間)。JavaScriptスコープは関数を中心に構築されています(オブジェクトを効果的に構築するためにも使用されます)。内部スコープからのアクセスの種類にも大きな違いがあります。アウタースコープに。私は他のスコープスキームに精通していませんが、それらは存在すると確信しています。
クラシックOOPとプロトタイプOOPとほぼOOP(Cの構造体) ?)vs非OOP:
クラスベースのOOPでも、バリエーションの余地がたくさんあります。多重継承(ew、かなり過剰、ew)、インターフェイスの定義などを実行できるかどうか…
JavaScriptには、オブジェクトがかなり単純で高度に可変である、一種のスタントハイブリッドプロトタイプOOPがありますが、それでも、IMOがカプセル化の重要な側面である内部の懸念からインターフェイスを分離する機能があります。 。
OOPについてのことは、技術的にOOPでなくても、本質的にOOP指向であることができるものが本当にたくさんあるということです。もちろん純粋主義者もいますが、結局のところ、デザインパターンは、特定の状況でうまく機能する特定の抽象化を実現することを目的としています。 OOPベースの言語からのアイデアが、より手続き指向の何かに役に立たないと思い込むのは早すぎないでください。そして、私はJavaScriptについて話していません。それは、プロトタイプベースのOOPパラダイムの間抜けなバージョンによってまったく制限されていません。
ファーストクラス関数:
これらを言語で持たないことは、私が諦めるのが難しいことです。他のコンテキストで使用するためのデータであるかのように、関数を渡すことができます。これにより、特にイベント処理スキームの実装が非常に簡単になりますが、言語を希望どおりに機能するように適応させることも非常に簡単になります。これが、JavaScriptを成功に導いた理由です。 2週間で設計され、Javaに近い構文がマーケティングスキームとして採用されたにもかかわらず、究極のものでした。
クロージャ:
Javaの議論がどこにあるのかはわかりませんが、1、2年前に多くのJava開発者がこの機能を求めていたのは知っています。非クロージャ言語では、関数が閉じられると、その関数内から何かを参照できるものはすべて、ガベージコレクションされたため、アクセスできなくなります。クロージャでは、実行コンテキストは次のようにバインドされます。 「返されたオブジェクトや関数のように、閉じた関数内のものを別のスコープから参照できます。基本的に、関数を閉じたときの変数を取得します。これは、ガベージコレクションのドアに足を詰め込むようなものですが、参照元のエンティティのローカル変数に作成された変数のコピーのように実装されていると思います。
リジッド/ストリクト/セーフvs.必要なすべてのロープを提供する:
JS開発者とJava開発者はそれぞれを理解しない傾向があります他のすべてのことであり、この特定の設計スペクトルのほぼ反対側にある2つの言語と関係があると思います。自分自身やチームの他の開発者から私を守ってほしくない。もっと少ないコードでもっとたくさんのことをしたいし、それに応じて非常に異なる(しかし特定のドメインで一貫した)方法ですべてをやりたい。両方に絶対的なトレードオフがあり、多くの言語は真ん中に落ちる傾向があります。
コメント
これらすべてへの近道は、いくつかの半有用なことを行うのに十分なLispを学ぶことだと思います。これらのパラダイムのほとんどは、Lispの使用方法として始まったので、簡単な方法です。
周りにはたくさんの「種類」の言語がありますが、新しい言語はいつでも現れる可能性があります。基本的に、言語の目的は、アイデア、概念、または要件を可能な限り直接エンコードできるようにすることです。そのために、既存のパラダイムが必要であり、新しいパラダイムが必要になる場合があります。
1つの見方は、表面構造の観点からです。アイデアを簡潔にエンコードできるようにするため、必要なものについて気が変わった場合でも、対応するコードの変更が簡単で、バグが発生する可能性はほとんどありません。
それを見ると、制御構造の観点からです。言語が実行されるとき(もしそうなら)、あなたが望むことを達成するために、物事が起こる順序は何ですか?例:単純なストレートスルー実行、再帰、バックトラック、並列処理。私(中程度の咳)が発見したものの1つは、差分実行でした。
もう1つの有用な視点は、データ構造が設計されるときはいつでも、言語は生まれ。データは、データを組み合わせて処理するアプリケーションプログラムによって「実行」されます。これは、プログラムが、インタプリタが処理を行うために使用するデータの集まり(バイトコードなど)であるのと同じです。
コメント