Обеспечение исключительности в Swift 5

Релиз Swift 5 по умолчанию включает проверку во время выполнения «Эксклюзивного доступа к памяти» в сборках Release, что еще больше расширяет возможности Swift как безопасного языка. Эти проверки времени выполнения были включены только в сборках отладки в Swift 4. Swift автоматически управляет памятью и гарантирует, что множественный доступ к одной и той же области памяти не конфликтует, гарантируя, что код, изменяющий расположение в памяти, имеет исключительную доступ.

Доступ к памяти может быть двух типов:

  1. Доступ для чтения
  2. Доступ для записи

В зависимости от продолжительности доступа доступ к памяти бывает двух типов:

  1. Мгновенный доступ - операция завершается без вмешательства какого-либо другого кода.
  2. Долгосрочный доступ - доступ охватывает выполнение другого кода. Обычно происходит при использовании inout аргументов в функциях или при изменении методов структуры.

Конфликты возникают при доступе к долговременной памяти. Когда доступ к памяти является долгосрочным, другой код может изменить или прочитать эту ячейку памяти, что называется перекрытием. Долгосрочный доступ может перекрываться с другими долгосрочными и мгновенными доступами. Эксклюзивный доступ к памяти ограничивает модификацию памяти в случае перекрытия.

Эксклюзивный доступ

Эксклюзивный доступ ограничивает выполнение нескольких одновременных операций чтения / записи или одновременных операций записи в области памяти.

Доступ к памяти осуществляется каждый раз, когда мы устанавливаем значение переменной, читаем значение из переменной или передаем аргумент функции.

Влияние принудительного соблюдения эксклюзивности в режиме выпуска для проектов Swift

Обеспечение эксклюзивности в Swift 5 может повлиять на существующий проект двумя способами:

  1. Если исходный код проекта нарушает правила эксклюзивности Swift и при тестировании Debug не удалось проверить недопустимый код, выполнение двоичного файла Release может вызвать ловушку времени выполнения. В случае сбоя будет выведено диагностическое сообщение «Доступы перекрываются к…, но для изменения требуется монопольный доступ». Исправление на уровне исходного кода обычно несложно.
  2. Накладные расходы на проверки доступа к памяти могут повлиять на производительность двоичного файла Release. В большинстве случаев воздействие должно быть небольшим.

Заключение

Принуждение к исключительности выявляет только однопоточные ошибки. Эксклюзивный доступ к памяти обеспечивает более надежную работу и значительно оптимизирует:

  1. Библиотеки
  2. Компилятор
  3. Написанный пользователем код

Предоставляя полную эксклюзивность, включенную в сборках Release, Swift 5 помогает устранять ошибки и проблемы с безопасностью, обеспечивать двоичную совместимость и обеспечивать будущую оптимизацию и языковые функции.

использованная литература

  1. Https://swift.org/blog/swift-5-exclustivity/
  2. Https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html
  3. Https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md
  4. Https://developer.apple.com/videos/play/wwdc2017/402/

Вы можете связаться с нами в Twitter, Linkedin, Facebook и Github.