プログラミング言語には何種類ありますか?[閉まっている]


30

基本的に、私は多くのプログラミング言語を学び、優れたプログラマーになりたいです。私はほんの一握りの深さしか知らないので、いくつかのクラスタイプのプログラミング言語があるかを誰かが説明できることを望んでいました。グループで学習しなければならない場合に、それらをひとまとめにする方法が好きです。

Javaのバックグラウンドから来た私は、静的な型付けに精通していますが、動的な型付けに加えて、可能な場合はカテゴリの内訳を確認したいほど利用可能な言語が多様でなければならないことを知っています。


2
いくつではなく「どのタイプ..」と言ったほうがいいでしょうか?
アミールRezaei

PrologとCのようなものは根本的に異なることを学んだので、それぞれが異なる種類のプログラミング言語に対応していると考えていたので、いくつの種類を把握したいと思っていました。
ソバ

7
2:あなたが望むことをするタイプとそうでないタイプ
マットエレン

1
さまざまな種類のプログラミング言語について学ぶこと絶対 に建設です!これはこれの複製として閉じられるべきであると主張する可能性がありますが、私はそれらが別個のままであるのに十分に明確な質問だと思います。
ピーターボートン

1
@Sova、新しい言語を最初に選択して、cベースの構文を使用しないものを試すことをお勧めします。そうすることで、あなたが最もよく知っているものとはどう違うのか、それがどのように機能するのかに頭を集中させるでしょう。
エリックReppen

回答:


73

言語の分類方法によって異なります。:基本的に、言語は二つのタイプに分けることができ不可欠あなたがコンピュータに指示する言語どのようにタスクを実行するために、そして宣言型コンピュータを教えている言語何をやって。宣言型言語はさらに機能言語に分割できます。機能言語では、関数とロジックを構成することでプログラムが構築されますプログラミング言語。プログラムは一連の論理接続を介して構築されます。命令型言語は、問題を解決するための手順のリストのようなもので、レシピのようなものです。命令型言語には、C、C ++、およびJavaが含まれます。関数型言語にはHaskellが含まれます。ロジックプログラミング言語には、Prologが含まれます。

命令型言語は、Cのような手続き型言語オブジェクト指向言語の 2つのサブグループに分けられることがあります。ただし、オブジェクト指向の言語は、グループ化とは少し直交していますが、オブジェクト指向の機能言語(OCamlとScalaが例です)があります。

staticおよびdynamicと入力して言語をグループ化することもできます。静的に型付けされた言語は、プログラムを実行する前に(通常はコンパイル段階で)型付けがチェック(および通常は強制)される言語です。動的に型指定された言語は、型チェックを実行時まで延期します。C、C ++、およびJavaは静的に型付けされた言語です。Python、Ruby、JavaScript、Objective-Cは動的に型指定された言語です。Forthプログラミング言語を含む、型付けされていない言語もあります。

あなた自分のタイピングによることもグループ言語規律弱い暗黙の型変換をサポートしていタイピング、および強い型付け、暗黙の型変換を禁止します。2つの間の線は少しぼやけています:いくつかの定義によれば、Cは弱い型付けの言語ですが、他の言語は強く型付けされていると考えています。とにかく、規律を入力することは、言語をグループ化するのに本当に便利な方法ではありません。


1
同様のことをするつもりでしたが、代わりに+1してコメントを追加します。また、各カテゴリまたは組み合わせには、特定の要素に焦点を当てることによって作成された多数のスピンオフがあります。たとえば、OOPは次のよ​​うになります。プロトタイプベースのOOP、アスペクト指向プログラミング、コンポーネントベースのプログラミングなど。機能的パラダイムには、非同期プロセスまたはスレッドがベースユニットであり、並列プロセスを一緒に構成してプログラミングする言語など、スピンオフもあります。
CodexArcanum

VBScriptなどのスクリプト言語はこれにどのように適合しますか?さまざまなタイプを作成できるため、少し手続き的であり、少しオブジェクト指向になる可能性があります。
JBキング

これはまさに私が探していたものです。どうもありがとうございました。
ソバ

3
@JB King OOP言語は通常、少なくともメソッド本体内では手続き型です。また、OOPは「オブジェクト」を意味するという一般的な誤解です。多くの言語にはデータ型とオブジェクトがあります。OOPの正確な定義については多くの議論がありますが、通常は継承やカプセル化(プライベート状態)が主要なテーマとして含まれています。どちらかの形式のどちらも含まない言語は、OOP言語として分類するのが困難です。
CodexArcanum

