プログラミング言語は、コンピューターの象徴であり、人間とコンピューターの間のコミュニケーションのための言語です。新しいプログラミング言語を学ぶとき、言語のどのような特徴に注意する必要がありますか?本「SICP」の著者は次の3つのポイントを挙げています:
* 組み合わせの手段
2. 組み合わせとは
L Go 言語と ML 言語は非常に似ており、「インターフェイス」、「高水準関数」、「クロージャ」、「ダック型」、「複数の値を返す」、それらを組み合わせるための goroutine などを提供しています。
プロローグ言語は完全にパターンマッチングのための論理言語です。彼の考え方は、数学の基礎が「1+1=2」であるのと同じように、世界中のすべての定理は最も単純な定理から導出され、それによって初めて「万有引力」や「万有引力」などの法則を導き出すことができる、というものに基づいています。相対性理論」。 Lisp 方言は s-expression (有名な S-expression) を使用してデータと関数を結合します。 Lisp ではデータと関数の間に区別はなく、すべてがデータです。
部外者: LISP の方言はチューリング マシンの考えと一致しています。エンコードするとき、コンピューター アーキテクチャを感じることはできません。他の言語は、フォン ロイマンの計算とストレージのアイデア (「スタック」構造または「レジスタ」構造) に基づいて設計されています。 C言語以降、関数はプログラムを抽象化する単位として使用されます。これにより、プログラムの再利用性とモジュール性が大幅に向上します。チームワークによるコーディングも可能になります。
オブジェクト指向プログラミング: 基本的にコンピューターの詳細を隠し、開発者はオブジェクトを通じて特定のビジネスを抽象化します。しかし、厳密に言えば、java も命令型言語のカテゴリーに属しており、値によって呼び出されます。比較すると、Python と Ruby はよりオブジェクト指向であり、Python はオブジェクト指向と関数型プログラミングのパラダイムを組み合わせたものであり、自然言語に近いものです。
lisp で表される関数型言語: 関数は基本的で唯一の抽象化であり、common-lisp はマクロに基づいた一連のオブジェクト指向プログラミング手法も開発します。私は関数型プログラミングの概念を好みます: 関数の副作用がないこと (特に変態的な Haskell の場合、スレッド セーフを考慮する必要がありません)、高階関数、クロージャ、ラムダなど。
よく「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 コードをスキャンしてフォローすると、予期せぬサプライズが待っています!!) |