Динамическая типизация | это... Что такое Динамическая типизация? (original) (raw)

Типизация данных
Типобезопасность Вывод типов Динамическая типизация Статическая типизация Строгая типизацияМягкая типизацияЗависимые типы Утиная типизация

Динами́ческая типиза́ция — приём, широко используемый в языках программирования и языках спецификации, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов. Примеры языков, где есть динамическая типизация — Smalltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript, Lisp, xBase,QtScript.

Противоположный приём — статическая типизация.

В некоторых языках с динамической типизацией стоит проблема сравнения величин, так, например, PHP имеет операции сравнения «==», «!=» и «===», «!==», где вторая пара операций сравнивает и значения, и типы переменных. Операция «===» даёт true только при полном совпадении, в отличие от «==», который считает верным такое выражение: (1=="1"). Стоит отметить, что это проблема не динамической типизации в целом, а конкретных языков программирования.

Содержание

Преимущества

Недостатки

Примеры

PHP

test res="string1";echores = "string1"; echo res="string1";echores.'
'; // выводит "string1" res=1;echores = 1; echo res=1;echores.'
'; // выводит "1" res+=2;echores += 2; echo res+=2;echores.'
'; // выводит "3" res+="string2";echores += "string2"; echo res+="string2";echores.'
'; // выводит "3string2" ?>

JavaScript

test Click to test

Object Pascal

program Project2; {$APPTYPE CONSOLE} Uses SysUtils; Var V1, V2: Variant; begin V1 := 'string1'; WriteLn(V1); // выводит "string1"
V2 := 1; WriteLn(V2); // выводит "1"
Inc(V2,2); WriteLn(V2); // выводит "3"
WriteLn(V2,'string2'); // выводит "3string2" end.

Object Pascal: Другие способы использования динамической типизации

procedure TForm1.Myproc(Obj: TObject); begin If (Obj is TButton) then (Obj as TButton).Click; end; function Something (A: array of const) begin // ... end; {Вызов: } Something ( [5,'Hello',3.14159, True, TForm] );

procedure TForm1.DisplayValue(const AValue: TValue); begin Memo1.Lines.Append(AValue.ToString); end;

procedure TForm1.btn1Click(Sender: TObject); var list: TStrings; begin list := TStringList.Create(); list.Text := 'Foo'; try DisplayValue(list); DisplayValue(list.Count); DisplayValue(list.Capacity * 8.964); DisplayValue(list is TStringList); DisplayValue(list.Text); finally list.Free; end; end; {Вывод: (TStringList @ 0166E460) 1 35,856 True Foo }

См. также

Ссылки