ПредишенСледващото

Статично и динамично типизиране

Въпреки че може да има междинни решения, има два основни подхода:

  • Dynamic пишете. изчакайте, докато изпълнението на всеки разговор, а след това да се вземе решение.
  • Статично пишете. въз основа на набор от правила, определени от оригиналния текст, независимо дали при изпълнение на видове нарушения са възможни. Системата е изпълнена, ако правилата гарантират липсата на грешки.

Тези условия могат да бъдат лесно обяснени: Когато се появи пишете динамичен вид проверка, докато системата е (динамично) и се изпълнява статично върху текст (преди изпълнение) за проверка на статично пишете.

Условията и въведен нетипизирани (въведена / типизиран) често се използва вместо въведен статично и динамично въвели (статично / динамично въвели). За да се избегне всякакво недоразумение, ние ще се придържаме към завърши именуване.

Статично пишете изисква автоматична проверка, налага, като правило, на компилатора. В резултат на това ние имаме един прост определение:

Определение: статично типов език

OO език е статично въвели, ако той идва с набор от договорените правила трябва да бъдат проверени от компилатора, чието спазване гарантира, че ефективността на системата няма да доведе до нарушаване на вида.

В литературата терминът "силно типизиране" (силно). Тя съответства на категоричен характер на определението, което изисква пълното отсъствие на видове нарушения. Възможно е да има слаба (слаби) форми статичен пишете. при които правило елиминира някои нарушения, а не да ги премахнат напълно. В този смисъл някои обектно-ориентирани езици се статично въведени слабо. Ние ще се борим за най-мощната пишете.

правила машинописни

Нашата обектно-ориентиран нотация е статично въвели. Нейните правила тип бяха въведени в предишните лекции и сведени до три прости изисквания.

Въпреки, че определението за статично типов език се дава точно това, не е достатъчно - необходимостта от неформални критерии за създаването на въвеждане правила. Да вземем два крайни случаи.

  • Абсолютно правилно език. където всеки синтактично правилен система и правилно по отношение на вида. -общите правила не са необходими. е съществуването на такива езици (представете си полски запис изразяването на събиране и изваждане на числа). За съжаление, нито един от реалния универсалния език не отговаря на този критерий.
  • Абсолютно неправилно език. че е лесно да се създаде, като всеки съществуващ език и добавяне на правило писане, което прави всяка неправилна система. По дефиниция, езикът написали: защото няма система, съответните правила, няма система ще доведе до типовете нарушения.

Можем да кажем, че езиците на първия тип са подходящи. но безполезен. последният може да бъде полезна, но не е подходящ.

На практика необходимата тип система, подходящо и полезно в същото време: достатъчно мощна за реализацията на нуждите на компютри и доста удобно, не ни принуди да отиде в изтънчеността да отговори на правилата за писане.

Ние казваме, че един език е реалистично. ако той е подходящ за употреба и полезно в практиката. За разлика от определението на статично пишете. даде категоричен отговор на въпроса: "Дали X статично написали език", определението на реализъм е отчасти субективно.

В тази глава ще видим, че ние предложихме е реалистично нотация.

Статично пишете води от природата на "песимистичен" политика. Опитвайки се да се даде гаранция, че изчисленията не водят до повреди. отхвърля изчисленията, които могат да са приключили без грешка.

Помислете за един обикновен, различен от обект, Паскал език от типа с различни видове реални и число. При описване н: цяло число; R: Реал оператор н: = R ще бъде отхвърлено поради нарушаване. Например, компилаторът ще отхвърли всички от следните твърдения:

Ако позволим на изпълнението им, можем да видим, че [A] винаги ще работи, тъй като всяко число система е точно представяне на реално число 0.0, ясно преведена на колкото 0. [B] почти със сигурност ще работи. Резултатът от [C] не е ясно (ако искаме да получим резултат от закръгляване или изхвърляне на дробна част?). [D], за да се справят с задача, тъй като операторът:

който включва недостижима задача (п ^ 2 - е квадрата на номер N). След смяна на н ^ 2 п правилния резултат ще даде само една серия от писти. N възлагане на големи реални стойности не могат да бъдат представлявани от доведе до провал.

В въвели език, като всички тези примери (на труд, не работи, понякога работи) безмилостно третират като общи правила нарушения и отхвърлиха всички компилатор.

Въпросът не е дали ние ще бъдем песимисти, но как песимистично можем да си позволим да бъдем. Да се ​​върнем към изискването на реализъм. ако видовете правила са толкова песимистични, които пречат простотата на изчисления, ние ги отхвърляме. Но ако видовете сигурност постижимо постигнати малко загуба на изразителна сила, ние ще ги вземе. Така например, в среда за разработка, която осигурява функция закръгляване и разпределянето на цялата страна - кръгли и съкращава. оператор н: = R неправилно основание се счита за вас кара да се запиша превърнете изрично реално число до цяло число, вместо да се използва по подразбиране двусмислен трансформация.

Статично писане: как и защо

Докато ползите от статично пишете очевидни, добри, за да се говори отново за тях.

предимства

Причините за използването на статичен пишете в обект на технологии, които посочихме в началото на лекцията. Надеждност, лесното разбиране и ефективност.

Надеждност поради грешки откриване, които иначе биха се прояви само по време на работа, и то само в някои случаи. Първото правило, принуждавайки декларира същество, тъй като, наистина, и функции, въведени в текста съкращения на програма, която позволява на компилатора, като се използват други две правила, има несъответствие между замислена и реални приложни лица, компоненти и изрази.

Ранното откриване на грешки, също така е важно, защото колкото по-дълго отлагане тяхното търсене, толкова по-голямо увеличение на цената на корекция. Този имот е интуитивен за всички професионални програмисти, количествено потвърди широко известни произведения Бьом (Бьом). Зависимост от разходите за коригиране на времето за намиране на грешката е показана на графиката, изграден според редица големи промишлени проекти и експерименти, проведени с малък за управление на проекта:


Фиг. 17.1. Сравнителни разходи за коригиране на грешки ([Бьом 1981], публикувани с разрешение)

Четливостта и лесното разбиране (четливост) има своите предимства. Във всички примери в тази книга, като например появата на предприятието дава на читателя с информация за нейното назначаване. Четливост е много важно във фазата на поддържане.

Аргументи в полза на динамично типизиране

Въпреки всичко това, динамично типизиране не губи своите привърженици, особено сред Smalltalk-програмисти. Техните аргументи се основават главно на реализъм, което обсъдихме по-горе. Те се уверите, че статичното типизиране е твърде ги ограничава, не им позволява свободно да изразят своите творчески идеи, понякога я наричат ​​"девствен пояс".

С този аргумент можем да се съгласим, но само за статично въвели езици, които не поддържат редица възможности. Заслужава да се отбележи, че са нужни на всички понятия, свързани с концепцията за тип и въведени в предишните лекции - отхвърлянето на всяка от тях е изпълнен със сериозни ограничения, както и въвеждането им, а напротив, дава ни действия гъвкавост, и ние се даде възможност да се насладите пълноценно на практичността на статично пишете.

Набор на текст: компоненти за успех

Какви са механизмите реалистичен статично пишете. Всички те влязоха в предишните лекции, и затова можем да ги спомням само за кратко. Техният съвместен списък показва последователността и силата на тяхната връзка.

Нашият тип система се основава изцяло на концепцията за клас. Класовете са дори такива основни видове като цяло число. и по тази причина, ние нямаме нужда от специални правила описват предварително определени видове. (Това е нашата нотация е различна от "хибридни" езици като Object Pascal. Java и C ++, където, клас на базата на системата на старите видове езици, комбинирани с предмет технология.)

