LINUX.ORG.RU

Доступен язык программирования Hare

 , ,


1

5

Впервые представлен широкой публике язык программирования Hare, который разрабатывает Дрю ДеВолт (автор Sway и SourceHut) со своей командой последние пару лет.
Hare — язык для системного программирования с минималистичным рантаймом, статической типизацией и ручным управлением памятью.

Исходный код компилятора предоставляется под лицензией GPLv3, а для стандартной библиотеки под лицензией MPL (Mozilla Public License). Компилятор Hare не основан на LLVM или GCC, а использует легковесный qbe. Программы на Hare не линкуются с libc по умолчанию.

На данный момент заявлена поддержка архитектур x86_64, aarch64 и riscv64, а также операционных систем Linux и FreeBSD. Поддержкой несвободных платформ команда заниматься не намеревается и предлагает это делать сторонним разработчикам, благо язык хорошо стандартизован.

На Hare уже есть написанные проекты; например, микроядро Helios.

Пример кода:

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()!;
};

>>> Подробности

★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 5)

Ну и зачем это нужно ?

Даже в примере некоторые «решения» - не очевидны.

Что такое «os::open» ? Если это открытие файлового дескриптора, то емнип из других ЯП - нужно указывать как открывать файл - на чтение, на запись, на дозапись. Если же это чтение файла в переменную, сорян константу - то как потом эту константу можно io::close ?

Что может делать io::copy после io::close, если файл уже закрыт, а указатель file очищена ? Или нет - и оно будет по мере исполнения кода течь памятью ?

Какого черта вообще open и close делают в разных либах ?

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

Что такое «os::open» ? Если это открытие файлового дескриптора, то емнип из других ЯП - нужно указывать как открывать файл - на чтение, на запись, на дозапись

судя по докам, это функция с переменным числом аргументов, в которых и передаются нужные флаги. А если их нет, то будет значение по умолчанию

https://docs.harelang.org/os#open

If no flags are provided, fs::flags::RDONLY, fs::flags::NOCTTY, fs::flags::CLOEXEC are used when opening the file

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

Опять украли Активный Оберон, что ли? Хотя явное управление памятью… А проблема висячего указателя там есть?

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

У Паскаля несколько другой путь, который делает код более явным и более читаемым. В нём и переменную посреди кода нельзя объявить, чтобы потом не путаться откуда какие переменные взялись и не скроллить активно код во все стороны в поисках искомого.

Так и здесь. Если defer откладывает выполнение кода до конца функции, то его можно просто поместить в конец функции. На то место, где он и должен выполняться. Вот и всё.

saahriktu ★★★★★
()

Харе программировать!

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

Так и в питоне тогда статическая типизация есть, если следовать вашей логике. Просто она под капотом. Для меня статическая типизация это возможность понять код без IDE.

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

Это как ты понял?

Из кода, когда я не могу понять тип переменной без IDE, то это не статическая типизация.

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

языки умеют не «пачкать» код явными декларациями

Это глупость, если тебя напрягают явные декларации, то IDE может без проблем скрыть лишний шум. Внедрять такое в сам ЯП не имеет смысла.

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

Да легко. Запрет алиасинга позволяет компилятору оптимизировать код более агрессивно.

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

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

let x: *int = alloc(42);
fn greet(user: str) void = {
	fmt::printfln("Hello, {}!", user)!;
};
let
	a: str = "hi",			// String
	b: (int, int) = (42, 24),	// Tuple
	c: struct {
		x: int,
		y: int,
	} = struct {
		x: int = 10,
		y: int = 20,
	},				// Struct
	d: [4]int = [1, 2, 3, 4],	// Array
	e: []int = [1, 2, 3, 4];	// Slice
type coords = struct { x: int, y: int };

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

Ну молодец, ты придумал себе свое определение «статической типизации». Остальной мир использует другое, отличное от твоего.

theNamelessOne ★★★★★
()

Напишите для hare дебагер eto с системой сборки delat.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от crutch_master

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

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

Если defer откладывает выполнение кода до конца функции, то его можно просто поместить в конец функции.

... 
if (invalidFileContent) {
    close(file);
    return;
}
...
if (somethingElseGoesWrong) {
    close(file);
    return;
}
...
//do something
close(file);
...

Ну нафиг

ya-betmen ★★★★★
()
Ответ на: комментарий от derlinux

Харе

У нас семейный анекдот есть. Мама работала в Красном Университете на кафедре «Химия и Анализ Редких Элементов». Сокращённо ХАРЭ. Так вот звонит какая-та тётя на кафедру. Дело было в восьмидесятых. Мамам берёт трубку и отвечает. «ХАРЭ». На что тётя сильно возмутилась «Девушка, чего вы ругаетесь!?».

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

Из кода, когда я не могу понять тип переменной без IDE, то это не статическая типизация.

Или тебе продали бесплатный Котлин.

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

Прекрасная идея defer, я подобное на Дельфях делал где-то году в 2000, оно называлось finallyDo (а может я и заврался, но во всяком случае пытался это делать, не помню уже). Общая идея - в том, что инициализация ресурса и его очистка текстуально находятся рядом.

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

Простой пример ошибки, связанной с очисткой переменных в конце:

ресурс := нов(какойТоРесурс)
если какоеТоУсловие то
  делайЧтоТо
иначе
  попытка
    делайЧтоТоДругое
  выходя
    удали(ресурс) 

В ветке «если» ресурс не очищен. Если функция достаточно длинная, то легко проглядеть такую ошибку. Если же код написан как

ресурс := нов(какойТоРесурс)
выходя
  удали(ресурс)
кон
если какоеТоУсловие то
  делайЧтоТо
иначе
  делайЧтоТоДругое

То ошибиться (или тупо забыть очистить ресурс) гораздо труднее.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 5)
Ответ на: комментарий от X512

move же!

А временно передать ссылкой или .get().
.release() — в нормальном коде нужно избегать.

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

Так надо просто делать очистку в конце функции. break и тому подобные инструменты для того, чтобы прыгнуть дальше по коду, никто не отменял.

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

Так надо просто делать очистку в конце функции.

И во всех местах, где есть return. И иногда надо закрыть не в конце функции, а раньше (например, если функция с бесконечным интерактивным циклом).

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

return один в конце функции надо делать в таких случаях.

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

saahriktu ★★★★★
()

Это очень даже интересно в сравнении с Go. Но вот только зачем этот перл/C++/PHP-подобный синтаксис? :(

Впрочем, спасибо хотя бы за trailing ‘;’.

GFORGX ★★★
()

Присвоение слайсов — это, получается, memcpy встроен в рантайм?

olegd ★★★
()

А если кто-то щупал или просто знает, есть что-то вроде CGo для внедрения C-кода?

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

try-with-resources гвоздями прибит к интерфейсу closeable, а defer - это полноценная замена finally, но более удобная в использовании и пригодная в т.ч. для return в середине блока (т.е. без связи с исключениями). defer уже есть в go, вопросов не вызывает, соответствует моим давним хотелкам, для меня вопрос закрыт. Т.е. я здесь ничего не обсуждаю, а просто объясняю тем, кому defer не нравится, что нужно просто немного привыкнуть к нему и тогда он хорош. Как я вспомнил, в Дельфях я скорее всего делал вложенную процедуру без параметров, которая закрывала ресурс. А также была конструкция onStack(объект), которая использовала механизм подсчёта ссылок, впиленный в Дельфи ради OLE, который просто запускал объект.Free при выходе из лексической области видимости, содержащей вызов onStack.

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

Но зачем он нужен? По отношению к расту похож на то, чем является Си по отношению к Си++.

Ничо ты нипанимаш... Харе Кришна, Харе Рама...

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

Hare крайне минимальная штука, бутстрап которой от исходников qbe (это типа LLVM, только сильно проще и меньше, как следствие генерирует более медленный код) до работающего компилятора со стандартной библиотекой занимает пару секунд.

Я не понял этих заклинаний и сразу вспомнил заклинание:Forth
Всю жизнь хочу научиться писать на форте, но всю жизнь только хочу...
Просто этот язык так далёк от мира... Голимый стек...
И по факту это космический интерпретатор... Для которого даже процессоры делались...

О! Давно не вспоминал про Forth и:
# apt-cache search gforth
gforth - GNU Forth Language Environment
Ща поставлю...

# gforth
Gforth 0.7.3, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
hello
:1: Undefined word

hello<<<

Backtrace:
$B78A5EDC throw
$B78B2730 no.extensions
$B78A6054 interpreter-notfound1

Он меня не понял :)

Но в сегодняшнем мире есть компьютер в каждом кармане...
Поставлю ка я gforth на своём андроиде... Ведь оно есть!

n0mad ★★★
()
Последнее исправление: n0mad (всего исправлений: 5)
Ответ на: комментарий от X512

Я не писал на языках с defer, но если я правильно понимаю, что тут происходит — то это шаг назад по сравнению с RAII

defer - это такой общий стек для всех коллбэков, которые вызовутся по выходу из блока.

Тогда как RAII привязывает очищение ресурса к деструктору конкретного объекта, не кидая всё в одну кучу.

Далее, что будет, если какой-то defer забудут поставить? Например при копипасте, рефакторинге. А если наоборот поставят два раза?.. По сути обычный это goto с рюшечками

С упомянутым тобой unique_ptr таких проблем быть не может

Crocodoom ★★★★★
()
export fn main(
    mb_magic: u32,
    mb: *multiboot::mb_header,
) void = {
    const modbase = mb.mods_addr: uintptr: *[*]multiboot::mb_module;
    rt::header = modbase[0].start: uintptr;

    // ...
};

А ещё говорят, что плюсы плохо выглядят… Что это, блин, за mb.mods_addr: uintptr: *[*]multiboot::mb_module?

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

чо там учиться? наливай да пей! сам проверял! Носков кажется автор книжки был )))

кстати, на тему bootstrap, в санках загрузчик OBP был на форте

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

Hare RAMa! Воистину 640кб достаточно для всего!

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

я кстати до сих пор не понимаю почему «харэ» в смысле «довольно, хватит» - относят к обсценным словам

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

То, что сейчас общественно допустимо общаться матом, раньше было немыслимо. Это из той же оперы. Юношеский сленг недопустимый в образованном обществе.

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

Ооо, у меня его куча. На днях снова поставил винду, накачал с рутрекера игрушек всяких, тупо дни напролёт рублюсь то в калл-оф-дьюти, то в дум. В думе ща в какой-то миссии застопорился, там вообще не понятно что делать. На карте показывает что там должен быть файт, но я убил 4 чудиков издалека и всё, больше никого нет :( Короче, решил отдохнуть в третий фаркрай, ох как же круто перегрузиться в поганую винду и рубиться в такие офигенные игры бесплатно без стимов, вайнов, костылей и смс.

dnb ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.