2
@sovaそんなふうに機能する2つの言語しか考えられません。Erlangは並列処理に大きく基づいていますが、私が話していたこととまったく同じようなものが必要な場合は、ポリフォニックC#を調べる必要があります。これは、Pi-Calculusに基づいた研究言語(現在はC-omegaに組み込まれています)(FPがlambda calcに基づいている方法など)Pi-calcはプロセスの単位に基づいており、プロセスおよび同期とasychの組み合わせを宣言しますそれらを呼び出します。FP、特にHaskellのArrowsも調べてください。矢印は非常に似ています。
CodexArcanum

12
  • アセンブリ
  • 手続き型
    • ベーシック
    • C
  • オブジェクト指向
    • C#
    • Java
  • 宣言的
    • プロローグ
    • SQL
  • 機能的
    • Lisp
    • ハスケル

これらは主なものですが、他にも多くのパラダイムがあり、それらの間には多くの重複があります。


宣言(Prolog、SQLなど)はどうですか?
ブルースオルダーマン

@ブルース、今emを得た。

うん、これは私が途中でどこかで学んだ一般的なアイデアでした。
sevenseacat

6
アセンブリは手続き型とみなすべきではありませんか?
MattDavey

2
ForthやFactorなどの連結(スタックベース)プログラミング言語はどうですか?あなたはそれを一種の関数型プログラミングと考えることができますが、それはおそらく言及に値するほど明確です。en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux

11

プログラミング言語(Paradigms)の種類については、http//en.wikipedia.org/wiki/Programming_paradigmをご覧
ください。

プログラミング言語の他の特性(タイプシステムなど)については、http//en.wikipedia.org/wiki/Programming_languageをご覧 ください。


ああ!「パラダイム」なんて良い言葉でしょう!ありがとう
ソバ

@sova私はこれを最良の回答として受け入れます。なぜなら、P.SEの回答にリストするにはパラダイムが多すぎて、それぞれのニュアンスを説明するのがはるかに少ないからです。
宮坂

9

画像をクリックしてPDFを表示します。 プログラミングパラダイムポスター

あなたは見ておくべきであるダミーのためのパラダイムプログラミング:どのようなすべてのプログラマすることがわかっているピーター・ヴァン・ロイによる。これにより、外部での状況の概要がわかります。

さらに先に進みたい場合は、「コンピュータープログラミングの概念、手法、およびモデル」を読むことができます。この方法で言語の束を学ぶことはありませんが、異なる種類の言語の背後にあるパラダイムを学びます。そのため、新しい言語を学ぶことはより簡単になります。


6
  • 手続き型:アセンブリ、Java、C#、F#、Lisp、Fortran。

  • セットベース:SQL。

  • パターンベース:Perl、Regex、Snobol。

  • ツリーベース:XSLT。

  • 配列ベース:APL。


2
+1は、異なるタイプの分類を使用するため、および実際には「手続き型」に他の人々の分類のほとんどが含まれていることを認識するためです。(もちろん、その言葉にはほとんど意味がなく、肉はそのような下位区分にあることを意味するだけです)
ハビエル

4

これに答えるにはさまざまな方法がありますが、用語では次のように分類できます。

機械語:機械語は低レベルのプログラミング言語です。コンピュータでは簡単に理解できますが、人が読むのは困難です。これが、人々がより高いレベルのプログラミング言語を使用する理由です。高水準言語で書かれたプログラムは、コンピューターが実行できるようにコンパイルまたは機械語に解釈されます。

アセンブリ言語:アセンブリ言語は、機械語の表現です。つまり、各アセンブリ言語命令は機械語命令に変換されます。アセンブリ言語のステートメントは読み取り可能ですが、ステートメントはまだ低レベルです。アセンブリ言語の欠点は、各プラットフォームに特定のアセンブリ言語が付属しているため、移植性がないことです。

高水準言語:高水準言語は、ほとんどのプログラマーが最近使用しているものです。C、C ++、Javaなどの言語はすべて高水準言語です。高水準言語の利点は、非常に読みやすく移植性があることです。高レベル言語の欠点は、アセンブリ言語よりも強力でないことです。高級言語の単一のステートメントが多くの機械語ステートメントに変換されるためです。

