про ржу

Jun 27, 2021 16:26

В смысле, не я ржу, а она Ржа. Прослушал я рассказ про Rust. Вынес оттуда два интересных момента:

1. Новым достижением Раста является разделение "опасного" и "безопасного" кода, а также "займа" и "потребления" ("borrowing" vs "consumption") ссылок. Остальное в нем выглядит убого по сравнению с С++.

Чтобы понять, что такое "опасный" код, представьте себе организацию двусвязного списка, а что такое "безопасный", представьте себе программу на Коболе. В этом, в принципе, есть глубокий смысл. Я думаю, что большинство программ и библиотек будут содержать и опасную и безопасную части. Все сложные вещи будут вынесены в опасную часть, а остальное в безопасную, чтобы в ней случайно не накосячить. То есть, на примере того же двусвязного списка, нет причин чтобы программа работала напрямую с указателями двусвязного списка где попало. Один раз пишется набор библиотечных функций для манипуляции списком, и потом весь остальной код просто вызывает эти функции и не имеет возможности испортить указатели.

А займ/потребление нужен для формулировки правил безопасного использования ссылок.

Но можно ли такое же сделать в С++? Пожалуй, запросто. Займ - это const & (ну или если mutable, то просто &), потребление - это &&. Осталось только добавить синтаксис для отеления опасных частей от безопасных и проверку правил безопасности в безопасных частях - и вуаля, все радости Ржи в С++. Как я когда-то где-то читал, "если вы видите что-то ценное в каком-то новом языке программирования, не торопитесь переходить на него, а подождите немножко, пока С++ пожрет это ценное".

2. Момент, который выглядет в Рже очень раздражающим - это отсутствие классов. В нем нет классов, в нем есть черты (traits) подобно Го и С++ным темплейтам.

Почему конкретно в Рже оно выглядит гораздо более раздражающе, чем в темплейтах? Потому что в темплейтах нету явной типизации по чертам. Они просто используются, и или оказывается что они есть (и тогда все работает) или их нет и получаются злозапутанные сообщения об ошибках (что тоже геморрой, но другой). В Рже же оказывается, что для параметров функций используются длинные списки необходимых черт для каждого: Trait1 + Trait2 + Trait3. Та же самая пробема в Го.

Но давайте посмотрим с другой стороны, что такое класс (точнее, интерфейс)? Интерфейс - это список методов. И каждый метод - черта. То есть, когда мы определяем интерфейс, мы по сути пишем:

InterfaceA = TraitA1 + TraitA2 + TraitA3

Если добавить эту "арифметику черт" в язык, позволяя давать имена их суммам, то весь геморой исчезает. Может оно даже уже есть в языке, просто не было в рассказе?

This entry was originally posted at https://sab123.dreamwidth.org/629413.html. Please comment there using OpenID.

кнопкодавство

Previous post Next post
Up