LINUX.ORG.RU

Доказана эффективность Rust

 , , , ,


3

6

… но на самом деле не совсем. Доказана типобезопасность подмножества Rust. Соответствующая статья опубликована аж целых два года назад. А доказательство верифицировано, просто афигенский рокетсайнс.

Считаю, что об этом полезно будет узнать жителям ЛОРа, особенно некоторым анонимам.

P.S. Сам с удивлением узнал сей факт, читая наброс humbug на хабре. Очень качественный наброс, кстати. Рекомендую.



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

Могу сесть в лужу, т.к. раст не знаю. Но вопрос: если там тип ясен из контекста, нафига вообще эта констрцкция с угловыми скобками?

Тип элемента контейнера ясен, но не ясен тип контейнера, потому и пишут это самое «Vec<_>».

Лично моя претензия к расту скорее заключается в том, что на уровне функций вывод заканчивается, а ведь именно функции в 2020 году являются основным инструментом метапрограммирования, включая локальные функции и лямбды-как-аргументы. В этом плане мне понравилась тенденция компиляторов GPU вытягивать все вызовы функций в один линейный код — мы ведь к этому в итоге идем. В больших проектах в большинстве случаев вызов функций производится взаимно внутри одного модуля, включая стандартные либы в состав этого модуля.

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

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

А теперь у всех инет, доступен веб с картинками, видео и всем, что угодно. И какой из этого вывод?

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

А теперь у всех инет, доступен веб с картинками, видео и всем, что угодно. И какой из этого вывод?

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

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

вывод такой, что когда инет отрубят, вы не …

хорошо-хорошо, но ты ответил на вопрос о стандарте. Как это все «не» связано с наличием или отсуствием стандарта. И да, кстати, на C++, если мне надо что-то быстро выяснить, драфт стандарта - это последнее место, в которое я полезу, в основном поисковик и сайты типа SO, ну или LOR.

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

драфт стандарта - это последнее место, в которое я полезу, в

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

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

Ответил на вопрос здесь. Вкратце: конструкция имеет смысл, если тип T ясен из контекста, но остальное – нет. В ответе привожу в пример collect, который собирает перечисляемые итератором элементы в любую коллекцию, реализующую трейт FromIterator. При применении collect тип элементов известен, но про коллекцию, в которую они будут собираться, не известно ничего, кроме того, что она должна реализовывать трейт. Поэтому ее тип нужно указать явно, но тип ее элементов можно опустить.

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

Тип элемента контейнера ясен, но не ясен тип контейнера, потому и пишут это самое «Vec<_>».

видимо, претензия заключалась в том что в C++ можно написать что-то типа

std::vector<int> a{1, 2, 3, 4, 5};
std::vector b(a);

без лишних скобок

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

Неописанные corner cases находят и в стандартах языков (кстати, кто там стандартизировал Java?). И что? Разработчики компиляторов бегают кругами и жалуются, что не могут написать компилятор?

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

Лень читать 5 страниц. Доставьте ХАЙЛАЙТЫ, пацаны. С меня увожение

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

без лишних скобок

В раст можно написать и без лишнего типа

let a = vec![1,2,3,4,5];
let b = a.clone();

b(a) - это клонирование вектора, не ошибаюсь? auto b(a); сделает то же самое?

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

Тип элемента контейнера ясен, но не ясен тип контейнера, потому и пишут это самое «Vec<_>».

А имени Vec недостаточно?

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

Vec означает: использовать дженерик-типы, указанные по умолчанию. Но так как у Vec<T> нет типа элементов по-умолчанию, то это будет ошибкой.

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

если будет стоять задача парсинга для извлечения декларций

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

И, опять таки, возвращаемся к неотвеченному тобой вопросу: как наличие инетов, форумов и картинок влияет на наличие/отсутствие стандарта языка?

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

И, опять таки, возвращаемся к неотвеченному тобой вопросу: как наличие инетов, форумов и картинок влияет на наличие/отсутствие стандарта языка?

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

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

