基本的に、私は多くのプログラミング言語を学び、優れたプログラマーになりたいです。私はほんの一握りの深さしか知らないので、いくつかのクラスやタイプのプログラミング言語があるかを誰かが説明できることを望んでいました。グループで学習しなければならない場合に、それらをひとまとめにする方法が好きです。
Javaのバックグラウンドから来た私は、静的な型付けに精通していますが、動的な型付けに加えて、可能な場合はカテゴリの内訳を確認したいほど利用可能な言語が多様でなければならないことを知っています。
基本的に、私は多くのプログラミング言語を学び、優れたプログラマーになりたいです。私はほんの一握りの深さしか知らないので、いくつかのクラスやタイプのプログラミング言語があるかを誰かが説明できることを望んでいました。グループで学習しなければならない場合に、それらをひとまとめにする方法が好きです。
Javaのバックグラウンドから来た私は、静的な型付けに精通していますが、動的な型付けに加えて、可能な場合はカテゴリの内訳を確認したいほど利用可能な言語が多様でなければならないことを知っています。
回答:
言語の分類方法によって異なります。:基本的に、言語は二つのタイプに分けることができ不可欠あなたがコンピュータに指示する言語どのようにタスクを実行するために、そして宣言型コンピュータを教えている言語何をやって。宣言型言語はさらに機能言語に分割できます。機能言語では、関数とロジックを構成することでプログラムが構築されますプログラミング言語。プログラムは一連の論理接続を介して構築されます。命令型言語は、問題を解決するための手順のリストのようなもので、レシピのようなものです。命令型言語には、C、C ++、およびJavaが含まれます。関数型言語にはHaskellが含まれます。ロジックプログラミング言語には、Prologが含まれます。
命令型言語は、Cのような手続き型言語とオブジェクト指向言語の 2つのサブグループに分けられることがあります。ただし、オブジェクト指向の言語は、グループ化とは少し直交していますが、オブジェクト指向の機能言語(OCamlとScalaが例です)があります。
staticおよびdynamicと入力して言語をグループ化することもできます。静的に型付けされた言語は、プログラムを実行する前に(通常はコンパイル段階で)型付けがチェック(および通常は強制)される言語です。動的に型指定された言語は、型チェックを実行時まで延期します。C、C ++、およびJavaは静的に型付けされた言語です。Python、Ruby、JavaScript、Objective-Cは動的に型指定された言語です。Forthプログラミング言語を含む、型付けされていない言語もあります。
あなた自分のタイピングによることもグループ言語規律:弱い暗黙の型変換をサポートしていタイピング、および強い型付け、暗黙の型変換を禁止します。2つの間の線は少しぼやけています:いくつかの定義によれば、Cは弱い型付けの言語ですが、他の言語は強く型付けされていると考えています。とにかく、規律を入力することは、言語をグループ化するのに本当に便利な方法ではありません。
これらは主なものですが、他にも多くのパラダイムがあり、それらの間には多くの重複があります。
プログラミング言語(Paradigms)の種類については、http://en.wikipedia.org/wiki/Programming_paradigmをご覧
ください。
プログラミング言語の他の特性(タイプシステムなど)については、http://en.wikipedia.org/wiki/Programming_languageをご覧 ください。
あなたは見ておくべきであるダミーのためのパラダイムプログラミング:どのようなすべてのプログラマすることがわかっているピーター・ヴァン・ロイによる。これにより、外部での状況の概要がわかります。
さらに先に進みたい場合は、「コンピュータープログラミングの概念、手法、およびモデル」を読むことができます。この方法で言語の束を学ぶことはありませんが、異なる種類の言語の背後にあるパラダイムを学びます。そのため、新しい言語を学ぶことはより簡単になります。
これに答えるにはさまざまな方法がありますが、用語では次のように分類できます。
機械語:機械語は低レベルのプログラミング言語です。コンピュータでは簡単に理解できますが、人が読むのは困難です。これが、人々がより高いレベルのプログラミング言語を使用する理由です。高水準言語で書かれたプログラムは、コンピューターが実行できるようにコンパイルまたは機械語に解釈されます。
アセンブリ言語:アセンブリ言語は、機械語の表現です。つまり、各アセンブリ言語命令は機械語命令に変換されます。アセンブリ言語のステートメントは読み取り可能ですが、ステートメントはまだ低レベルです。アセンブリ言語の欠点は、各プラットフォームに特定のアセンブリ言語が付属しているため、移植性がないことです。
高水準言語:高水準言語は、ほとんどのプログラマーが最近使用しているものです。C、C ++、Javaなどの言語はすべて高水準言語です。高水準言語の利点は、非常に読みやすく移植性があることです。高レベル言語の欠点は、アセンブリ言語よりも強力でないことです。高級言語の単一のステートメントが多くの機械語ステートメントに変換されるためです。
高水準言語はさらに次のように分類できます。
関数型言語:関数型言語では、プログラムは関数定義に分割されます。関数型言語は、一種の宣言型言語です。それらは主に定数付きの型付きラムダ計算に基づいています。有名な関数言語には、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では、タイプシェナンガンはめったに心配されません。いくつかの点で柔軟性は物事をより堅牢にすることができますが、言語のポットホールのいくつかを知らない場合、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つの言語に関係があると思います。自分やチームの他の開発者から私を守ってほしいとは思いません。私はもっと少ないコードでもっと多くのことを行い、状況に応じてすべてを非常に異なる方法で行います(ただし、特定のドメインでは一貫性があります)。どちらにも絶対的なトレードオフがあり、多くの言語は中間により多く収まる傾向があります。
これらすべてへの近道は、ある程度有用なことをするのに十分なLispを学ぶことだと思います。これらのパラダイムのほとんどは、Lispを使用する方法として始まったため、物事を試す簡単な方法です。
周辺には多くの「種類」の言語がありますが、新しい言語はいつでも表示できます。基本的に、言語の目的は、アイデア、概念、または要件をできるだけ直接エンコードできるようにすることです。そのために、既存のパラダイムが望んでいる状況があり、新しいパラダイムが必要になる場合があります。
見る方法の1つは、表面構造の観点です。どのように直接アイデアを簡潔にエンコードできるので、あなたが望むものについて考えを変えた場合、対応するコードの変更も簡単で、バグを導入する機会はほとんどありません。
別の見方をすると、制御構造の観点からです。言語が実行された場合(実行されている場合)、目的を達成するために、物事が発生する順序は何ですか?例としては、単純なストレートスルー実行、再帰、バックトラック、並列処理があります。私が発見した1つ(ささやかな咳)は、差次的実行でした。
別の便利な視点は、データ構造が設計されるたびに言語が生まれることです。データは、プログラムがインタープリターによって物事を行うために使用される単なるデータの束(バイトコードなど)であるのと同様に、データを処理して物事を実行するアプリケーションプログラムによって「実行」されます。
特定のアプリケーション用のプログラミング言語があることを付け加えなければなりません。思い浮かぶのは、工作機械の製造で使用される言語であるAPT(自動プログラムツール)です。