高レベルのプログラミング言語の型システムの基本的な理解

型システム

私には、「高レベルのプログラミング言語の基本的な理解」の記事で私は一度それがデータ型の重要性を述べた高レベルのプログラミング言語、および多くの高レベルのプログラミング言語、あるいはほとんどの彼の理解を説明しましたなぜならシステムや意思決定のタイプの特徴。この記事の目的は、システムのタイプによって、高レベルのプログラミング言語の基本的な特性のいくつかを学ぶことができるようになり、高レベルのプログラミング言語の型システムの私の理解でチャットすることです。

そのため、高レベルのプログラミング言語を学ぶには、「型思考」のようなものを確立することは非常に必要です。

我々は、彼らが通常持っている、システムの種類の言語を記述し强类型弱类型静态类型および动态类型4項。これら四つの用語については、非常に厄介です見つけるためにインターネットを説明し、説明の多くは、明らかに間違っているがあります。Python言語は強く型付けされた言語として定義されている理由を説明する。例えば、一部のユーザは、次の例の使用:

a = 1
b = "2"
c = a + b //error
复制代码

しかし、強く型付けされた言語のJavaと同じ、文字列が文句を言うと、デジタル加算されません、この以上の説明は正確ではありません。

この記事では、私は、これらの概念の私の理解について話すと、私の完璧に私自身の概念のいくつかを紹介します「思考のタイプを。」

静的な型と動的な型

では、「高レベルのプログラミング言語の基本的な理解」、高レベルのプログラミング言語のデータ型の重要性を述べてきた、高レベルのプログラミング言語は、通常、基本データ型の多様性を定義し、これらのタイプのデータは、実際に表します固定メモリの長さと対応するメモリ内のデータの取り扱い。

ここで、我々はまた少し操作機構のプログラムを知っている必要があり、実行時にプログラムは、ベースアドレスを持っている必要があり、プログラムが走ったように、CPUデータおよび命令は、メカニズムをベースアドレスによってアドレス指定さ+オフセット(もちろん、これは比較的簡単な要約、実際の状況は非常に複雑です)。

そして、我々は、高レベルのプログラミング言語は、お使いのコンピュータ上で実行するように変換して行かなければならないことを知っています。タイプ解釈コンパイル実行型(もちろん、実際の状況はより複雑になります) - 一般的な高レベルのプログラミング言語で大まかに二つのカテゴリーに分けることができます。

上記の分析に従うことにより、我々は二つの概念をクリアする必要があり、つまり、静态动态一般的に、我々は呼んで解释/编译ステージ静态阶段から、运行段階动态阶段

静的タイプ

上記の理解と、いわゆる静态类型手続の静的段階における各変数のオフセットを決定することが可能であることを意味する、タイプ変数は静的位相に確定される(可変のオフセット)を指しそれはあります。これは、静的型付け言語は、これらの次のような特徴を持っている必要があることを意味します:

  • 変数は、最初の文の後に使用しなければなりません。
  • 明示的に型を指定またはタイプを決定するために型推論に依存している初期化し、その後、すぐに変更できなくなります変数のタイプを決定する際の変数を宣言します。
  • そのようなだけでなく、数値型の数のような比較的小さな粒径へのデータ型定義は、対応する整数、浮動小数点、等を定義する必要があり、異なるオフセット値がサポートされます

静的型チェック

ここで私は、カスタムその静的型チェックの概念を導入する必要がある静的な型は、それが何であるかをチェックし、?プログラムのコンパイラやインタプリタは、静的位相を持つことになり、各変数の型を検出するために、同じ変数が保存しておきたい場合は、値の異なるタイプを保持していることはできません、または互換性のあるタイプを、または変換値が格納されていることを意味し変数に入力します。一方、機能の種類に対応するオペランド・オペレータのためのパラメータは、型チェックを行います[1]

ので、なぜ、この用語静的型チェックを導入し、静的型チェックは静的型付け言語は静的段階に可変オフセットを決定する必要があるため、その変数の型は不変でなければならない、静的型付け言語のための絶対必要です、そうでない場合は、静的段階に可変のオフセットを決定することができません

そして、いくつかの言語は動的型付けが、それは、このような活字言語として、静的型チェックの機能を提供しているが、ツールのプロパティです。

ダイナミックタイプ

静的段階には変数のみ運用段階において決定された変数の型、種類(オフセット)を決定しないようにするので、ダイナミック型は、符号化における静的に型付けされた言語よりも柔軟であろう。静的タイプは、動的型付けのこれらの特性が要求されない有する上にこれが意味します。

動的な型チェック(型検出ランタイム(RTTI))

ここで、私は、動的な型チェックという概念を導入する必要があり、また、実行時の型チェック(RTTI)することができ、それは動的型付け言語、または静的型付け言語であるかどうか、時々データ型変換が避けられないので、RTTIが必要ですA。

すべてのタイプの動的検出のための強く型付けされた言語は、動的段階で発生しながらしかし、それは、検出のRTTI型がより検出された値の型ではなく、変数の型である、と指摘します

静的タイプとコントラストのダイナミック型

1565520846800

上記JavaScriptは動的言語を入力されているが、C ++は静的型付けされた言語、同じ機能を実現するコードの上記2個であり、我々はメモリ割り当ての種類の点で動的および静的タイプとの間の差を分析します

1565521806470

あなたは、JavaScriptが実行時に動的属性ごとのオフセットを計算する必要があり、見ることができ、各オブジェクトは、そのプロパティは、オフセット情報を維持する必要があり、それが決定されたC ++コンパイラ、各オブジェクトの良いですプロパティをオフセット、オフセットは、それだけの情報のコピーを保存する必要があります。

静的型付け言語は確かに、より便利になりますコードを書く、IDEで、静的型チェックの特性となりますので、同時に、サブ文書の静的な型は、達成することができます。

強く型付けと弱い型付け

強く型付けと弱い型付けの場合、これら二つの概念は明確な定義はありませんし、これら二つの定義のために、インターネットはここで私は自分より世俗的な説明を、自分の理解に応じて与え、比較的厄介な説明です。

まず、プログラミング言語は、最も基本的な部分は、システムオペレータ、キーワードやフレーズの一種であり、これらの最も基本的な部分で、我々は、任意の複雑な手順を実装することができます。同時に、我々は最終的に操作するデータは、当社の定義の一部としてこれらの基本的なプログラミング言語を介して実行され、私は強く型付けと弱いオペレータが実行するために主に型指定された議論をここです。

演算子を定義するオペランドの数と演算子は、オペランドのデータ型を受信することを期待するとき我々は、すべての演算子の定義におけるプログラミング言語を知っているし、我々は、以下について説明します。

厳密に型指定されました

オペレータの定義で指定された受信データの種類とデータ型は、直接的に例外を報告する場合は、オペレータが有する言語の静的な型または静的タイプのオペレータの数と一致しない場合、強くことを特徴と明示入力動的型付け言語は動的型付け言語の静的型チェックは実行時にエラーを報告しますのではなく、静的位相誤差に報告するチェック。プログラミング言語やデータ型の必須要件を比較し、この時間は、私たちは強く型付けされた呼び出しデータの種類に敏感です。一般的に、強く型付けされた言語には、Java、Pythonとがあります。いくつかの例は、定義されたPythonのオペレータに以下に示します。

バイナリ算術演算子は、伝統的な優先順位に従います。これらの具体的な作業のいくつかは、非数値型に適用されることに注意してください(非数値タイプのため、オペレータは、具体的な説明を与えるサポートしています)。指数演算子2つのだけの優先度レベルを除いて、乗算型演算子は、加算型に作用する別のオペレータに作用します:

オペレータ*出力パラメータ(乗算)製品。または2つのパラメータは、両方のデジタルでなければならない、またはパラメータ及び他のパラメータは、整数配列でなければなりません。前者の場合、二つの数が変換され、その後、同じタイプ乗じ。後者の場合には、反復配列、反復係数が空のシーケンス負出力します。

...

演算子+(加算)とパラメータを出力します。または2つのパラメータは、両方のデジタルでなければならない、または両方は、配列の同じタイプであってもよいです。前者の場合、二つの数が合計され、その後、同じ型に変換しました。後者の場合には、接合作業の実行順序。

演算子-(マイナス)は、差分パラメータを出力します。(2つの数値パラメータは、最初の同じ型に変換される数値型、数の一種のみのために、整数と浮動小数点除算の実行時の型で存在することが可能であるため)。

これは、公式Pythonドキュメントである二元+1 +「2」この式はPythonで動作しない理由を説明する演算子を定義します、。また、その次のコードに注意してください。

a = "123"
b = 1
print(a/b)
复制代码
Traceback (most recent call last):
  File "H:/Python/Hello/src/Hello.py", line 3, in <module>
    print(a/b)
TypeError: unsupported operand type(s) for /: 'str' and 'int'
复制代码

あなたはstrのタイプと動作時間で割り切れる数を行うにはタイプでレポート異常を見ることができます。

弱い型指定

弱いタイプは、データ・オペランドのタイプに対してより高い耐性を示し、オペレータが一貫した定義のデータ型ではない場合、オペレータタイプ及び定義は、異常が直接報告むしろ最初試みる受信しない場合、受信し値は、所望のオペレータの値のデータ型に変換し、データ型の変換に失敗した場合、最終的に例外がスローされ、操作者が計算に使用されます。今回は弱いのための言語要件のこのタイプを呼び出す、またはタイプに敏感ではありません。

このようなデータ型変換は、一般的に、もちろん、我々はまた、コード内の値にキャストすることができ、ランニングになります。

暗黙の型変換の多くで満たされ、またES仕様は、暗黙的にこれらの型変換のための操作を提供するために、抽象オペレーションの非常に大きな数を定義では、JavaScriptなど、プレゼンテーションのこの部分ではJavaScript詳細には、JavaScriptの一部となります。

強く型付けと弱い型付け比較

  • 強く型付けされた言語プログラムの堅牢性と可読性がより柔軟な弱い型付けされた言語の演算子を使用しながら、より良いですが、コントロールする強力な能力を必要とします。

C言語の疑問

C言語は、静的弱く型付けされた言語として分類されるIは、上述のように、それはまた、パス、次のコードのことが言えます。

int main() {
    int a = 0;
    double b = 0;
    a = "123" - 3; //没有报错,但是产生的行为比较怪异,没有仔细研究过,但是足以说明C语言是一门弱类型语言
    printf("sizeof a: %d", sizeof(a)); //4 数据类型(偏移量)没有发生变化,所以是静态类型
    printf("\n");
    printf("valueof a: %d", a);
    printf("\n");
    printf("sizeof b: %d", sizeof(b)); //8
}
复制代码

真の値と偽の値

任意決意ロジックの結果は、ブール型の値で表されるので、ブールは、高レベルのプログラミング言語の任意のタイプのデータを使用する比較的高い周波数です。利便性を符号化するために、多くのオペレーティング・言語の種類が導入している真值假值概念。

値がブールbool型を型に変換されていない場合は、それがある場合true、我々はそれを呼び出すよ真值値がbool型でない場合、変換値の後にタイプ値をBOOLし、逆に、false我々は、この値を呼んで、假值これは、真と、任意のデータ型に相当値と偽の両方に相当し、論理が真値と偽の値の時間依存特性とすることができるため、我々はそれを決定しました。

一方、動的型付け言語では、導入された真理値論理演算子は、より強力になります。

概要

上記の後時にターゲット言語を見つけるために新しい言語を学ぶために、と多くの時間を節約することができ、これらの基本的な理解と、高レベルのプログラミング言語の型システムの私の基本的な理解です。

ビューの純粋に個人的なポイントよりも、ビューの異なる点は、議論のための歓迎されているがあります。


  1. そこに多くの人々が、これは強力な機能によって実証され入力されると思うかもしれないですが、多言語の私の分析により、Pythonなど強く型付けされた言語でバイアスされ、この機能の王冠がダイナミック強く型付けされた言語であることがわかりましたしかし、変数の値は、異なるタイプのストレージを持つことができます。↩︎

おすすめ

転載: juejin.im/post/5d5050e6e51d4562165534c1