Дрю ДеВолт объясняет, что веб-интерфейс Github.com требует множества лишних действий. Гораздо эффективнее использовать консольный почтовый клиент, отправляя тот же пулл-реквест одной командой из консоли

Американский разработчик Дрю ДеВолт (Drew DeVault) известен как создатель и исполнительный директор платформы для хостинга проектов SourceHut, которую Фонд сохранения свободы ПО выбрал как альтернативу майкрософтовскому сервису GitHub (наряду с CodeBerg) в рамках кампании Give Up GitHub по уходу свободных проектов с этого коммерческого хостинга, задача которого — генерировать продажи Copilot.

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

Дрю ДеВолт — один из ценных и опытных системных программистов опенсорсного движения, автор более десятка полезных инструментов и системных утилит.

О его личной жизни известно мало. Живёт в Филадельфии, выступает на компьютерных конференциях по всему миру, страдает от выгорания — довольно типичная история для разработчиков и мейнтейнеров опенсорсных проектов.

▍ Основные проекты


  • sway — оконный менеджер для X11/Wayland,
  • wlroots — библиотека композитора для Wayland,
  • sr.ht — набор опенсорсных программ для управления разработкой ПО, включая платформу хостинга кода SourceHut,
  • scdoc — генератор манов, т. е. страниц справочного руководства,
  • aerc — консольный почтовый клиент,
  • chopsui — набор инструментов для реализации UI,
  • TrueCraft — реализация клиента MineCraft,
  • KnightOS — операционная система для программируемых калькуляторов,
  • Patchy — менеджер торрентов,
  • Redict — свободный форк Redis. Интересно, что автор решил захостить его на платформе Codeberg, которая составляет конкуренцию его SourceHut,
  • Парольный менеджер Himitsu: «простое ядро, на котором можно построить расширяемую экосистему интеграций для работы с любыми секретами»,



  • QBE — бэкенд компилятора, цель которого — обеспечить 70% производительности промышленных компиляторов при 10% кода (в частности, здесь 14 000 строк кода на С99). «Ограничение по размеру позволяет QBE сосредоточиться на главном и не вступать на бесконечный путь убывающей отдачи», — сказано на официальном сайте. По сути, является альтернативой LLVM.


    Компилятор cproc на базе QBE по производительности не уступает полноценным «большим» компиляторам:


Вдобавок, Дрю ДеВолт внёс существенный вклад во многие другие проекты, включая mrsh, Alpine Linux, git.

В качестве основной рабочей станции использует обычный Core i7-3770K на 3,5 ГГц с 16 ГБ RAM и 4 ТБ дисков (информация за 2019 год, с тех пор почти наверняка сделал апгрейд хотя бы RAM), конфигурация с четырьмя мониторами, один 4К, один вертикальный, два ноутбука ThinkPad X200, в доме установлены несколько Raspberry Pi (DNS, файл-дроппер (вероятно, торренты — прим. авт.)). Основная операционка, естественно, Alpine Linux, оконный менеджер — sway, его собственный проект. Приятно создавать рабочие инструменты и затачивать их именно так, как удобно лично тебе. За свои принципы, выбор инструментов, платформы хостинга кода, языка программирования и старые глупые комментарии по некоторым вопросам в сфере свободного ПО (говорят, он оставлял комментарии вроде "github sucks, go migrate to sourcehut" на разных форумах после незначительных сбоев GitHub, в то время как SourceHut однажды упал на целую неделю из-за его тривиальной архитектурной ошибки) до сих пор получает тонну хейта и даже DDoS-атаки.

Для SourceHut поднята гораздо более интересная инфраструктура: шесть выделенных серверов в двух локациях, в сумме 96 ядер, полтерабайта RAM и 60 ТБ дисков.

В качестве браузера Дрю ДеВолт использует заточенный на клавиатуру qutebrowser с минимальным GUI. Крайне удобная штука:


Любит текстовый редактор vim, IRC-клиент WeeChat, почтовый клиент mutt, консоль fish (пока его собственная консоль mrsh не будет дописана)

▍ Низкоуровневый язык Hare


В апреле 2022 года Дрю ДеВолт представил новый язык системного программирования Hare (переводится как «Заяц», возможно, назван по некоей анималистической традиции с «Питоном»). Язык похож на С, только лучше и проще.


"Hello world!" на языке Hare

ДеВолт говорит, что Hare предназначен для быстрого написания стабильного и надёжного кода. Что касается «безопасности» в работе с памятью и проч., то здесь есть несколько преимуществ по сравнению с С, среди них ДеВолт называет «проверяемый доступ к фрагментам и массивам, исчерпывающий switch и match, типы нулевых указателей, меньше неопределённого поведения, отсутствие строгих алиасов (псевдонимов) для указателей, меньше агрессивных оптимизаций и так далее. В коде на Hare вероятность таких ошибок гораздо ниже, чем на C». Ранее в блоге он перечислял и другие преимущества перед С.

Основные характеристики языка: статическая типизация, ручное управление памятью и высокая скорость выполнения, плюс несколько интересных функций и улучшений по сравнению с С. Создатели предлагают использовать Hare для компиляторов, операционных систем, системных инструментов, сетевого программного обеспечения и других низкоуровневых и высокопроизводительных решений.

Дрю ДеВолт приводит свой любимый пример: программа, которая вычисляет собственный хэш SHA-256:

use crypto::sha256;
use encoding::hex;
use fmt;
use hash;
use io;
use os;

export fn main() void = {
	const hash = sha256::sha256();
	const file = os::open("main.ha")!;
	defer io::close(file)!;
	io::copy(&hash, file)!;

	let sum: [sha256::SIZE]u8 = [0...];
	hash::sum(&hash, sum);
	hex::encode(os::stdout, sum)!;
	fmt::println()!;
};

Hare основан на бэкенде компилятора QBE, который обеспечивает хорошую производительность при небольшом объёме.

У стандартной библиотеки небольшой, фиксированный объём, но она поддерживает множество вариантов использования без всяких зависимостей. Состав библиотеки:

  • Набор криптографических инструментов.
  • Поддержка сетей.
  • Всеобъемлющие операции с датой/временем.
  • Абстракции ввода-вывода и файловой системы.
  • Примитивы Unix, такие как poll, fnmatch и glob.
  • Расширенные регулярные выражения POSIX.
  • Парсер и программа проверки типов Hare.

«Стандартная библиотека Hare — это новый старт для системного программирования без унаследованных проблем POSIX и libc, — пишет Дрю — Программы Hare не связываются с libc по умолчанию».

К моменту официального анонса в 2022 году разработка Hare продолжалась два с половиной года, за это время на нём были написаны микроядро Helios для систем x86_64 и парольный менеджер Himitsu.

Некоторые независимые специалисты по системным языкам указывали на ряд недостатков в Hare, то же время ставя его в ряд с другими интересными альтернативами С, такими как Rust, Zig и Myrddin. Правда, с момента написания того критического обзора Hare серьёзно доработан.

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

На самом деле низкоуровневые языки вроде С незаменимы для написания системных и высокопроизводительных, оптимизированных приложений, таких ОС и видеоигры. И кроме C/С++ у нас мало других инструментов такого типа, поэтому разработку в этой области можно приветствовать. Hare пытается улучшить C, оставаясь при этом очень простым языком, с гораздо лучшей обработкой ошибок, поддержкой массивов и слайсов, богатой стандартной библиотекой минимального размера, более краткими и мощными значениями возврата функций (через tagged unions), улучшенной безопасностью памяти и другими улучшениями, упомянутыми выше.

Пример типа tagged union в Hare (см. комментарий к типу signed):

use bufio;
use hare::ast;
use hare::lex;
use hare::parse;
use hare::types;
use io;
use strings;

