Про що ми в кінцевому підсумку говоримо тут - це час збирання та час виконання.
Скомпілюйте помилки в часі, якщо ви подумаєте про це, в кінцевому рахунку, це означає, що компілятор зможе визначити, які проблеми у вашій програмі ще до її запуску. Це, очевидно, не компілятор "довільної мови", але я повернусь до цього незабаром. Компілятор, у всій своїй безмежній мудрості, однак , не перелічити всі проблеми , які можуть бути визначені компілятором. Це частково залежить від того, наскільки добре написаний компілятор, але першопричиною цього є те, що багато часу визначається під час виконання .
Помилки під час виконання, як ви добре знаєте, я впевнений, як і я, - це будь-який тип помилок, який трапляється під час виконання самої програми. Це включає поділ на нуль, винятки з нульовим вказівником, проблеми з обладнанням та багато інших факторів.
Характер помилок виконання означає, що ви не можете передбачити вказані помилки під час компіляції. Якби ви могли, їх майже напевно перевіряли під час компіляції. Якщо ви могли б гарантувати число нульове під час компіляції, то ви можете виконати певні логічні висновки, наприклад, поділ будь-якого числа на це число призведе до арифметичної помилки, викликаної діленням на нуль.
Таким чином, по-справжньому, ворог програмно-гарантійного належного функціонування програми виконує перевірки виконання, на відміну від складання перевірок часу. Прикладом цього може бути виконання динамічного складання іншого типу. Якщо це дозволено, ви, програміст, істотно перекриваєте можливість компілятора знати, чи це безпечно робити. Деякі мови програмування вирішили, що це прийнятно, тоді як інші принаймні попереджають вас під час компіляції.
Ще одним хорошим прикладом може бути дозвіл на те, щоб нулі були частиною мови, оскільки можливі винятки з покажчиком нуля, якщо ви дозволите нулі. Деякі мови повністю усунули цю проблему, запобігаючи тим, що змінні, не явно декларовані як здатні містити нульові значення, оголошені без негайного присвоєння значення (наприклад, візьмемо Kotlin). Хоча ви не можете усунути помилку виконання виключення з покажчиком з нульовим покажчиком, ви можете запобігти його, видаливши динамічний характер мови. У Котліні ви, звичайно, можете змусити зберігати нульові значення, але це само собою зрозуміло, що це метафоричні "покупці, будьте обережні", оскільки вам потрібно чітко заявити про це як таке.
Чи можете ви концептуально мати компілятор, який би міг перевіряти помилки на кожній мові? Так, але, швидше за все, це буде незграбний і дуже нестабільний компілятор, в якому вам доведеться заздалегідь надати мову, що складається. Він також не міг знати багато речей про вашу програму, більше, ніж компілятори для певних мов знають про неї певні речі, такі як проблема зупинки, про яку ви згадували. Як виявляється, дуже багато інформації, яка може бути цікавою для вивчення програми, неможливо зібрати. Це було доведено, тому швидше за все це не зміниться.
Повернення до основної точки. Методи не є автоматично безпечними для потоків. Для цього є практична причина, яка полягає в тому, що безпечні методи для потоків також повільніші, навіть коли нитки не використовуються. Rust вирішує, що вони можуть усунути проблеми виконання, роблячи методи потоками безпечними за замовчуванням, і це їх вибір. Хоча це й коштує.
Математично можна довести правильність програми, але саме з застереженням у вас буде буквально нульова функція виконання в мові. Ви зможете прочитати цю мову і знати, що вона робить, без будь-яких сюрпризів. Мова, мабуть, виглядала б дуже математично за своєю суттю, і це, мабуть, не випадково. Другий застереження полягає в тому, що помилки під час виконання все ж трапляються, що може не мати нічого спільного з самою програмою. Таким чином, програма може бути доведена правильної, приймаючи ряд припущень про те комп'ютері, яка запускається на точності і не змінюється, що, звичайно , завжди це станеться в будь-якому випадку і часто.