All streams
Search
Write a publication
Pull to refresh
88
0
Александр Мещеряков @freecoder_xx

Rust разработчик

Send message

Представьте, что вам прямо сейчас нужно сделать утилиту командной строки, которая должна работать в Linux-дистрибутиве, для прикладных целей. Что вы выберете? Delphi? А если не его, то значит ли это, что Delphi — не прикладной язык программирования?

Вот вам пример из библиотеки intercom, как можно сделать API в Rust для работы с COM-объектами (они тоже основаны на vtable):


Rust COM server:


pub use intercom::*;

#[com_library(Calculator)]

#[com_class(Calculator)]
struct Calculator {
    value: i32
}

#[com_interface]
impl Calculator {
    pub fn new() -> Self {
        Self { value: 0 }
    }

    pub fn add(&mut self, value: i32) -> ComResult<i32> {
        self.value += value;
        Ok(self.value)
    }
}

C# COM client:


class Program
{
    [STAThread]
    static void Main( string[] args )
    {
        var calc = new Calculator.Interop.Calculator();
        calc.Add( 10 );
        var result = calc.Add( 100 );
        Console.WriteLine( result );
    }
}

Вся магия с указателями и прочим скрыта за атрибутными процедурными макросами.

язык без библиотек — это не язык прикладного программирования — и не надо вводить людей в заблуждение

Пожалуйста дайте ссылку на то место, где я говорю, что Rust — это язык без библиотек.


А еще это вранье вдвойне — потому что модель память OLE не натягивается на владение Rust (просто так).

А вам не все равно, OLE-объектом вы оперируете в программе или нет, если результат "натягивается" на то, что вам нужно помимо вашего непосредственного участия? Object Pascal, считайте, повезло, что он имеет такое же представление vtable, как в C++. И что, мы теперь все языки с моделью памяти, отличной от C++, вычеркнем из разряда прикладных?

И где там эти динамические возможности демонстрируются? Я вижу статическую строку 'Excel.Application', вижу статические обращения типа XLApplication.Workbooks — это все написано в самом коде программы. Где динамика-то?

Могу ошибаться, но мне видится, что у Rust немного другой путь.


Если C++ изначально был достаточно целостен, а потом в него сверху накручивались дополнительные фичи (грубо говоря), то Rust изначально имеет стройную концепцию, которая реализована не полностью. Львиная доля сложности языка как раз состоит в понимании исключений и частных ограничений языка, которые сама концепция, кажется, иметь не должна. Отсутствие const generics (скоро будут), отсутствие специализации, отсутствие NLL (уже реализовано), нет HKT ни для типов, ни для лайфтаймов и так далее. У языка очень большая перспектива для развития именно по пути к своему внутреннему концепту, пока реализованному лишь отчасти.


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


Также в Rust-компиляторе разрабатывается слой MIR (mid-level intermediate representation), который в будущем позволит не только менять бекэнд (сейчас используется LLVM), но и "фронтэнд", могут появиться новыя языки, которые будут компилироваться в Rust MIR.

Синтаксис у Раста в целом нормальный. Есть шероховатости, но они постепенно устраняются. Те, кто программируют на Rust, дискомфорта не испытывают. Я думаю вы, как и многие из новичков, путаете "плохой синтаксис" с "непонятная/непривычная семантика". Во всяком случае уже не раз были споры насчет синтаксиса и никто из критиков не предложил лучшего решения для выражения тех же сущностей так, чтобы новый синтаксис не рушил остальные конструкции языка в других местах. Может быть у вас есть конструктивные предложения?


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

Мы обсуждаем возможности самого языка или имеющиеся библиотеки? Я вам показал, как выглядел бы код на Rust, который привели вы. Есть ли в экосистеме Раста библиотеки для работы с excel — это другой вопрос, к статье отношения не имеющий.

Ну, например, так:


use excel::{Application, WorkbookTemplate, SheetType};

let mut app = Application::new()
    .with_visible(true)
    .with_workbooks([
        WorkbookTemplate::Empty,
        WorkbookTemplate::BatChart,
        WorkbookTemplate::BatWorkSheet,
    ].into());
app.workbooks[1].sheets.add(SheetType::new_chart().with_count(1));
app.workbooks[2].sheets.add(SheetType::new_work_sheet().with_count(1));

for workbook in &app.workbooks {
    list_box.items.add(format!("Workbook: {}", workbook.name));
    for sheet in &workbook.sheets {
        list_box.items.add(format!("  Sheet: {}", sheet.name));
    }
}

А что вы знаете про коммунизм? То, что модель разработки СПО основана на общественной собственности и на участии самих потребителей в производстве — означает, что результат работы не будет продаваться. Фактически означает, никаких формальных запретов не нужно, просто так работает эта экономическая модель.

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

А что за закон? Можно поподробнее?

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


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

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

Из этого описания — ничерта не понять.

А в чем ошибка-то? Логические ошибки можно допустить в любом языке. А то, что работать с указателями в Java "трудно", то это правда.

Да, после такого особенно больно...

Это просто демонстрация читаемости — рабочий и компилируемый пример.

Назовите язык, в котором нельзя говнокодить.

Сигнатура функции должна быть такой:


unsafe fn inc_three(y: &*mut i32) -> i32

Здесь проблема не в fn, и не в mut, а в том, что вы принимаете ссылку на указатель. Этот код не назовешь ни тривиальным, ни типичным. И может пояснить, зачем вы указываете лайфтайм у ссылки, который никак не используется?

Да, "упаковку" не в Rust придумали: https://habr.com/ru/post/328052/

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity