プログラミング言語の型システム

何かが、それをマークしたときに何かを理解していない新入生を書きます

1.はじめに

型システムは、手段と型チェックとして採用され、1950年代にFORTRANコンパイラからが始まりました。ソフトウェア工学、プログラミング言語の設計、コンパイラと高性能ネットワークセキュリティと型理論を使用して、重要なアプリケーションの他の側面における研究プログラミングビューの言語の型システム(タイプ理論)のポイントは、。でコンピュータサイエンスを研究することによって、この入門コースとレッスンをご覧くださいデータは、著者らは、プログラミング言語の型システムの概念の理解を深め、その役割と問題が特定の理解を持っています。結果の研究では、今、このレポートを仕上げます。
S

2.型システム(タイプシステム)

2.1定義

タイプは、通常の値の可能な組の集合であると考えられて。このようなコレクションの整数値であってもよい整数として、言葉は含蓄システムは、いくつかの困難に入ります。;および「タイプの基本セット」に定義された一連の種類の基本的な構成のセット「プリミティブ型を設定」:私たちは、「型システム」、のための合理的な説明への参照を、この分野でのプログラミング言語を議論します組成物、操作、変換方法。
次のように我々は、定義されたタイプのシステムを得ることができる:
(入力規則)、各種プログラムコンストラクト(変数、式、関数、等)を与えるために使用されるルールのセットを設定するルールのセットで構成されたプログラミング言語の一部の種類が割り当てられている
例1:の形態で説明した非設定ルール「M及びNは、長い型の式である場合、ロングタイプはM + N表現です」

実施例2:関数fは長いタイプのパラメータである場合、対応する引数のタイプも長くなければなりません。引数は、対応する文字、ショート、およびint型である場合、システムが自動的に限り、それらをアップグレードします。[1]

型システムの定義も参照してください:

タイプシステムは、変数、式、機能またはモジュールのようなコンピュータプログラムは、から成り、様々な構築物のタイプと呼ばれるプロパティを割り当てるルールの集合である。[2]

2.2役割

私たちは、コンピュータが2値的にし、基本単位として連続8ビットに格納されていることを知っている- 「バイト」このビューに、コンピュータの記憶装置は、一般的な、店のテキスト、画像、音や他の他のメディアは、違いのない本質的な性質を持っていないです。
現実には、我々は人工的なC言語のint型やdoubleとしてプログラミング言語の概念では非常に異なる「基本タイプ」のシリーズを導入していることです。ある意味では、自分自身をint型と倍増、任意の違いを確認しているだけで数バイトからなるメモリセルはありません。
私たちは、「複雑な」型システムを設定したい理由?実際には、「ストア」をコンセプトに、私たちは情報の保存を達成するために、バイト単位で、バイナリモードを使用し、十分です。しかし、我々はさらに言うか、コンピュータプログラミング言語、その役割主に二つ、すなわち、情報の保存や情報の処理するために、ことに注意してください。これは、理論的研究のタイプ(型理論)、パーティションタイプのシステムは、情報処理のために大きな利便性をもたらすことが判明しました。

型システムは、それらが計算値の種類に応じてフレーズを分類することによって、特定のプログラムの動作が存在しないことを証明するための扱いやすい構文法である[3]。

型システムの基本的な目的は、プログラムの実行中に実行エラーの発生を防止することである。[4]

換言すれば、システムの基本的な目的は、(後述)型デザイン型検査によるプロセスは、挙動が良好で適切なタイミングで実行されていることを確認する方法を使用することです。
型チェックに寄与することに加えて型付きプログラミング言語、以前のエラーが検出され、別のプログラムモジュールは、互いに独立してコンパイルされ、より効率的な空間配置とアクセスをもたらすことができます。また、必要なシステムの種類があり、原因計算ルールの違いに異なるタイプのデータを参照してください。

そして、タイプの実際の意味と組み合わせて、我々が見ることができ、プログラムの基本的な問題を解決するための」タイプ理論は意義がありますが、問題を提起、それは意味のあるプログラムでも、より豊かに導いた適切な対応するタイプではありませんオンデマンド型システム。「[5]

2.3関連概念

私たちは、最初に表示されます以下で説明するいくつかの概念を導入
捕獲されたエラーが0に加えて、プログラムの実行を誤って終了する可能性を、Javaは内境界配列アクセスの外に
トラップされないエラー、エラーの後に続けますが、任意の行動かもしれません。バッファオーバーフローのようにCは、間違ったアドレスにジャンプする
ビヘイビアの言語設計禁止、あなたはそれがすべてのトラップされないエラーを含まなければならない禁断の行動の集合を定義することができますが、追い込まれたエラーが含まれていてもよい。..
まあ/ ILLは行儀:プログラムの実行が不可能に禁じられている場合行動は、それ以外の病気行儀行儀でした。
上記の概念の理解、我々はプログラミング言語を区別することができます。
それが不可能禁断の行為であるbehaved--すべてのプログラムがうまくされている言語が、言語は強く型付けされた(強く型付けされました)。そうでなければ、そのようなC言語のバッファオーバーフローなどの弱いタイプ(弱く型付けされた)、すなわち、エラーがトラップされ行動を禁止属します。
2静的な型(静的型付け):コンパイル時に拒否された病気に振る舞ったプログラム。
ダイナミックタイプ(dynamiclly型付け):ビヘイビアILL、ランニング拒否された 
タイプは、言語の構文の一部である場合は3を、明示的な型(明示的に型指定された)であり、コンパイル時の型推論は、暗黙的な型(暗黙的には、入力された)である場合には、 MLとHaskell4など。

したがって、我々は次のように一般的なプログラミング言語は、分類され、分類することができます

无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell

4.正式なタイプのシステム

:のような式を入力
INT、intint、ポインタ(INT)
のようなルールを設定します。

x:int|-x+1:int

どこ| - 左側は、環境アサーションを入力ステレオタイプと呼ばれています。

 |– M : int    |– N : int
 |– M + N : int 

前記フォーム

a < b    b < c
a < c

式には、我々は推論規則を呼び出します。
理解するためによると、それはステレオタイプのルール上に構築されたステレオタイプのアサーション推論規則として見ることができます。

3.タイプ(型チェックを)チェック

参照チェック、型チェックや他のチェックを宣言するために、変数名や関数名の名前を入力し、構文チェックを含めた後、コンパイラプログラムを確認してください。
私たちがここで議論されている検査の種類、システムの種類に依存し、その実装。タイプ長い配列は、mが長いタイプである場合、例えば、コンパイラは、M +「123」とエラーの種類は、+ 3.5を有しているがあります。
システムの種類については、ここではウィキペディアから借りて定義された[6]、次のとおりです。

タイプ型の制約を検証し、施行の過程コンパイル時(静的チェック)で、または実行時にも発生チェックは、があります。

:言及した2がどこにあるかのモードを確認してください
静的タイプは、プログラムA(ソースコード)のAPOSのテキストに基づいて安全性解析プログラムの種類を検証するプロセスをチェックしている。
具体的には、静的型チェックは、テスト自体の下でプログラムを実行していません唯一の文法的正確さ、構造、プロセス、インターフェイス等チェック又はテストプログラムのソースコード分析による。ギャップと、例えば、パラメータが一致しない、不適切な分岐ネストされたループネスト、再帰が許可されていない、変数が使用されていない疑わしい、およびヌルポインタ参照を識別するための静特性解析のプログラムによる静的メソッド不審な計算
動的な型チェックは、検証の過程で 、実行時にプログラムの型の安全性を。
ダイナミックタイプのいくつかの形式で、ほとんどのセキュリティタイプ(タイプセーフ)言語が検出され、彼らはまた、静的型チェッカーを持っている場合でも、その理由は、多くの有用な運動エネルギーが静的チェックのために実用化することは非常に困難であるということです。例えば、プログラムは、2個のタイプA及びBを定義して考慮し、BはAのサブタイプであります 我々はタイプBタイプAの変数から変換したい場合は、元はB型である場合、この時点では、この変数意気消沈していること、これだけこの変数は正当なものです。プログラムが実行されている場合にのみ、格納されたアドレスを参照する変数名の内容は、従って、セキュリティが必須である場合、このような動作かどうかを決定する際の動的な型チェックを決定することができます。
第三のタイプ--Combining静的および動的な型チェックの拡張によって。すなわち、いくつかのプログラミング言語は、検査の2種類以上を可能にしながら。

欠陥の4.C言語タイプ

それだけでC言語はそう一例として、言語に精通でした。
比較的完全なシステムを有するC言語静的タイプ、新しいタイプは、タイプを組み合わせることにより製造することができます。二種類の基本タイプ及び構成を含むタイプC(ポインタ関数が構成された表示および入力することができます)。しかし、C言語では、いくつかの欠陥がシステムの種類に無視することはできませんがあります。上記の定義によると、私たちは与えられたシステムの種類を紹介し、C言語では、実行している場合、それはセキュリティ上の問題を引き起こす可能性があり、コンパイル時のチェックにつながることができ、弱く型付けされた言語は、特定の欠陥があるあります。より一般的な操作は、危険なポインタ演算とキャストです。
我々は再びここにクラスで使用する場合としては、例えば、[7]:

typedef struct{int m;float a[];} record;
	record p={2,{1.0,2.0}},q={3,{1.0,2.0,3.0}};
	int main(){
		p=q;
		printf(“%d %f %f %f\n”,p.n,p.a[0],p.a[1],p.a[2]);
		printf(“%d %f %f %f\n”,q.n,q.a[0],q.a[1],q.a[2]);
      return 0;
	}

このような手順については、GCC(Ubuntuの/リナロ4.6.3-1 ubuntu5 ) :次の結果を生じるが4.6.3コンパイル
3 1.000000 2.000000 3.000000
3432433534 1.000000 2.000000 3.000000
理由は破壊QNコンパイラはに連続したメモリを割り当てることですpとqの構造がP = Qの後に行われる、PA [1]及び隣接QNのアドレスで、その結果、データを格納された、PA [2]のアドレスQN、破壊され記憶されたQN値を占有します。
そして、次のタイプの変換の一例である
/ 初心者摂氏変換アルゴリズム遭遇C
入力温度のためにFを、Cは変換の温度であります
/

main()
{
     float c,f;
     scanf("%f",&f);
     c=5*(f-32)/9;
}
//根据优先级问题,先算括号里面的,即f-32,由于f是float型,则f-32也是float型
//5和9都是int型,5*(f-32)就是int型与float的乘积,此时的int会自动转换为
//float型
//同理,再除9,最终c为float型。

しかし、実際にはしばしばいくつかの学生が、C = 5×(F-32)/ 9のように書き換えられる方程式という問題を生じます 

c=5/9*(f-32)

すべての任意の数を乗じた、= 0そう5/9、INT / INT =であるため、両方のint型ため5/9を使用し、括弧内のものを取るので、結果は0に直接出力され、5,9である0 0。これはエラーになります。
弱言語を入力して、強く型付けされた言語をとメリットを判断することはできません。実際には、どのような言語の需要に応じて使用します。シンプルで小さなアプリケーションを書くときにタイプの弱体化は、言語の柔軟性を向上させ、多くの時間、弱い型付けされた言語を使用するには、高い開発効率を符号量を大幅に節約することができます。例えば、C言語の型システムの欠陥、このような欠陥は、Cのセキュリティのリークによって引き起こされるが、効率を考慮して、私たちはこの欠陥を許可するので、C言語では、最も人気のある言語の一つ残っています。大規模なプロジェクトの建設については、強く型付けされた言語仕様を使用すると、弱いタイプを使用するよりも信頼性が高い可能性があります。

おすすめ

転載: blog.csdn.net/saber_jk/article/details/92699816
おすすめ