LINUX.ORG.RU
ФорумTalks

Curl переезжает на Rust

 , ,


1

6

Привет, ЛОР!

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

Daniel Stenberg, один из авторов curl, написал, что hyper – библиотека для работы с HTTP в Rust – в будущем будет использоваться как бэкенд для curl для работы с HTTP.

Ссылка: https://daniel.haxx.se/blog/2020/10/09/rust-in-curl-with-hyper/

hateyoufeel:

Curl переезжает на Rust

По приведенной ссылке Daniel Stenberg, автор curl:

This is not converting curl to Rust.

Don’t be fooled into believing that we are getting rid of C in curl by taking this step.

gag ★★★★★
()
Ответ на: комментарий от hateyoufeel

Почему это? Какой толк заставлять себя учить язык, который нафиг никому не нужен? «Для души» есть более другие языки.

Хотя у многих Rust как раз «для души», судя по опросам, и это ещё одна причина, почему не стоит в него вкатываться: при малейших намёках на популяризацию сразу набежит толпа демпингующих быдлокодеров, даже несмотря на якобы высокий порог вхождения (на самом деле нет, там компилятор кондубасит палками так, что любая макака в итоге выродит что-то рабочее, а непонятные ошибки компилятора с радостью разжуёт и положит в рот радужное инклюзивное комьюнити в Discord).

mertvoprog
()
Ответ на: комментарий от crypt

ммм… могу я считать, что этот вопрос исходно ко мне? формулировка: что мешает мне на RHEL6 установить последний тулчейн для сборки верна?

Ничего не мешает. Минимальная версия для последнего Rust: Debian 6 squeeze , а он чуть старше RHEL6. Так что можно установить последний раст на RHEL6. На RHEL5 нельзя…

Debian 6 squeeze (glibc 2.11 and kernel 2.6.32). While that release is already EOL, it happens to match the minimum common versions of two enterprise distros that do still need Rust support – RHEL 6 (glibc 2.12 and kernel 2.6.32) and SLES 11 SP4 (glibc 2.11 and kernel 3.0).

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от gag

malloc() в Си при невозможности выделить память тихо возвращает NULL. Так называемый системный язык Rust кладёт библиотеку в панику и, соответственно, жёстко прерывает работу вызывающей программы. Для curl - это no go. И хорошо.

Ты 5 звёзд заработал и настолько плох?

void* safe_malloc(size_t size)
{
    void* res = malloc(size);
    if (res == NULL) abort();
    return res;
}

Например в glib используется такой безопасный malloc, g_malloc, и он упадёт, а не вернёт NULL…

gpointer
g_malloc (gsize n_bytes)
{
    gpointer mem;
    mem = malloc (n_bytes);

    if (mem)
        return mem;

    g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes",
        G_STRLOC, n_bytes);
}
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Так бесполезные функции (хотя скорей работающие частично), если памяти мало то вернется некорректный адрес же, а не NULL.

paramon
()
Последнее исправление: paramon (всего исправлений: 3)
Ответ на: комментарий от paramon

Так бесполезный макрос, если памяти мало то вернется некорректный адрес же.

В Linux с overcommit да, но он и в Rust тогда не упадёт на выделении, а лишь позже на использовании, как и в С.

А в Windows и FreeBSD malloc возвращает NULL когда не может выделить память…

fsb4000 ★★★★★
()
Ответ на: комментарий от hateyoufeel

Вот такой, например.

Почему растоманы за столько лет не нашли хотя бы несколько реальных примеров, а всегда пишут какую-то дичь, которая просто не компилируется на сишном компиляторе при включенных предупреждениях и -Werror (то есть реальный режим, в котором и разрабатывают сишники)?

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Например в glib используется такой безопасный malloc, g_malloc, и он упадёт, а не вернёт NULL…

Си не ограничивается glib. А особенно в контексте обсуждаемой новости: curl должна продолжать работать на (встраиваемых) системах с ограниченными ресурсами.

gag ★★★★★
()
Ответ на: комментарий от gag

А особенно в контексте обсуждаемой новости: curl должна продолжать работать на (встраиваемых) системах с ограниченными ресурсами.

Я неправильно вначале тебя прочитал. И думал, что тихий возврат NULL это типа минус, и написал что можно не тихо возвращать NULL, а падать.

glib это не libc, это «Gnome Lib».

Но паники в Rust можно перехватывать(это те же исключения С++, по крайней мере в текущей реализации, и если нет флагов при компиляции, чтобы паники стали abort, вместо исключений): https://doc.rust-lang.org/std/panic/fn.catch_unwind.html

fsb4000 ★★★★★
()
Ответ на: комментарий от WitcherGeralt

раст придётся таки начинать учить

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

bread
()
Ответ на: комментарий от gag

Учитывая что 99.9% C кода просто вызывает abort() после этого - то разницы никакой.

RazrFalcon ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Тем более, учить это говно не стоит даже ради прикола. В каком-нибудь хаскелле в тыщу раз больше смысла.

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от mertvoprog

Хотя у многих Rust как раз «для души»

радужное инклюзивное комьюнити

Выходит, у многих душа находится в жопе?

bread
()
Ответ на: комментарий от RazrFalcon

gentoo уже можно собрать с -Werror?

не знаю, если нельзя то, значит в тех программах, которые не собираются есть проблемы. Даже если автор не хочет исправлять какие-то предупреждения, так как они неправильные, то их можно подавлять в коде…

fsb4000 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Задам вопрос по-другому: можно собрать ядро с -Werror?

Ну видимо нет, да я решил посмотреть как устроена сборка, и во многих проектах лишь отдельные предупреждения с Werror.

В ядре:

KBUILD_CFLAGS   := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
		   -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
		   -Werror=implicit-function-declaration -Werror=implicit-int \
		   -Wno-format-security \
		   -std=gnu89

в gtk

    '-fno-strict-aliasing',
    '-Wno-c++11-extensions',
    '-Wno-missing-include-dirs',
    '-Wno-typedef-redefinition',
    '-Wduplicated-branches',
    '-Wduplicated-cond',
    '-Wformat=2',
    '-Wformat-nonliteral',
    '-Wformat-security',
    '-Wignored-qualifiers',
    '-Wimplicit-function-declaration',
    '-Wlogical-op',
    '-Wmisleading-indentation',
    '-Wmissing-format-attribute',
    '-Wmissing-include-dirs',
    '-Wmissing-noreturn',
    '-Wnested-externs',
    '-Wnull-dereference',
    '-Wold-style-definition',
    '-Wpointer-arith',
    '-Wshadow',
    '-Wstrict-prototypes',
    '-Wswitch-default',
    '-Wswitch-enum',
    '-Wundef',
    '-Wuninitialized',
    '-Wunused',
    '-Werror=address',
    '-Werror=array-bounds',
    '-Werror=empty-body',
    '-Werror=implicit',
    '-Werror=implicit-fallthrough',
    '-Werror=init-self',
    '-Werror=int-to-pointer-cast',
    '-Werror=main',
    '-Werror=missing-braces',
    '-Werror=missing-declarations',
    '-Werror=missing-prototypes',
    '-Werror=nonnull',
    '-Werror=pointer-to-int-cast',
    '-Werror=redundant-decls',
    '-Werror=return-type',
    '-Werror=sequence-point',
    '-Werror=trigraphs',
    '-Werror=vla',
    '-Werror=write-strings',

Ну плохо, что они позволяют даже тем предупреждениям, которые они выбрали чтобы компилятор им их показывал, быть в коде…

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

ЧТД

Фичи и проверки раста недоступны в С/С++ в принципе. Смиритесь.

RazrFalcon ★★★★★
()
Ответ на: комментарий от fsb4000

Почему растоманы за столько лет не нашли хотя бы несколько реальных примеров

А зачем их искать? Они на cve.mitre.org выложены.

то есть реальный режим, в котором и разрабатывают сишники

Разве что в своих влажных фантазиях. В большинстве случаев, как тут уже сказали, код на C с -Werror не соберётся. Частично, потому что древний говнокод и безумное жонглирование указателями. Частично, потому что новые ворнинги добавляют.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от mertvoprog

Почему это? Какой толк заставлять себя учить язык, который нафиг никому не нужен?

Если бы нафиг никому не был нужен, не было бы столько драмы на ЛОРе (и не только!) вокруг него. И всякие мозиллы, микрософты и прочие жыдбрейнсы бы не вкладывались.

Но это всё не так важно. Вопрос в том, что именно ты собираешься делать с этим инструментом. Если инструмент позволит тебе быть более продуктивным и быстрее писать более качественный код, чем конкуренты, то почему нет? Чтобы не распинаться, лучше лишний раз приведу ссылку на Пола этого вашего Грэма и его Beating the averages.

Добавлю, что по поведению многих людей здесь может сложиться впечатление, что язык программирования – это нечто среднее между клеймом на лбу, половым расстройством и образом жизни. Но это не так. К языкам достаточно относиться как к любым другим инструментам. Если тебе достаточно жабы чтобы копать код отсюда и до обеда, то в этом нет ничего плохого. Просто кто-то другой может хотеть более удобного инструмента и отсутствия лишних страданий.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от fsb4000

