Я интересуюсь языковым дизайном и в целом могу легко рассуждать о широко известных функциях (например, наследование, полиморфизм, делегаты, лямбды, захваты, сборка мусора, исключения, обобщения, дисперсия, отражение и т. Д.), Их взаимодействиях в конкретный язык, способы их реализации, их ограничения и т. д.
В последние несколько месяцев я начал читать о Rust, у которого есть система владения, которая обеспечивает безопасность памяти и детерминированное управление ресурсами, заставляя статически проверять время жизни объектов. С точки зрения простого пользователя языка, я мог бы поднять систему почти сразу.
Однако с точки зрения дизайнера языков мне потребовалось некоторое время, чтобы понять, почему в Rust все именно так, как есть. Я не мог сразу понять причину некоторых ограничений системы собственности, пока я не заставил себя придумывать случаи, которые нарушали бы целостность системы, если бы у нее не было этих аспектов.
Мой главный вопрос не имеет ничего общего с Rust и его собственностью, но вы можете использовать его в качестве примера в своих комментариях / ответах, если вам это нужно.
Когда разработчики языка разрабатывают новую функцию, какую методологию или процесс они используют, чтобы решить, что функция работает должным образом?
Под «новым» я подразумеваю, что это не то, что уже было протестировано на существующих языках (и, следовательно, основная часть работы была проделана другими дизайнерами). Под «работает должным образом» я подразумеваю, что функция правильно решает предполагаемую проблему и является достаточно пуленепробиваемой. Под «разумно пуленепробиваемым» я подразумеваю, что никакой код не может быть написан на языке или конкретном подмножестве языка (например, подмножество без «небезопасного» кода), которое нарушило бы целостность функции.
Является ли это методом проб и ошибок, в том смысле, что вы придумали простую форму функции, затем попытаетесь найти способы ее нарушения, затем исправьте ее, если вы успешно нарушили ее, а затем повторите? И потом, когда вы не можете думать о каких-либо других возможных нарушениях, вы надеетесь, что ничего не осталось, и называете это днем?
Или есть формальный способ на самом деле доказать (в математическом смысле слова), что ваша функция работает, а затем использовать это доказательство, чтобы уверенно получить правильную (или в основном правильную) функцию с самого начала?
(Я должен отметить, что у меня есть инженерное образование, а не компьютерные науки. Поэтому, если я упускаю что-то, что было бы очевидно для людей из CS, пожалуйста, не стесняйтесь указывать на это.)