Автор Тема: Rust атакует.  (Прочитано 30163 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Rust атакует.
« : Апрель 03, 2013, 08:39:30 pm »
Я же уже упоминал что на Rust мозилловцы экспериментальный браузеродвижок пишут (весь такой асинхронно-параллельный)? Вот этот:  https://github.com/mozilla/servo (иначе нафига мозилле этот руст вообще?)

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

Первые плоды сотрудничества - свежий релиз Rust 0.6 в котором самсунг по быстрому реализовал поддержку ARM-архитектуры (оно и понятно, Самсунг заинтересован браузер на базе этого движка воткнуть на смартфоны).

Подробнее новость тут: http://www.opennet.ru/opennews/art.shtml?num=36576
И тут: https://blog.mozilla.org/blog/2013/04/03/mozilla-and-samsung-collaborate-on-next-generation-web-browser-engine/

Так что с некой вероятностью, вскоре монополия С++ на браузерные движки может закончиться :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #1 : Апрель 04, 2013, 07:01:22 am »
В этом Расте, что интересно, есть АлгТД (замаскированные под перечисления), были бы ещё классы типов -- вообще зачётный язык вышел бы...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #2 : Апрель 04, 2013, 07:03:51 am »
В этом Расте, что интересно, есть АлгТД (замаскированные под перечисления), были бы ещё классы типов -- вообще зачётный язык вышел бы...
Да фигня эти ADT, вон в плюсах их тоже можно сделать :-) Был бы язык высокоуровневый, а ADT приложатся ;-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #3 : Апрель 04, 2013, 07:05:57 am »
В этом Расте, что интересно, есть АлгТД (замаскированные под перечисления), были бы ещё классы типов -- вообще зачётный язык вышел бы...
Да фигня эти ADT, вон в плюсах их тоже можно сделать :-) Был бы язык высокоуровневый, а ADT приложатся ;-)
Кстати, ADT без паттерн-матчинга ведь нафиг не нужны. Посему вопрос - что там у руста с паттерн-матчингом?
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #4 : Апрель 04, 2013, 07:14:46 am »
В этом Расте, что интересно, есть АлгТД (замаскированные под перечисления), были бы ещё классы типов -- вообще зачётный язык вышел бы...
Да фигня эти ADT, вон в плюсах их тоже можно сделать :-) Был бы язык высокоуровневый, а ADT приложатся ;-)
Кстати, ADT без паттерн-матчинга ведь нафиг не нужны. Посему вопрос - что там у руста с паттерн-матчингом?
Да, вижу, там все норм с паттерн-матчингом:
fn area(sh: Shape) -> float {
    match sh {
        Circle(_, size) => float::consts::pi * size * size,
        Rectangle(Point { x, y }, Point { x: x2, y: y2 }) => (x2 - x) * (y2 - y)
    }
}
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #5 : Апрель 04, 2013, 07:17:09 am »
Но во всех этих новомодных языках есть одна единая беда - там те же проблемы с модульностью, что и в Обероне - эта модульность не для людей.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #6 : Апрель 04, 2013, 07:18:50 am »
В этом Расте, что интересно, есть АлгТД (замаскированные под перечисления), были бы ещё классы типов -- вообще зачётный язык вышел бы...
Да фигня эти ADT, вон в плюсах их тоже можно сделать :-) Был бы язык высокоуровневый, а ADT приложатся ;-)
Симитировать-то можно, а использовать так как надо (что бы от них реальный толк был) -- нельзя. Как и в шарпе, паскалях...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #7 : Апрель 04, 2013, 07:22:49 am »
В этом Расте, что интересно, есть АлгТД (замаскированные под перечисления), были бы ещё классы типов -- вообще зачётный язык вышел бы...
Да фигня эти ADT, вон в плюсах их тоже можно сделать :-) Был бы язык высокоуровневый, а ADT приложатся ;-)
Симитировать-то можно, а использовать так как надо (что бы от них реальный толк был) -- нельзя. Как и в шарпе, паскалях...
Почему же нельзя? Очень даже можно. Получается ATD+pattern matching. Без написания тонн кода руками.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #8 : Апрель 04, 2013, 07:24:02 am »
В этом Расте, что интересно, есть АлгТД (замаскированные под перечисления), были бы ещё классы типов -- вообще зачётный язык вышел бы...
Да фигня эти ADT, вон в плюсах их тоже можно сделать :-) Был бы язык высокоуровневый, а ADT приложатся ;-)
Кстати, ADT без паттерн-матчинга ведь нафиг не нужны. Посему вопрос - что там у руста с паттерн-матчингом?
Да, вижу, там все норм с паттерн-матчингом:
fn area(sh: Shape) -> float {
    match sh {
        Circle(_, size) => float::consts::pi * size * size,
        Rectangle(Point { x, y }, Point { x: x2, y: y2 }) => (x2 - x) * (y2 - y)
    }
}
Да, вот ещё примерчик:
enum List<X> { Nil, Cons(X, @List<X>) }

let x: List<int> = Cons(10, @Cons(11, @Nil));

match x {
    Cons(a, @Cons(b, _)) => {
        process_pair(a,b);
    }
    Cons(10, _) => {
        process_ten();
    }
    Nil => {
        return;
    }
    _ => {
        fail!();
    }
}
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #9 : Апрель 04, 2013, 07:25:18 am »
Но во всех этих новомодных языках есть одна единая беда - там те же проблемы с модульностью, что и в Обероне - эта модульность не для людей.

