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)

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

А если где то лежат два модуля и в каждом свой printf?

LINUX-ORG-RU ★★★★★
()

БЛЯ

(простите меня, но иных слов и более ёмких определений нет)

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

Это я выбрал неудачный пример. :) Вот, например, векторы:

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

fn void main()
{
    float[<3>] v1 = { 1, 2, 3 };
    float[<3>] v2 = { 4, 5, 6 };
    float[<3>] v3 = v1 * v2;

    foreach (i, a : v1)
    {
        printf("v1[%d]: %f\n", i, a);
    }
    foreach (i, a : v2)
    {
        printf("v2[%d]: %f\n", i, a);
    }
    foreach (i, a : v3)
    {
        printf("v3[%d]: %f\n", i, a);
    }
}
dataman ★★★★★
() автор топика

retaining the same syntax as far as possible.

only change where there is a significant need.

struct
{
} // no ;
fn void main()

xaizek ★★★★★
()

модули - нет хидерам

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

ЛОЛ, спасибо, но нет.

no-such-file ★★★★★
()
Ответ на: комментарий от dataman

Ну нинаю, сишка с удобствами. Стоит ли оно того хз. Умножать вектора весело конечно, но если надо в ином порядке то один фиг делать функцию. foreach тоже да удобно, но при желании он реализуется и в сишке, да не универсально будет, но оно и надо то местами. Зайдёт тем кто именно стремится и рыбку съесть и на … и сишкой пользоваться дальше и избавится от ручного труда (который опять же только в определённых случаях будет избавлен)

Ну пусть будет, посмотрим как оно будет или тихо сгинет в небытие =)

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

Ну нинаю, сишка с удобствами.

Неудобств тоже хватает. Например, невозможно скомпилировать файл true.c3, т.к. имя зарезервировано. Или члены enum должны быть ТАКИМИ.

Пока не могу переубедить автора в том, что это плохой дизайн.

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

Сыровато как-то. Подождём С5-С6.

paran0id ★★★★★
()

printf(«12! = %d\n», x);

Это провал. Сколько уже было багов в printf. Первое что нужно делать это запилить правильное форматирование строк по типу print("{x}") вместо print("%d", x).

ox55ff ★★★★★
()

C

factorial(n) {
  return !n ? 1 : n * factorial(n - 1);
}

main() {
  int x = factorial(12);
  printf("%d\n", x);
}
Делает тоже самое, факториал вычисляется в компилтайме, где прогресс?

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

А если так:

macro int @cofefe(a; @body(x))
{
    @body(a);
    @body(a);
    return 1;
}

fn void main()
{
    int x = 0;
    @cofefe(1; int y)
    {
        defer printf("defer: %d\n", x++);
        printf("%d\n", x++);
    };
    printf("Done!\n");
}
dataman ★★★★★
() автор топика
Ответ на: комментарий от EXL

Ну как бы нет, по крайней мере они не называют себя убийцами Си.

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

Подписывайтесь, ставьте лайки звёзды, шлите PR. :)

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

Из недостатков - практически спартанская стандартная библиотека

Может оно и к лучшему, для всяких там эмбедов

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

Тут есть нюансы: ограниченный встроенный ассемблер. Пока нельзя в/из него передавать/получать параметры/значения.

К примеру, в Zig он полноценный и syscall им и реализован.

А в Odin есть и ассемблер и встроенная функция syscall.

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

нет. языки, плохо выглядящие эстетически (например, использующие знаки $ и % рядом с альфонумериком), могут иногда жить долго, но в конце концов загибаются, потому что их неэстетичность снижает продуктивность программистов, которые имеют дело с этим кодом. в случае же с новым языком, шанса взлететь нет. в отличии от php в своё время, никаких киллерфич по сравнению с любым c++, rust-ом или go.

caryoscelus
()

язык должен иметь выразительные декларативные возможности, хорошую систему типов и классы.

а операторы - это дело десятое.

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

например, использующие знаки $ и % рядом с альфонумериком

$ означает, что это compile-time переменные.

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

Такие:

module gen <Type>;

fn Type mult(Type x)
{
    return x * x;
}

fn Type addMult(Type x, Type a, Type b)
{
    return x * a + b;
}

module test;

define intMult = gen::mult<int>;
define doubleAddMult = gen::addMult<double>;

fn int getIt(int i)
{
    return intMult(i) + 1;
}

fn double getIt2(double i)
{
    return doubleAddMult(i, 2, 3);
}
dataman ★★★★★
() автор топика
Ответ на: комментарий от snake266

у него есть/перегружен оператор «*»

Уточню, что перегрузки арифметических операторов пока нет.

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

Добавлю, что compiler-benchmark поддерживает C3, но автор благоразумно не включил его в результаты. Потому что c3c один из быстрейших компиляторов. ;)

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

он просто нифига не умеет же, вероятнее всего.

AndreyKl ★★★★★
()

Казалось бы, в чем проблема сделать улучшенный Си учитывающий накопившуюся практику, но нет.

Видимо разруха в головах.

Psilocybe ★★★★
()
Последнее исправление: Psilocybe (всего исправлений: 1)
Ответ на: комментарий от dataman
   float[<3>] v1 = { 1, 2, 3 };
   float[<3>] v2 = { 4, 5, 6 };
   float[<3>] v3 = v1 * v2;

А какое тут произведение векторов? Скалярное, векторное или тензорное?

В чем смысл такое в язык тащить?

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

очевидно векторное.

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

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

В чем смысл такое в язык тащить?

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

SIMD есть и в Odin и в Zig, да и в C++20 включили. Очевидно, фича востребованная.

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

Вместо fn пока можно использовать func, let отсутствует. Насчёт бакса согласен. :)

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