ну компилятор то у них есть. иначе что еще проверяет синтаксис и генерирует нечто в соответствии с некоей семантикой конструкций.

Так это не компилятор, а фронтенд к llvm. И автор этого транслятора давно не в команде. Можно предположить, что там вообще никого нет, кто бы полностью понимал код rustc. Вся разработка ведется на уровне «добавить фичу, потому что она удобна мозиле».

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

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

Да, и никто толком не знал как шайтан-машина работает и где там зарыты грабли.

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

вот кстати прекрасная иллюстрация того, о чем я говорю… прямо из упомянутого в топик стартером документе… стр 66:3


For obvious reasons of scale, we do not consider the full Rust language, for which no formal description exists anyway. Instead, after beginning (inğ2) with an example-driven tour of themost central and distinctive features of the Rust type system, we proceed (inğ3) to describeλRust, a continuation-passing style language (of our own design) that formalizes the static and dynamic semantics of these central features.


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

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

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

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

я ни словом не обмолвился о связи инета с необходимостью стандартов

тогда зачем в ответе на справедливое замечание о первом стандарте C ты написал:

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

к чему этот отсыл к «картинкам»?

это общая практика для разработчиков языка, уважающих свою аудиторию

Вот я, допустим, в 1996г. взял книгу о программировании на Borland C++ 5.0, читаю, и программирую в Win95 на этом самом BC++5.0. И я вообще ничего не знаю про стандарт, мое понятие о уважении автором языка моей персоны (или оной разраотчиков компилятора) не зависит от наличия или отсутствия стандарта. И почему вообще речь зашла об «уважении»? Это типа как после распития, «ты меня уважаешь»?

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

тогда зачем в ответе на справедливое замечание о первом стандарте C ты написал:

у сишечки не было официального стандарта, но было подробное описание в виде лангрепорта. что является неофициальным! стандартом. это я уже писал, но приходиться повторяться. у руста похоже вообще кроме примеров ничего нет. у руста до официального стандарта еще лет 800. пусть хоть лангрепорт выкатят. что обычно делают еще до выпуска первого компилятора или вместе с ним.

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

вместо этого, после тура по их сайту с примерами наиболее важных фич…

По какому ещё сайту? «Для начала мы рассматриваем основные и отличительные особенности Раста с демонстрацией их на примерах, после чего…»

И главную часть упустили.

that formalizes the static and dynamic semantics of these central features

Язык, который они придумали формализует то, что отличает Rust от других языков.

Формальное описание семантики языка, в отличии от неформального описания семантики языка в стандарте - это вообще редкая вещь.

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

лангрепорта

Да что это за лангрепорт такой? Я встречал упоминание этого термина только в связи с ALGOL 60. Дайте ISBN, или ссылку какую-нибудь. А то непонятно о чём речь.

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

Про отсутствие «после тура по их сайту» тебе уже ответили.

For obvious reasons of scale

по очевидным причинам размера языка

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

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

Да что это за лангрепорт такой? Я встречал упоминание этого термина только в связи с ALGOL 60. Дайте ISBN, или ссылку какую-нибудь. А то непонятно о чём речь.

Это спецификации. лангрепорт(language report) испускается вместе с первым компилятором, как анонс языка. потом он плавно перетекает в спецификацию, и уже более не нужен, и является скорее историческим документом.

https://docs.oracle.com/javase/specs/

https://csharpindepth.com/Articles/Specifications

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

Про отсутствие «после тура по их сайту» тебе уже ответили.

за тур по сайту - прошу прощения…там просто тур… видимо по турции, я не выяснял. короче после тура с примерами они….

дело в том, что scale многие могли истолковать по разному, но для меня в данном случае это «масштабность», которую я заменил на «размер языка».

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

я вот что-то не понял… я вот нашел спецификацию руста, и еще в первом комменте написал, что заранее извиняюсь, если она есть…

