LINUX.ORG.RU

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

 , ,


1

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, так как содержит намного меньше гарантий.

★★★★★

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

А когда вся семантика разобрана, то осталось только построить машинные коды по ней.

Ака 95% LLVM.

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

А когда вся семантика разобрана, то осталось только построить машинные коды по ней

Ну да, я ж прокомментировал уже )

Они бы с радостью сделали полностью изолированный отладчик

если бы в этом был хоть какой-нибудь смысл. Но они его _не_ сделали

anonymous
()

Неплохо, но хотелось бы видеть sum types, discriminated unions (как в TypeScript или Ceylon) и вариантность.

anonymous
()

Кстати

Основан на ворованном LLVM. Как будто кто-то сомневался

Хороший стиль изложения ) + в карму ТС-у

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

Речь шла про нормальные строки для C++ - они есть только в Qt.

Критерии нормальности строк сможете предоставить?

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

Они угадывают значение байтиков

И сделать это на машине Тюринга принципиально невозможно?

По этой причине весь проект нужно компилировать целиком

А мне говорили про отдельные объектные файлы, которые потом линкуются.

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

А в чём проблема?

напомню для мимопроходящих, что вопрос был про поиск предыдущего символа в UTF-8 строке

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

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

А когда вся семантика разобрана, то осталось только построить машинные коды по ней.

Ака 95% LLVM

96 Мб LLVM против 48 Мб Clang. Половина LLVM - это платформ-специфичный код для оптимизациия под конкретный процессор. Большая часть остальной части - инфраструктура для создания этого платформ-специфичного кода. Генерировать топорный код - намного проще.

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

А мне говорили про отдельные объектные файлы, которые потом линкуются

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

И сделать это на машине Тюринга принципиально невозможно?

Да. «a < b > c» - здесь компилятор должен угадывать наобум смысл конструкции.

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

Чтоб ты написал коммент, конечно же. Забанься уже

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

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

Очень успешно угадывает, хочу вам сказать. И при этом работает на «машине Тьюринга».

Вас обманули. Всех. Когда-то в Си файлы действительно компилировались отдельно

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

Это вас кто-то обманул. Или вы сами себя обманули.

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

ORLY?

$ cat test.cpp 
#include <iostream>

int main() {
	int a = 10;
	int b = 20;
	int c = 30;
	bool e = a < b > c;
	std::cout<< "Valid" << e << "\n";
	return 0;
}
$ g++ ./test.cpp -o bin
$ ./bin 
Valid0


P.S. И это мы еще операторы '<' и '>' переопределять не начали.

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

Пять лет пилить непопулярный недораст на фуллтайме ради срача? Сильно.

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

Ещё как orly. Вот это убери:

int a = 10; int b = 20; int c = 30;

Да и остальное непонятно откуда нарисовалось

anonymous
()

Очередное поделие на тему «хотим писать как на C++, но не на C++»

Вердикт: в мусорку.

Автор ошибся уже тем что подумал что ему не нужен GC.

lovesan ★★★
()

Чем быстрее C++ исчезнет тем лучше для этого мира, жалко что его заменой Rust уж точно никак не станет, синтаксис наркомана + логика наркомана которую понимают только наркоманы из Mozilla, они же скоро до уровня brainfuck скатятся.

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

Я опять забываю табличку «сарказм» показывать.

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

вход/выход в/из try{} вполне может иметь накладные расходы

Опять-же, тупенькие кодеришки вставляют try{}, где попало, а потом жалуются на накладные расходы.

anonymous
()

смесь C++ и C#, с небольшими вкраплениями Rust.

Гремучая смесь. Как бы не пронесло.

Автор пилит язык последние 5 лет full-time.

Пипец, 5 лет коту под хвост.

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

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

