Типобезпечність (англ. type safety) — властивість мови програмування, яка характеризує безпеку та надійність у застосуванні її системи типів.
Систему типів називають безпечною (англ. safe) або надійною (англ. sound), якщо у програмах, які пройшли перевірку узгодження типів (англ. well-typed programs або well-formed programs), виключено можливість виникнення помилок узгодження типів [en].
Помилка узгодження типів або помилка типізації (англ. type error) — неузгодженість типів компонентів виразів у програмі, наприклад спроба використати ціле число як функцію. Пропущені помилки узгодження типів на етапі виконання можуть спричиняти баги і навіть креші програм. Безпека мови не є синонімом повної відсутності багів, але щонайменше вони стають досліджуваними в рамках семантики мови (формальної або неформальної).
Надійні системи типів також називають сильними (англ. strong), але трактування цього терміна часто пом'якшують, крім того, його часто застосовують до мов, які здійснюють динамічну перевірку узгодження типів (сильна та слабка типізація).
Іноді безпечність розглядають як властивість конкретної програми, а не мови, якою її написано — тому що деякі типобезпечні мови дозволяють обійти або порушити систему типів, якщо програміст практикує мізерну типобезпеку. Поширена думка, що такі можливості на практиці є необхідними, але це вигадка. Поняття про «безпечність програми» є важливим у тому сенсі, що реалізація безпечної мови сама може бути небезпечною. Розкрутка компілятора вирішує цю проблему, забезпечуючи мові безпечність не лише в теорії, але й на практиці.
Подробиці
Робіну Мілнеру належить вираз «Програми, що пройшли перевірку типів, не можуть „збитися зі шляху істинного“». Тобто, безпечна система типів запобігає свідомо помилковим операціям, пов'язаним із хибними типами. Наприклад, вираз 8 / "Hello, World"
очевидно є помилковим, оскільки арифметика не визначає операції ділення числа на рядок. Формально, безпечність означає гарантію того, що значення будь-якого виразу, який пройшов перевірку типів і має тип τ
є істинним елементом множини значень τ
, тобто лежатиме в межах діапазону значень, допустимого статичним типом цього виразу. Насправді, у цій вимозі є нюанси — див. [en] та складні випадки поліморфізму.
Крім того, інтенсивне використання механізмів визначення нових типів запобігає логічним помилкам, які походять із семантики різних типів. Наприклад, і міліметри, і дюйми є одиницями довжини і можуть бути подані цілими числами, але буде помилкою віднімати дюйми від міліметрів, і розвинена система типів не допустить цього (зрозуміло, за умови, що програміст використовує для значень, виражених у різних одиницях, різні типи даних, а не описує і ті, й інші як змінні цілого типу). Іншими словами, безпечність мови означає, що мова захищає програміста від його власних можливих помилок.
Багато мов системного програмування (наприклад, Ада, Сі, ) передбачають ненадійні (англ. unsound) або небезпечні (англ. unsafe) операції, призначені для можливості порушити (англ. violate) систему типів (див. Зведення типів і Каламбур типізації). В одних випадках це допускається лише в обмежених частинах програми, в інших — не відрізняється від добре типізованих операцій.
У мейнстримі[] нерідко поняття типобезпеки звужують до «безпечності типів щодо доступу до пам'яті» (англ. memory type safety), що означає, що компоненти об'єктів одного агрегатного типу не можуть звертатися до комірок пам'яті, виділених під об'єкти іншого типу. Безпека доступу до пам'яті означає заборону можливості скопіювати довільний бітовий ланцюжок з однієї ділянки пам'яті в іншу. Наприклад, якщо мова передбачає тип t
, що має обмежений спектр допустимих значень, і надає можливість скопіювати нетипізовані дані в змінну цього типу, то це не є типобезпечним, оскільки потенційно допускає, що змінна типу t
матиме значення, яке не є допустимим для типу t
. І, зокрема, якщо така небезпечна мова дозволяє записати довільне ціле значення в змінну, що має тип «вказівник», то небезпечність доступу до пам'яті очевидна (див. Завислі вказівники). Прикладами небезпечних мов є C і . У спільнотах цих мов часто називають «безпечними» будь-які операції, які безпосередньо не призводять до падіння програми. Безпека доступу до пам'яті також запобігає можливості переповнення буфера, наприклад, спроби запису великорозмірних об'єктів у комірки, виділені для об'єктів іншого типу меншого розміру.
Надійні статичні системи типів консервативні (надлишкові) в тому сенсі, що відкидають навіть програми, які виконалися б коректно. Причина цього полягає в тому, що для будь-якої тюрінг-повної мови, множина програм, які можуть породжувати помилки узгодження типів під час виконання, алгоритмічно нерозв'язна (див. Проблема зупинки). Як наслідок, такі системи типів забезпечують ступінь захисту, суттєво вищий, ніж це необхідно для забезпечення безпеки доступу до пам'яті. З іншого боку, безпечність деяких дій неможливо довести статично, її слід контролювати динамічно (наприклад, індексація масиву з довільним доступом). Такий контроль може здійснюватися або [en] самої мови, або безпосередньо функціями, що реалізують подібні потенційно небезпечні операції.
Сильно динамічно типізовані мови (наприклад, Лісп, Smalltalk) не допускають пошкодження даних завдяки тому, що програма, яка намагається перетворити значення до несумісного типу, породжує виняток. До переваг сильної динамічної типізації перед типобезпечністю можна віднести відсутність консервативності, як наслідок, розширення спектра розв'язуваних завдань програмування. Ціною цього стає неминуче зниження швидкодії програм, а також необхідність значно більшої кількості пробних запусків для виявлення можливих помилок. Тому багато мов комбінують у той чи інший спосіб можливості статичного та динамічного контролю узгодження типів.
Приклади безпечних мов
Ада
Ада (найбільш типобезпечна мова в сімействі Паскалю) орієнтована на розробку надійних вбудовуваних систем, драйверів та інші завдання системного програмування. Для реалізації критичних секцій Ада надає низку небезпечних конструкцій, імена яких зазвичай починаються з Unchecked_
.
Мова SPARK є підмножиною Ади. З нього усунуто небезпечні можливості, але додано можливості проєктування за контрактом. SPARK виключає можливість виникнення завислих вказівників за допомогою виключення можливості динамічного виділення пам'яті. Статично перевірювані контракти додано до Ada2012.
Гоар у тюрінгівській лекції стверджував, що задля забезпечення надійності мало статичних перевірок — надійність насамперед є наслідком простоти . Тоді ж він передбачив, що складність Ади спричинить катастрофи.
BitC
— гібридна мова, що комбінує низькорівневі можливості Сі з безпекою Standard ML та лаконічністю Scheme. BitC орієнтована на розробку надійних вбудовуваних систем, драйверів та вирішення інших завдань системного програмування.
Cyclone
Дослідницька мова Cyclone є безпечним діалектом мови C, що запозичує багато ідей з ML (зокрема, типобезпечний ). Призначена для тих самих завдань, що й C, і після здійснення всіх перевірок компілятор породжує код на ANSI C. Не потребує для забезпечення динамічної безпеки віртуальної машини або збирання сміття — натомість заснована на [en]. Cyclone встановлює вищу планку вимог безпеки сирцевого коду, і через небезпечність природи C портування навіть простих програм із C на Cyclone може вимагати певної роботи, хоча чималу її частину можна проробити в рамках C до зміни компілятора. Тому Cyclone часто визначають не як діалект C, а як «мову, синтаксично і семантично схожу на C».
Rust
Багато ідей Cyclone втілено в мові Rust. Крім сильної статичної типізації у мову додано статичний аналіз часу життя вказівників, заснований на концепції «володіння». Реалізовано статичні обмеження, що блокують потенційно некоректний доступ до пам'яті: відсутні нульові вказівники, неможлива поява неініціалізованих та деініціалізованих змінних, заборонено спільне використання змінюваних змінних кількома завданнями. Перевірка на вихід за межі масиву є обов'язковою.
Haskell
Haskell (нащадок ML) спочатку розроблявся як мова, що мало зробити поведінку програм нею ще більш передбачуваною, ніж ранніми діалектами ML. Однак, пізніше до стандарту мови додано небезпечні операції, необхідні у повсякденній практиці, хоча й позначені відповідними ідентифікаторами (починаються з unsafe
).
Haskell також надає можливості слабкої динамічної типізації, і до стандарту мови включено реалізацію механізму обробки винятків за допомогою цих можливостей. Її використання може призводити до аварійного завершення програм, за що [en] назвав Haskell виключно небезпечним. Він вважає неприйнятним той факт, що винятки мають тип, визначений користувачем у контексті класу типів Typeable
, з урахуванням того, що винятки генерує безпечний код (за межами IO
); і класифікує повідомлення про внутрішню помилку, яке видає компілятор, як невідповідне гаслу Мілнера. В обговоренні показано, як можна було б реалізувати в Haskell'і статично типобезпечні винятки в стилі Standard ML.
Лісп
«Чистий» (мінімальний) Лісп є однотиповою мовою (тобто будь-яка конструкція належить до типу «S-вираз»), хоча навіть перші промислові реалізації Lisp передбачали принаймні певну кількість [en]. Сімейство нащадків мови Lisp утворюють переважно динамічно типізовані мови, але існують статично типізовані і такі, що поєднують обидві форми типізації.
Common Lisp є сильно динамічно типізованою мовою, але передбачає можливість явно ([en]) призначати типи (а компілятор SBCL здатний сам їх виводити), однак, ця можливість використовується для оптимізації та посилення динамічних перевірок і не означає статичної типобезпеки. Програміст, з метою підвищення швидкодії, може встановити для компілятора знижений рівень динамічних перевірок, і тоді скомпільовану програму вже не можна вважати безпечною.
Мова Scheme також є динамічно типізованою мовою, але компілятор [en] статично виводить типи, використовуючи їх для агресивної оптимізації програм. Мови «Typed Racket» (розширення Racket Scheme) і типобезпечні. Clojure поєднує сильний динамічний та статичний контроль типів.
ML
Спочатку мова ML розроблялася як інтерактивна система доведення теорем, і лише згодом стала самостійною компільованою мовою загального призначення. Багато зусиль було приділено доведенню надійності системі типів Гіндлі — Мілнера, що лежить в основі ML. Доведення надійності побудовано для підмножини («Fuctional ML»), розширення посилальними типами («Reference ML»), розширення винятками («Exception ML»), для мови, що об'єднує всі ці розширення («Core ML») і нарешті, його розширення першокласними продовженнями («Control ML»), спершу мономорфними, потім поліморфними.
Наслідком цього стало те, що нащадки ML найчастіше апріорі вважаються типобезпечними, навіть попри, що деякі з них відкладають значущі перевірки на програми (OCaml), або відхиляються від семантики, для якої побудовано доведення надійності, і містять небезпечні можливості явно (Haskell). Мовам сімейства ML характерна розвинена підтримка алгебричних типів даних, використання яких суттєво сприяє запобіганню логічних помилок, що також підтримує враження типобезпеки.
Деякі нащадки ML також є інструментами інтерактивного доведення ([en], [en], Agda). Багато хто з них, хоча й могли б використовуватися для безпосередньої розробки програм із доведеною надійністю, частіше використовуються для верифікації програм іншими мовами — з таких причин, як висока трудомісткість використання, низька швидкодія, відсутність [en] тощо. Серед нащадків ML із доведеною надійністю виділяються як орієнтовані на промислове застосування мови Standard ML і прототип його подальшого розвитку successor ML (раніше відома як «ML2000»).
Standard ML
Мова Standard ML (старша в сімействі мов ML) орієнтована на розробку [en] програм промислової швидкодії. Мова має строге формальне визначення та доведену статичну та динамічну безпечність. Після статичної перевірки узгодженості інтерфейсів компонентів програми (зокрема, породжуваних — див. [ru]), подальший контроль безпеки підтримується -системою. Як наслідок, навіть програма, що містить помилку, на Standard ML завжди продовжує поводитися як ML-програма: вона може надовго піти в обчислення або видати користувачеві повідомлення про помилку, але вона не може впасти.
Однак деякі реалізації ([en], Mythryl, [en]) включають нестандартні бібліотеки, що надають певні небезпечні операції (їх ідентифікатори починаються з Unsafe
). Ці можливості необхідні для [en] цих реалізацій, що забезпечує взаємодію з не-ML-кодом (зазвичай це код на C що реалізує критичні за швидкістю компоненти програм), який може вимагати своєрідного бітового подання даних. Крім того, багато реалізацій Standard ML, хоча самі написані на ньому самому, використовують рантайм-систему, написану на C. Іншим прикладом є режим REPL компілятора SML/NJ, який використовує небезпечні операції виконання інтерактивно введеного програмістом коду.
Мова Alice, розширення Standard ML, надає можливості сильної динамічної типізації.
Див. також
Примітки
- Ахо-Сети-Ульман та 1985, 2001, 2003, с. 340, Статическая и динамическая проверка типов.
- Wright, Felleisen, 1992.
- Cardelli - Typeful programming, 1991, с. 3.
- Mitchel - Concepts in Programming Languages, 2004, с. 132—133, 6.2.1 Type Safety.
- Java is not type-safe.
- Harper, 2012, с. 35, Chapter 4. Statics.
- Mitchel - Concepts in Programming Languages, 2004, с. 130, 6.1.2 Type Errors.
- Appel - A Critique of Standard ML, 1992, с. 2, Safety.
- Paulson, 1996, с. 2.
- Milner - A Theory of Type Polymorphism in Programming, 1978.
- Cardelli - Typeful programming, 1991, с. 51, 9.3. Type violations.
- Mitchel - Concepts in Programming Languages, 2004, с. 133—135, 6.2.2 Compile-Time and Run-Time Checking.
- Pierce, 2002, с. 3, 1.1 Типы в информатике.
- Cardelli - Typeful programming, 1991, с. 49, 9.1 Dynamic types.
- C.A.R. Hoare — The Emperor's Old Clothes, Communications of the ACM, 1981
- unsafeCoerce Архівна копія на сайті Wayback Machine. (мова Haskell)
- System.IO.Unsafe Архівна копія на сайті Wayback Machine. (мова Haskell)
- Haskell Is Exceptionally Unsafe.
- Cardelli, Wegner - On Understanding Types, 1985, с. 3, 1.1. Organizing Untyped Universes.
- Common Lisp HyperSpec. оригіналу за 16 червня 2013. Процитовано 26 травня 2013.
- SBCL Manual — Declarations as Assertions. оригіналу за 20 січня 2015. Процитовано 20 січня 2015.
- . Архів оригіналу за 7 січня 2009. Процитовано 23 грудня 2014.
- Appel - A Critique of Standard ML, 1992.
- Robin Milner, Mads Tofte. Commentary on Standard ML. — Universiry of Edinburg, University of Nigeria, 1991. — 7 липня. з джерела 1 грудня 2014.
Література
- Robin Milner. A Theory of Type Polymorphism in Programming. — Jcss, 1978. — Vol. 17 (7 July). — P. 348—375.
- Stavros Macrakis. Safety and power // ACM SIGSOFT Software Engineering Notes. — 1982. — Vol. 7, iss. 2, no. April (7 July). — P. 25—26. — DOI: .
- Luca Cardelli, Peter Wegner. On Understanding Types, Data Abstraction, and Polymorphism. — , 1985. — 7 July. — P. 471—523. — ISSN 0360-0300.
- Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы: принципы, технологии и инструменты. — Addison-Wesley Publishing Company, Издательский дом «Вильямс», 1985, 2001, 2003. — 768 с. — (рус.), 0-201-10088-6 (ориг.).
- [en]. Typeful programming // IFIP State-of-the-Art Reports. — Springer-Verlag, 1991. — Iss. Formal Description of Programming Concepts (7 July). — P. 431—507.
- Andrew W. Appel. A Critique of Standard ML. — Princeton University, revised version of CS-TR-364-92, 1992. — 7 July.
- Andrew K. Wright, [en]. A Syntactic Approach to Type Soundness // Information and Computation. — 1992. — Vol. 115, iss. 1 (7 July). — P. 38—94. — DOI: .
- Lawrence C. Paulson. ML for the Working Programmer. — 2nd. — Cambridge University Press, 1996. — 492 с. — (тверда обкладинка), 0-521-56543-X (м'яка обкладинка).
- Pierce, Benjamin C. Types and Programming Languages. — MIT Press, 2002. — .
- John C. Mitchell. Concepts in Programming Languages. — Cambridge University Press, 2004. — (електронна книга в netLibrary); 0-521-78098-5 (тверда обкладинка).
- Harper. . — version 1.37 (revised 01.11.2014). — licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License, 2012. — 544 с. Архівовано жовтень 24, 2015 на сайті Wayback Machine.
- Vijay Saraswat. Java is not type-safe.
Посилання
- Type Safe. Portland Pattern Repository Wiki. Процитовано 5 лютого 2014.
- . Haskell Is Exceptionally Unsafe.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Tipobezpechnist angl type safety vlastivist movi programuvannya yaka harakterizuye bezpeku ta nadijnist u zastosuvanni yiyi sistemi tipiv Sistemu tipiv nazivayut bezpechnoyu angl safe abo nadijnoyu angl sound yaksho u programah yaki projshli perevirku uzgodzhennya tipiv angl well typed programs abo well formed programs viklyucheno mozhlivist viniknennya pomilok uzgodzhennya tipiv en Pomilka uzgodzhennya tipiv abo pomilka tipizaciyi angl type error neuzgodzhenist tipiv komponentiv viraziv u programi napriklad sproba vikoristati cile chislo yak funkciyu Propusheni pomilki uzgodzhennya tipiv na etapi vikonannya mozhut sprichinyati bagi i navit kreshi program Bezpeka movi ne ye sinonimom povnoyi vidsutnosti bagiv ale shonajmenshe voni stayut doslidzhuvanimi v ramkah semantiki movi formalnoyi abo neformalnoyi Nadijni sistemi tipiv takozh nazivayut silnimi angl strong ale traktuvannya cogo termina chasto pom yakshuyut krim togo jogo chasto zastosovuyut do mov yaki zdijsnyuyut dinamichnu perevirku uzgodzhennya tipiv silna ta slabka tipizaciya Inodi bezpechnist rozglyadayut yak vlastivist konkretnoyi programi a ne movi yakoyu yiyi napisano tomu sho deyaki tipobezpechni movi dozvolyayut obijti abo porushiti sistemu tipiv yaksho programist praktikuye mizernu tipobezpeku Poshirena dumka sho taki mozhlivosti na praktici ye neobhidnimi ale ce vigadka Ponyattya pro bezpechnist programi ye vazhlivim u tomu sensi sho realizaciya bezpechnoyi movi sama mozhe buti nebezpechnoyu Rozkrutka kompilyatora virishuye cyu problemu zabezpechuyuchi movi bezpechnist ne lishe v teoriyi ale j na praktici PodrobiciRobinu Milneru nalezhit viraz Programi sho projshli perevirku tipiv ne mozhut zbitisya zi shlyahu istinnogo Tobto bezpechna sistema tipiv zapobigaye svidomo pomilkovim operaciyam pov yazanim iz hibnimi tipami Napriklad viraz 8 Hello World ochevidno ye pomilkovim oskilki arifmetika ne viznachaye operaciyi dilennya chisla na ryadok Formalno bezpechnist oznachaye garantiyu togo sho znachennya bud yakogo virazu yakij projshov perevirku tipiv i maye tip t ye istinnim elementom mnozhini znachen t tobto lezhatime v mezhah diapazonu znachen dopustimogo statichnim tipom cogo virazu Naspravdi u cij vimozi ye nyuansi div en ta skladni vipadki polimorfizmu Krim togo intensivne vikoristannya mehanizmiv viznachennya novih tipiv zapobigaye logichnim pomilkam yaki pohodyat iz semantiki riznih tipiv Napriklad i milimetri i dyujmi ye odinicyami dovzhini i mozhut buti podani cilimi chislami ale bude pomilkoyu vidnimati dyujmi vid milimetriv i rozvinena sistema tipiv ne dopustit cogo zrozumilo za umovi sho programist vikoristovuye dlya znachen virazhenih u riznih odinicyah rizni tipi danih a ne opisuye i ti j inshi yak zminni cilogo tipu Inshimi slovami bezpechnist movi oznachaye sho mova zahishaye programista vid jogo vlasnih mozhlivih pomilok Bagato mov sistemnogo programuvannya napriklad Ada Si C peredbachayut nenadijni angl unsound abo nebezpechni angl unsafe operaciyi priznacheni dlya mozhlivosti porushiti angl violate sistemu tipiv div Zvedennya tipiv i Kalambur tipizaciyi V odnih vipadkah ce dopuskayetsya lishe v obmezhenih chastinah programi v inshih ne vidriznyayetsya vid dobre tipizovanih operacij U mejnstrimi utochniti neridko ponyattya tipobezpeki zvuzhuyut do bezpechnosti tipiv shodo dostupu do pam yati angl memory type safety sho oznachaye sho komponenti ob yektiv odnogo agregatnogo tipu ne mozhut zvertatisya do komirok pam yati vidilenih pid ob yekti inshogo tipu Bezpeka dostupu do pam yati oznachaye zaboronu mozhlivosti skopiyuvati dovilnij bitovij lancyuzhok z odniyeyi dilyanki pam yati v inshu Napriklad yaksho mova peredbachaye tip t sho maye obmezhenij spektr dopustimih znachen i nadaye mozhlivist skopiyuvati netipizovani dani v zminnu cogo tipu to ce ne ye tipobezpechnim oskilki potencijno dopuskaye sho zminna tipu t matime znachennya yake ne ye dopustimim dlya tipu t I zokrema yaksho taka nebezpechna mova dozvolyaye zapisati dovilne cile znachennya v zminnu sho maye tip vkazivnik to nebezpechnist dostupu do pam yati ochevidna div Zavisli vkazivniki Prikladami nebezpechnih mov ye C i C U spilnotah cih mov chasto nazivayut bezpechnimi bud yaki operaciyi yaki bezposeredno ne prizvodyat do padinnya programi Bezpeka dostupu do pam yati takozh zapobigaye mozhlivosti perepovnennya bufera napriklad sprobi zapisu velikorozmirnih ob yektiv u komirki vidileni dlya ob yektiv inshogo tipu menshogo rozmiru Nadijni statichni sistemi tipiv konservativni nadlishkovi v tomu sensi sho vidkidayut navit programi yaki vikonalisya b korektno Prichina cogo polyagaye v tomu sho dlya bud yakoyi tyuring povnoyi movi mnozhina program yaki mozhut porodzhuvati pomilki uzgodzhennya tipiv pid chas vikonannya algoritmichno nerozv yazna div Problema zupinki Yak naslidok taki sistemi tipiv zabezpechuyut stupin zahistu suttyevo vishij nizh ce neobhidno dlya zabezpechennya bezpeki dostupu do pam yati Z inshogo boku bezpechnist deyakih dij nemozhlivo dovesti statichno yiyi slid kontrolyuvati dinamichno napriklad indeksaciya masivu z dovilnim dostupom Takij kontrol mozhe zdijsnyuvatisya abo en samoyi movi abo bezposeredno funkciyami sho realizuyut podibni potencijno nebezpechni operaciyi Silno dinamichno tipizovani movi napriklad Lisp Smalltalk ne dopuskayut poshkodzhennya danih zavdyaki tomu sho programa yaka namagayetsya peretvoriti znachennya do nesumisnogo tipu porodzhuye vinyatok Do perevag silnoyi dinamichnoyi tipizaciyi pered tipobezpechnistyu mozhna vidnesti vidsutnist konservativnosti yak naslidok rozshirennya spektra rozv yazuvanih zavdan programuvannya Cinoyu cogo staye neminuche znizhennya shvidkodiyi program a takozh neobhidnist znachno bilshoyi kilkosti probnih zapuskiv dlya viyavlennya mozhlivih pomilok Tomu bagato mov kombinuyut u toj chi inshij sposib mozhlivosti statichnogo ta dinamichnogo kontrolyu uzgodzhennya tipiv Prikladi bezpechnih movAda Ada najbilsh tipobezpechna mova v simejstvi Paskalyu oriyentovana na rozrobku nadijnih vbudovuvanih sistem drajveriv ta inshi zavdannya sistemnogo programuvannya Dlya realizaciyi kritichnih sekcij Ada nadaye nizku nebezpechnih konstrukcij imena yakih zazvichaj pochinayutsya z Unchecked Mova SPARK ye pidmnozhinoyu Adi Z nogo usunuto nebezpechni mozhlivosti ale dodano mozhlivosti proyektuvannya za kontraktom SPARK viklyuchaye mozhlivist viniknennya zavislih vkazivnikiv za dopomogoyu viklyuchennya mozhlivosti dinamichnogo vidilennya pam yati Statichno pereviryuvani kontrakti dodano do Ada2012 Goar u tyuringivskij lekciyi stverdzhuvav sho zadlya zabezpechennya nadijnosti malo statichnih perevirok nadijnist nasampered ye naslidkom prostoti Todi zh vin peredbachiv sho skladnist Adi sprichinit katastrofi BitC gibridna mova sho kombinuye nizkorivnevi mozhlivosti Si z bezpekoyu Standard ML ta lakonichnistyu Scheme BitC oriyentovana na rozrobku nadijnih vbudovuvanih sistem drajveriv ta virishennya inshih zavdan sistemnogo programuvannya Cyclone Doslidnicka mova Cyclone ye bezpechnim dialektom movi C sho zapozichuye bagato idej z ML zokrema tipobezpechnij Priznachena dlya tih samih zavdan sho j C i pislya zdijsnennya vsih perevirok kompilyator porodzhuye kod na ANSI C Ne potrebuye dlya zabezpechennya dinamichnoyi bezpeki virtualnoyi mashini abo zbirannya smittya natomist zasnovana na en Cyclone vstanovlyuye vishu planku vimog bezpeki sircevogo kodu i cherez nebezpechnist prirodi C portuvannya navit prostih program iz C na Cyclone mozhe vimagati pevnoyi roboti hocha chimalu yiyi chastinu mozhna prorobiti v ramkah C do zmini kompilyatora Tomu Cyclone chasto viznachayut ne yak dialekt C a yak movu sintaksichno i semantichno shozhu na C Rust Bagato idej Cyclone vtileno v movi Rust Krim silnoyi statichnoyi tipizaciyi u movu dodano statichnij analiz chasu zhittya vkazivnikiv zasnovanij na koncepciyi volodinnya Realizovano statichni obmezhennya sho blokuyut potencijno nekorektnij dostup do pam yati vidsutni nulovi vkazivniki nemozhliva poyava neinicializovanih ta deinicializovanih zminnih zaboroneno spilne vikoristannya zminyuvanih zminnih kilkoma zavdannyami Perevirka na vihid za mezhi masivu ye obov yazkovoyu Haskell Haskell nashadok ML spochatku rozroblyavsya yak mova sho malo zrobiti povedinku program neyu she bilsh peredbachuvanoyu nizh rannimi dialektami ML Odnak piznishe do standartu movi dodano nebezpechni operaciyi neobhidni u povsyakdennij praktici hocha j poznacheni vidpovidnimi identifikatorami pochinayutsya z unsafe Haskell takozh nadaye mozhlivosti slabkoyi dinamichnoyi tipizaciyi i do standartu movi vklyucheno realizaciyu mehanizmu obrobki vinyatkiv za dopomogoyu cih mozhlivostej Yiyi vikoristannya mozhe prizvoditi do avarijnogo zavershennya program za sho en nazvav Haskell viklyuchno nebezpechnim Vin vvazhaye neprijnyatnim toj fakt sho vinyatki mayut tip viznachenij koristuvachem u konteksti klasu tipiv Typeable z urahuvannyam togo sho vinyatki generuye bezpechnij kod za mezhami IO i klasifikuye povidomlennya pro vnutrishnyu pomilku yake vidaye kompilyator yak nevidpovidne gaslu Milnera V obgovorenni pokazano yak mozhna bulo b realizuvati v Haskell i statichno tipobezpechni vinyatki v stili Standard ML Lisp Chistij minimalnij Lisp ye odnotipovoyu movoyu tobto bud yaka konstrukciya nalezhit do tipu S viraz hocha navit pershi promislovi realizaciyi Lisp peredbachali prinajmni pevnu kilkist en Simejstvo nashadkiv movi Lisp utvoryuyut perevazhno dinamichno tipizovani movi ale isnuyut statichno tipizovani i taki sho poyednuyut obidvi formi tipizaciyi Common Lisp ye silno dinamichno tipizovanoyu movoyu ale peredbachaye mozhlivist yavno en priznachati tipi a kompilyator SBCL zdatnij sam yih vivoditi odnak cya mozhlivist vikoristovuyetsya dlya optimizaciyi ta posilennya dinamichnih perevirok i ne oznachaye statichnoyi tipobezpeki Programist z metoyu pidvishennya shvidkodiyi mozhe vstanoviti dlya kompilyatora znizhenij riven dinamichnih perevirok i todi skompilovanu programu vzhe ne mozhna vvazhati bezpechnoyu Mova Scheme takozh ye dinamichno tipizovanoyu movoyu ale kompilyator en statichno vivodit tipi vikoristovuyuchi yih dlya agresivnoyi optimizaciyi program Movi Typed Racket rozshirennya Racket Scheme i tipobezpechni Clojure poyednuye silnij dinamichnij ta statichnij kontrol tipiv ML Spochatku mova ML rozroblyalasya yak interaktivna sistema dovedennya teorem i lishe zgodom stala samostijnoyu kompilovanoyu movoyu zagalnogo priznachennya Bagato zusil bulo pridileno dovedennyu nadijnosti sistemi tipiv Gindli Milnera sho lezhit v osnovi ML Dovedennya nadijnosti pobudovano dlya pidmnozhini Fuctional ML rozshirennya posilalnimi tipami Reference ML rozshirennya vinyatkami Exception ML dlya movi sho ob yednuye vsi ci rozshirennya Core ML i nareshti jogo rozshirennya pershoklasnimi prodovzhennyami Control ML spershu monomorfnimi potim polimorfnimi Naslidkom cogo stalo te sho nashadki ML najchastishe apriori vvazhayutsya tipobezpechnimi navit popri sho deyaki z nih vidkladayut znachushi perevirki na programi OCaml abo vidhilyayutsya vid semantiki dlya yakoyi pobudovano dovedennya nadijnosti i mistyat nebezpechni mozhlivosti yavno Haskell Movam simejstva ML harakterna rozvinena pidtrimka algebrichnih tipiv danih vikoristannya yakih suttyevo spriyaye zapobigannyu logichnih pomilok sho takozh pidtrimuye vrazhennya tipobezpeki Deyaki nashadki ML takozh ye instrumentami interaktivnogo dovedennya en en Agda Bagato hto z nih hocha j mogli b vikoristovuvatisya dlya bezposerednoyi rozrobki program iz dovedenoyu nadijnistyu chastishe vikoristovuyutsya dlya verifikaciyi program inshimi movami z takih prichin yak visoka trudomistkist vikoristannya nizka shvidkodiya vidsutnist en tosho Sered nashadkiv ML iz dovedenoyu nadijnistyu vidilyayutsya yak oriyentovani na promislove zastosuvannya movi Standard ML i prototip jogo podalshogo rozvitku successor ML ranishe vidoma yak ML2000 Standard ML Mova Standard ML starsha v simejstvi mov ML oriyentovana na rozrobku en program promislovoyi shvidkodiyi Mova maye stroge formalne viznachennya ta dovedenu statichnu ta dinamichnu bezpechnist Pislya statichnoyi perevirki uzgodzhenosti interfejsiv komponentiv programi zokrema porodzhuvanih div ru podalshij kontrol bezpeki pidtrimuyetsya sistemoyu Yak naslidok navit programa sho mistit pomilku na Standard ML zavzhdi prodovzhuye povoditisya yak ML programa vona mozhe nadovgo piti v obchislennya abo vidati koristuvachevi povidomlennya pro pomilku ale vona ne mozhe vpasti Odnak deyaki realizaciyi en Mythryl en vklyuchayut nestandartni biblioteki sho nadayut pevni nebezpechni operaciyi yih identifikatori pochinayutsya z Unsafe Ci mozhlivosti neobhidni dlya en cih realizacij sho zabezpechuye vzayemodiyu z ne ML kodom zazvichaj ce kod na C sho realizuye kritichni za shvidkistyu komponenti program yakij mozhe vimagati svoyeridnogo bitovogo podannya danih Krim togo bagato realizacij Standard ML hocha sami napisani na nomu samomu vikoristovuyut rantajm sistemu napisanu na C Inshim prikladom ye rezhim REPL kompilyatora SML NJ yakij vikoristovuye nebezpechni operaciyi vikonannya interaktivno vvedenogo programistom kodu Mova Alice rozshirennya Standard ML nadaye mozhlivosti silnoyi dinamichnoyi tipizaciyi Div takozh en Kresh Teoriya tipiv Formalna verifikaciya Avtomatichne dovedennya teorem Privedennya tipiv Kalambur tipizaciyiPrimitkiAho Seti Ulman ta 1985 2001 2003 s 340 Staticheskaya i dinamicheskaya proverka tipov Wright Felleisen 1992 Cardelli Typeful programming 1991 s 3 Mitchel Concepts in Programming Languages 2004 s 132 133 6 2 1 Type Safety Java is not type safe Harper 2012 s 35 Chapter 4 Statics Mitchel Concepts in Programming Languages 2004 s 130 6 1 2 Type Errors Appel A Critique of Standard ML 1992 s 2 Safety Paulson 1996 s 2 Milner A Theory of Type Polymorphism in Programming 1978 Cardelli Typeful programming 1991 s 51 9 3 Type violations Mitchel Concepts in Programming Languages 2004 s 133 135 6 2 2 Compile Time and Run Time Checking Pierce 2002 s 3 1 1 Tipy v informatike Cardelli Typeful programming 1991 s 49 9 1 Dynamic types C A R Hoare The Emperor s Old Clothes Communications of the ACM 1981 unsafeCoerce Arhivna kopiya na sajti Wayback Machine mova Haskell System IO Unsafe Arhivna kopiya na sajti Wayback Machine mova Haskell Haskell Is Exceptionally Unsafe Cardelli Wegner On Understanding Types 1985 s 3 1 1 Organizing Untyped Universes Common Lisp HyperSpec originalu za 16 chervnya 2013 Procitovano 26 travnya 2013 SBCL Manual Declarations as Assertions originalu za 20 sichnya 2015 Procitovano 20 sichnya 2015 Arhiv originalu za 7 sichnya 2009 Procitovano 23 grudnya 2014 Appel A Critique of Standard ML 1992 Robin Milner Mads Tofte Commentary on Standard ML Universiry of Edinburg University of Nigeria 1991 7 lipnya z dzherela 1 grudnya 2014 LiteraturaRobin Milner A Theory of Type Polymorphism in Programming Jcss 1978 Vol 17 7 July P 348 375 Stavros Macrakis Safety and power ACM SIGSOFT Software Engineering Notes 1982 Vol 7 iss 2 no April 7 July P 25 26 DOI 10 1145 1005937 1005941 Luca Cardelli Peter Wegner On Understanding Types Data Abstraction and Polymorphism 1985 7 July P 471 523 ISSN 0360 0300 Alfred Aho Ravi Seti Dzheffri Ulman Kompilyatory principy tehnologii i instrumenty Addison Wesley Publishing Company Izdatelskij dom Vilyams 1985 2001 2003 768 s ISBN 5 8459 0189 8 rus 0 201 10088 6 orig en Typeful programming IFIP State of the Art Reports Springer Verlag 1991 Iss Formal Description of Programming Concepts 7 July P 431 507 Andrew W Appel A Critique of Standard ML Princeton University revised version of CS TR 364 92 1992 7 July Andrew K Wright en A Syntactic Approach to Type Soundness Information and Computation 1992 Vol 115 iss 1 7 July P 38 94 DOI 10 1006 inco 1994 1093 Lawrence C Paulson ML for the Working Programmer 2nd Cambridge University Press 1996 492 s ISBN 0 521 57050 6 tverda obkladinka 0 521 56543 X m yaka obkladinka Pierce Benjamin C Types and Programming Languages MIT Press 2002 ISBN 0 262 16209 1 John C Mitchell Concepts in Programming Languages Cambridge University Press 2004 ISBN 0 511 04091 1 elektronna kniga v netLibrary 0 521 78098 5 tverda obkladinka Harper version 1 37 revised 01 11 2014 licensed under the Creative Commons Attribution Noncommercial No Derivative Works 3 0 United States License 2012 544 s Arhivovano zhovten 24 2015 na sajti Wayback Machine Vijay Saraswat Java is not type safe PosilannyaType Safe Portland Pattern Repository Wiki Procitovano 5 lyutogo 2014 Haskell Is Exceptionally Unsafe