Чи є альтернативи типам для статичного аналізу?


18

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

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

Пов'язана річ , мені було цікаво , про те, чи є якісь - або не-декларативні способи зробити статичний аналіз (типи декларативні, здебільшого ).

Відповіді:


24

Системи статичного типу - це різновид статичного аналізу, але існує багато статичних аналізів, які зазвичай не кодуються в системах типу. Наприклад:

  • Перевірка моделі - це метод аналізу та верифікації для одночасних систем, який дозволяє довести, що ваша програма добре поводиться під усіма можливими переплетеннями потоків.

  • Аналіз потоку даних збирає інформацію про можливі значення змінних, яка може визначити, чи є деякі обчислення зайвими, чи якась помилка не враховується.

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

  • Логіка розділення - це логіка програми (використовується, наприклад, в аналізаторі Infer ), яка може використовуватися для міркування про програмні стани та виявлення таких проблем, як нульові перенаправлення покажчика, недійсні стани та витоки ресурсів.

  • Програмування на основі контракту - це засіб уточнення передумов, постумов, побічних ефектів та інваріантів. Ада має вбудовану підтримку контрактів і може перевірити деякі з них статично.

Оптимізація компіляторів робить багато невеликих аналізів з метою побудови проміжних структур даних для використання під час оптимізації - такі як SSA, кошторис вкладених витрат, інформація про пару інструкцій тощо.

Інший приклад недекларативного статичного аналізу знайдений у контролері типу Hack , де нормальні конструкції керуючого потоку можуть уточнити тип змінної:

$x = get_value();
if ($x !== null) {
    $x->method();    // Typechecks because $x is known to be non-null.
} else {
    $x->method();    // Does not typecheck.
}

І якщо говорити про «очищення», то в землях систем типів, типів уточнення (як це використовується в LiquidHaskell ) типів пар з предикатами, які гарантовано зберігаються для екземплярів типу «уточнений». І залежні типи беруть це далі, дозволяючи типам залежати від значень. «Привіт світ» залежного введення тексту зазвичай є функцією конкатенації масиву:

(++) : (a : Type) -> (m n : Nat) -> Vec a m -> Vec a n -> Vec a (m + n)

Тут ++береться два операнди типу Vec a mі Vec a n, будучи векторами з типом елементів aі довжинами mі, nвідповідно, є натуральними числами ( Nat). Він повертає вектор того ж типу елемента, довжина якого становить m + n. І ця функція доводить це обмеження абстрактно, не знаючи конкретних значень mі n, тому довжини векторів можуть бути динамічними.


Що таке система типів? Я розумію, що насправді не знаю. Визначення у Вікіпедії є круговим: en.wikipedia.org/wiki/Type_system
Макс Хейбер

1
@mheiber: статична система типу А просто статичний аналіз, типи приписуючи (наприклад, int, int -> int, forall a. a -> a) з точки зору (наприклад, 0, (+ 1), \x -> x). Інші аналізи можуть приписувати різні властивості, не пов'язані з типом даних, наприклад, побічні ефекти ( pure, io), видимість ( public, private) або стан ( open, closed). На практиці багато з цих властивостей можна перевірити в тій же реалізації, що і перевірка / умовивід типу, тому відмінність не є абсолютно чіткою.
Джон Перді

4

@ JonPurdy відповідь краще, але я хотів би додати ще кілька прикладів:

Очевидно:

  • перевірка синтаксису

  • накладки

Неочевидне:

  • Іржа дає програмісту можливість вказати, чи є "прив'язки" змінними , і виконує ці обмеження.

  • Це пов'язано з родом: деякі мови дозволяють запускати деякий код під час компіляції, а це означає, що багато речей, які в іншому випадку могли б бути помилками виконання, можуть бути зафіксовані під час компіляції. Деякі приклади - макроси та німські процедури, позначені compileTimeпрагмою .

  • Логічне програмування - це в основному побудова програми шляхом надання тверджень.

Напівстатичне введення тексту:

  • Facebook Flow забезпечує можливість гібриду між динамічним та статичним введенням тексту. Ідея полягає в тому, що навіть динамічний код неявно набирається. Потік дозволяє запустити сервер, який дивиться ваш код під час його запуску для виявлення можливих помилок типу, навіть якщо ви не вводите анотацію своїх функцій.

1

Типовий аналіз не означає багато.

Як відомо, у Agda є система типу Тюрінга, що відрізняється (і набагато складніше обчислити), ніж мови ML (наприклад, Ocaml ).


Агда, докладає великих зусиль, щоб не було системи типу "повний тип Тьюрінга" і навіть не було "термінової системи Тьюрінга".
user833970
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.