А в Windows и FreeBSD malloc возвращает NULL когда не может выделить память…

В FreeBSD тот же overcommit по дефолту включен и никто не мешает сделать malloc(1T) и получить указатель.

С другой стороны, на Windows overcommit просто не нужен, потому что основная потребность в overcommit сейчас – это чтобы fork() работал.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от bread

Ннискожыти, там куча мозголомных концепций. Можно, конечно, их не учить, и пытаться писать как на более знакомом ЯП, но тогда воевать с компилятором придётся на порядок больше.

mertvoprog
()
Ответ на: комментарий от hateyoufeel

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

А толку с того, что они вкладываются? Ну будет язык, не выходящий за пределы полутора контор, как F# какой-нибудь. Для стремящихся попасть в конкретную контору разве что.

Если инструмент позволит тебе быть более продуктивным и быстрее писать более качественный код, чем конкуренты, то почему нет?

Потому что этого мало; если в требованиях — писать на %languagename%, а не на Rust, то продуктивность и качество идут лесом. Иначе весь мир давно перешёл бы на один ЯП.

К языкам достаточно относиться как к любым другим инструментам

Это приводит к тому, что программист не становится специалистом ни в одном ЯП и постоянно мечется, не повышая с годами скилл. cast @Bioreactor.

mertvoprog
()
Ответ на: комментарий от mertvoprog

Потому что этого мало; если в требованиях — писать на %languagename%, а не на Rust, то продуктивность и качество идут лесом.

Ну может и лесом такие конторы тогда?

Иначе весь мир давно перешёл бы на один ЯП.

Универсальных инструментов нет. У нас в одном проекте зачастую может два-три языка для разных целей присутствовать, не считая каких-нибудь мелких скриптов на шелло-питоне.

программист не становится специалистом ни в одном ЯП

Что значит быть «специалистом в ЯП»? Знать наизусть стандарт и детали реализации? А нафига? Я тут могу сказать примерно следующее: если с инструментом приходится воевать больше времени чем, собственно, решать предметные проблемы, то может и нахер такой инструмент? Это, в основном, касается всяких C/C++, которые все почему-то всё время неправильно держат и в итоге весь мир течёт и сегфолтится. Хотя про какой-нибудь Haskell я тоже так периодически думаю :)

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от bread

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

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

ничего, есть ещё wget и libfetch

Harald ★★★★★
()
Ответ на: комментарий от mertvoprog

там куча мозголомных концепций. Можно, конечно, их не учить

Вот именно. Опытный похапист на любом языке напишет программу на похапе. С садистским канпелятором даже проще, опытным путём нащупаешь как нужно делать, чтобы оно не ругалось.

bread
()
Ответ на: комментарий от hateyoufeel

Ну может и лесом такие конторы тогда?

Ну о чём и речь: растаманам придётся выбирать из полутора контор. Может, лесом такой язык лучше?

Универсальных инструментов нет

А речь не об универсальности, речь о том, что рыночек ЯП давно переделён.

Знать наизусть стандарт и детали реализации?

Знать питфолы конкретного языка и кодить на нём (включительно с набором библиотек/фреймворков для базовых вещей) на автоматизме, забивая голову более высокими абстракциями, касающимися бизнес-логики, а не лазить каждые 5 минут в документацию. Постоянно прыгая по языкам и стекам, такого уровня опыта достичь нереально.

которые все почему-то всё время неправильно держат и в итоге весь мир течёт и сегфолтится

В других языках подобные проблемы просто выражаются иначе. Спровоцировать утечку в скриптухе и тем более функциональщине куда тривиальнее, а поймать её сложнее. Исключения и ошибки же отличаются от сегфолтов лишь степенью фатальности ;)

mertvoprog
()
Последнее исправление: mertvoprog (всего исправлений: 1)
Ответ на: комментарий от bread

Если опытный похапист не пошлёт раст нафиг раньше, ведь похапа ничего компилировать не требует и уже давно бы заработала!

mertvoprog
()
Ответ на: комментарий от mertvoprog

А как же ЧСВ? Вон vertexua пишет какую-то срань на расте, которую можно написать на пыхе или го. А зачем? Только для ЧСВ. А у вас так и вовсе раст вместо баша. Ну чо тут скажешь...

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от bread

А у вас так и вовсе раст вместо баша

Ну так профит наглядный: на баше под нагрузкой постоянно зависало, а теперь почти не виснет.

