Мене цікавить мовний дизайн, і взагалі можу легко міркувати про широко відомі особливості (наприклад, успадкування, поліморфізм, делегати, лямбда, захоплення, збирання сміття, винятки, дженерики, дисперсія, рефлексія тощо), їх взаємодії в конкретної мови, шляхів їх можливого втілення, обмежень тощо.
В останні кілька місяців я почав читати про Rust, який має систему власності, яка забезпечує безпеку пам’яті та детерміноване управління ресурсами, змушуючи життя об’єктів статично перевірятися. З точки зору простого користувача мови, я міг підібрати систему майже одразу.
Однак, з точки зору дизайнера мови, мені знадобилося певний час, щоб зрозуміти, чому все в Расті відбувається саме так, як вони є. Я не міг одразу зрозуміти міркування деяких обмежень системи власності, поки не змусив себе придумувати випадки, які б порушили цілісність системи, якщо вона не мала б цих аспектів.
Моє головне питання не має нічого спільного з Рустом та його власністю конкретно - але сміливо використовуйте його як приклад у своїх коментарях / відповідях, якщо вам потрібно.
Коли мовні дизайнери розробляють нову функцію, яку методологію чи процес вони використовують, щоб вирішити, що функція працює належним чином?
Під "новим" я маю на увазі, що це не те, що вже перевірено на існуючих мовах (і, таким чином, основна частина робіт була виконана іншими дизайнерами). Під "працює належним чином" я маю на увазі, що ця функція правильно вирішує передбачувану проблему, і вона достатньо захищена від куль. Під "розумно захищеним" я маю на увазі, що жоден код не може бути записаний мовою або певною підмножиною мови (наприклад, підмножина без "небезпечного" коду), яка б порушила цілісність функції.
Це процес проб і помилок, в тому сенсі, що ви придумали просту форму функції, потім спробуйте знайти способи її порушення, потім виправити, якщо ви успішно її порушите, а потім повторіть? І тоді, коли ви не можете придумати будь-які інші можливі порушення, ви сподіваєтесь, що нічого не залишилося, і називати це день?
Або існує формальний спосіб фактично довести (в математичному сенсі цього слова), що ваша функція працює, а потім використати цей доказ, щоб впевнено отримати функцію правильно (або здебільшого правильно) з самого початку?
(Я мушу зазначити, що у мене є інженерна підготовка, а не інформатика. Тож, якщо я пропускаю щось, що було б очевидним для людей з ЦС, будь ласка, не соромтеся це вказати.)