Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
1

[Rust] Обсуждение возможностей и предстоящей роли языка Rust

12.02.2015, 04:38. Показов 13014. Ответов 121
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Psilon, чем он тебя так привлек? И почему именно "убийца плюсов"?
Если напишешь развернутый ответ, обещаю вынести в отдельную тему и погонять компилятор пару часов дабы вступить в полемику
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2015, 04:38
Ответы с готовыми решениями:

[Rust] Как привязывать WinAPI-функции к коду на Rust?
Может кто-нить дать код, КАК привязывать вин апишные функции к растовскому коду (на примере...

[Rust] Расскажите о своём опыте программирования на Rust
Доброе утро! Расскажите, пожалуйста, о своём опыте программирования на Rust. Можно в сравнении с...

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

[Rust] Time
Подскажите как узнать время в Rust. //Rust extern crate time; fn main() { let now =...

121
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
13.02.2015, 10:53  [ТС] 21
Author24 — интернет-сервис помощи студентам
Так-с, я тут.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Не могу до сих пор понять: полезны ли макросы вообще?
Разработчики Rust пишут так (http://doc.rust-lang.org/book/macros.html)
Functions are the primary tool that programmers can use to build abstractions. Sometimes, however, programmers want to abstract over compile-time syntax rather than run-time values. Macros provide syntactic abstraction.
Т.е. иногда возникает необходимость "парить над синтаксисом" и рассматривается как средство для его расширения. Тут макросы скорее похожи на таковые в Scheme, чем на сишные (мои изначальные наблюдения были неверны, пока не попробовал сам такое написать).
Вот, например, обрезанная версия макроса assert, который наверняка знаком многим из Си
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Rust
// сигнатура макроса
macro_rules! my_assert {
    // параметры макроса - принимает одно выражение
    // для двух выражений было бы ($left: expr, $right: expr)
    ($cond: expr) => (
        if !$cond {
            // concat! сцепляет строки
            // stringify! преобразует выражение в строку
            println!(concat!("asserion failed: ", stringify!($cond)));
        }
    );
}
 
fn main() {
    // 5 == 5 не вызвало бы появления сообщения
    // должно вывести: assertion failed: 5 == 6
    my_assert!(5 == 6);
}
Я ещё сам до конца с этим не разобрался, и вам не рекомендую делать большие выводы по этому - в книге эта возможность относится к одной из самых сложных (advanced topics).
III: Advanced Topics - Macros
Исходники стандартных макросов на GitHub
1
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.02.2015, 10:57 22
Ну эти макросы реально круты.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
13.02.2015, 11:01  [ТС] 23
Ещё по поводу расширений синтаксиса макросами: например, в Rust нет возможности использовать именованные параметры, как, например, в C#
C#
1
2
3
4
5
int Add(int left, int right) {
    return left + right;
}
// ...
int y = Add(left: 5, right: 6);  // y = 11
Однако, внутри скобок в println! такая возможность есть
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Rust
fn add(lhs: i32, rhs: i32) -> i32 {
    lhs + rhs
}
 
fn main() {
    let x = add(5, 6);  // x = 12
    
    // Ошибка компиляции, т.к. Rust не поддерживает именованные параметры
    // let y = add(lhs = 5, rhs = 6);
    
    // Выводит "5 + 6"
    println!("{left} + {right}", left = 5, right = 6);
}
println! (а точнее fmt!) похож на C#-ский String.Format(), но даже шире его.
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.02.2015, 11:04 24
Цитата Сообщение от tezaurismosis Посмотреть сообщение
i32
А что означает эта запись?
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
13.02.2015, 11:10  [ТС] 25
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А что означает эта запись?
Целочисленный тип данных в 32 бита. Вот, кстати, числовые типы в Rust
C++ (Qt)
1
2
// Rust
u8, u16, u32, u64, uint, i8, i16, i32, i64, int, f32, f64
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.02.2015, 11:13 26
tezaurismosis, а чем int отличается от i32?
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
13.02.2015, 11:23  [ТС] 27
Dennis Ritchie, судя по документации, на int отводится 64 бита
C++ (Qt)
1
2
3
// Rust
// std::int::BITS
pub const BITS: usize = 64
P.S. Этому типу недолго жить осталось, его заменят на isize, а uint на usize (точнее просто переименуют - вроде бы отличий от i64/u64 нет).
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.02.2015, 14:34 28
Цитата Сообщение от tezaurismosis Посмотреть сообщение
println! (а точнее fmt!) похож на C#-ский String.Format(), но даже шире его.
в шестом шарпе как раз хотят добавить интерполяцию строк

Добавлено через 8 минут
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Psilon, я не понимаю одного, как функциональный язык может заменить императивный.
Ведь в Rust'e больше развита функциональная сторона?
А зачем восклицательный знак в функции println!()?
функциональная парадигма лучше императивной по всем параметрам И лучше ООП по многим параметрам. Это видно хотя бы по внедрению ФП фич в современные ООП языки: функции первого класса, лямбды, замыкания, монады - это всё ФП фишки И их все больше интегрируется.

У ФП есть большое преимущество: объекты в нём неизменяемые, что приводит нас к возможности писать многопоточный код без синхронизации вообще. То есть нет ни мьютексов, ни семафоров, ни hazard pointers, ни даже lock-free, она тупо не нужна. Поэтому с увеличением многоядерности в аппаратном и программном плане ФП будут всё более выгодными.

Ну и ФП ближе к человеческому мышлению, чем императивный код и ООП. Это еще Дейкстра говорил, когда goto ругал. И это очень просто иллюстрируется - без дебага ошибку в программе нам очень трудно найти. Мы не можем в уме прокрутить эволюцию всех переменных в коде. Только в режиме отладки, наблюдая постоянно за watch'ами, мы можем понять "ага, тут почему-то отрицательное значение, хотя должно быть положительное".

Я не большой сторонник ФП, но слишком много преимуществ у него А недостаток один - мало где ФП учат как первому языку, хотя если учат, то императивный стиль i = i+1 воспринимается более чужеродно, чем для императивщиков - стиль ФП.
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.02.2015, 14:39 29
Цитата Сообщение от Psilon Посмотреть сообщение
функциональная парадигма лучше императивной по всем параметрам
А по скорости?
Цитата Сообщение от Psilon Посмотреть сообщение
А недостаток один - мало где ФП учат как первому языку
Согласен.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.02.2015, 15:20 30
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А по скорости?
по скорости средне, но тут больше проблема в том, что архитектура процессорная заточена под императивщину.

Но даже на такой архитектуре Scala чуть быстрее джавы получается: http://benchmarksgame.alioth.d... scala.html

Ну и вакансий на ФП есть, не сказать, что дофига, но есть
Миниатюры
[Rust] Обсуждение возможностей и предстоящей роли языка Rust  
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.02.2015, 15:21 31
Цитата Сообщение от Psilon Посмотреть сообщение
по скорости средне, но тут больше проблема в том, что архитектура процессорная заточена под императивщину.
Хотите сказать, что если переписать архитектуру, то функциональные языки будут работать быстрее, чем C++?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
13.02.2015, 15:25 32
Dennis Ritchie, что значит "переписать архитектуру"? Её можно только иначе спроектировать, вот например на хабре пример графовой архитектуры ЭВМ, которую фактически ФП и эмулируют на обычных процессорах.
1
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
16.02.2015, 20:30  [ТС] 33
-- Буду периодически выкладывать сюда описание возможностей языка, которые мне показались интересными или необычными --
Необычной мне показалась возможность связывать данные с элементами перечисления, например
C++ (Qt)
1
2
3
4
5
6
7
// Rust
enum Character {
    Digit(i32),
    Other,
}
// ...
let ten = Character::Digit(10);
Compound Data Types

Долго думал, что из этого можно рабочего сделать, придумал такую штуку:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Rust
struct Point2D {
    x: f32,
    y: f32
}
 
struct Vector2D {
    from: Point2D,
    to: Point2D
}
 
enum CreationMode {
    Optional(Point2D, Point2D),
    Radius(f32, f32),
    Default
}
 
fn create_vector(mode: CreationMode) -> Vector2D {
    match mode {
        // произвольный вектор
        CreationMode::Optional(_x, _y) => Vector2D { from: _x, to: _y },
        // радиус-вектор
        CreationMode::Radius(_x, _y) => Vector2D {
            from: Point2D { x: 0.0, y: 0.0 },
            to: Point2D { x: _x, y: _y }
        },
        // вектор "по-умолчанию"
        CreationMode::Default => Vector2D {
            from: Point2D { x: 0.0, y: 0.0 },
            to: Point2D { x: 0.0, y: 0.0 }
        }
    }
}
 
fn main() {
    let vec = create_vector(
        CreationMode::Optional(
            Point2D { x: 12.0, y: 1.0 },
            Point2D { x: 2.0, y: 0.0 }));
    println!("({}, {}) -> ({}, {})",
        vec.from.x, vec.from.y,
        vec.to.x, vec.to.y);
}
Этакая перегрузка метода без перегрузки метода Мы можем создавать разные вариации вектора, пользуясь только одним методом.
Если у кого-то есть идеи по-реалистичнее, милости прошу (Psilon, вкатывайся)
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.02.2015, 23:19 34
tezaurismosis, ну афайк одно из самых простых (и мощных) применений - это создание nullable То есть в терминах того же F#

C++
1
2
3
4
5
enum NullableInt
{
   Value(i32),
   Null
}
Хотя могу ошибаться Я в расте не особо, жду stable-версию После этого начну ковырять. Плюс сертификация. Но с радостью буду следить за твоими успехами, и делиться идеями.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
17.02.2015, 13:54  [ТС] 35
Цитата Сообщение от Psilon Посмотреть сообщение
Я в расте не особо, жду stable-версию
В блоге разрабы пишут, что около 80% (вроде бы) возможностей языка и стандартной библиотеки уже не изменят к stable версии. Так что я предпочту продолжить ковырять, меня язык впечатляет
0
Администратор
12268 / 5333 / 268
Регистрация: 05.04.2011
Сообщений: 14,086
Записей в блоге: 2
18.02.2015, 10:08 36
 Комментарий администратора 
Господа, вернулись к теме. Оффтоп прекращаем, будьте так любезны.

Тема разделена.

Насчет ФЯП - ООП - сюда

ФЯП или ООП?
2
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
05.03.2015, 03:00 37
Цитата Сообщение от Psilon Посмотреть сообщение
И если не секрет, чем компилируешь? А то я окромя связки notepad++ и компиля ничего не придумал, подсветка тоже хромает, без IntelliSense как без рук, и прочие невзгоды
sublime text + plugins под rust, и вполне можно писать, и подсветка и ошибки(хотя и криво реализованные пока что)
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
05.03.2015, 11:28  [ТС] 38
Вот бы автодополнение кода, хотя бы базовое - имена функций и типов, члены перечислений и т.д. Есть такая для Vim'а, но работает с танцами и требует исходники.
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
05.03.2015, 11:31 39
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Вот бы автодополнение кода, хотя бы базовое - имена функций и типов, члены перечислений и т.д. Есть такая для Vim'а, но работает с танцами и требует исходники.
плагин с автодополнением под sublime я тоже видел, но не ставил
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
05.03.2015, 12:17  [ТС] 40
dzrkot, к сожалению оно (как и дополнение для Atom, который я сейчас юзаю для Ржавчины), работают через Racer, про который я выше и написал (просто запамятовал название)
0
05.03.2015, 12:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2015, 12:17
Помогаю со студенческими работами здесь

Rust+assembler
Как связать язык rust и ассемблер не используя ассемблерные вставки(неудобно использовать их в...

Есть ли у rust будущее?
Вот вчера общался с 1 товарищем на тему перспектив С++, он меня убеждает что язык скоро будет...

Rust ошибка E0623
при компиляции появляется ошибка E0623 в документации этот номер пропущен. в чём может быть...

Frontend Для RUST
Нужна помощь! Есть класс Participant, в этом классе есть функция new. impl Participant { ///...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru