
この記事には、動的型付けの悪を呼び出さないために型付けについて知っておく必要がある最低限のものが含まれています。Lispは型なし言語であり、Cは強く型付けされた言語です。
完全版には、すべてのタイプのタイプの詳細な説明が含まれており、コード例、人気のあるプログラミング言語へのリンク、指数関数的な画像が含まれています。
最初に短いバージョンの記事を読み、次に必要に応じて記事全体を読むことをお勧めします。
ショートバージョン
標準化プログラミング言語は、通常、 型付きと型なし ( 型 なし )の2つの大きなキャンプに分かれています。 たとえば、前者にはC、Python、Scala、PHP、およびLuaが含まれ、後者にはアセンブリ言語、Forth、およびBrainfuckが含まれます。
「タイプレスタイピング」はコルクのように本質的に単純なので、他のタイプにさらに分割されることはありません。 ただし、型付き言語は、いくつかの重複するカテゴリに分けられます。
- 静的 / 動的タイピング。 静的は、変数と関数の最終的なタイプがコンパイル段階で設定されるという事実によって決定されます。 つまり コンパイラはすでにどの型がどこにあるかを100%確信しています。 動的型付けでは、プログラムの実行中にすべての型が既に検出されています。
例:
静的:C、Java、C#;
動的:Python、JavaScript、Ruby。
- 強い / 弱いタイピング(厳密/厳密でないと言うこともあります)。 厳密な型指定は、言語が式に異なる型を混在させることを許可せず、自動暗黙変換を実行しないという事実によって区別されます。たとえば、文字列から多くを減算することはできません。 精度の低下が発生したり、変換があいまいな場合でも、弱い型付け言語は多くの暗黙的な変換を自動的に実行します。
例:
強力:Java、Python、Haskell、Lisp。
弱い:C、JavaScript、Visual Basic、PHP。
- 明示的 / 暗黙的なタイピング。 明示的に型付けされた言語は、新しい変数/関数/引数の型を明示的に設定する必要があるという点で異なります。 したがって、暗黙的な型指定のある言語は、このタスクをコンパイラー/インタープリターに転送します。
例:
明示的:C ++、D、C#
暗黙的:PHP、Lua、JavaScript
また、これらのカテゴリはすべて交差していることにも注意してください。たとえば、C言語には静的な弱い明示的な型付けがあり、Python言語には動的な強い暗黙的な型があります。
それでも、静的型と動的型を同時に持つ言語はありません。 先を見て、私はここに横たわっていると言います-それらは本当に存在しますが、それについては後で詳しく説明します
さらに進みましょう。
詳細バージョン
短いバージョンでは十分ではないようであれば、良いでしょう。 詳細を書いたのも不思議ではありませんか? 主なことは、短いバージョンではすべての有用で興味深い情報を収めることは単に不可能であり、詳細な情報はおそらく誰もが緊張せずに読むには長すぎるということです。
型なしタイピング
型のないプログラミング言語では、すべてのエンティティは、さまざまな長さのビットのシーケンスと見なされます。
型なしタイピングは、通常、低レベル(アセンブリ言語、Forth)および難解な(Brainfuck、HQ9、Piet)言語に固有です。 しかし、彼女には、欠点とともにいくつかの利点があります。
メリット
- 非常に低いレベルで記述することができ、コンパイラー/インタープリターは型チェックを妨害しません。 任意の種類のデータに対して任意の操作を実行できます。
- 通常、結果のコードはより効率的です。
- 指示の透明性。 言語の知識があれば、通常、特定のコードが何であるかは間違いありません。
短所
- 複雑さ 多くの場合、リスト、文字列、構造などの複雑な値を提示する必要があります。 これにより不便が生じる可能性があります。
- チェックの欠如。 文字から配列ポインターを減算するなどの無意味なアクションは、完全に正常であると見なされ、微妙なエラーが発生します。
- 低レベルの抽象化。 複雑なデータ型を操作することは、数字を操作することと変わりません。当然、多くの困難が生じます。
強い型なしタイピング?
, . ( 86/86-64, ) , cx (16 ) rax (64 ).
mov cx, eax ;
, - ? , . , , .

, (static) (dynamic) , , .
, ( , ). , — , ? ? , , ?
.
- — . , , ( , ).
- . , .
- , .
- IDE ( , ).
- — ( , ).
- ( , , ).
- — , .

, — . — ( ) — , .
? 3- : .
— . , ( ) , , — (-1).
(Python):
def find( required_element, list ):
for (index, element) in enumerate(list):
if element == required_element:
return index
return (-1)
, , , , . . — - !
():
unsigned int find_int( int required_element, int array[], unsigned int size ) {
for (unsigned int i = 0; i < size; ++i )
if (required_element == array[i])
return i;
return (-1);
}
unsigned int find_float( float required_element, float array[], unsigned int size ) {
for (unsigned int i = 0; i < size; ++i )
if (required_element == array[i])
return i;
return (-1);
}
unsigned int find_char( char required_element, char array[], unsigned int size ) {
for (unsigned int i = 0; i < size; ++i )
if (required_element == array[i])
return i;
return (-1);
}
, Python, ? ?
, . , . C++ . :
( , C++):
template <class T>
unsigned int find( T required_element, std::vector<T> array ) {
for (unsigned int i = 0; i < array.size(); ++i )
if (required_element == array[i])
return i;
return (-1);
}
! Python . , 3-, !
, — .
, , . - ( Haskell). - ( ), () .
, , :
- C# - dynamic.
- F# ?, .
- Haskell — Data.Dynamic.
- Delphi — Variant.
, :
- Common Lisp — .
- Perl — 5.6, .
, ?

. « ». — strong typing.
, , , . « ». — weak typing.
, . .
, . , , . !
. , , , , , «» ? — , ! (, )
- ? , , , , .
?
- — , .
- — , , , , .
- — -, , , , - -.
- — , . , .
- ( ).
- .
- .
, , ! ?
.
,
… . « » ?
, . — . — ( , , , -, , ).
. 3.5 — ( — ? ? ? ?).
— , . .
, PL/I . ! !
, . ? , Pascal , . C#, Groovy Common Lisp.
, , . , .
Haskell.
, .
pi + 1
,
pi + 1.0
pi + float(1)
.
pi + 1
!
Haskell, , 1 . , , . !
sum x y
, x y ( 1), — sum , sum , sum , sum sum .
, .
, , . , ( Haskell, Java, C#, Python), ( C, JavaScript, Lua, PHP).
, ?

, , . — explicit typing.
, , . — implicit typing.
- , , — , , .
, , ?
- (
int add(int, int)
) , . - , , .
- —
def add(x, y)
,int add( int x, int y)
. - . - , , .
, , ( - ?), !
-
, - . . — Haskell, , :
--
add (x, y) = x + y
--
add :: (Integer, Integer) -> Integer
add (x, y) = x + y
: ,
add :: (Num a) => a -> a -> a
*, .. , Haskell'.
* int_index .
. , . 18 , !
, Haskell, . ( )
- -?
.
-
C++, C++11 ( C++0x), auto, , :
:
//
unsigned int a = 5;
unsigned int b = a + 3;
//
unsigned int a = 5;
auto b = a + 3;
. . ( , , , ):
//
std::vector<int> vec = randomVector( 30 );
for ( std::vector::const_iterator it = vec.cbegin(); ... ) {
...
}
//
auto vec = randomVector<int>( 30 );
for ( auto it = vec.cbegin(); ... ) {
...
}
! . , - Haskell, ?
, decltype auto:
//
int divide( int x, int y ) {
...
}
//
auto divide( int x, int y ) -> decltype(x / y) {
...
}
, , (templates / generics) .
“”.
JavaScript - | | Ruby - | | Python - | | Java - | | PHP - | | C - | | C++ - | | Perl - | | Objective-C - | | C# - | | Haskell - | | Common Lisp - | | D - | | Delphi - | |
( C# qxfusion):
- C# — , - dynamic 4.0. dynamic var.
- ++ — C++11 auto decltype. , Boost (boost::any, boost::variant). .
- Common Lisp — , .
- D — .
- Delphi — Variant.
- , CL, PHP Obj-C, - — .
. , . ? ? ? , .
!
:
: