LINUX.ORG.RU

Убийца ли C язык C3?

 , ,


3

8

В честь сегодняшнего пре-релиза (0.2.4).

C3 (GitHub) - очередной «убийца» C на базе LLVM. Потихоньку разрабатывается шведским программистом (одна штука).

Ключевые особенности:

  • компилятор написан на C
  • поддержка LLVM 12-15 (насколько мне известно, ни один из конкурентов этого не может (привет, Odin, Zig и т.д и т.п.))
  • полная C-ABI совместимость
  • модули - нет хидерам!
  • дженерики
  • макросы, но не как в C
  • слайсы
  • контракты
  • compile time and runtime reflection (плохопереводимая игра слов)
  • SIMD «из коробки»
  • и многое другое!

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

macro int factorial($n)
{
        $if ($n == 0):
                return 1;
        $else:
                return $n * factorial($n - 1);
        $endif;
}

extern fn void printf(char *fmt, ...);

fn void main()
{
        int x = factorial(12);
        printf("12! = %d\n", x);
}
★★★★★

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

Ясно. «Убийца C», компилятор которого нельзя портировать на новую платформу за 2 недели неспешного ковыряния в носу, не нужен.

Фишка Си как раз в максимальной дубовости реализации компилятора.

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

Ну это же Дрю ДеВолт, он любит шутить.

dataman ★★★★★
() автор топика

дженерики

Не нужно.

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

K&R без структур возможно за 2 недели можно портировать.

MOPKOBKA ★★★★★
()

Макросы в 2к23, лол, что мне мешает самому их добавить в язык через препроцессор? Должна быть возможность вызывать любую функцию в compile-time, и возможность из них взаимодействовать с компилятором, получать определения, менять их.

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

добавить в язык через препроцессор

Препроцессор в MMXXIII году, лол.

Должна быть возможность вызывать любую функцию в compile-time

Любую не получится.

взаимодействовать с компилятором, получать определения, менять их

Это к Nim.

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

Любую не получится.

Получится, в моем языке (под влиянием forth) можно.

MOPKOBKA ★★★★★
()
7 июня 2023 г.

Уж сколько своих «убийц» пережила сишечка - не сосчитать…

QsUPt7S ★★
()
20 сентября 2023 г.

https://github.com/c3lang/c3c/tree/master/resources/examples/nolibc

fn int main()
{
    String msg = "Hello, C3 World!\n";
    $$syscall(1, 1, (uptr)msg.ptr, msg.len); // __NR_write, STDOUT
    return 0;
}

fn void _start() @export("_start")
{
    int ret = main();
    $$syscall(60, ret); // __NR_exit
}

module std::core::builtin;

def PanicFn = fn void(String message, String file, String function, uint line);

PanicFn panic = &default_panic;

fn void default_panic(String message, String file, String function, uint line)
{
}
dataman ★★★★★
() автор топика
Последнее исправление: dataman (всего исправлений: 1)

Убийцы не нужны их и так складывать некуда.

call-monster
()
31 октября 2023 г.

Одно из самых долгожданных нововведений – интерфейсы:

interface InStream
{
    fn void! close() @optional;
    fn usz! seek(isz offset, Seek seek) @optional;
    fn usz len() @optional;
    fn usz! available() @optional;
    fn usz! read(char[] buffer);
    fn char! read_byte();
    fn usz! write_to(OutStream* out) @optional;
    fn void! pushback_byte() @optional;
}

fn usz! available(InStream* s)
{
    if (&s.available) return s.available();
    if (&s.seek)
    {
        usz curr = s.seek(0, Seek.CURSOR)!;
        usz len = s.seek(0, Seek.END)!;
        s.seek(curr, Seek.SET)!;
        return len - curr;
    }
    return 0;
}
struct ByteReader (InStream)
{
        char[] bytes;
        usz index;
}

fn usz ByteReader.len(&self) @dynamic
{
        return self.bytes.len;
}
dataman ★★★★★
() автор топика

https://github.com/c3lang/c3c/releases/tag/release_0.5

First 0.5 release. Using the 0.5 release has the following stability guarantees: no changed standard library functions, no change in language syntax and semantics. However, compiler and standard library bugs will be fixed as long as they do not change behaviour.

https://github.com/c3lang/c3c/blob/master/releasenotes.md

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