type signed = (int | i8 | i16 | i32 | i64);
// эквивалент:
// type signed = (i64 | (i32 | (i16 | (i8 | int | int | int))));
type unsigned = (uint | u8 | u16 | u32 | u64);
type integer = (...unsigned | ...signed);
type floating = (f32 | f64);
type numeric = (...integer | ...floating);

type numeric_repr = struct {
	id: u32,
	union {
		_int: int,
		_i8: i8,
		_i16: i16,
		_i32: i32,
		_i64: i64,
		// ...
	},
};

export fn main() void = {
	const input = bufio::fixed(strings::toutf8("int"), io::mode::READ);
	const lexer = lex::init(&input, "<string>");
	const _type = parse::_type(&lexer)!;
	defer ast::type_finish(&_type);
	const store = types::store(types::x86_64, null, null);
	defer types::store_free(store);
	const itype = types::lookup(store, &_type) as const *types::_type;

	const obj: numeric = 1337;
	const ptr = &obj: *numeric_repr;
	assert(ptr.id == itype.id);
	assert(ptr._int == 1337);
};



С одной стороны, Дрю ДеВолт всем сердцем предан опенсорсу. С другой стороны, это довольно противоречивая личность. У некоторых может создаться впечатление, что «слишком раздутое эго» человека заставляет создавать собственные варианты, альтернативы и форки известных проектов (GitHub, язык C, Redis, LLVM и т. д.), словно у всех проектов один и тот же фатальный недостаток. Не говоря уже о резких высказываниях и комментариях, которые он не стесняется высказывать в своём блоге и других местах.

Впрочем, благодаря таким непримиримым энтузиастам и двигается вперёд индустрия СПО.

P. S. Интересно, что впервые в серии «Выдающиеся программисты 21 века» представлен разработчик, о котором нет статьи в Википедии.



© 2024 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT ?

Комментарии (4)


  1. Panzerschrek
    10.12.2024 07:00

    Этот Hare - очередной мертворождённый язык от неосиляторов C++. Отсутствие деструкторов ставит крест на безопасности и надёжности разрабатываемых программ. Да, Hare в некоторых аспектах лучше, чем Си, но проигрывает C++ в выразительности и Rust в выразительности и надёжности.
    Малый объём кода компилятора - так себе преимущество. Не вижу, как бы это облегчало жизнь конечному разработчику. Я, как пользователь clang, как-то не страдаю от большого размера его кодовой базы.


    1. eugenk
      10.12.2024 07:00

      Вот не сказал бы... Hare пока не смотрел, но малый объем меня заинтересовал. Дело в том, что мне сейчас нужен системный язык, способный возвращать из функции более одного значения. У меня есть очень хороший софт-процессор стековой архитектуры для встраивания в FPGA. Собираюсь опубликовать тут о нём цикл статей. Беда что писать для него пока можно только на ассемблере (хотя нормальная IDE для него уже написана). Хотелось бы чего-то высокоуровневого. Си прекрасный язык, но ориентирован на традиционную архитектуру регистры-память. В стековой архитектуре необходимо уметь возвращать из функции более одного значения. Надеюсь понятно почему. Не знаю, умеет ли это Hare. Но малый размер компилятора хотя бы оставляет надежду понять его, и прикрутить к нему такую возможность.


      1. ahabreader
        10.12.2024 07:00

        А если под этот ZPU-like CPU реализовать компилятор C, но писать на языке из тех, что компилируются C (список)? Ткнул наугад, в Cforall есть Multiple-Return-Value Functions, но это потому что туда запихнули вообще всё.


    1. ahabreader
      10.12.2024 07:00

      Не вижу, как бы это облегчало жизнь конечному разработчику.

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

      В FAQ к языку тоже пытаются продать простоту, хотя за ней стоит упрощение работы для автора, как в хобби-языках. Обобщённое программирование не в духе C, многопоточность "мы предпочитаем не поощрять", поддержки Windows и macOS не будет под предлогом проприетарности...