LINUX.ORG.RU

www.linux.org.ru/forum/talks/16325849?cid=16331211

Borrow checker проверяет и данные в куче, его правила работают и в многопоточном коде

В Rust локальные переменные могут выделяться в куче, как это происходит в скриптовухе во многих языках с динамическими типами данных. Однако, фундаментальный принцип работы borrow checker-а — каждая область памяти может в одно время изменяться только одним фрагментом кода. То есть, по сути данные являются локальными для некоторых функций. Или же данные общие, но изменять их нельзя.

Так еще делает, если я не ошибась, Ponylang — скорее всего по стопам раста.

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

Например, толпа фанатиков, которая кричит про то, что раст — лучший яп, или, что товарищ @byko3y уже приводил, время компиляции.

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

толпа фанатиков, которая кричит про то, что раст — лучший яп

А какой язык лучше раста?

время компиляции.

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

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

А какой язык лучше раста?

Что есть лучше? Лучше для чего?

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

Только вот компиляция раста просто очень длинная. Попробуйте собрать компилятор раста. А потом соберите gcc.

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

Например, толпа фанатиков

С каких пор толпа фанатиков - проблема языка? У твоего любимого тоже есть своя толпа фанатиков, если он конечно не эталонное ненужно. Теперь твой любимый язык проблемный?

время компиляции

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

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

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

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

Типа, как часто тебе действительно нужно собирать компилятор раста, что бы говорить, что это проблема?

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

С каких пор толпа фанатиков - проблема языка

Неправильная реклама. Так у джаваскрипта сейчас.

У твоего любимого

Это какой же, интересно.

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

Конечно рантайм важнее. Только вот на время компиляции забивать полностью не стоит.

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

А какой язык лучше раста?

Вот. В точку. Какой язык лучше раста? Альтернатив нет. Какой язык лучше Java? Альтернатив все равно нет. И да, я завидую. Потому что могу сделать язык лучше, но он никому не нужен — индустрия будет еще минимум 5-10 лет сидеть на C++/Java/C#, даже если мой язык окажется божественным и неповторимым. Блин, даже Rust можно было сделать лучше, но в какой-то момент его отдали на растерзание эффективным менеджерам, у которых почти получилось похоронить язык.

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

https://www.reddit.com/r/rust/comments/av1fi3/how_much_time_does_it_take_to_c...

Rust компилирует сам себя почти час. При том, что это порядка 400 тыс строк кода — детский сад. Посмотри на GCC, в котором 15 млн строк. Сколько будет самокомплиироваться Rust, когда дорастет до таких объемов? Круглые сутки?

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

А какой язык лучше раста?

Что есть лучше? Лучше для чего?

Лучше для того, чтобы реализовать на нем средний по больнице коммерческий проект. То есть, с ограничением на время реализации и вообще затрачиваемые на реализацию ресурсы, при некоторой гарантии работоспособности. Он Легионер прав, потому что ЯП выбирают манагеры, а не программисты — а манагеры выбрали Java, C++, и Rust.

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

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

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

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

Тебе самому хоть раз приходилось писать достаточно большой проект, на котором время компиляции раста было бы пролемой? Мне нет

Мне приходилось. Лично. Дальше что?

могу привести в пример хромимум(если он еще жив), который на плюсах написан и собирается несколько часов

А сутки+ на одном ядре не хотел?

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

Кстати, Растовчане советуют не компилировать код лишний раз. А использовать

cargo check

а лишь когда cargo check не покажет ошибок, тогда выполнять

cargo build

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

https://imgur.com/a/v1dBI8S

:)

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

Растовчане советуют не компилировать код лишний раз. А использовать

Это всё попытки как-то спасти проект, который уперся в глухую стенку и дальше не двигается. Там вон для C++ придумывают резидентные сервера сборки, но в итоге переходят на модули, потому что без изменения архитектуры языка дальше развивать сборку некуда. У раста та же ситуация — спроектирован язык плохо, и всё проведенное растом в яслях время было упущено, вовремя задержка развития не обнаружена (PS: а я подчеркиваю, что еще в самом начале развития у раста была явная проблема со временем компиляции, на которые упорно не обращали внимание). И теперь у нас ребенок-аутист, который не может говорить, читать, писать, избегает взгляда глаза в глаза, но зато может раскладывать предметы по порядку.

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

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

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

у тебя в последнем слове 4 ошибки. там С#

C# — это киборг, где-то в недрах которого сидит исходный человек в первозданном виде, но про этого человека уже никто не помнит.

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

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

Но ты даже не попробовал.

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

Хоть мне и блевать охота от сего тула, но все таки Си диез действительно одно из самых используемых... Типо я реалист...

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

Я думаю он ещё компиляет много зависимостей, хотя я не проверял

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

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

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

Хоть мне и блевать охота от сего тула, но все таки Си диез действительно одно из самых используемых... Типо я реалист

