LINUX.ORG.RU

У кого-то на хабре бомбануло от Столярова

 , ,


2

8

https://habr.com/ru/post/598219/

Если вкратце, растофанатик решил доказать, что его любимый язычок тоже умеет в нулевой рантайм, отключил std и core, и у него даже получилось собрать хелловорлд «как на сишечке».
Правда руст в этом состоянии даже два числа сложить не может (а весь хелловорлд по сути написан на ассемблере), в то время как сишечка без библиотек остаётся той же сишечкой, достаточно пары обёрток над сисколлами.

Ваше мнение?

★★★★★

Последнее исправление: TheAnonymous (всего исправлений: 3)

Я надеюсь, пишущие на Go такой фигнёй не страдают.

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

Которой тогда еще не существовало :D

Ты меня напугал. Полез, посмотрел. Java вышла в 95. Тогда в плюсах даже dynamic_cast не было.

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

Не было стандарта с большой круглой печатью от международных спиногрызов. По факту «стандарт» выпускаемый Страуструпом существовал ещё в 80х, а в начале 90х это уже был целый комитет, не знаю правда выпускали ли они до 98го какие-то стандарты.

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

Если там оператор сложения не захардкожен в компилятор

Захардкожен. Просто не работает. Как и всё остальное.

Ну и понятное дело, если в этом случае выпилить std, то и складывать не сможет. Хотя может быть всё по-другому и ты просто набросил про сложение.

Всё ещё хуже.

А почему на расте недостаточно?

Потому что раста никакого не будет. Раста не существует как языка. На нём ничего невозможно написать.

Поэтому путём обмазывания ffi с сишным рантаймом, интринсиком ллвм(читай сишка-вм) и тонн ансейфа - создана stdlib. Где уже как в песочнице ты можешь что-то делать. Правда не что-то, а лабы. Но это уже нюансы.

Работает так же как и везде. Вот можешь ты в жаваскрипте хранить какие-нибудь байты? Нет. Ты можешь использовать только внешнюю сущность. И так со всем.

Поэтому если из пхп(и прочих подобных растов) мы убирает stdlib и прочий рантайм - остаётся пустота. Это основной критерий. Почему это важно я могу дополнительно объяснить.

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

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

Нет, не подразумевают. Это миф. А то, что раст как нахлабучка над llvm может существовать - это не значит ничего. Это просто фокусы.

Поэтому без рантайма на сишке всё и везде пишут. А такого с растом не приключается. Почему?

Пару примеров я уже показал. Как мне сделать sizeof в расте? Как мне сложить 2 числа.

Это всё базовые свойства того, что раст не является языком. Хост-языком для неё является си через llvm. Т.е. раст знать не знает как он исполняется, где, что такое сложение чисел и прочее. Это просто сахарок.

Вот сишка знает. Раст - нет. Это как какой-нибудь котлин из мира жавы. Тоже обёртка требующая хост-языка.

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

Привет, царь!

Как мне сделать sizeof в расте?

Как тебе сделать sizeof в C для автоматического массива? И что он выдаст?

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

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

Нельзя. Этот код выглядит как мусор и работает как мусор. Никаких абстракций поверх него не построишь.

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

Это, кстати, ещё один ложный пропагандистский штамп. Никуда там ничего не предотвращается. ссылки - это часть раста как нахлабучки. Она живёт отдельно. Вообще ничего не знает про unsafe.

Поэтому рассказывать о том, что в unsafe что-то сохраняться - это неверно.

unsafe позволяет использовать операции, которые нативные для хост-языка. О которых раст в принципе ничего не знает. Это значит, что внутри unsafe я могу кастануть ссылку к указателю и наоборот. И никакое отслеживание никуда и ничего об этом не скажет.

По-сути любой unsafe-код в расте - это ub. Любое преобразование указателя в ссылку/ссылку в указатель - уб. Это работать не должно/не может.

У них когда-то были с этим проблемы - поэтому они повырубали все noalias из llvm. И в целом ллвм прощает много где подобное.

Для тех кто не понимает - поясню. Если у нас есть mut ref - она обладает инвариантов уникальности. Если же мы берём от неё указатель/преобразуем её из указателя - это сразу нарушение инварианта и бам.