Всё пока так, пока нет исключения, то ничего не тратится на проверки и на создание лишних объектов (обёрток для кодов возврата). Даже нет проверок на NPE (https://shipilev.net/jvm/anatomy-quarks/25-implicit-null-checks/). Если исключение возникло, то тут плохо в любом случае. Да, раскрутка стека - операция дорогая, вне зависимости от языка (в том же go ворох библиотек для работы с ошибками и раскруткой стека), иногда даже ограничивают глубину раскрутки.

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

Да пусть меняется 20 раз. И может изменять поведение текущего кода, особенно, если меняется major-версия библиотеки. И в новой версии библиотеки могут появиться новые коды и приложение, когда встретит неизвестный код возврата тоже упадёт. Тут проблема не в исключениях или кодах возврата. У тебя же приложение зависит от конкретной версии и при обновлении версии библиотеки проверяется совместимость и работоспособность с новой версией?

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

И это доказывает, что самая важная и трудоёмкая часть компилятора - парсер, так?

Самая важная и трудоемкая для крестов. Поскольку даже хелло ворлд парсить тяжело.

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

«a < b > c» - здесь компилятор должен угадывать наобум смысл конструкции

Это не валидный c++ код

template<class T>
struct Z
{
	void f() {}
};

int main()
{
	Z < int > a;
	int b=0, c=0, d=0, e=0;
	c < d > e;
    return 0;
}

Никаких ошибок, максимум - предупреждения:

consoleapplication1.cpp(16): warning C4804: >: небезопасное использование типа "bool" в операции
consoleapplication1.cpp(16): warning C4552: >: оператор не имеет результата; требуется оператор с побочным действием
consoleapplication1.cpp(14): warning C4101: a: неиспользованная локальная переменная

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

Очень успешно угадывает, хочу вам сказать. И при этом работает на «машине Тьюринга»

Достаточно не объявить идентификатор или забыть включить заголовок - и будет ясно, как он хорошо угадывает.

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

Всё замечательно, вы правы, можете дальше учить своих студентов.

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

Обижаешь. В nano тоже подсветка есть

Да, есть. Ну я хз, что такого вспомнить на никсах так, чтобы подсветки не было. Vi? Тоже есть есть подсветка.

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

Поясни, каким образом многословность повышает ценность IDE

Поясняю за него: тебе нужно написать строчку кода, типичный пример println("hello world"); но тебе нужно написать класс, в классе метод с объявлениями модификаторов доступа - это многословность, которая подталкивает к использованию IDE, поскольку бессмысленно неудобна. И если ты думаешь, что это необычный вариант - ты ошибаешься, потому что куча проектов содержат в себе классы с методами-однострочниками, причем, на C++ подобная ситуация наблюдается - особенно это касается геттеров-сеттеров.

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

Это другой пример. И здесь ничего угадывать не нужно

Ты тупой или тралишь?

struct y
{
	bool a;
};

template<class T>
struct z
{
	void f() {}
};

int main()
{
	z < y > a;
	int z=0, y=0, d=0, e=0;
	z < y > e;
	return 0;
}

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

чот похоже это ты тупой.

// другой анонимус

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

Тебе я ещё вчера объяснил, что все эти школопричины вроде автокомплитов и подсветок - всё мимо. Ценность IDE не в этом

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

Так что здесь нужно угадать? Приведи список возможных вариантов, которые компилятор может выбрать

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

Поэтому Гослинг признал, что главной ошибкой в проектировании языка Java были классы - фундаментальный и бесполезный boilerplate.

нашел цитату:

https://www.javaworld.com/article/2073649/why-extends-is-evil.html

I once attended a Java user group meeting where James Gosling (Java's inventor) was the featured speaker. During the memorable Q&A session, someone asked him: «If you could do Java over again, what would you change?» «I'd leave out classes,» he replied. After the laughter died down, he explained that the real problem wasn't classes per se, but rather implementation inheritance (the extends relationship). Interface inheritance (the implements relationship) is preferable. You should avoid implementation inheritance whenever possible

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

Тебе я ещё вчера объяснил, что все эти школопричины вроде автокомплитов и подсветок - всё мимо. Ценность IDE не в этом

Я могу много рассказывать про убогости языка, из-за которых нужны IDE. Например, они нужны потому, что после написания чуть более крупной, не hello world программы, оказывается, что функционал, который бы в хорошем языке писался в 10 строчек, оказывается написанным в 10 классов и разбросанным по 10 файлам, из-за чего без IDE трудоемкость понимания код возрастает в разы на ровном месте. Это признак того, что язык ориентирован на понимание компьютером, а не понимание человека - это неизбежно ведет к использованию IDE даже для элементарных операций.

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

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

Так что здесь нужно угадать? Приведи список возможных вариантов, которые компилятор может выбрать

Второй варик - это объявление переменной e с типом z<y>, очевидно. Вариант, который предпочел выбрать компилятор - операторы сравнения. Чтобы этот выбор сделать, ему нужно знать семантику всех сущностей в программе. Почему я и пишу, что здесь до кодогенерации остался один шаг.

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

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

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.