Категоризація типів систем (сильна / слабка, динамічна / статична)


23

Якщо коротко: як класифікуються системи типів в академічному контексті; зокрема, де я можу знайти авторитетні джерела, які роблять чіткими відмінності між різними типами системи?

У певному сенсі складність цього питання полягає не в тому, що я не можу знайти відповідь, а в тому, що я можу знайти занадто багато, і жодне не виділяється як правильне. Фон полягає в тому, що я намагаюся вдосконалити статтю у вікі Haskell про введення тексту , яка наразі вимагає таких відмінностей:

  • Немає введення тексту: Мова не має поняття типів або з введеної точки зору. У мові існує точно один тип. Мова складання має лише тип 'бітовий шаблон', у Rexx та Tk є лише тип 'текст', в ядрі MatLab є лише тип 'складнозначна матриця'.
  • Слабке введення тексту: Є лише кілька виділених типів і, можливо, введіть синоніми для кількох типів. Напр. C використовує цілі числа для булевих, цілих чисел, символів, наборів бітів та перерахувань.
  • Сильне введення тексту: Дрібнозернистий набір типів, таких як ада, віртська мова (Паскаль, Модула-2), Ейфелева

Це цілком суперечить моєму особистому сприйняттю, яке більше відповідало:

  • Слабка типізація: Об'єкти мають типи, але неявно перетворюються на інші типи, коли цього вимагає контекст. Наприклад, Perl, PHP та JavaScript - це всі мови, на яких "1"можна використовувати більш-менш будь-який контекст 1.
  • Сильне введення тексту: Об'єкти мають типи, і немає неявних перетворень (хоча перевантаження може використовуватися для їх моделювання), тому використання об'єкта в неправильному контексті є помилкою. У Python індексація масиву з рядком або float кидає виняток TypeError; в Haskell це не вдасться під час компіляції.

Я попросив думки з цього приводу у інших людей більш досвідчених у цій галузі, ніж я, і хто дав цю характеристику:

  • Слабка типізація: Виконання недійсних операцій над даними не контролюється та не відхиляється, а лише дає недійсні / довільні результати.
  • Сильне введення тексту: Операції над даними дозволяються лише у випадку, якщо дані сумісні з операцією.

Як я розумію, перша і остання характеристики називали б C слабо типованою, друга - назвала б сильно типізованою. Перші та другі називають Perl та PHP слабко типізованими, треті називають їх сильно набраними. Усі троє описують Python як сильно типізований.

Я думаю, що більшість людей сказали б мені «добре, немає єдиної думки, немає прийнятого значення термінів». Якщо ці люди не праві, я був би радий почути про це, але якщо вони мають рацію, то як же дослідники CS описати і порівняти системи типів? Яку термінологію я можу використовувати, що менш проблематично?

Як пов'язане з цим питання, я вважаю, що динамічне / статичне розмежування часто дається у термінах "час компіляції" та "час запуску", що я вважаю незадовільним, враховуючи, що мова чи мова складена не стільки властивість цієї мови як його реалізації. Я вважаю, що має бути суто семантичний опис динамічної та статичної типізації; щось уздовж рядків "статична мова - це та, в якій може бути введено кожний підвираз". Буду вдячний за будь-які думки, зокрема посилання, які б пояснили це поняття.


6
Я думаю, ви вже маєте свою відповідь: не існує прийнятого визначення слабкого та сильного набору тексту.
svick

Мені не було б важко повірити, але я задаю це питання з надією, що є таке, про яке я просто не чув :) або принаймні визначення більш авторитетне, ніж те, що такий хлопець, який редагував вікі, вважає, що це так .
Бен Міллвуд

3
Щоб отримати докладнішу інформацію про це, дивіться це питання, пов'язане із питаннями SO .
svick

1
Щоб підкріпити точку svick, неможливо знайти посилання авторитету на те, що не прийнято. Все, що претендує на авторське право, просто було б помилковим (оскільки будь-яка кількість зустрічних прикладів може бути надана).
edA-qa mort-ora-y

Ну, є різниця між тим, хто пише документ, який говорить "ось Єдине істинне визначення, з яким всі згодні", і хтось пише папір, який говорить "ось визначення, які я збираюся використовувати для цього документу, хоча я знаю, що є інші ". Навіть останнє було б краще, ніж те, що я знаю до цих пір. Я думаю , що ви маєте рацію , хоча, в цьому випадку, то , що у людей повинні сказати про різні види системи типу? Чи принаймні конкретна динамічна / статична відмінність?
Бен Міллвуд

Відповіді:


18

