Динамічна типізація - прийом, широко використовуваний у мовах програмування і мовах специфікації, при якому змінна зв'язується з типом в момент присвоювання значення, а не в момент оголошення змінної. Таким чином, в різних ділянках програми одна і та ж змінна може приймати значення різних типів. Приклади мов, де є динамічна типізація - Smalltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript, Lisp, xBase, QtScript.

Протилежний прийом - статична типізація.

У деяких мовах з динамічною типізацією стоїть проблема порівняння величин, так, наприклад, PHP має операції порівняння " == "," != "і" === "," !== ", де друга пара операцій порівнює і значення, і типи змінних. Операція "===" дає true тільки при повному збігу, на відміну від "==", який вважає вірним такий вираз: ( 1=="1"). Варто відзначити, що це проблема не динамічної типізації в цілому, а конкретних мов програмування.


1. Переваги

  • Мінімум додаткових рядків: змінні треба або просто оголосити без вказівки типу ( JavaScript), або взагалі оголошувати не потрібно ( Бейсік) або не обов'язково ( PHP).
  • Відповідно, спрощується написання простих програм.
  • Підвищується гнучкість мови. Наприклад, тільки динамічний мову може мати функцію eval(), яка обчислює значення довільного виразу.
  • Прискорює роботу компілятора - а значить, виробничий цикл "написати-перевірити".
  • Автоматично дає мові елементи метапрограмування і інтроспекції.
    • Іншими словами: коли програміст пише функцію "відсортувати масив", функція відразу починає працювати для масиву чисел, масиву рядків, масиву об'єктів (метапрограмування). Щоб визначити, чи можлива операція x.length, середовищі виконання потрібно знати, якого типу змінна x і чи є у неї поле length; якщо подібні запити може робити і сама програма, це і є інтроспекція.
  • Спрощується робота прикладного програміста з СУБД, які принципово повертають інформацію в "динамічно типізованих" вигляді. Тому динамічні мови цінні, наприклад, для програмування веб-служб.
  • Іноді потрібно працювати з даними змінного типу. Наприклад, функція пошуку підрядка повертає позицію знайденого символу (число) або маркер "не знайдено". В PHP цей маркер - Булевського false. У статичних мовах це особлива константа (0 в Паскалі, std::string::npos в C + +).

2. Недоліки

  • Статична типізація дозволяє вже при компіляції помітити прості помилки "через недогляд". Для динамічної типізації потрібно як мінімум виконати дану ділянку коду.
    • Особливо підступні в динамічному мові програмування опечатки : розробник може кілька разів переглянути непрацюючий код і нічого не побачити, поки нарешті не знайде набраний з помилкою ідентифікатор.
  • В об'єктно-орієнтованих мовах не діє або діє з обмеженнями автодоповнення : важко або неможливо зрозуміти, до якого типу відноситься змінна, і вивести набір її полів і методів.
  • Для написання складного коду потрібна особлива культура програмування: угорська нотація, юніт-тестування і т. д. У статичних мовах, взагалі-то, теж, але набагато в меншому ступені.
  • Інтерфейсна частина модуля (описи типів, заголовки процедур і т. д. - те, що відповідає interface -секції в Паскалі та h-файлу в Сі) в статичному мовою сама по собі є істотною частиною документації - а при вдалій архітектурі модуля взагалі дозволяє обійтися без документування.
  • Низька швидкість, пов'язана з динамічною перевіркою типу. До того ж більшість мов з динамічною типізацією інтерпретуються, а не компільовані.

3. Приклади

