LINUX.ORG.RU

beef - новый системный ЯП

 , ,


2

8

https://www.beeflang.org/

Особенности:

  • По заявлению автора, представляет собой смесь C++ и C#, с небольшими вкраплениями Rust.
  • Без GC, JIT и тому подобного.
  • Развивается параллельно с IDE (написана на самом beef и собственном тулките). Дизайн языка развивается с учётом удобства разработки IDE.
  • Автор делает упор на удобную отладку с помощью дебаггера, а не print.
  • Умеет все модные фичи: ADT, pattern matching, лямбды, дженерики, миксины, кортежи, опциональные типы и тд. Но не гарантирует null-safety.
  • Поддерживает рантайм рефлексию.
  • Не использует исключения. Используется тот же подход что и в Rust: Result + panic.
  • Проверяет проблемы с памятью в рантайме в отладочной сборке. В релизной сборке всё как в C/C++.
  • Предоставляет лёгкое взаимодействие с C/C++ кодом (не уверен в каком виде).
  • Основан на ворованном LLVM. Как будто кто-то сомневался.
  • Автор пилит язык последние 5 лет full-time.

Простой пример:

static Result<uint> GetMinusOne(uint i)
{
    if (i == 0)
        return .Err;
    return .Ok(i - 1);  
}

void Use()
{
    /* Handle result via a switch */
    switch (GetMinusOne(i))
    {
        case .Ok(let newVal): Console.WriteLine("Val: {}", newVal);
        case .Err: Console.WriteLine("Failed");
    }

    /* This invokes an implicit conversion operator, which will be fatal at runtime if an error is returned */
    int newVal = GetMinusOne(i);

    /* Result<T> contains a special "ReturnValueDiscarded" method which is invoked to facilitate failing fatally on ignored returned errors here */
    GetMinusOne(i);
}

В целом ближе к D, чем к Rust, так как содержит намного меньше гарантий.

То что автор языка профессионал высокого класса понятно.
Не понятно почему многим нравится «пилить» языки программирования?

Такое впечатление, что разработчики языков программирования полагают, что если язык будет «современен», то разработка будет идти быстрее, …

Пора бы уже задуматься разработчикам что такое проект?
А-ля IDE ИМХНО - «каменный век».

Владимир

anonymous ()

Ничто не бывает бесплатным. У этой поделки явно с zero-cost abstractions все плохо.

А такой Result с ошибкой в рантайме на ++ написать как два пальца.

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

А такой Result с ошибкой в рантайме на ++ написать как два пальца.

Даже не надо. Уже есть std::expected. Но язык ещё даже не в alpha версии, поэтому автор может всё поменять.

RazrFalcon ★★★★★ ()

небольшими вкраплениями Rust.

Ну вот раст уже дорос то того, что ему начали пилить замену. С другой стороны, если не будет дебильного оргроничения на 1 мутабельную ссылку/указатель, то может получиться интересно.

Используется тот же подход что и в Rust: Result + panic.

ТО есть опять вот такая херня

fn call1() -> Result<(), Error> {...}
fn call2() -> Result<(), Error> { call1()?; ...}
fn call3() -> Result<(), Error> { call2()?; ...}
fn call4() -> Result<(), Error> { call3()?; ...}
anonymous ()
Ответ на: комментарий от RazrFalcon

Чем тебе не нравятся исключения? Да и какая разница как? Альтернатива же должна быть. Хочешь - исключения, хочешь - коды возврата. Было бы круто просто управлять в рантайме ходом выполнения.

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

Непонятно, что не так с исключениями. Возвращаемые ошибки точно так же оборачивают любые произвольные ошибки, поэтому ничем от произвольных исключений по сути не отличаются. Если тебе нужно обрабатывать все ошибки, лови все исключения. Если тебе нужно обрабатывать конкретную ошибку, лови конкретное исключение. Единственная проблема с исключениями это то, что оно может вылететь почти в любой строчке и поломать состояние. Но на практике в той же Java для меня это никогда не было существенной проблемой. При наличии автоматического управления памятью и использования современных подходов к дизайну программы, в частности максимального использования иммутабельных объектов, всё просто работает.

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

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

или пердолиться с кодами возврата как в 70-х.

Так а чем раст в этом плане отличается? call()?; это по-сути сахар для пердолиния с возвратами. Сколько там будет в коде проверок на то, что там вернулось Ok, а не Err.

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

call()?;

Это хорошо, когда у тебя вызов возвращает тоже, что и этот call. А когда вызов использует пару-тройку вызовов с другими Result<(), …>, вот тут пердолиться приходиться по всем полям.

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

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

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

anonymous ()
Ответ на: комментарий от crutch_master

А потом каждая либа начинает изобретать свои строки. Знаем, проходили. Все базовые примитивы и конструкции должны быть в языке/std, иначе не будет никакой экосистемы, как в C/C++.

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

Если тебе нужно обрабатывать конкретную ошибку, лови конкретное исключение

В этом и проблема. Завтра либа поменяет что-то и у меня прога упадёт в рантайме.

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

В чем? Чем это отличается от проверок возврата? Это и есть проерка и дальнейший return Err(err). То, что этот ? делает это менее многословным, ну да, на то и сахар.

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=78a12f4d78834707961577f4cc2321f3

Давай покажи, как тут обойтись без пердолиния в стиле 70х.

anonymous ()
Ответ на: комментарий от RazrFalcon

А потом каждая либа начинает изобретать свои строки

Как будто что-то плохое. Людям нужны строки лучше, чем в есть в твоём недоязычке, вот они их и изобретают. А тупые ограничения ничего не дают придумать принципиально отличного от default и двигать развитие.

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

Специально для альтернативно одарённых:

  • Код возврата возвращает число. Сам результат возвращается отдельно. Result возвращает пару.
  • Код возврата можно пропустить и обратится к неверным данным. С Result (в расте) - нельзя.
  • Rust умеет ADT, соответственно ошибка содержит контекст, а не просто номер. И не надо рассказывать про union. Это убогий костыль, который никто не использует, из-за отсутствия сахара.
  • ? часть сахара.
RazrFalcon ★★★★★ ()
Ответ на: комментарий от crutch_master

Людям нужны строки лучше, чем в есть в твоём недоязычке, вот они их и изобретают.

В нормальных языках - нормальные строки. Переизобретать там нечего. Unicode один для всех.

RazrFalcon ★★★★★ ()

Дизайн языка развивается с учётом удобства разработки IDE.

Приехали. Это финиш. Гуляй, Вася.

Вот вам на будущее тест на вменяемость любого ЯП:

  1. Запускаешь busybox vi и пытаешься в нём на заданном ЯП написать любую программу средней сложности, решающую практическую задачу. Ну, скажем, утилиту отправки SMS с заданными PDU-параметрами через последовательный порт. Или что-то такого же уровня.
  2. Если у ЯП нет нужных библиотек для взаимодействия с портами/файлами, выкидываешь ЯП.
  3. Если на этом ЯП неудобно писать в busybox vi, выкидываешь ЯП.
  4. Если код на этом ЯП без подсветки синтаксиса сливается в трудночитаемую кашу, выкидываешь ЯП.
  5. Если тебе неудобно управлять busybox vi, выкидываешь себя.
anonymous ()
Ответ на: комментарий от anonymous

ЯП, которые не могут обойтись без IDE для эффективного написания и чтения кода, заведомо ущербны и подлежат уничтожению.

Ты, наверное, из тех, кто пишет на сишечке в блокноте и яро против любого автокомплита?

Zhbert ★★★★★ ()