Это какой по счёту убийца сишки? Где-нибудь есть перечень всех этих убийц?)

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

Да, достаточно хорошо. Мониторы нонче широкие, надо чем-то занимать.

Virtuos86 ★★★★★
()

C3 (GitHub) - очередной «убийца» C

компилятор написан на C

/0 Кто-то опять doing it wrong.

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

Дойдут до версии 1.0, перепишут на самом себе. А пока смысл?

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

Разумеется, уважающий себя «убийца Ц» начинает с того, что пишет себя на самом себе, чтоб исключить предпосылки для «супервентности к Ц», убивающей саму идею убивания Ц (гугл «супервентность»).

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

было:

$else стало: $$syscall инфляция?

anonymous
()

макросы, но не как в C
compile time and runtime reflection (плохопереводимая игра слов)

Есть пример сериализации/десериализации структур?

Bad_ptr ★★★★★
()

Слишком много долларов $ $$ $$$. Есть же фунты, юани, йены.

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

Не уверен, что сейчас это возможно.

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

си бьет модулу-2 в части препроцессора и компактности записи. и проигрывает ей в типизации, у модулы-2 она строгая, и модульности, коя является у модулы-2 центральной идеей. еще у модулы есть сопрограммы, но эта фича сомнительна. она устарела.

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

Модульность, какой она должна быть. Типизация, настоящая строгая типизация и как следствие - большая безопасность кода. Корутины, причем как часть языка, а не наклепаны на коленке где-то еще. Очень внятный и простой стандарт, компилятор написать проще некуда, таких вещей как undefined bevavior не завозили. Настоящие массивы с возможностью проверки границ, а не фейковые как в С. И прочая.

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

Препроцессор в C - это аргумент в пользу бедных, а не насущная необходимость, там разве что средства условной компиляции и нужны. Все остальное - от бедности.

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

Благодарю за ответ, это интересно. А можете объяснить про препроцессор? Я просто так и не понял это действительное или мнимое преимущество C?

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

проигрывает ей в типизации, у модулы-2 она строгая

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

EvilFox ★★
()
19 мая 2024 г.

Смотрю на эту тему и не понимаю: читал я её уже или нет. Погрепал комменты – оказалось, читал. Склероз.

В общем, главный вопрос – чем это лучше zig?

wandrien ★★
()

В общем, я пособирал мысли в кучу и вот что собрал:

То, что язык «based on C» – это автор, мягко говоря, лукавит, а попросту – звиздит. От Си там только скобочки.

Но дело не в особенностях синтаксиса, а в том, какую задачу пытается решать язык, какой у него raison d’être.

Чтобы ответить на вопрос о том, является ли этот язык по духу продолжением Си, нужно сначала установить raison d’être самого Си.

Для меня лично ключевой фишкой Си является — максимальная явность потока управления. И другая важная фишка — максимальная простота языка.

И в этом смысле идейным продолжением Си является Zig. Его автор исчерпывающе раскрыл суть существования своего языка:

Простой язык

Сфокусируйтесь на отладке вашего приложения, а не на отладке вашего знания языка программирования.

    Без скрытых потоков управления.
    Без скрытых выделений памяти.
    Без препроцессора и макросов.
Здесь нет скрытого потока управления, нет скрытых выделений памяти, нет препроцессора и отсутствуют макросы. Если код на Zig не выглядит как вызов какой—то функции, тогда так оно и есть. Это значит, что вы можете быть уверены, что данный код вызывает только foo() и затем bar(), и это гарантировано независимо от типа:

var a = b + c.d;
foo();
bar();

А что касается C3, то краткое знакомство с документацией вызывает ощущение солянки, куда пытаются затолкать всё сразу, но непонятно, ради чего.

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

А что касается C3, то краткое знакомство с документацией вызывает ощущение солянки, куда пытаются затолкать всё сразу

Ты путаешь.

info: Usage: zig [command] [options]
Commands:
...
  ar               Use Zig as a drop-in archiver
  cc               Use Zig as a drop-in C compiler
  c++              Use Zig as a drop-in C++ compiler
  dlltool          Use Zig as a drop-in dlltool.exe
  lib              Use Zig as a drop-in lib.exe
  ranlib           Use Zig as a drop-in ranlib
  objcopy          Use Zig as a drop-in objcopy
  rc               Use Zig as a drop-in rc.exe
dataman ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.