IharOK
.
Andrei
Вон у тебя и в плюсах проверка.
Я имел в виду, что проверка только в одном месте, а не в каждой функции.
Alexander "SonnySlave"
что не определено по стандарту - сам разрулил
а сам - это в плане компилятор рулит?
Крылатый
Idris бы тут помог)
Andrei
Berkus
Idris бы тут помог)
вот щас бы на идрисе в плюсах писать!
Dr. Friedrich
Я имел в виду, что проверка только в одном месте, а не в каждой функции.
А я имел в виду, что конпилятор в жаве точно так же свои проверки соберёт в кучу и заинлайнит, и будет одна проверка. Не тот компилятор, который javac, а, ну, настоящий компилятор.
Dr. Friedrich
Потому что компилятор в жаве написан на плюсах.
Dr. Friedrich
Следовательно, он хорош, правильно? Плюсы же это хорошо :3
Dr. Friedrich
Это вполне может быть, но это не гарантировано. А здесь гарантированно, что он не будет делать лишнего.
Ок, да, с такой постановкой согласен. Действительно, там это не гарантировано при использовании стандартных массивов.
Berkus
Dr. Friedrich
так здесь тоже не гарантированно, он при UB может тебе диск зачистить
А тут вот разве есть UB? Вроде как конкретный код без UB.
Andrei
так здесь тоже не гарантированно, он при UB может тебе диск зачистить
В приведённом коде UB нет, при это нет и лишних проверок.
Dr. Friedrich
И я несколько потерялся таким образом в тезисах ОП.
Berkus
А тут вот разве есть UB? Вроде как конкретный код без UB.
НИКТО не может запретить мне вызывать getThird({ 10, 20}) в этом коде, НИКТО
Dr. Friedrich
В этом коде вызова нету! А если вызов будет — это будет уже другой код.
Dr. Friedrich
Ну или ты, типа, слинковаться хочешь с таким вот бинарником?
Dr. Friedrich
Это можно.
Dr. Friedrich
Но это уже вопрос правильной модульности и предоставления безопасного интерфейса.
Dr. Friedrich
https://ideone.com/WiVnZ0
Ну, ссылка другая и код другой :)
Matway
НИКТО не может запретить мне вызывать getThird({ 10, 20}) в этом коде, НИКТО
Никто не запретит вызвать форматирование диска из джавы. Причём здесь это? Я говорю, что если правильно "готовить" (то бишь, внимательно читать контракты к функциям и их не нарушать) то UB позволяет не платить там, где это не нужно.
Dr. Friedrich
В этом коде есть UB, да. Странно, что у них на ideone до сих пор диск не отформатировался.
Berkus
В этом коде есть UB, да. Странно, что у них на ideone до сих пор диск не отформатировался.
может и отформатировался, оно ж на vm катается, одна упала другую подняли
Dr. Friedrich
В C++ нет, а вот в прилагаемой документации можно контракты написать.
Berkus
В C++ нет, а вот в прилагаемой документации можно контракты написать.
ну да, давай заставим компилятор с++ читать прилагаемую документацию
Dr. Friedrich
«Ой, извините, ваш самолёт упал потому, что вы не прочитали мелкий текст в документации к функции»
Dr. Friedrich
Dr. Friedrich
Я надеюсь надеюсь надеюсь, что это VM.
Dr. Friedrich
видимо поэтому самолеты на с++ долго не летают
А я не знаю, на чём они летают. Неужели на плюсах или си не пишут код для самолётов? А на чём тогда пишут?
Dr. Friedrich
А, ну норм, я спокоен.
Matway
чувак, в С++ НЕТ КОНТРАКТОВ ФУНКЦИЙ, НЕТ КОНТРАКТОВ КЛАССОВ НЕТ ВООБЩЕ НИКАКИХ КОНТРАКТОВ
https://en.wikipedia.org/wiki/Design_by_contract > Contract conditions should never be violated during execution of a bug-free program. Contracts are therefore typically only checked in debug mode during software development. Later at release, the contract checks are disabled to maximize performance. В плюсах контракт - это документация. Для валидирования контрактов в режиме дабажной сборки есть assert.
Крылатый
Но как я знаю, там крайне жёсткие ограничения на используемый функционал.
Крылатый
Была на хабре статья, описывающая процесс разработки ПО для самолётов.
Berkus
Была на хабре статья, описывающая процесс разработки ПО для самолётов.
я думаю там любителей UB пиздят ногами и увольняют до того как они закоммитят первый свой код
Andrei
можно обмазаться ассертами и статик ифами и это будет почти аналогично контрактам из того же эйфеля, но НЕТ
То, что в плюсах нет механизма, энфорсящего контракт — это __отдельная проблема__.
Berkus
остальные все решаемые )
Andrei
К тому же, если очень хочется — можно мисюзить любой API, на любом языке, даже на твоём любимом Rust :)
Berkus
разговор был вообще про контракты
Alexander "SonnySlave"
так в расте емнип тоже контрактов нет
Alexander "SonnySlave"
@berkus или есть?
Andrei
заметь, я ни слова не сказал про раст
Ты там выше где-то упомянул unsafe, сомневаюсь, что ты имел в виду шарп.
Matway
я думаю там любителей UB пиздят ногами и увольняют до того как они закоммитят первый свой код
Это не так. Как раз в аэрокосме очень не любят, когда радиационно-устойчивая, и отсюда довольно медленная железяка проверяет на каждом чихе соответствие строгим спецификациям. Design by contract как раз очень популярен в mission critical системах. Другое дело, что там поверх языка ещё и ставятся верификаторы контракта. Считай, автоматически суются ассёрты куда можно для дебажных сборок. И UB там очень любят и уважают. UB - это когда спека не связывает руки компилятору. Разумеется, никто в здравом уме UB ДОПУСКАТЬ не собиратся.
Berkus
Ты там выше где-то упомянул unsafe, сомневаюсь, что ты имел в виду шарп.
я специально написал его по-другому, потому что не только в расте есть ансейф
Dr. Friedrich
На c# же...
Неа. Восклицательный знак ещё специально поставлен, чтобы все догадались!
Berkus
понятно, ладно, если я говорю про контракты а вы слышите только РАСТ то идите-ка вхуй
Dr. Friedrich
:)
Alexander "SonnySlave"
что ж ты агришься то. мне просто интересно
Berkus
да я и не тебе отвечал)
Berkus
более менее контракты я видел только в эйфеле, в расте тоже только ассерты
🐙 Antony
Контракты в С++ добавляют: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0542r3.html
🐙 Antony
Уже лет 10 добавляют )
🐙 Antony
Надеюсь к C++20 сойдётся
Dr. Friedrich
Ну, тут вот свежий какой-то документ.
Berkus
саттер вроде беспокоился что и в 20 они не войдут
Berkus
void f [[attribute]] (); // Attribute applied to function void f() [[attribute]]; // Attribute applied to function type больше tricky syntax богу of tricky syntaxes!
Dr. Friedrich
А можно между void и f поставить атрибут?
Berkus
можно, это будет атрибут функции
Berkus
так же как первый случай
Berkus
[[attribute]] void f(); // Attribute applied to function void f [[attribute]] (); // Attribute applied to function
Berkus
а, или нет