Разделы сайта находятся в разработке.

Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.

Управление памятью и совместный доступ

Ни один способ управления памятью не является лучшим или универсальным: в разных условиях выигрывают разные подходы:

  • Ручное управление памятью может делать всё, что угодно, кроме одного — гарантировать отсутствие ошибок.
  • Анализ владения и заимствования на этапе компиляции позволяет доказать корректность кода без дополнительных рантайм-проверок, но некоторые сценарии и алгоритмы не могут быть доказаны статически на этапе компиляции.
  • Подсчёт сильных и слабых ссылок во время выполнения удобен для разделяемого владения, но имеет ненулевую стоимость и не защищает от циклических и перекрёстных зависимостей.
  • Сборка мусора упрощает работу со сложными циклическими структурами, но имеет самые дорогие накладные расходы и недетерминированное выполнение.
  • Ни один из перечисленных способов управления памятью не включает в себя вопросы межпотоковой синхронизации доступа к памяти.

Поэтому выбирать только один способ управления памятью в языке программирования — это значит заранее ограничить его возможности и добавить лишние накладные расходы. Из этих соображений концепция управления памятью TrustLang допускает расширение реализации модели управления памятью с минимальным влиянием на синтаксис языка и определяется требованиями (гарантиями) для работы с памятью.

Модель управления памятью

  • Семантика языка делит переменные не по способу внутренней реализации, а по семантике, т. е. переменная по значению может хранить данные в куче, но при копировании должно выполняться и создание копии всех её данных, находящихся в куче.
  • Полное описание жизненного цикла объекта всегда включает в себя несколько ортогональных осей и никакая сокращённая символьная запись в принципе не может закодировать всё множество комбинаций (вид ссылки, доступ, принадлежность к региону (время жизни), наличие деструктора у объекта и т. п.). Поэтому сокращённая символьная запись типов переменных предназначена только для переменных, жизненный цикл которых компилятор может верифицировать в автоматическом режиме во время компиляции (преимущественно для локальных областей).
  • В идентичность типов данных включаются не только типы ссылок, но и способы межпоточной синхронизации доступа.
  • Так как требуется взаимодействие с C++-кодом, то от сырых указателей на данные полностью уйти нельзя, но для них вводятся жёсткие ограничения на уровне компилятора (статического анализатора), чтобы ограничить ошибки при работе с памятью.
  • Работа с памятью должна включать в себя и защиту стека от переполнения.

Текущая модель управления памятью находится на стадии тестирования и будет задокументирована в версии 0.7.0. Обсудить эти и другие концепции проекта можно на Reddit https://www.reddit.com/r/trust_lang/