В Расте ещё и синтаксис отстойный -- все эти фигурные скобочки бесят уже...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #10 : Апрель 04, 2013, 07:30:40 am »
Симитировать-то можно, а использовать так как надо (что бы от них реальный толк был) -- нельзя. Как и в шарпе, паскалях...
Почему же нельзя? Очень даже можно. Получается ATD+pattern matching. Без написания тонн кода руками.
Приведи пример на плюсах, возможно я смогу объяснить на нём, что именно мне не нравится в такой имитации.
По-крайней мере, в сишарпе мне не удалось симитировать те же хаскельные типы Maybe и Either так, что бы это было действительно полезно -- в плане повышения надёжности софта. Только многословия добавил в результате. Язык (C#) -- ацтойный...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #11 : Апрель 04, 2013, 07:32:02 am »
Чтобы не быть голословным, вот на плюсах ADT + pattern matching:
typedef boost::variant<boost::blank, int, string, vector<int>> var_t;
vector<int> vit;
var_t myFooV = vit;

auto visitor = make_lambda_visitor<void>(
        [](int v) -> void { cout << "int: " << v << endl; },
        [](string& v) -> void{ cout << "string: " << v << endl; },
        [](vector<int>& v) -> void{
                v.push_back(27);
                boost::get<vector<int>>(myFooV).push_back(34); 
                cout << " vector.. has elements: " << v.size() << endl;
        }
    );

boost::apply_visitor( visitor , myFooV );

Не сказал бы что мне вот прям идеально нравится эта реализация, по моему мнению можно сделать ещё краше. Но тем не менее :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #12 : Апрель 04, 2013, 07:38:16 am »
Чтобы не быть голословным, вот на плюсах ADT + pattern matching:
typedef boost::variant<boost::blank, int, string, vector<int>> var_t;
vector<int> vit;
var_t myFooV = vit;

auto visitor = make_lambda_visitor<void>(
        [](int v) -> void { cout << "int: " << v << endl; },
        [](string& v) -> void{ cout << "string: " << v << endl; },
        [](vector<int>& v) -> void{
                v.push_back(27);
                boost::get<vector<int>>(myFooV).push_back(34); 
                cout << " vector.. has elements: " << v.size() << endl;
        }
    );

boost::apply_visitor( visitor , myFooV );

Не сказал бы что мне вот прям идеально нравится эта реализация, по моему мнению можно сделать ещё краше. Но тем не менее :-)
Мамин ёжик, жесть-то какая.
Идею вроде понял, но -- у этих псевдо-АлгТД даже имени конструктора (варианта) нет. Не то, совсем не то...
Ну вот попробуй симитировать Maybe и Either... Ну или List, хотя бы...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #13 : Апрель 04, 2013, 07:46:04 am »
Кусок из https://github.com/mozilla/servo/blob/master/src/servo/html/cssparse.rs
/// Where a style sheet comes from.
pub enum StylesheetProvenance {
    UrlProvenance(Url),
    InlineProvenance(Url, ~str),
}

pub fn spawn_css_parser(provenance: StylesheetProvenance,
                        resource_task: ResourceTask)
                     -> Port<Stylesheet> {
    let (result_port, result_chan) = comm::stream();

    let provenance_cell = Cell(provenance);
    do task::spawn {
        let url = do provenance_cell.with_ref |p| {
            match *p {
                UrlProvenance(copy the_url) => the_url,
                InlineProvenance(copy the_url, _) => the_url
            }
        };

        let sheet = Stylesheet::new(url, data_stream(provenance_cell.take(),
                                                     resource_task.clone()));
        result_chan.send(sheet);
    }

    return result_port;
}
Так-то в принципе весьма неплохо, но всё же эти {} и ваще синтаксический мусор...
Но по сравнению с тем, что тут выше на с++ boost variant было показано -- просто прелесть...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #14 : Апрель 04, 2013, 07:50:25 am »
Чтобы не быть голословным, вот на плюсах ADT + pattern matching:
typedef boost::variant<boost::blank, int, string, vector<int>> var_t;
vector<int> vit;
var_t myFooV = vit;

auto visitor = make_lambda_visitor<void>(
        [](int v) -> void { cout << "int: " << v << endl; },
        [](string& v) -> void{ cout << "string: " << v << endl; },
        [](vector<int>& v) -> void{
                v.push_back(27);
                boost::get<vector<int>>(myFooV).push_back(34); 
                cout << " vector.. has elements: " << v.size() << endl;
        }
    );

boost::apply_visitor( visitor , myFooV );

Не сказал бы что мне вот прям идеально нравится эта реализация, по моему мнению можно сделать ещё краше. Но тем не менее :-)
Мамин ёжик, жесть-то какая.
Идею вроде понял, но -- у этих псевдо-АлгТД даже имени конструктора (варианта) нет. Не то, совсем не то...
Ну вот попробуй симитировать Maybe и Either... Ну или List, хотя бы...

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

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

Ну а Maybe тут сделать можно, но зачем Maybe без монад? Без монад оно не юзабельно же.
Y = λf.(λx.f (x x)) (λx.f (x x))