高水準言語はさらに次のように分類できます。

  1. 関数型言語:関数型言語では、プログラムは関数定義に分割されます。関数型言語は、一種の宣言型言語です。それらは主に定数付きの型付きラムダ計算に基づいています。有名な関数言語には、Scala、F#、Clojure、Lispなどがあります。

  2. 手続き言語:手続き言語では、プログラムは結果を生成するために従うべき一連のステップで記述されます。COBOL、FORTRAN、およびCはいくつかの手続き型言語です。

  3. オブジェクト指向プログラミング言語: OOP言語では、プログラムは、データを含むオブジェクトと、データを操作するメソッドに分割されます。Java、C#、およびC ++はOOP言語です。

  4. 論理プログラミング言語:論理言語は、コンピューターが論理的に推論できるようにするプログラムを作成するために使用されます。例:ロジック言語

詳細な調査については、以下をご覧ください。


3

私は機能の面で考える傾向があります:

構文:

Cベースまたはwhat-have-you。JavaにはCベースの構文があります。PythonやRubyのようなものを試して構文から抜け出し、特定の言語がどのように機能するかという基本的な観点からもっと考えることを強くお勧めします。私は、構文がCベースよりもかさばる必要がなく、空白の周りのブロックを構築するのに問題がないと考えています。

コンパイル済みと解釈済みw ビルドプロセスと解釈済み/コンソール:

コンパイル時と実行時の環境の懸念についてはほとんど知識がありませんが、私はめったに考えない懸念が山ほどあります。

同様に、Javaのように仮想マシン内で実行するためのコンパイルのようなプロセスがまだ残っているインタープリター言語がたくさんあります。物事の変更を確認するには、再構築する必要があります。

そして、ライブ環境のコンソールでコマンドごとにオンザフライで実行できるJavaScriptとPythonがあります。3つすべてが、コードの記述方法を大きく変える可能性があります。

動的タイピングと厳密なタイピング:

私はこの2つを設計上のトレードオフと見なす傾向があります。はるかに低いレベルにあり、パフォーマンスが重要な場合、静的型付けは非常に理にかなっています。どういうわけか、ある概念が別の概念よりも「安全」であるというこの概念を理解したことはありませんが、基本的にはタイピングシステムのしくみと期待されることを学ぶ非常に可塑的で動的な言語で思いつきました。JSでは、タイプシェナンガンはめったに心配されません。いくつかの点で柔軟性は物事をより堅牢にすることができますが、言語のポットホールのいくつかを知らない場合、Jr。レベルの開発者にとっては確かに難解です。

ブロックレベルのスコープ対関数のスコープ対?:

ブロックレベルが最も一般的です(ほとんどのCベースの構文言語では{}の間のすべて)。JavaScriptスコープは、関数を中心に構築されます(これは、オブジェクトを構築するためにも使用されます)。また、内側のスコープから外側のスコープへのアクセスの種類にも大きな違いがあります。私は他のスコープスキームに精通していませんが、それらが存在していると確信しています。

クラシックOOP対プロトタイプOOP対Almost-OOP(Cの構造体)対Non-OOP:

クラスベースのOOPでさえも、さまざまなバリエーションがあります。多重継承(ew、十分に過剰、ew)、インターフェースの定義などができるかどうか...

JavaScriptには、オブジェクトが非常にシンプルで高度に変更可能な、一種のスタントハイブリッドプロトタイプOOPがありますが、内部の懸念からインターフェースを分離する機能があります。これはIMOがカプセル化の重要な側面です。

OOPについてのことは、技術的にはOOPでなくても、本質的にOOP指向であることができるものが本当にたくさんあるということです。もちろん純粋主義者もいますが、結局のところ、デザインパターンとは、特定の状況でうまく機能する特定の抽象化を達成することです。OOPベースの言語からのアイデアが、より手続き指向の何かに役に立たないことを仮定するのは早すぎないでください。そして、私はJavaScriptについて話しているのではありません。プロトタイプベースのOOPパラダイムの間抜けなバージョンによって制限されることはまったくありません。

一流の機能:

言語でこれらを持たないことは私にとってあきらめるのが難しいことです。他のコンテキストで使用するデータのように、関数を渡すことができます。これにより、特にイベント処理スキームの実装が非常に簡単になりますが、言語を希望どおりに機能するように言語を適応させることも非常に簡単になります。JavaScriptを究極の成功に導いたのは、2週間で設計され、マーケティングスキームとしてJavaに近似した構文が採用されたにもかかわらず、私が疑いのあることではありません。

閉鎖:

Javaの議論がどこにあるのかはわかりませんが、1年または2年前に多くのJava開発者がこの機能を求めていたことがわかります。非クロージャ言語では、関数が閉じると、その関数内から何らかの方法で参照できるものはすべて、ガベージコレクションされたためアクセスできなくなります。クロージャーでは、実行コンテキストがバインドされているため、返されたオブジェクトや関数など、別のスコープからその閉じた関数内のものを参照できる場合、基本的に関数が閉じられたときの変数を取得できます。ガベージコレクションのドアに足を踏み入れるようなものですが、参照エンティティのローカル変数に作成された変数のコピーのように実装されていると思われますが。

リジッド/厳格/安全vs.すべてをあなたが望むロープを与える:

JS開発者とJava開発者はお互いをまったく理解しない傾向があり、この特定の設計範囲のほぼ反対側にある2つの言語に関係があると思います。自分やチームの他の開発者から私を守ってほしいとは思いません。私はもっ​​と少ないコードでもっと多くのことを行い、状況に応じてすべてを非常に異なる方法で行います(ただし、特定のドメインでは一貫性があります)。どちらにも絶対的なトレードオフがあり、多くの言語は中間により多く収まる傾向があります。


どうもありがとう。説明のない下票の努力をするのは本当に素晴らしいことです。
エリックReppen

2

これらすべてへの近道は、ある程度有用なことをするのに十分なLispを学ぶことだと思います。これらのパラダイムのほとんどは、Lispを使用する方法として始まったため、物事を試す簡単な方法です。

周辺には多くの「種類」の言語がありますが、新しい言語はいつでも表示できます。基本的に、言語の目的は、アイデア、概念、または要件をできるだけ直接エンコードできるようにすることです。そのために、既存のパラダイムが望んでいる状況があり、新しいパラダイムが必要になる場合があります。

見る方法の1つは、表面構造の観点です。どのように直接アイデアを簡潔にエンコードできるので、あなたが望むものについて考えを変えた場合、対応するコードの変更も簡単で、バグを導入する機会はほとんどありません。

別の見方をすると、制御構造の観点からです。言語が実行された場合(実行されている場合)、目的を達成するために、物事が発生する順序は何ですか?例としては、単純なストレートスルー実行、再帰、バックトラック、並列処理があります。私が発見した1つ(ささやかな咳)は、差次的実行でした。

別の便利な視点は、データ構造が設計されるたびに言語が生まれることです。データは、プログラムがインタープリターによって物事を行うために使用される単なるデータの束(バイトコードなど)であるのと同様に、データを処理して物事を実行するアプリケーションプログラムによって「実行」されます。


クール。LISPを学び、啓発されます。エキサイティング:D
sova

ただし、データ構造を使用するという行為が新しい中間言語を作成すると言う場合、すべてのアルゴリズムで新しい言語が生まれる(すべての操作は必ずデータ構造で行われる)と縮小すると、新しい言語を主張することもできますコードのすべての行で生まれます。あなたは何か他のものを意味すると思いますが、私はまだ私がまだ理解しているかどうかよくわかりませんか?
ソバ

@sova:私にとって、情報理論は大いなる啓示でした(シャノンとコルモゴロフの両方)。帯域幅、エラー検出、最小限のコーディング、ランダム性などの概念で、意味がどのようにエンコードされ、チャネルを通過するかについてです。したがって、データは情報をエンコードし、アルゴリズムはチャネルです。プログラムは情報をエンコードし、プログラミングはチャンネルです。では、どの情報がエンコードされますか?それはいつどこから来たのですか?どこへ行くの?エラー(ノイズ)の原因は何ですか?彼らはどのように修正されますか?私はそれが有用な視点を見つけた。
マイクダンラベイ

@sova:(続き)不快な数学をすべて習得する必要はありません。私にとって重要なのは、物事を考えるために与えられたフレームワークでした。
マイクダンラベイ

1

特定のアプリケーション用のプログラミング言語があることを付け加えなければなりません。思い浮かぶのは、工作機械の製造で使用される言語であるAPT(自動プログラムツール)です。


私はそれを覚えています。私も使ったかもしれません。少年、それは最先端でした。フライス盤を手動でガイドする必要はなく、開始ボタンを押すだけです。そして、バグがあった場合、すべての地獄が解散します。
マイクダンラベイ

私は、フライス盤用のgcodeを生成するプログラムに取り組んできました。私は文字通りプログラミングのバグの結果を保持し、見ましたが、しばしば私のものです。
デビッドソーンリー

私は20年かけてシステムのゴブにポストプロセッサーをインストールしました。
デイブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.