Разгърнати типове ни дават по-голяма гъвкавост, позволявайки видове, чиито стойности представляват обекти, заедно с видовете, чиито стойности се посочи връзки.

В последната дума в създаването на гъвкава система тип принадлежи към наследството и свързаното с концепцията за оперативна съвместимост. По този начин се преодолее основен ограничаване на класически напечатани езици, например, Pascal, на Ада, в която операторът х: у = изисква вид на х и у са подобни. Това правило е твърде строг: той забранява използването на обекти, които могат да се обозначи обекти на сродни видове (SAVINGS_ACCOUNT и CHECKING_ACCOUNT). Когато наследи, ние изискваме съвместим тип с типа на х ш. например, х има тип профил. Y - SAVINGS_ACCOUNT. и втори клас - наследник на първото.

На практика, след статично типов език се нуждае от подкрепа множествено наследяване. Известни основните обвинения в статично типизиране е, че той не дава възможност да се интерпретира различни обекти. По този начин, обект на документа (документ) може да се предава по мрежата, и следователно се нуждаят от присъствието на компоненти, свързани със съобщение тип (съобщение). Но тази критика е валидна само за езика на ограничени единствен наследство.


Фиг. 17.2. множествено наследяване

В някои случаи, вие искате да се ограничи гъвкавостта. , която позволява използването на операции, които се прилагат само за лица от общ тип. Ако общ клас SORTABLE_LIST поддържа сортиране, то изисква тип лице Г., където G - родово параметър сравнение наличност. Това се постига чрез свързване с G-класа определяне родово ограничение, - съпоставими:

Всеки действителната родово параметър трябва да е потомък на SORTABLE_LIST клас сравними. като необходим компонент.

Друг механизъм задължителен - опит за присвояване - за организиране на достъп до обектите, вида на софтуер, който не се контролира. Ако Y - е обект на базата данни или обект, получен чрез мрежата, оператор х = у определя стойността на х у ?. ако у съответства на съвместим тип, или ако не е, да даде стойността на х Void.

Одобрение. свързан като част от идеята за дизайн от договора, с класове и техните компоненти, под формата на предварителни условия, postconditions и клас инварианти, предоставя възможност за описване на семантични ограничения, които не са обхванати от типа на спецификация. В езици като Pascal и на Ада, има видове подмрежи, които могат да ограничат стойността на природата, например, границите от 10 до 20 г. обаче, използвайки ги, няма да бъде в състояние да гарантира, че стойността на I е отрицателна, винаги два пъти надвишава й. За помощта на инварианти класове, предназначени да отразява точно наложените ограничения, без значение колко сложна да са те.

При разработването на софтуерни системи в действителност трябва да друг имот, присъща на повечето среди за разработка - бързо, увеличаване (бързо частичното) прекомпилиране. Когато пишете или промяна на системата, бих искал да се възможно най-скоро, за да видите ефекта от промените. С статично типизиране, трябва да се даде време на компилатор за тип двойна проверка. Традиционните компилация съчетания изискват многократни превод на цялата система (и неговия монтаж), и този процес може да бъде мъчително бавно, особено с преход към широкомащабни системи. Това явление е аргумент в полза на преводачески системи, като например началото на Lisp среда или Smalltalk, стартирайте системата с малко или без обработка, без да се извършва вид проверка. този аргумент е забравено сега. Един добър съвременен компилатор определя колко кода е променило от последната компилация, и обработва само промени намерени.

"Да мъника написали"?

Нашата цел - строг, статичен пишете. Ето защо ние трябва да се избегнат всякакви вратички в нашата "играят по правилата", най-малко, просто да ги идентифицира, ако те съществуват.

Най-често срещаният вратичка в статично въвели езици е наличието на трансформация, промяна на вида на лице. В C и неговите производни езици се наричат ​​"тип реализация" или леене (отливка). Записване (OTHER_TYPE) х показва, че стойността на х се възприема от компилатора като имащи вид OTHER_TYPE. при спазване на определени ограничения върху възможните типове.