3.1. PHP

    test </ title> </ head> <body> <span> <? Php </span><span> $ Res </span><span> = </span><span> "String1" </span><span> ; </span><span> echo </span><span> $ Res </span><span> . </span><span> '<br />' </span><span> ; </span><span> / / Виводить "string1" </span><span> $ Res </span><span> = </span><span> 1 </span><span> ; </span><span> echo </span><span> $ Res </span><span> . </span><span> '<br />' </span><span> ; </span><span> / / Виводить "1" </span><span> $ Res </span><span> + = </span><span> 2 </span><span> ; </span><span> echo </span><span> $ Res </span><span> . </span><span> '<br />' </span><span> ; </span><span> / / Виводить "3" </span><span> $ Res </span><span> + = </span><span> "String2" </span><span> ; </span><span> echo </span><span> $ Res </span><span> . </span><span> '<br />' </span><span> ; </span><span> / / Виводить "3string2" </span><span> ?> </span> </ Body> </ html> </pre></div></div><br clear=all style=page-break-before:always /><h3><span id=link5> 3.2. JavaScript </span></h3><div dir=ltr><div><pre> <html> <head> <title> test </ title> </ head> <body> <span> < </span> script type <span> = </span><span> "Text / javascript" </span><span> > </span><span> function </span> DoTest <span> ( </span> obj <span> ) </span><span> { </span><span> var </span> res <span> = </span><span> "String1" </span><span> ; </span> alert <span> ( </span> res <span> ) </span><span> ; </span><span> / / Виводить "string1" </span> res <span> = </span><span> 1 </span><span> ; </span> alert <span> ( </span> res <span> ) </span><span> ; </span><span> / / Виводить "1" </span> res <span> + = </span><span> 2 </span><span> ; </span> alert <span> ( </span> res <span> ) </span><span> ; </span><span> / / Виводить "3" </span> res <span> + = </span><span> 'String2' </span><span> ; </span> alert <span> ( </span> res <span> ) </span><span> ; </span><span> / / Виводить "3string2" </span><span> } </span><span> </ </span> script <span> > </span> <a href="#" onClick="DoTest()"> Click to test </ a> </ body> </ html> </pre></div></div><br clear=all style=page-break-before:always /><h3><span id=link6> 3.3. Object Pascal </span></h3><div dir=ltr><div><pre><span> program </span> Project2 <span> ; </span><span> {$ APPTYPE CONSOLE} </span><span> Uses </span> SysUtils <span> ; </span><span> Var </span> V1 <span> , </span> V2 <span> : </span> Variant <span> ; </span><span> begin </span> V1 <span> : </span><span> = </span><span> 'String1' </span><span> ; </span><span> WriteLn </span><span> ( </span> V1 <span> ) </span><span> ; </span><span> / / Виводить "string1" </span> V2 <span> : </span><span> = </span><span> 1 </span><span> ; </span><span> WriteLn </span><span> ( </span> V2 <span> ) </span><span> ; </span><span> / / Виводить "1" </span> Inc <span> ( </span> V2 <span> , </span><span> 2 </span><span> ) </span><span> ; </span><span> WriteLn </span><span> ( </span> V2 <span> ) </span><span> ; </span><span> / / Виводить "3" </span><span> WriteLn </span><span> ( </span> V2 <span> , </span><span> 'String2' </span><span> ) </span><span> ; </span><span> / / Виводить "3string2" </span><span> end </span><span> . </span></pre></div></div><p> Object Pascal: Інші способи використання динамічної типізації </p><div dir=ltr><div><pre><span> procedure </span> TForm1 <span> . </span><span> Myproc </span><span> ( </span> Obj <span> : </span> TObject <span> ) </span><span> ; </span><span> begin </span><span> If </span><span> ( </span> Obj is TButton <span> ) </span><span> then </span><span> ( </span> Obj as TButton <span> ) </span><span> . </span><span> Click </span><span> ; </span><span> end </span><span> ; </span><span> function </span> Something <span> ( </span> A <span> : </span><span> array </span><span> of </span><span> const </span><span> ) </span><span> begin </span><span> / / ... </span><span> end </span><span> ; </span><span> {Виклик:} </span> Something <span> ( </span><span> [ </span><span> 5 </span><span> , </span><span> 'Hello' </span><span> , </span><span> 3.14159 </span><span> , </span><span> True </span><span> , </span> TForm <span> ] </span><span> ) </span><span> ; </span><span> procedure </span> TForm1 <span> . </span><span> DisplayValue </span><span> ( </span><span> const </span> AValue <span> : </span> TValue <span> ) </span><span> ; </span><span> begin </span> Memo1 <span> . </span><span> Lines </span><span> . </span><span> Append </span><span> ( </span> AValue <span> . </span><span> ToString </span><span> ) </span><span> ; </span><span> end </span><span> ; </span><span> procedure </span> TForm1 <span> . </span><span> btn1Click </span><span> ( </span> Sender <span> : </span> TObject <span> ) </span><span> ; </span><span> var </span> list <span> : </span> TStrings <span> ; </span><span> begin </span> list <span> : </span><span> = </span> TStringList <span> . </span><span> Create </span><span> ( </span><span> ) </span><span> ; </span> list <span> . </span><span> Text </span><span> : </span><span> = </span><span> 'Foo' </span><span> ; </span><span> try </span> DisplayValue <span> ( </span> list <span> ) </span><span> ; </span> DisplayValue <span> ( </span> list <span> . </span><span> Count </span><span> ) </span><span> ; </span> DisplayValue <span> ( </span> list <span> . </span><span> Capacity </span><span> * </span><span> 8.964 </span><span> ) </span><span> ; </span> DisplayValue <span> ( </span> list is TStringList <span> ) </span><span> ; </span> DisplayValue <span> ( </span> list <span> . </span><span> Text </span><span> ) </span><span> ; </span><span> finally </span> list <span> . </span><span> Free </span><span> ; </span><span> end </span><span> ; </span><span> end </span><span> ; </span><span> {Висновок: (TStringList @ 0166E460) 1 35,856 True Foo} </span></pre></div></div></div></div></body></html>

Цей текст може містити помилки.

Схожі роботи | скачати

Схожі роботи:
Качина типізація
Статична типізація
Строга типізація
Динамічна система
Динамічна геологія
Динамічна модель
Динамічна змінна (фізика)