Системи статичного типу - це різновид статичного аналізу, але існує багато статичних аналізів, які зазвичай не кодуються в системах типу. Наприклад:
Перевірка моделі - це метод аналізу та верифікації для одночасних систем, який дозволяє довести, що ваша програма добре поводиться під усіма можливими переплетеннями потоків.
Аналіз потоку даних збирає інформацію про можливі значення змінних, яка може визначити, чи є деякі обчислення зайвими, чи якась помилка не враховується.
Абстракційна інтерпретація консервативно моделює ефекти програми, зазвичай таким чином, що аналіз гарантовано закінчується, - типові шашки можуть бути реалізовані аналогічно до абстрактних перекладачів.
Логіка розділення - це логіка програми (використовується, наприклад, в аналізаторі 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
, тому довжини векторів можуть бути динамічними.