Тези споразумения се заобиколят ограниченията на вид проверка. Привеждане широко разпространена в език за програмиране C на, активиране ANSI C. диалект Дори и в C ++ отливки, макар и по-рядко, е запознат и може би е необходимо нещо.

Придържайте се към правилата на статично типизиране не е толкова лесно, ако в даден момент те могат да бъдат заобиколени чрез привеждане.

Освен това, ние приемаме, че системата за тип е строг и не позволява на гласове.

Може би сте забелязали, че се опитват да задават - неразделна част от реалистичен вид система - като призрак. Въпреки това, има една съществена разлика: Опитът да се възложи проверки дали текущия тип съответства на определения вид - това е безопасно, а понякога е необходимо.

Въвеждане и свързване

Въпреки, че като читател на тази книга със сигурност ще се разграничи статично типизиране на статично свързване. има хора, които не обичат под сила. Отчасти това може да се дължи на влиянието на езика Smalltalk, защитавайки динамичен подход към предизвикателствата и способен да образува грешна представа, че те имат един и същ разтвор. (Ние сме в книгата се твърди, че за да се създаде надеждни и гъвкави програми съчетават желателно статичен и динамичен пишете задължителен.)

Както пише и задължително сделка с семантиката на x.f строежите основа собственост (арг). но отговори на два различни въпроса:

Въвеждане и свързване

  • Въпросът за писане. когато трябва да се знае точно какво ще бъде показана по време на изпълнението на операцията, съответстваща на ф. приложимо към обекта прикрепен към същността на х (с параметър Arg)?
  • Въпросът за свързване. когато ние трябва да знаем какво операция инициира обаждането?

Писането дава отговор на въпроса за наличието на най-малко една операция, свързването е отговорен за избора на правото.

Като част от обективен подход:

И двата проблема може да бъде решен, така динамично и статично. Съществуващи версии, предоставени от всичките четири решения.

  • Редица езици не са обект, да речем, Pascal, от Ада, реализиран като статично типизиране и статично свързване. Всеки субект е само един тип обекти определено статично. Това гарантира надеждността на разтвора, цената на която е неговата гъвкавост.
  • Smalltalk и други обектно-ориентирани езици включват средства за динамично свързване и динамично да пишете. В този случай, се отдава предпочитание на гъвкавост в ущърб на надеждността на езика.
  • Отделни езици не са обект поддържат динамично пишете и статично свързване. Сред тях - за монтаж езици и редица скриптови езици (скриптови езици).
  • Идеи статична печатна и динамично свързване реализира в нотацията, предложени в тази книга.

Причината за избора на статично и динамично свързване типизиране очевидна. Първият въпрос е: "Кога ще разберем за съществуването на компонентите?" - предлага статичен отговор: "Колкото по-скоро толкова по-добре", което означава, че по време на компилация. Вторият въпрос е: "Какво е използването на компонентите?" включва динамичен отговор ", който е необходим," - съответства на динамичен вида на обекта се определя по време на изпълнение. Това е единственият приемлив разтвор ако статично и динамично свързване дава различни резултати.

Следващият пример ще помогне за изясняването на наследството йерархията на тези понятия:


Фиг. 17.3. Видове самолет

Въпросът за писане, когато убеден, че ще има lower_landing_gear компонент ( "колесника"), приложим към обекта (за хеликоптер той няма да бъде изобщо) по въпроса за свързването: кое от няколко възможни варианта за избор.

Dynamic пишете в Smalltalk стил изисква да чака за повикване, и по време на изпълнение, за да проверите наличността на желания компонент. Това поведение е възможно за прототипи и експериментални разработки, но това е неприемливо за промишлени системи - време на полет от късно, за да попитам, имате ли шаси.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!