ホームページ > バックエンド開発 > PHPチュートリアル > プログラミング言語に関するランダムトーク

プログラミング言語に関するランダムトーク

WBOY
リリース: 2016-07-25 08:43:31
オリジナル
961 人が閲覧しました



前に書いてあります: 既存の言語のプログラミング パラダイムは、手続き型、オブジェクト指向、関数型、論理型であることはわかっています。ソフトウェア工業化の普及とソフトウェアの複雑さの増大に伴い、プログラミング言語の開発の歴史も、初期の手続き型(命令型)言語cから、プログラミング言語javaに代表されるオブジェクト指向言語へと進化してきました。論理プログラミング言語(prologに代表される)や関数型言語(lisp系)も学術や人工知能の分野で多く使われています。近年、マルチコアの到来により、クラウドコンピューティングの時代が到来しました。関数型プログラミング言語は徐々に出現しており、最も古典的な言語は scheme、common-lisp、ml、clojure、go に代表されます。そして、最近の jdk8 にも徐々に functiond、closure が追加されています。文法や scala の作者は、プログラマーが関数型言語の考え方で コーディング に取り組むことをますます主張しています。プログラミング言語の開発は時代の変化に合わせて常に変化していることがわかります。開発プロセスから、テクノロジーの開発は、ソフトウェアの複雑さの基本的なニーズを解決することを中心に開発されていることがわかります。

1. プログラミング言語の概要
プログラミング言語は、コンピューターの象徴であり、人間とコンピューターの間のコミュニケーションのための言語です。新しいプログラミング言語を学ぶとき、言語のどのような特徴に注意する必要がありますか?本「SICP」の著者は次の3つのポイントを挙げています:
* 原始的な要素
* 組み合わせの手段
上記の 3 つの機能は基本的にすべてのプログラミング言語の機能をカバーしており、言語設計者が最初から考慮しなければならないものでもあります。これら 3 つの点についての私の理解: プリミティブ要素は言語の基本的なシンボル (基本的なデータ型、キーワードなど) を表し、語彙部分です。組み合わせ手段は、基本的な要素を使用して組み合わせのプロセスを通じて大規模なプログラムを構築する手段です。異なる言語には異なる組み合わせ手段が用意されています。抽象化の手段は抽象化を意味し、ソフトウェアの複雑さを解決し、ソフトウェアの可読性、拡張性、再利用性を向上させる重要な手段です。以下では、言語の特徴を要素の組み合わせや抽象化方法の観点から比較していきます。


2. 組み合わせとは
アセンブリ言語: 最も単純な語彙および文法形式であり、低水準言語と呼ばれます。アセンブラは、リテラル変換のプロセスを通じてアセンブリ コードをネイティブ コード (CPU 命令セット) に変換します。 提供される基本要素には、数字、文字、-、+、*、/、case、if、break、go、命令、およびその他の基本要素が含まれ、これらの要素はコンピュータ実行シーケンス記号に結合されます。 C 言語はアセンブリ言語よりも高度であり、プログラマーが CPU、レジスタ、メモリの作業を直接任せることができ、配列、構造体、その他のデータ構造など、より多くの組み合わせメソッドを提供します。
Java 言語はオブジェクト指向言語であると主張しているため、C 言語よりも一歩進んで、強力な型システムを使用してプロパティとメソッドを結合します。
L Go 言語と ML 言語は非常に似ており、「インターフェイス」、「高水準関数」、「クロージャ」、「ダック型」、「複数の値を返す」、それらを組み合わせるための goroutine などを提供しています。


プロローグ言語は完全にパターンマッチングのための論理言語です。彼の考え方は、数学の基礎が「1+1=2」であるのと同じように、世界中のすべての定理は最も単純な定理から導出され、それによって初めて「万有引力」や「万有引力」などの法則を導き出すことができる、というものに基づいています。相対性理論」。
Lisp 方言は s-expression (有名な S-expression) を使用してデータと関数を結合します。 Lisp ではデータと関数の間に区別はなく、すべてがデータです。
部外者: LISP の方言はチューリング マシンの考えと一致しています。エンコードするとき、コンピューター アーキテクチャを感じることはできません。他の言語は、フォン ロイマンの計算とストレージのアイデア (「スタック」構造または「レジスタ」構造) に基づいて設計されています。

3. 抽象化とは
C言語以降、関数はプログラムを抽象化する単位として使用されます。これにより、プログラムの再利用性とモジュール性が大幅に向上します。チームワークによるコーディングも可能になります。

オブジェクト指向プログラミング: 基本的にコンピューターの詳細を隠し、開発者はオブジェクトを通じて特定のビジネスを抽象化します。しかし、厳密に言えば、java も命令型言語のカテゴリーに属しており、値によって呼び出されます。比較すると、Python と Ruby はよりオブジェクト指向であり、Python はオブジェクト指向と関数型プログラミングのパラダイムを組み合わせたものであり、自然言語に近いものです。

lisp で表される関数型言語: 関数は基本的で唯一の抽象化であり、common-lisp はマクロに基づいた一連のオブジェクト指向プログラミング手法も開発します。私は関数型プログラミングの概念を好みます: 関数の副作用がないこと (特に変態的な Haskell の場合、スレッド セーフを考慮する必要がありません)、高階関数、クロージャ、ラムダなど。

4. 型システム
よく「JavaScript は弱く型指定された言語で、Java 言語は強く型指定された言語」と言われます。型システムの観点からプログラミング言語を区別するのも興味深いです。一般に、弱く型付けされた言語はより自然言語に近く、文法もより自由で活発です。今日の言語の傾向も弱型の方向に進んでいます。

コンピューターは高度に構造化されており、スタック上のバ​​イナリ ビットのエラーはオーバーフロー、バス、その他のエラーにつながります。したがって、言語レベルでの自由は、コンパイラーまたはインタープリターの恩恵を受けます。たとえば、Java や C などの言語には強力なコンパイル時の型検出メカニズムが備わっており、強力な型付けの利点により、コーダーは構文エラーやセマンティック エラーがほとんどないコードを作成できます。これは、IDE のサポートにも役立ちます。大規模な技術チームへの協力。

弱い型指定言語を使用すると、自由度が得られ (型情報は必要ありません)、プログラマがキーボードのキーを入力する回数が大幅に減ります。自由には代償が伴い、型推論 (型推論) がコンパイラーまたはインタープリターに組み込まれます (型推論では、変数、演算子、戻り値、およびコンテキスト内のその他の情報の明示的な型に基づいて正規化メソッドが使用されます)。弱い型は簡単にコンパイルできますが (またはコンパイルする必要はないが解釈して実行できます)、型チェックのプロセスもありますが、このプロセスは遅延します。実行時まで。したがって、弱く型付けされた言語はあまり構造化されておらず、コーディング時に正しい型を保証することが難しく、IDE のサポートも困難です。ただし、一部のアナライザーは構文エラーと意味論的エラーを継続的に検出できます。これは、厳密に型指定された言語の IDE 効果を達成するのと同じです。近年、言語の方向性はコンピュータアーキテクチャから徐々に離れ、プログラマがアーティストのようにコードで自由に記述できる自然言語の方向に進化してきました。

5. コンパイル/解釈
Java 言語は解釈またはコンパイルされますか? 手続き型javacコンパイラのJavaソースコード→クラスバイトコードの処理からはなんとも言えません。ただし、JVM 上でバイト コードを実行するプロセスは解釈またはコンパイルされる可能性があります。解釈された型とコンパイルされた型はどちらも、内部的には、字句解析 -> 構文解析 -> コンパイラ バックエンド -> というコンパイル原則のプロセスに従います。 しかし、それらには独自の利点があります:

インタプリタ: コードを迅速にロードします。インタプリタは実行時のコンテキストなどの情報を維持する必要があります。したがって、必要なコードがロードされ、フラグメントが解釈されて実行されます。ただし、同じコードに対してコンパイル プロセスを実行するのは冗長であり、時間の無駄になります。

コンパイラー: 高速実行。さらに、最適化プロセスは構造化されたプロセスであるため、コンパイラ バックエンドでも中間コードの最適化が容易になります。多くの場合、中間コード全体を走査し、コード全体を最適化し、操作効率を向上させる必要があります。

ランタイム: 一般的に、インタープリタ型言語は、実行プロセス中に変数の検索、バインド、スコープなどを提供するために、ランタイム コンテキスト情報をメモリ内に維持する必要があります。 コンパイル言語は、基本的にレジスタスタックモデルに基づいてコードを実行し、データバインディングがスタック構造内で完了するため、実行速度が若干速くなります。

hotspot-jvm は、解釈とコンパイルのそれぞれの利点を組み合わせています。メソッドが頻繁に実行され、ホットスポットに到達すると、jvm はまずコンパイル プロセスを開始し、サブコードをネイティブ コードにコンパイルします。それをキャッシュすると、次の呼び出しを直接実行できます。 hotspot-jvm はスタック命令に基づいてバイトコードを実行しますが、これはレジスタ命令を犠牲にしてクロスプラットフォームの考慮事項にも基づいています (Android オペレーティング システムに基づく dalvik 仮想マシンはレジスタ命令に基づいています)。多くの場合、言語のバランスを取るプロセスは、より多くの「自由」を獲得するほど、より多くの「犠牲」を伴います。

6. 概要: 初 ライプニッツの提案を解決するために: すべてのコンピューティング タスクの命題を解決する一般的なモデルがあるかどうかを調べ、チューリング理論を発明しました。フォン・レイマンが人間の脳のニューロンの思考プロセスをシミュレートし、記憶と演算装置に基づいた最初のコンピューター「ENIAC」を製造するまで、これまでのところ、コンピューターのハードウェア技術は実質的に変わっていません。それは、ムーアの法則の崩壊によって人々が発展したというだけです。ますます大規模化するコンピューティング タスクをサポートするために、複数レベルのキャッシュ、マルチコア、およびマルチ CPU テクノロジーが使用されています。 この過程で、人々が論理、記号論、アルゴリズムを研究し続けるにつれて、コンピューターとの対話に使用される言語はますます抽象的で豊かなものになってきています。私たちはこのイメージシンボルを使って時間と空間を抽象化し、このイメージシンボルを使ってソフトウェアの複雑さを解決し、このイメージシンボルを使って私たちの考えをコンピュータに伝えます。
添付ファイルやテキストのアップロードに制限があるため、一部の写真やテキストが表示されない場合があります。詳しくは、http://mp.weixin.qq.com/s?__biz=MzI5ODI3NzY2MA==&mid=100000725&idx=2&sn をご覧ください。 =fde9b2af17a00679c89f3f6fc8be64c8#rd
誰でもコミュニケーションを取ることができます。
下のQRコードをスキャンすると、素敵な記事がどんどん増えていきます! (QR コードをスキャンしてフォローすると、予期せぬサプライズが待っています!!)




購読番号QRコード.jpgプログラミング言語に関するランダムトーク



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート