vak: (Знайка)
[personal profile] vak
Видели мы уже Си++, D, Zig, а вот встречайте новый проект. Язык и компилятор С3: https://c3-lang.org/. Пока не такой развитый как Zig, но тоже представляет интерес. Работает на маке и Линуксе, на Windows я не пробовал.

Компилятор построен на основе LLVM: github.com/c3lang/c3c

Простейший пример:
module hello_world;
import std::io;

fn void main()
{
io::printn("Hello, world!");
}
Основные улучшения C3 по сравнению с обычным C:

Особенность / улучшение Что добавлено в C3 Зачем это нужно / какую проблему решает
Совместимость с ABI C Программы на C3 могут напрямую вызывать функции C и наоборот, без обёрток. Можно использовать существующие C‑библиотеки и постепенно переходить на C3.
Модульная система (namespaces) Код организуется в модули с контролем экспорта и изоляцией имён. В C всё глобально, имена часто конфликтуют, сложное управление зависимостями.
Дженерики (обобщённые модули) Код можно писать для разных типов данных без макросов. В C приходится копировать код или использовать сложные макросы.
Срезы и безопасные массивы Встроенные типы «срезов» (указатель + длина), безопасное индексирование, foreach. В C легко выйти за пределы массива и получить утечку или сбой.
Ошибки и опциональные типы Встроенные типы для ошибок (например, Result, Optional) без накладных расходов. В C обработка ошибок громоздкая и легко забыть проверить код возврата.
defer — автоматическая очистка ресурсов Можно указать действия, выполняемые при выходе из функции. В C приходится вручную дублировать код освобождения или писать goto cleanup.
Контракты (пред- и постусловия) Можно описывать логические условия, проверяемые в отладочном режиме. В C нет встроенных средств проверки инвариантов.
Семантические макросы и код во время компиляции Макросы понимают типы; можно выполнять код на этапе компиляции. В C макросы чисто текстовые, часто приводят к ошибкам.
SIMD и inline‑assembler первого класса Поддержка векторных типов и встроенного ассемблера на уровне языка. В C это делается через нестандартные расширения и платформозависимо.
«Zero‑is‑Initialization» (ZII) Нулевая инициализация создаёт корректное состояние объекта, где это имеет смысл. В C часто встречаются ошибки из‑за неинициализированной памяти.
Расширенная стандартная библиотека Есть готовые динамические массивы, хэш‑карты, строки и другие утилиты. В C стандартная библиотека минимальна, приходится писать всё вручную.

Date: 2025-10-09 21:44 (UTC)
From: [personal profile] begoon
Второму не бывать? :-)

http://c2lang.org/

Date: 2025-10-09 21:49 (UTC)
From: [personal profile] begoon
Автор C3 говорил, что ему понравился C2, но в то время разработка C2 как-то почти умерла, поэтому автору C3 надоело ждать, и он начал C3.

А вот через некоторое время C2 тоже проснулся, и теперь у нас и C2 и C3, в активном развитии.
Edited Date: 2025-10-09 21:52 (UTC)

Date: 2025-10-09 21:50 (UTC)
lxe: (Default)
From: [personal profile] lxe
Интересней, что убрано по сравнению с C++.

Date: 2025-10-09 22:07 (UTC)
lxe: (Default)
From: [personal profile] lxe
"Ну, привет, Гринвуд".

Date: 2025-10-10 02:06 (UTC)
sab123: (Default)
From: [personal profile] sab123
Вышла такая же бессмыссленная убогость, как Го.

Date: 2025-10-09 22:27 (UTC)
vlad_m: (Default)
From: [personal profile] vlad_m
А что там с динамической памятью?
Особенно при использованием слайсов.
Смарт указатели со счётчиками? Сборка мусора?

Date: 2025-10-10 01:08 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Осталось только натренировать БЯМ, чтобы более или менее автоматически переводить миллиарды существующих строк сишного кода на 130.81 Hz (это С3, если кто не понял), и ключик у нас в кармане.

Date: 2025-10-10 02:30 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
И Duff's device может?

Date: 2025-10-10 04:50 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
результат такой, что лучше не надо. 😀

Вот именно. Как говорили лет 20-25 назад, imagine a Beowulf cluster Billion lines of these.

а третьего не миновать

Date: 2025-10-10 03:32 (UTC)
From: [personal profile] h1uke
IMHO, можно проехать, не остановившись. Т.е., таки миновать.

Очень сильно пахнет индусскими рацухами, типа записи сравнений справа налево, чтобы ошибки с "=" и "==" ловить.
Не, не климатит ...

P.S.
"В C часто встречаются ошибки из‑за неинициализированной памяти" -- вот, прямо таки C в этом виноват, а не собственные кривые руки ...
Лентяи и халтурщики :)