Історично історично термін "сильно набрана мова програмування" вжив у 70-х роках у відповідь на існуючі широко використовувані мови програмування, більшість з яких мали отвори типу. Деякі приклади:

  • У Fortran існували речі, які називаються областями зберігання "COMMON", які можна було б поділити між модулями, але не було перевірок, щоб кожен модуль декларував вміст сховища COMMON однаковими типами. Отже, один модуль міг оголосити, що певний блок зберігання COMMON мав ціле число, а інший - число з плаваючою точкою, і в результаті дані будуть пошкоджені. У Fortran також були заяви "EQUIVALENCE", згідно з якими одне і те ж сховище може бути оголошено таким, що містить два різних об'єкти різних типів.

  • В Algol 60 тип параметрів процедури оголошувався як просто "процедура", не вказуючи типи параметрів процедури. Отже, можна припустити, що параметр процедури був процедурою, що приймає цілі числа, але передається в якості аргументу реально приймаючої процедури. Це призвело б до того ж виду корупції, що і твердження COMMON та EQUIVALENCE. (Однак Алгол 60 усунув старі проблеми.)

  • У Паскалі були додані "варіанти записів", які були майже так само, як і колишні висловлювання EQUIVALENCE.

  • У C додано "касти типів", за допомогою яких будь-який тип даних може бути переосмислений як дані іншого типу. Це була досить навмисна дірка, призначена для програмістів, які нібито знають, що роблять.

Сильно набрані мови, розроблені в 70-х роках, мали на меті усунути всі подібні отвори. Якщо вивчити, що це означає, це означає, що представлення даних захищено. Неможливо переглядати об'єкт даних одного типу як об'єкт іншого типу, який, мабуть, має такий самий бітовий зразок, що і його внутрішнє подання. Теоретики почали використовувати термін "незалежність представництва" для характеристики цієї властивості замість розпливчастої ідеї "сильного введення тексту".

Зауважте, що динамічно набрані мови, такі як Lisp, які виконують повну перевірку типу виконання, "сильно набираються" в сенсі захисту представлень. У той же час статично набрані мови втратять незалежність представництва, якщо вони не перевіряють межі масивів. Отже, вони не "сильно набрані" у строгому розумінні цього терміна. Через ці аномальні наслідки термін "сильно набраний" вийшов з ладу після 70-х років. Коли Міністерство оборони США розробило суворі вимоги до дизайну Ада, вони включили вимогу, що мова повинна бути "сильно набрана". (Схоже, в той час вважалося, що ідея "сильно набраного" була само собою зрозумілою. Жодного визначення не пропонувалося. ) Усі мовні пропозиції, подані у відповідь, стверджували, що вони "набрані". Коли Дайкстра проаналізував усі мовні пропозиції, він виявив, що жодна з них не була сильно набрана, і насправді навіть не було зрозуміло, що означає цей термін. Дивіться звітEWD663 . Однак я бачу, що цей термін повертається до вживання зараз через молоде покоління дослідників, які не знають картату історію цього терміна.

Термін "статично набраний" означає, що всі перевірки типу проводяться статично і жодних помилок типу не виникне під час виконання. Якщо мова також сильно набрана, це означає, що під час виконання дійсно немає помилок типу . Якщо, з іншого боку, в системі типів є отвори типу, відсутність помилок типу запуску часу нічого не означає. Результати можуть бути повністю корумпованими.

Нова дискусія про "сильний та слабкий набір тексту", здається, стосується того, чи слід допускати певні перетворення. Дозволити рядок, де потрібно ціле число, є "слабким набором тексту" відповідно до цих людей. У цьому є певний сенс, оскільки спроба перетворити рядок у ціле число може бути невдалою, якщо рядок не представляє собою ціле число. Однак перетворення цілого числа в рядок не має такої проблеми. Це може бути випадком "слабкого набору тексту" відповідно до цих людей? Я поняття не маю. Я зауважую, що у Вікіпедії дискусії про "слабкий набір тексту" не цитують жодних рецензованих публікацій. Я не вірю, що це цілісна ідея.

Зауваження додано : Основним моментом є те, що термін "сильний набір тексту" не став використовуватись як технічний термін із суворим визначенням. Це було більше схоже на те, що деякі дизайнери мови вважали: "наша система типу є сильною; вона фіксує помилки всіх типів; у ній немає отворів типу", і, коли вони опублікували мовну конструкцію, вони заявили, що вона "сильно набрана" . Це гучне слово звучало добре, і люди почали його використовувати. Папір Карделлі-Вегнера був першим, який я побачив, де був наданий аналіз на те, що це означає. Мій пост тут слід розглядати як уточнення їхньої позиції.


Чи можете ви дати кілька посилань на історичний розвиток? "відсутність помилок типу виконання часу нічого не означає" - ви маєте на увазі тут час збирання?
Рафаель

Ось документ про Евкліда, який з’явився в Google Scholar. Пригадую, я бачив у 70-х роках кілька статей, де мови, як заявляли, були сильно набрані. Це, як правило, вважалося кроком продажу.
Удай Редді

