Pull to refresh

Comments 21

Когда рассказываете давно всем очевидные и 1000 раз пережеванные всеми, кому не лень, вещи, рассказывайте хотя бы в контексте популярных и хайповых языков. Есть шанс, что хотя бы не заминусуют.

Грамотное решение проблемы нулевых указателей — использование алгебраических типов данных.

Когда мы имеем вместо void* func() что-то вида fn func() -> Enum_Option, то мы дальше предоставляем программисту простую возможность обработать 'Err' (кодирование которого и стало причиной появления NULL), и возможность безопасно вынуть значение из 'Ok' посредством исчерпывающего pattern matching'а.

Впервые оно появилось в заумных ML'ных языках, но сейчас оно дошло до мейнстрима и его можно использовать не взрывая себе мозг монадками.

Да и раньше монадок не нужно было, аппликативных функторов достаточно.


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

Если честно, я аппликативные функторы считаю как раз тем самым «взрывом мозга», который нам пытаются всучить под эгидой удобства от алгебраических типов данных. Так что лучше взять алгебраические типы данных и обойтись без взрыва мозга. Viva Rust, так сказать.

Формализация и понимание нижележащих абстракций — оно, в общем, не зря.

Напишите «что-то вида» на с\с++. Если уж сравнивать примеры кода то хотябы со схожими языками.
Ну, я его только учу, до реального кода пока далеко. Но мои эксперименты показали, что в работе с аллокатором он (Rust) существенно обгоняет Go и находится на одном и том же уровне с Сишным кодом (при использовании одинаковых структур данных, потому что наивный тест на сишном string.h прососал даже python'у из-за неэффективного strlen).
На плюсах вы можете возвращять не голый указатель а обертку, которая может защищать от обращения к нулевому указателю.
Главная проблема в том, что в С++ — МОЖНО. Можно почти всё. В том числе стрелять себе в ногу без предупреждения по модели С. В этом смысле совместимость с С — фатальна для языка, т.к. компилятор не имеет возможности защитить человека от ошибок, и уровень дисциплины что в С, что в С++ оказывается одинаковый.

А смысл? На C++ вам система типов языка мало что гарантирует.

C void*, вообще указателями, неявными преобразованиями, отсутствием понятия чистых функций и прочей радостью?
Тоже об этом подумал. К тому же это явно более зрелый язык.

> избавились от ошибок управления памятью с помощью сборки мусора

Особенно смешно читать вот это.
Вот вот. Сборка мусора — отдельный источник проблем в совсем неожиданных местах
Ну, например запуск сбора мусора в неподходящий момент или нехватка памяти, которая в нужный момент не была освобождена сборщиком. Счетчик ссылок, например как в Objective C мне кажется лучшим решением

Счётчик ссылок не очень хорошо работает с циклами, приходится извращаться.


Запуск в неподходящий момент — это да. Другое дело, правда, что в случае счётчика ссылок вы тоже не знаете, держите ли вы последнюю ссылку на объект или нет, и запустится ли, скажем, тяжёлый деструктор вот прям у вас здесь и сейчас, когда вы отпустите потенциально последнюю ссылку, или нет.

>Счётчик ссылок не очень хорошо работает с циклами, приходится извращаться.
А чем плох счетчик ссылок с циклами?

>Запуск в неподходящий момент — это да. Другое дело, правда, что в случае счётчика ссылок вы >тоже не знаете, держите ли вы последнюю ссылку на объект или нет, и запустится ли, скажем, >тяжёлый деструктор вот прям у вас здесь и сейчас, когда вы отпустите потенциально последнюю >ссылку, или нет.
Но вы можете явно на это влиять, может не очень красиво, костыльно, но можно.

Вот кстати еще против аргумент сбора мусора: данные можно организовать так, что будет утечка памяти, сборщик мусора ее не освободит

А чем плох счетчик ссылок с циклами?

Тем, что если у вас A хранит в себе shared_ptr<B>, который хранит в себе shared_ptr<A> на исходный A, то они не удалятся никогда. Вам нужно либо руками в точке разрушения очищать один из указателей, либо обмазываться weak_ptr'ами.


Но вы можете явно на это влиять, может не очень красиво, костыльно, но можно.

Это да. Но костыльно и не очень красиво, а также не очень поддерживаемо, согласитесь.


На GC тоже можно влиять. В ghc 8.2 вон, например, compact regions завезли.


Вот кстати еще против аргумент сбора мусора: данные можно организовать так, что будет утечка памяти, сборщик мусора ее не освободит

Ну, можно и кеш какой-нибудь не очищать, да, будет семантическая утечка, верно. GC не панацея и не серебряная пуля ни в коем случае.


Тут примерно как со строгой статической типизацией: тайпчекер, который переносит управление ресурсами в компил-тайм, отвергнет больше семантически корректных программ, но даст вам больше уверенности, что неотвергнутые программы корректны.

разыменование нулевого указателя — дефект, который справедливо считается «чумой» современного программирования

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

перегрузка фунции заслуженно считается холокостом современного программирования

ну а серьезно, ну не нравятся указатели, испльзуйте референсы.
Only those users with full accounts are able to leave comments. Log in, please.

Information

Founded
Location
Россия
Website
university.innopolis.ru
Employees
501–1,000 employees
Registered