Это решается всяким завязыванием на уб и тем свойством, что ref - это просто обёртка над хост-сущностью. Поэтому номинально на уровне llvm инвариант не нарушается. Но это лишь хак, который еле-еле работает.

Допустим в случае с async они не осилил сделать этот хак. И им пришлось нарушать инварианты у ссылок. Поэтому в async у ссылок иная семантика. В этом весь раст - сплошная дыра.

Но т.к. это не язык даже, а хост-язык нормально умеет в алисы, то всё вроде работает. Ну всегда можно хост-язык обвинить в уб. Они всегда так делают. Ну хотя хост у них не сишка, а реализация сишки. Поэтому там понятие стандартного уб не применимо.

Но для растофанатиков это куда большее табу, чем пихать всюду .clone().

Потому что методичка спускается сверху. А там люди +/- знают то, о чём я писал. Поэтому детабуирование ансейфа сразу даст многим понимание. Сейчас подобными практиками можно скрыть правду от адептов.

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

не знаю правда выпускали ли они до 98го какие-то стандарты

Нет, не выпускали. Комитеты по стандартизации C++ образовались в 1990-ом (ANSI) и 1991-ом (ISO) (источник). По факту, работа над стандартом началась где-то в 1992-ом, а принят он был лишь в 1998-ом.

Что касается книг Страуструпа, то в 1985-ом одновременно с релизом первой версии C++ вышло первое издание «The C++ programming language», в котором описывалось то, что было доступно в компиляторе.

Через год или два Страуструп выпустил отдельную статью (или брошюру) с описанием того, что еще хотелось получить в языке (типа множественного наследования, исключений, шаблонов). Но только часть из этого была добавлена в cfront 2.0 в 1989-ом.

Затем в 1989-ом или в 1990-ом Страуструп выпускает книгу «The Annotated C++ Reference Manual», в которой уже описывается практически то, что затем стало C++98. Но компиляторов, которые это все более-менее поддерживали бы не было еще, как минимум, два года. А под MS-DOS и MS-Windows на x86 как и года четыре.

Так что года до 2003-2004-го был «С++ на бумаге» и «С++ доступный в компиляторах». Только после 2003-го нормальная поддержка C++98 появилась уже почти что повсеместно.

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

Как тебе сделать sizeof в C для автоматического массива?

Ты слился? Показывай мне в расте для начала сайзоф для массива, а потом уже для «автоматического массива». Ну и сам этот «массив» покажи.

И что он выдаст?

Понятия не имею. Ты для начала что это покажи. На расте.

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

Ты слился? Показывай мне в расте для начала сайзоф для массива, а потом уже для «автоматического массива». Ну и сам этот «массив» покажи.

use std::mem::size_of_val;

fn main() {
    let array: [u8; 16] = [0; 16];
    println!("size of array = {}", size_of_val(&array));
}

Опять растохейтеры не могут в простейшие примеры.

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

Потому что в расте код базовых типов и компиляторные интринзики вытащены в либу, которая линкуется по дефолту.

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

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

Так же в расте нету нормальной системы типов - только днище из 60-70 годов. Поэтому приходится костылять всякие sizeof и прочее через рантайм-мусор.

Я уже писал об этом. До const-фейка sizeof вообще напрямую через рантайм работал. Да и сейчас много что работает. Хотя const-фейк такой же рантайм с ТЗ раста.

Поэтому всё. sizeof в расте нет. Зачем начал со мною спорить, что бы в конечном итоге соврать и начать оправдываться?

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

Они просто не понимают что раст это такая надстройка над сишной инфраструктурой. Туллчейн для бедных.
Где запихнули свой синтаксис и модель разработки (это как BDSM в мире программирования, не зря же там во главе угла модель владения) которой придерживается линтер c подобием статического анализатора которое гордо называется borrow checker.

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

которой придерживается линтер c подобием статического анализатора которое гордо называется borrow checker.

Нет, там всё ещё позорней. Сделали бы они именно статический анализатор, но нет. Они не смогли.

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

И вот это неосиляторство они выдали за язык. Ну как в бложике серво написано «вы начали новую жизнь и теперь ещё лучше», когда мозила выкинула их на помойку.

Когда у тебя есть пропаганда и табуны промытых фанатов - нет никакой проблемы называть чёрное белым. По старой схеме работают ака двоемыслие.

right_security
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.