1
@Raphael. Я мав на увазі "помилки типу виконання". Щоб потрапити на час запуску, програмі доведеться в першу чергу пройти перевірку статичного типу. Справа в тому, що сильно набрана мова, наприклад, Java, видасть помилки типу під час виконання, коли вона не може перевірити їх під час компіляції. Мова з отворами типу, наприклад, C, дозволить час виробляти сміття замість помилок.
Удай Редді

1
@benmachine. Дивіться розділ "Перевірка типу" в роботі, яку я цитував. Я думаю, що головне в тому, що "сильно набрано" - це гучне слово. Це не технічне поняття. У кращому випадку, технічний зміст цього означає, що немає типових отворів.
Удай Редді

1
У типовій сучасній реалізації, де два різних цілих типи мають однакове представлення (наприклад, обидва intі longмають 32 біти, або обидва, longі long longмають 64, програма, яка використовує вказівник на один такий тип, щоб написати деякий сховище і використовує вказівник іншого типу його читання, як правило, не спровокує виявлену помилку під час виконання, але може довільно несправно працювати іншими способами. Модерн C таким чином втрачає присутність безпеки інших типів інших мов, не отримуючи жодної семантики, якою були якісні реалізації мови Річчі раніше пропонували в обмін.
supercat

7

У статті Удай Редді, знайденій у своїй відповіді « Про розуміння типів, абстрагування даних та поліморфізм (1985), даються такі відповіді:

Мови програмування, в яких тип кожного виразу може бути визначений статичним програмним аналізом, вважаються статично набраними. Статична типізація є корисною властивістю, але вимога, що всі змінні та вирази прив'язуються до типу під час компіляції, іноді занадто обмежує. Це може бути замінено слабшою вимогою, щоб всі вирази були гарантовані як відповідність типу, хоча сам тип може бути статично невідомим; це, як правило, можна зробити, ввівши деяку перевірку типу виконання. Мови, в яких всі вирази відповідають типу, називаються сильно набраними мовами. Якщо мова сильно набрана, її компілятор може гарантувати, що програми, які вона приймає, виконуватимуться без помилок типу. Взагалі, ми повинні прагнути до сильного набору тексту та приймати статичне введення тексту, коли це можливо.


розміщено як вікі спільноти, оскільки я не заслуговую на те, щоб визнати це.
Бен Міллвуд

Проблема, яку я маю тут, пов'язана з першим коментарем svick. Хоча може бути приємно, що ви знайшли визначення сильного введення тексту, це, звичайно, не є загальноприйнятим визначенням.
edA-qa mort-ora-y

@ edA-qamort-ora-y: на чому ви це говорите? Чи є у вас щось краще, ніж анекдотичні докази того, що є і що не прийнято? Будь-які цитати? (Я розумію, що у вас може бути поважна точка, навіть якщо ні, але я все ж думаю, що вищезазначене відповідає на моє питання; навіть якщо консенсусу немає, добре знати хоча б один із серйозних академічних відповідей).
Бен Міллвуд

1
Я не можу реально довести відсутність узгодженого визначення, чи можу я? Логічно це неможливо. Однак статті у Вікіпедії про сильну машинопис вказують на багато доказів та посилань на незгоду та суперечливість. en.wikipedia.org/wiki/Strong_typing
edA-qa mort-ora-y

@ edA-qamort-ora-y: Цитати з Вікіпедії насправді не дуже корисні: деякі не є академічними, інші наводяться з інших причин, ніж визначення термінів. Документ про програмування здається багатообіцяючим, але лише дуже коротко посилається на визначення; можливо, варто все-таки відредагувати свою відповідь. Що стосується підтвердження відсутності, я думаю, що доказів суперечок / незгод серед людей, які знають, про що вони говорять, був би достатнім для мене (що, справді, Докладний програмовий документ може дати мені).
Бен Мілвуд

6

Авторитетні відповіді можна знайти у статті опитування Карделлі та Вегнера: Про розуміння типів, абстрагування даних та поліморфізм .

Зауважте, що "сильне введення тексту" має загальноприйняте значення, "слабке введення тексту" не означає. Будь-який збій із сильним набором тексту може бути визнаний слабким, а люди можуть відрізнятись тим, який тип відмови прийнятний, а який - ні.



Відмінно, це саме те, що я хотів. У документі читається трохи, тому я думаю, що слід відповісти, що підсумовує чіткі моменти. Чи слід редагувати їх у вашій відповіді чи публікувати власну відповідь у вікі? У будь-якому випадку я збираюся дати йому ще пару днів, якщо хтось ще має вклад, то прийміть все, що залишилося :)
Бен Міллвуд,

@benmachine. Повний документ заслуговує на читання, але концептуальні питання високого рівня висвітлюються лише у перших кількох розділах.
Удай Редді

4
Я все ще думаю, що це слід підсумувати на цій сторінці. Посилання може закінчитися пізніше.
Бен Міллвуд

@benmachine. Ви можете залишити резюме як власну відповідь на своє запитання.
Удай Редді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.