вы же, растоманы, меня куда-то увели в болото дисскусии об отсутствии таковых и у других языков..откуда следует что вы спецификацию не читали, и похоже не знали о ее существовании. короче она вот. чтобы знали на чем пишете там. сбоку справа есть оглавление на кнопочке. вот это похоже уже на дело https://doc.rust-lang.org/stable/reference/

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

Это спецификации. лангрепорт(language report) испускается вместе с первым компилятором, как анонс языка. потом он плавно перетекает в спецификацию, и уже более не нужен, и является скорее историческим документом.

А как тебе такая хронология:

  • 1979 - начало работы над «C с классами»
  • 1982 - переименование в C++, выходит первый компилятор cfront (какие там были спеки?)
  • 1985 - первый коммерческий компилятор, появляется первая версия книги «Язык программирования C++» Вот, что сказано о книге на сайте Страуструпа:

Here is the definitive reference and guide to the C++ programming language, which was designed and implemented by author Bjarne Stroustrup. C++ is the result of years of experiments and research at AT&T Bell Laboratories to create a successor to C. It is already heavily used in many AT&T Bell Laboratories’ projects.

Что-то ничего не сказано про формальное описание ЯП, но зато «already heavily used in many AT&T Bell Laboratories’ projects». Как так, коллег своих совсем не уважал, кормил насильно своим нестандартизированным C++?

  • 1990 - появляется Annotated Reference Manual, считается документом, на котором основан международный стандарт.

Таким образом, от момента начала работы над «C с классами» и до появления ARM (еще не стандарта) прошло 11 лет.

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

Керниган и Ричи написали книгу «The C Programming language» ISBN 9780131101630. Там есть раздел C Reference manual, который начинается так: «This manual describes the C language on the DEC PDP-ll, the Honeywell 6000,the IBM System/370, and the Interdata 8/32. Where differences exist, it concentrates on the PDP-11, but tries to point out implementation-dependent details. With few exceptions, these dependencies follow directly from the underlying properties of the hardware; the various compilers are generally quite compatible»

Вольный перевод: «Мы тут описываем немного разные варианты реализации языка на четырёх платформах с упором на версию для PDP-11, но пытаемся указать где у нас implementation defined, а где рыбу заворачивали. Но в основном всё должно работать одинаково.»

А language report для C это что?

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

Вольный перевод: «Мы тут описываем немного разные варианты реализации языка на четырёх платформах с упором на версию для PDP-11, но пытаемся указать где у нас implementation defined, а где рыбу заворачивали. Но в основном всё должно работать одинаково.»

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

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

Ну, конкретно тело замыкания в расте участвует в выводе типа в оборачивающей функции. Локальных функций вроде нет, но лямбды вполне их замещают, по крайней мере в книгах по расту советуют не ссать использовать конструкции типа vector.map(lambda1).filter(lambda2).for_each(lambda3), типа это работа компилятора превратить вызов функций высшего порядка в цикл, с простым local_func() тем более справится.

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

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

в расте нельзя написать вот такое, например

auto f = [&](const auto& f, uint32_t i) {
    if (i == 0) return 1UL;
    return f(f, i - 1) * i;
};
Lrrr ★★★★★
()
Ответ на: комментарий от red75prim

Невыразимый тип, который обозначается как func()::<lambda(const auto:1&, int)>, где auto:1 по необходимости разворачивается в func()::<lambda(const auto:1&, int)>.

Занятно. Ленивый бесконечный тип.

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

Так это что, и сам Y-комбинатор не типизируем тоже? Как только люди с этим живут? :)

А то, что в современные плюсы завезли индуктивные типы, это интересно, спасибо. Оно в рантайме от f(f, 10) не грохнется потом при попытке что-нибудь в типах проинтроспектировать?

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

С автовыводом типов нельзя, но вообще можно:

struct Rec<'a>(&'a dyn Fn(Rec<'a>, u32) -> u32);

fn main() {
    let f = |f: Rec, i: u32| {
        if i==0 {
            1
        } else {
            (f.0)(f, i - 1) * i
        }
    };
    
    println!("{}", f(Rec(&f), 6));
}
red75prim ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.