mertvoprog
()
Ответ на: комментарий от bread

И ещё пары кило-мега-гигабайтов выводит красиво и единообразно; Мы бы свихнулись на баше такое писать ;)

mertvoprog
()
Ответ на: комментарий от RazrFalcon

+ fsb4000 так ведь -Werror не для сборки а для разработки, на разных платформах и разных версиях могут быть разные предупреждение, и конечно могут возникать ложные. Смысла так собирать просто нету.

paramon
()
Ответ на: комментарий от fsb4000

Я неправильно вначале тебя прочитал. И думал, что тихий возврат NULL это типа минус, и написал что можно не тихо возвращать NULL, а падать.

Тогда разобрались.

glib это не libc, это «Gnome Lib».

Знаю.

Но паники в Rust можно перехватывать(это те же исключения С++,…

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

Note that this function may not catch all panics in Rust. A panic in Rust is not always implemented via unwinding, but can be implemented by aborting the process as well. This function only catches unwinding panics, not those that abort the process.

На данный момент об API для перехвата обработки OOM-события всё ещё до конца не договорились; то что есть сейчас не стабильно и поэтому не доступно в обычной версии компилятора.

gag ★★★★★
()
Ответ на: комментарий от gag

Вы не туда читаете. Этот параграф о том, что прогу на расте можно собрать с panic=abort, ака -fno-exceptions.

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

Другое дело что в расте поведение аллокатора зависит от самого аллокатора. По умолчанию, будет вызван std::alloc::handle_alloc_error и уже эта функция вызовет abort. То есть никаких исключений.

Что интересно, попытка аллоцировать больше isize::MAX приведёт к панике. Но это assert, а не OOM.

Ну и не будем забывать про уже упомянутый overcommit, который ставит всё с ног на голову.

Напоследок:

We’ll also need a way to handle out-of-memory (OOM) conditions. The standard library calls std::alloc::oom(), which in turn calls the oom langitem, which aborts the program in a platform-specific manner. The reason we abort and don’t panic is because unwinding can cause allocations to happen, and that seems like a bad thing to do when your allocator just came back with «hey I don’t have any more memory».

https://doc.rust-lang.org/nomicon/vec-alloc.html

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Вы не туда читаете.

Ну, как там написали, так я и читаю.

Note that this function may not catch all panics in Rust. A panic in Rust is not always implemented via unwinding, but can be implemented by aborting the process as well. This function only catches unwinding panics, not those that abort the process.

Т.е. при работе программы одни ловит, другие нет, в зависимости, как та или иная panic реализованы.

Этот параграф о том, что прогу на расте можно собрать с panic=abort, ака -fno-exceptions.

А у вас получается, что не «may not», а «will either all or none». Как соберёшь, так будут ловиться или не ловиться все panic.

Что интересно, попытка аллоцировать больше isize::MAX приведёт к панике. Но это assert, а не OOM.

Интересненько.

gag ★★★★★
()
Ответ на: комментарий от gag

при работе программы одни ловит, другие нет, в зависимости, как та или иная panic реализованы

Паники реализованы глобально. Нельзя собрать пол проги одним методом, а другую другим.

RazrFalcon ★★★★★
()
Ответ на: комментарий от mertvoprog

Ну о чём и речь: растаманам придётся выбирать из полутора контор.

Почему-то у меня таких проблем не возникало.

речь о том, что рыночек ЯП давно переделён.

Даже близко не. Вспомни сам, лет 5-7 назад шкалка и руби были последним писком и все на них молились. Сейчас их уже слегка закапывают. В бэкенде очень много где golang поселился. В мобильной разработке — Kotlin.

Языки программирования — крайне непостоянная вещь. Понятно, что можно зависнуть на одном месте и 50 лет программировать на коболе, но вряд ли ты об этом мечтаешь.

Знать питфолы конкретного языка и кодить на нём (включительно с набором библиотек/фреймворков для базовых вещей) на автоматизме

Если это не C++ с его комитетом старперов, то эта информация в основном будет неактуальна через 4 года.

Исключения и ошибки же отличаются от сегфолтов лишь степенью фатальности ;)

Простуда от анального спидорака отличается лишь степенью фатальности. Чувак, не пори херню. Исключение можно перехватить и обработать. После сегфолта твой код может разве что сдохнуть.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

та нее это ядро, а линуксовое, ну или какое нить из БСД(нет/фри/опен/стрекоза)
ну или МС бы ядро 10-ки на расте переписала...

Minona ★★☆
()
Последнее исправление: Minona (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.