Разделы сайта находятся в разработке.
Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.
Управление памятью и совместный доступ
Ни один способ управления памятью не является лучшим или универсальным: в разных условиях выигрывают разные подходы:
- Ручное управление памятью может делать всё, что угодно, кроме одного — гарантировать отсутствие ошибок.
- Анализ владения и заимствования на этапе компиляции позволяет доказать корректность кода без дополнительных рантайм-проверок, но некоторые сценарии и алгоритмы не могут быть доказаны статически на этапе компиляции.
- Подсчёт сильных и слабых ссылок во время выполнения удобен для разделяемого владения, но имеет ненулевую стоимость и не защищает от циклических и перекрёстных зависимостей.
- Сборка мусора упрощает работу со сложными циклическими структурами, но имеет самые дорогие накладные расходы и недетерминированное выполнение.
- Ни один из перечисленных способов управления памятью не включает в себя вопросы межпотоковой синхронизации доступа к памяти.
Поэтому выбирать только один способ управления памятью в языке программирования — это значит заранее ограничить его возможности и добавить лишние накладные расходы. Из этих соображений концепция управления памятью TrustLang допускает расширение реализации модели управления памятью с минимальным влиянием на синтаксис языка и определяется требованиями (гарантиями) для работы с памятью.
Модель управления памятью
- Семантика языка делит переменные не по способу внутренней реализации, а по семантике, т. е. переменная по значению может хранить данные в куче, но при копировании должно выполняться и создание копии всех её данных, находящихся в куче.
- Полное описание жизненного цикла объекта всегда включает в себя несколько ортогональных осей и никакая сокращённая символьная запись в принципе не может закодировать всё множество комбинаций (вид ссылки, доступ, принадлежность к региону (время жизни), наличие деструктора у объекта и т. п.). Поэтому сокращённая символьная запись типов переменных предназначена только для переменных, жизненный цикл которых компилятор может верифицировать в автоматическом режиме во время компиляции (преимущественно для локальных областей).
- В идентичность типов данных включаются не только типы ссылок, но и способы межпоточной синхронизации доступа.
- Так как требуется взаимодействие с C++-кодом, то от сырых указателей на данные полностью уйти нельзя, но для них вводятся жёсткие ограничения на уровне компилятора (статического анализатора), чтобы ограничить ошибки при работе с памятью.
- Работа с памятью должна включать в себя и защиту стека от переполнения.
Текущая модель управления памятью находится на стадии тестирования и будет задокументирована в версии 0.7.0. Обсудить эти и другие концепции проекта можно на Reddit https://www.reddit.com/r/trust_lang/