Элементарно, Ватсон: до восьмерки Java была адом, при этом из альтернатив было только C#. Конечно, потом подъехал уже и Go, и сами разрабы Java оживились, потому что язык рисковал остаться вообще без коммерческих ниш и отправиться на помойку. Это волшебные механизмы «рыночка», которые я долго не мог понять: почему вся экономика может тратить сотни миллиардов долларов для обхода проблем, которые можно было бы решить один раз за 100 млн долларов?

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

что именно я не пробовал...?

Сказать мне, сколько раз в час энтерпрайз программист запускает компиляцию.

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

Например?

Компиляция медленная и всё очень жирно. Нет нормальных исключений. Дыры в якобы безопасной модели.

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

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

У Rust оно хуже всех. Даже C++ быстрее. Это сказывается на общей скорости разработки потому что надо непрерывно тестировать что написано.

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

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

Я линк давал на обзор этой проблемы с конкретными причинами:

https://pingcap.com/blog/rust-compilation-model-calamity

Лучше уже не будет. Проблема в том, что часами компилируется не только компилятор, но еще и любой другой проект на расте такого же или большего размера. А что такое 400 тыс строк? Это проект на десять рыл за пару лет работы. У меня команда из 7 человек где-то за 8 лет написала миллион — и это скромненькая такая разработка для полупубличного пользования, даже не какой-то крупный высокобюджетный проект.

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

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

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

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

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

TooPar
()
Ответ на: комментарий от Legioner
  • Soundness holes. Если уж начинать сраться про безопасность - то отсюда, но поехавшие хейтерки обычно не знают Rust чуть более чем совсем, поэтому аргументация скатывается в какое-то УГ.
  • Куча нужных и ожидаемых фич (GAT, полная версия const generics, trait bounds на самих trait-ах, etc.), которые зависли в ожидании chalkification.
  • Не особо удобная всинхронщина.
anonymous-angler ★☆
()
Ответ на: комментарий от fernandos

Ну да, у меня в генте он стоит.

Ах вот он какой, собирательный образ растохейтера.

meliafaro ★★★★★
()
Ответ на: комментарий от anonymous-angler

Rust локальные переменные могут выделяться в куче

Откуда такая информация? Это не так

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

byko3y ★★★★
() автор топика
Ответ на: комментарий от anonymous-angler

Почему не может? Что тебе мешает её вернуть из функции и передать в другую?

Что мешает мне целочисленную переменную вернуть из функции? Да ничего. Однако, это не отменяет того факта, что эта переменная была локальная для этой функции во время выполнения этой функции.

Я все-таки ожидал, что ты в качестве примера приведешь передачу ссылки в вызываемую функцию, а не возврат в вызывающие, что есть более сложным случаем, поскольку как бы вызывающая функция у нас не закончилась, но и управление ведь из нее ушло за пределы видимости локальных переменных, а локальные переменные другие функции, тем не менее видят. Оба варианта передачи локальных данных есть в том же Си, и это не отменяет того факта, что они локальны и попытка выполнить небезопасную операцию за пределами видимости приведет к UB в сишке или же к ошибке компиляции в Rust без unsafe.

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

Ты не поверишь, но в Сишечке тоже так можно

Во, ты почти понял. Только не понял, что я подвожу ровно к тому же.

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

Ну… Эээ… Я не совсем понял суть твоей претензии.


fn callee1(a: &mut Vec<i32>) {
    a.push(6);
    a.push(7);
}

fn callee2(mut a: Vec<i32>) -> Vec<i32> {
    a.push(8);
    a.push(9);
    a
}

fn caller() {
    let mut a: Vec<i32> = vec![1, 2, 3, 4, 5];
    
    callee1(&mut a);
    a = callee2(a);
    
    for i in &a {
        print!("{} ", i);
    }
    println!();
}

Вектор - один и тот же, ни разу не копируется. То же самое будет и с Box. Какой-нибудь Arc<T> можешь хоть в static запихнуть.

anonymous-angler ★☆
()
Ответ на: комментарий от anonymous-angler

Или расшарить что-то в куче между потоками. Опять же, вектор всего один.

use std::sync::Arc;
use std::sync::Mutex;
use std::thread;

fn callee1(a: Arc<Mutex<Vec<i32>>>) {
    let mut a = a.lock().unwrap();
    a.push(6);
    a.push(7);
}

fn callee2(mut a: Arc<Mutex<Vec<i32>>>) {
    let mut a = a.lock().unwrap();
    a.push(8);
    a.push(9);
}

fn caller() {
    let mut a = Arc::new(Mutex::new(vec![1, 2, 3, 4, 5]));
    
    let thread1 = thread::spawn({
        let a = a.clone();
        move || callee1(a)
    });
    
    let thread2 = thread::spawn({
        let a = a.clone();
        move || callee2(a)
    });
    
    thread1.join();
    thread2.join();
    
    let a = a.lock().unwrap();
    for i in a.iter() {
        print!("{} ", i);
    }
    println!();
}
anonymous-angler ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.