- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
В чём прикол "Go"?
Попробовал сделать примитивное апцо - это сущий пиздец. Нельзя просто взять и на лету
сформировать с нуля массив и отобразить его в виде "JSON" - надо под все случаи прописать
какие-то долбоёбские структуры и строго их придерживаться. Нельзя просто так взять и
закомментировать абы какую строку - под это приходится ломать и крушить половину кода
в файле.
Говорят, что это нужно для какой-то дисциплины, но схуяли программист не может распоряжаться
СВОИМ кодом по своему усмотрению? С каких пор компилятор учит программиста стилю кода?
В этом говноязыке чувствуешь себя, как на зоне.
Очень гадостно в этом языке работать с базами данных.
Я было обрадовался, что наконец-то появился язык, официально как будто не дающий возможности
технически реализовать ООП-подход и ломающий стереотип о необходимости влажных фреймворков,
но на деле это оказалось той же пиздой, только в другой обёртке.
Поэтому я за "PHP".
В нём я просто создаю на лету массив произвольной структуры и тут же превращаю его в "JSON".
В нём я просто комментирую ту строку, которая мне в данный момент не нужна. В нём я просто
создаю подключение к "MySQL" и использую его в коде даже без отсылки к переменной подключения.
Наконец, в нём я могу не использовать ООП, если не хочу (а я не хочу).
"PHP" переживает все другие языки для серверной разработки. "Ruby" мёртв, "Python" мёртв, "Java" и
"NodeJS" уже подыхают, на очереди, я так понимаю, как раз "Go". И только "PHP" на коне.
>it was absurd the time needed to compile compared to something written in C or C++
Притом что кресты раньше обычно считались за днище по скорости компиляции.
Но в целом, пuтушатня компилится раз в 10 медленее аналогичной сишки.
Смотря что понимать под компилятором.
Крестовый LLVM-бекэнд? Или разбирающий пuтуха фронт для LLVM? Он как я слышал на дrustне.
Так-то замечание верное: без использования unsafe/сишных биндингов пuтушатня работает в разы медленее.
Потому все рассказы про zero cost abstraction — враньё и пропаганда.
Но почему? Много лишних копирований из-за того, что чекер по ссылке передать не даёт?
>Много лишних копирований
Ещё я слышал что они делают runtime bounds checking.
Звучит конечно смешно и печально.
После сказок о ма-те-ма-ти-че-ски доказанной корректности языка.
Так-то я не знаю. Наверное дело в анскильности.
Как они умудрились это-то сломать? Какой прогресс )))
Когда их спрашивают: а чего это у вас runtime проверки?
https://stackoverflow.com/a/28389701
Они отвечают: «а мы нихуя не умеем» и перекладывают ответственность на рантайм и шланг.
Для проверок в compile-time нужно пилить «систему типов с диапазонами». (см. тред: https://govnokod.ru/26515#comment535139)
А раст-отребье слишком анскильно для такой задачи.
Забавно, что и гцц и шланг умеют доказывать несложные утверждения даже без такой системы. Т.е. в том же алгоритме двоичного поиска, скорее всего, они не будут вставлять проверки в колёса.
Ты про это?
При включенном «range checking» ($R+) сначала компилятор попытается проверить выражения, которые считаются в компилтайме (в вышеуказанном реальном примере он сразу выкинул и не стал дальше компилировать, потому что константа выходит за диапазон), а если в компилтайме ничего криминального нет, то он будет производить проверки в рантайме при каждом присвоении, как в следующем реальном примере:
https://ideone.com/g1ajss
Чем это хуже Пuтушатни — непонятно.
Просто паскалисты не воняют создают дикий хайп вокруг обычных в целом вещей.
Притом скорость компиляции Паскаля огромна, в силу его простоты.
In safe Rust bounds checks elimination is left up to LLVM. Iterator’s next() is inlined, so the optimizer can see what actually is checked and doesn’t need to create a literal Some/None wrapper at any point.
For slices there’s also get_unchecked() which you can use when you are sure the check is not needed.
https://users.rust-lang.org/t/iterators-and-eliminating-all-runtime-bounds-checks/13935/3
Царь был прав. Пuтушатня нихуя сама не может. Всё быстрое и хорошее там либо ворованное, либо unsafe.
Ну а почему нет? Если там эта механика уже запилена и несложные утверждения о значениях вполне доказывает.
> when you are sure
А вот это зашквар, конечно. Если я так в себе уверен, то зачем мне раст? Ладно бы что-то невозможное через unsafe делать. Но тут он на ровном месте ради пирфоманса...
Zero-co-co-cost malloc!
Zero-co-co-cost free!
Zero-co-co-cost bounds checking!
Потому что это нивелирует все заявления о премиуществах пuтушатни.
Если проверки убирает LLVM-бекэнд, то любой llvm-based ЯВУ может быть не менее «безопасным».
А массивы ведь для произвольного доступа и нужны.
З.Ы. Именно поэтому функцианальщики обычно всё доказывают на каких-нибудь списках или деревьях, а массивы обходят стороной.
Последователи функциональной парашдигмы придумали себе Separation logic, так что не всё так печально с массивами уже. Правда пока все имплементации, что я видел, выглядят в лучшем случае как embedded DSL. Но может когда-нибудь это нативно прикрутят.
Если не бояться ебануться наотличненько, то можно установить с опама исследовательский проект "iris" и сказать, что в Coq завезли O(1) векторы.
Кстати Coq — хороший, правильный Петух.
В отличие от Rusta они занимаются нужными вещами, а не просто кукарекают.
Люди не полагаются на шланг, а делают в компайл-тайме пруфы ку-ка-ректности (coq correct) обращений к массивам:
http://adam.chlipala.net/cpdt/html/MoreDep.html
Это потому что он проприетарный
Если компилятор сможет доказать, что ∀i: i + 42 < petuhLen, то ничего. Если сможет доказать, что ∃i: i + 42 < petuhLen (например, у нас цикл «i in 0..petuhLen»), то кидать ошибку. Если не сможет ни того, ни другого — выдавать предупреждение, наверное.
А с простыми кейсами в духе "я вот только что проверил" или "мне просто циклом пробежаться" конпеляторы и сейчас справляются. Без всяких аннотаций.
Как что-то плохое.
Универсального алгоритма нет, но есть довольно мощные эвристики, к примеру Coq умеет довольно автоматически многие системы неравенств решать, включая про +42:
https://coq.inria.fr/refman/addendum/omega.html
https://coq.inria.fr/refman/addendum/micromega.html#coq:tacn.lia
https://softwarefoundations.cis.upenn.edu/current/lf-current/lf.tgz (вся серия тут: https://softwarefoundations.cis.upenn.edu/current/index.html )
Начальных знаний не требует, кроме базовой функцональщины. Крайне советую читать эту книжку через CoqIde или в Emacs, распаковав её исходники куда-нибудь локально, и выполняя код и решая упражнения прямо по ходу чтения, и поглядывая на порядок глав в deps.gif.
Тут вам не джэйвэ.
прочитай еще раз что тебе гост написал
operator [] как раз не проверяет границы (хотя я бы не исключал, что -Warray-bounds там кое-что будет уметь)
а .at() проверяет
в чем должна быть магия?
На уровне синтаксиса — да. operator[]() у вектора сделан максимально быстрым и никаких «исключений» не содержит, вышел за перделы массива — сам дурак. В at(), напротив, рантайм-проверки есть.
Магию делает конпелятор, например: https://gcc.godbolt.org/z/v3EMM3.
В get_sum_1() конпелятор догадался, что проверки в at() лишние, и сделал максимально простой цикл без лишних телодвижений. А вот в get_sum_2(), к сожалению, не догадался: туповат-с.
После инлайна получилось что-то такое (условно, конечно, это же не дефайны, чтобы их так дословно раскрывать):
Ну вот конпелятор и сумел доказать, что if тут лишний.
Зачем? Ему на это похуй, он просто видит лишние сравнения и течёт.
> что такое "for"
Ну, инвариант сишного фора не особо сложно вывести, он там во второй колонке.
если нет, то не сможет
в постгресе такой правильный сорт функции называется stable
которая не портит базу и всегда будет возвращать одно и то же, если передать одни и те же аргументы и сохранять текущее состояние базы
но самое главное, такую питушню можно использовать как критерий сортировки
Починил, проверь.
Хотя, не. Туповат-с
UPD: А, не, в жирной строчке max_idx просто присвоится vec.size() же. Так не интересно.
Я тоже сначала так подумал. А потом с горечью осознал что ошибся при копипасте:
>UPD: А, не, в жирной строчке max_idx просто присвоится vec.size() же.
Таки туповат.
Причём казалось бы говнище: vec.size() постоянно дрочим внутри цикла. А оказывается оптимальным кодом.
https://gcc.godbolt.org/z/x5rq4j
Короче я понял, там эвристика расчитывает на идиоматичное i<vec.size() в условии или в бряке сверху(что одно и то же).
Меняем местами
И получается хуйня
Аналогично компилятор не в состоянии оптимизировать 2 условия
https://gcc.godbolt.org/z/8hWT3j
Какая безопасность )))
Ну хоть не UB как в крестах, просто two's complement. Хотя разницы особо и нет, один хер прога выведет фигню.
Я за Царя и няшную.
Ну сэкономили на пакетном менеджере. У гугла ж одна репа на все, логично все зависимости там и хранить.
Я помню в студии была замечательная прагма, позволяющая локальные(!) пути к либам прямо в сишниках хардкодить. Так что до гения мелкософта го немного не дотягивает.
Там же вроде gopath ебанутый, все дела
один хуй даже сейчас у них есть какое-то подобие центрального репозитория артефактов, который почему-то в первую очередь прокси и только во вторую собственно репозиторий артефактов
ну ничего, в го 2 точно починят
- несколько версий одной зависимости емнип не поставить никак
- файла типа Package.json тоже не было, а потому каждая гоблядь должна была зависимости ставить руками (поймал себя на мысли, что в Рэкете такое же говно с этим, ну или я не шарю)
Может, что-то поменялось, конечно
тем более, что у крестов сейчас сегмент не "хочу", а "вынужден"
ну, по моим личным ощущениям
Даже после новых стандартов? Вроде наконец язык чинить начали после ада C++03.
> вроде, все крестушки давно выросли из этого возраста
Ок, но когда я в крестовых кругах вращался, они ещё не выросли.
я не занимаюсь крестами уже лет 7
кресты это долго, дорого и охуенно
не всегда подходит, мягко говоря
Скорее долго и охуенно дорого.
gost?
если писать игоры, то, конечно, ты бы хотел максимум фпс на железе юзера
если упёрся в то, что на жабе тормозит бекенд яндекс карт, то тоже
если у тебя микроэвм с 128МБ рам, а всё ещё надо за микросекунды выполнять операции, то тоже
как-то так
нормальный менеджер смотрит на это, взвешивает все за и против, и вот приходит к выводу, что "охуенно дорого" всё ещё приемлемо, потому что всё остальное будет ещё дороже или тупо не сможет достичь целевых показателй
Вон даже на ГК вбросы про "кресты говно" уже не вызывают эмоций.
>свои пилить только через боль и унижения.
И мы опять приходим к тому, о чём я говорил...
Именно поэтому единственная вменяемая структура данных — одномерный массив.
Блин, попробовать что ли по фану пильнуть дерево. Посмотреть хоть своими глазами на этот раст.
Currently there is 11 THOUSAND lines of Rust in wlroots-rs. All of this code is just wrapper code, it doesn’t do anything but memory management. This isn’t just repeated code either, I defined a very complicated and ugly macro to try to make it easier.
This wrapper code doesn’t cover even half of the API surface of wlroots. It’s exhausting writing wlroots-rs code, memory management is constantly on my mind because that’s the whole purpose of the library. It’s a very boring problem and it’s always at odds with usability - see the motivation for the escape from callback hell described above.
To do all of this, and then go write Way Cooler, already a big undertaking, is too much for me to commit to. When the benefit at the end of the day is just so I don’t have to write C, that doesn’t really make it worth it. If I got this out of the box by simply linking to the library, like I can in C++, then it would be much more tenable.
I can always just use unsafe bindings to wlroots, just like I would with any other language. However, the entire point of Rust is that it’s safe. Doing that is not an option because at that point you lose the entire benefit of the language.
http://way-cooler.org/blog/2019/04/29/rewriting-way-cooler-in-c.html Стрелочка повернулась!
Какой пиздец )))
Пuтушатня заставляет делать какие-то чудовищные обёртки, для самых тривиальных вещей изворачиваться, выдумывая головоломные абстракции.
Которые в итоге... всё-равно протекают.
>I wish them luck, but I don’t feel interested in rewriting the entire world in Rust
Ахаха.
> Smithay [rust] is very incomplete. Very, very incomplete compared to wlroots. It is no where near usable and the current trajectory doesn’t look like it will be usable very soon either.
> wlroots [C] is a great framework and has a strong backing in the community so I don’t see the need to abandon it just so I can keep using Rust.
> I like Rust, but not enough to reinvent the wheel so it doesn’t have any C in it.
Как там мантра «дак мы же как Сишка»?
Только тыкал в это палочкой.
Потому моё мнение вряд ли претендует на объективность.
https://govnokod.ru/26927#comment573150
https://govnokod.xyz/_26927/#comment-557333
Экое коварство. На ГК он чётный, а на хузе нечётный.
И как теперь быть? Отвечать только на хузе? Но он всё-равно ответит и на ГК.
Интереснее исправить коммент на хузе в тот момент, когда он уже получил исправленный тред с ГК но ещё не внёс его в базу. Тогда правка с хуза окажется на ГК, а правка с ГК окажется на хузе.
> Заделал твой анус, проверь.
> Пенисом.
> Анал, минет, кордебалет.
> Но член мой ты дружески можешь подержать.
> А мой хуец тебе в глаза не бросился?
> Засунул тебе вовнутрь, проверь.
> Поюзал твой анус, проверь.
> Встретил твою мамку с блядок.
> Сунул свой кривой-перекривой хуец тебе в попец, проверь.
> Увидел у тебя промеж ягодиц.
> Дал тебе слизать спермач с моего хуя.
Вот это не стертор?