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)
Ответ на: комментарий от fluorite

Зачем ты мне это родил? Тебя просили не код, а грамматику в формальном описании каком-нибудь. Как в ней ты будешь без допарсивания разбирать пример с a * b.

А то, что это можно сделать на контекстном парсере в лапше. Я знаю. Тебе уже об этом говорили. Только парсер от этого не стал ll1.

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

Т.е. тебе нужно чётко сказать - чем будет являться a * b в результате твоего разбора. Это должно являться var decl/op*, вот твоя задача сделать это. Потом можешь делать какие угодно приседания.

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

Возможно он хотел сказать про проблему новичков которые не понимают смысла/разницы пост- и пре- фиксного инкремента и декремента. От этого случаются ошибки. Они думают что это просто иная запись, синонимы.
И не понимают что i--/i++ работает не так как они ожидают.
В массив попадёт i старый, а не новый.
Другого смысла отказываться от этих конструкций разумного нет.

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

На самом деле три. Обращение к переменным + оператор.

Там одна операция.

Да. Это составной оператор, такой же как ++. Только тут ты опять засыпался. Это не увеличить на один. Это прибавить+приравнять x

Вовсе нет, Вы просто мыслите неверно. Действие всего одно, что там, что там. Операторы тут не при чём.

Это клоунада.

Ну так прекратите.

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

В принципе Ваши рассуждения стоят ноль. Сначала мусор раскидывали. Потом устроили клоунаду. Почему бы Вам не напрячься и не придумать оператор который заменит цикл целиком, следуя Вашей же нелепой логике. Как в JS, например, map или forEach или что там, Вам виднее, это ведь Ваш уровень.

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

Нет. Он и есть тот самый новичёк. Только вместо признания этого - пытается своё невежество навязывать.

А в целом проблема путания пост/пре связанна с тем, что много альтернативно-одаренных впаривают i–. Ты мог это видеть везде. Далее рядовые это копипастят.

Если убрать этот баласт/невежество из обучения - никакой путаницы не будут. Люди привыкнут писать как люди - ++i/–i. Именно это правильная дефолтная записать. Которая аналогична i += 1;

right_security
()

Автор уже задумал расширение языка под названием PO?

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

++i/–i. Именно это правильная дефолтная записать. Которая аналогична i += 1

Не аналогична.

  1. Сами же говорили, что i += 1 «не может вернуть предыдущие значение».
  2. Запись i += 1 не похожа на говно.
  3. Запись ++i будет аналогична записи i += 1 перед []. Ну это все знают, только смысла использовать от этого говнозапись вида array[++i] не появляется.
  4. Познание работы ++i, i++ и того же с -- выдавать за достижение будет только откровенная молочная жопа, что собственно и требовалось доказать.
  5. Так и не понять основной сути сказанного может тоже только она же.
thegoldone ★★
()
Ответ на: комментарий от Siborgium

Там должен был быть постинкремент.

Нет, не должен. Речь идёт про читаемость кода. Примеры адекватны цели.

И лично мне проще читается именно версия с инкрементом.

О чём и речь, лично Ваше удобство здесь не на первой позиции.

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

Проблема в интуитивной непонятности.
i++ выглядит как i+1 и ожидается как i+=1 по логике инкрементации.
Логика авторов с вычислением не видна, авторы кто придумал такую запись о людях не думали, а думали о своей личной шизе. Оправдывать недалёкость авторов нельзя. Костылять обучением можно, но лучше от этого эти конструкции не становятся.

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

arr[x -= 1] - это так же работает

Подобные конструкции нормальный язык так же должен запрещать.

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

Проблема в интуитивной непонятности.

Для кого?

i++ выглядит как i+1 и ожидается как i+=1 по логике инкрементации.

Нет, не ожидается. Нет не выглядит. Я такую шизо-теорию в первый раз слышу. Я даже никогда не думал о том, что оно на что-то похоже.

Самое интересное, что когда ты придумывал эту чушь, то почему-то ++i не похоже на 1+i, а вот i++ похожа. Судя по всему ты относишься к жертва, либо агитатором той методички, о которой я говорил. А далее начал маняврировать.

Логика авторов с вычислением не видна,

Нет, логики как раз таки нет в твоих манёврах, а вот в логике тех кто это делал - она есть.

Оправдывать недалёкость авторов нельзя.

Скорее недалёкость тех, кто говорит о похожести на 1+i.

Костылять обучением можно, но лучше от этого эти конструкции не становятся.

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

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

Я даже расскажу как думали авторы. Хотя это должно быть понятно любому, хотя читая «похоже на i+1» - я начинаю сомневаться в людях. Особенно тех, кто с таким уровнем понимания/аргументации называет кого-то недалёкими.

Дак вот, i++ - вначале i, потому ++. ++i - вначале ++, а потом i. Я думал это всем очевидно/понятно. Ни кто я, чтобы понимать шизово.

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

Для кого?

Для новичков, которые ещё не зазубрили помойный синтаксис.

Нет, не ожидается. Нет не выглядит. Я такую шизо-теорию в первый раз слышу. Я даже никогда не думал о том, что оно на что-то похоже.

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

Самое интересное, что когда ты придумывал эту чушь, то почему-то ++i не похоже на 1+i, а вот i++ похожа.

В конкретно том сообщении я говорил за i++. Новички обычно про префисную запись и не слышали даже в силу её крайней непопулярности.

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

Этот бред я не буду комментировать, не надо меня ввязывать в свою шизу.

Нет, логики как раз таки нет в твоих манёврах, а вот в логике тех кто это делал - она есть.

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

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

Зубрёжка и есть костыль. Эти конструкции зашкварены. Теперь даже если выкинуть префиксный вариант и оставить постфиксный с интуитивно понятной логикой, то он всё равно зашкварен — одни люди будут ожидать один вариант (кто не зубрили си), другие другой (кто зубрили си).

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

Для новичков, которые ещё не зазубрили помойный синтаксис.

Каких таких новичков? Зачем ты навяызваешь свою шизу кому-то?

Для новичка который ожидает продуманный

Он продуманный.

В конкретно том сообщении я говорил за i++.

Смотри, вот ты начал мне рассказывать про i++ похоже на i+1, но почему ты не подумал об обратном. Это как раз таки показывает об уровне твоей продуманности.

А далее ты слился. Поэтому отвечай - почему именно i+1, а не 1+i.

Новички обычно про префисную запись и не слышали даже в силу её крайней непопулярности.

Вот опять, удивительно то как персонаж со мною спорить, а потом повторяет то что я говорил. Как раз префиксная запись является базовой. Почему как они могут её не видеть?

А не видят они её потому что есть подобны тебе пропагандисты.

зазубрил их бред

Куда зазубрил? Зазубрил именно ты. Зачем врёшь, если выше этому свидетельств много?

В целом далее тебя совсем прорвало и я не буду тебе позволять сливаться. Поэтому за i+1 vs 1+i ты ответишь. А так же за «забрил», а так же за недолёкость.

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

Удивительный в своём невежестве персонаж, кстати.

Начал про «продуманный» и сел в лужу с i+1 vs 1+i.

Начал спорить с «всё не так», а потом ссылаться на i++-пропаганду.

Рассказывает про какую-то зубрёжку, хотя как раз таки сам зазубрил i++. Т.е. просто не думал, а потреблял пропаганду невежества.

Так и не смог, кстати, показать почему и кто друг ожидает «другой» вариант. В целом ему даже и пытаться ненужно. Он жертва, которая ищет оправдания.

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

Каких таких новичков? Зачем ты навяызваешь свою шизу кому-то?

Обычных. «Шизу» навязываешь ты.

Он продуманный.

Если бы он был продуманный не было бы таких ситуаций.

Смотри, вот ты начал мне рассказывать про i++ похоже на i+1, но почему ты не подумал об обратном. Это как раз таки показывает об уровне твоей продуманности.

Я и хотел рассказать именно про i++. Зачем мне говорить про префиксном если проблема в постфиксном?
А ты мне зачем-то хочешь навязать префиксный.

Почему как они могут её не видеть?

Потому что язык изучают по статьям, а не по стандарту.

А не видят они её потому что есть подобны тебе пропагандисты.
Куда зазубрил? Зазубрил именно ты. Зачем врёшь, если выше этому свидетельств много?

Из какой палаты пишешь?

В целом далее тебя совсем прорвало и я не буду тебе позволять сливаться.

Скорее тебя порвало. Оставлю тебя в одиночестве. Не вижу смысла спорить с одержимым.

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

Если бы он был продуманный не было бы таких ситуаций.

Каких ситуаций? Что неосиляторы/пропагандисты бегают и врут? Что засрали везде и всё? Ну такова реальность.

Я и хотел рассказать именно про i++.

Нет, мне ненужны твои оправдания. Ты писал о том, что i++ интуитивней потому что похоже на i+1. Мало того что это чушь, но то ладно. Тебе задали простой вопрос. Если i++ похоже на i+1, тогда ++i похоже на 1+i. Почему тогда первое интуитивно, а второе нет?

То понятно, что отвечать за свои вбросы сложно. Но ты хоть попытайся. Остальные оправдания мимо.

Потому что язык изучают по статьям, а не по стандарту.

Причём тут стандарт. Если проблема в том, что везде бегают подобные тебе неосиляторы и гадят. Убери тебя - никакой проблемы не будет. О чём я сообщил.

Повторяю мой основной тезис. Шизы вместо нормального ++i впаривают i++-шизу, а после оказывается что люди путают это с i += 1. Самое путает уже та самая зубрёжка. Потому что вменяемый человек просто понимает операции, а не как цирковое чудо заучивает какие-то трюки.

А потом шизы приходят и говорят «ну это сишка виновата, что i++ неправильно работает». Шизы впарили людям шизу, а после виноват кто угодно, но не они. Типичная история.

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

Кстати, почему-то данный персонаж так же врал про «нет логики», но когда ему её показали - он что-то не отвечаешь. Чего же так? Отвечай. Ты утверждал, что логики нет. Тебе её показали. Она куда лучше/понятнее твоей шизо-теории дырявой.

Как ты это объяснишь?

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

Да что-то по-моему Вы слились по всем параметрам. Брызгать пеной и аргументировать свою позицию – это разные вещи.

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

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

Второе - где пруфы. Что ты там и с чем сравнивал.

Третьи - какое отношение какой-то маздайский мусор имеет к си? Никакого.

Четвёртое и самое важное - как это связано с тем за что ты плюсовал. Предположим, что разница действительно есть. Эра разница сравнивает сравнимое. Каким образом выяснил, что она обусловлена тем что ты плюсова?

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

Что ты там и с чем сравнивал.

Я пользовался и тем и другим.

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

Увеличить переменную на один – одно действие.

На всратом x86. Человечество могло бы делать по куче операций за такт, но кодерки это осилят только лет через 100.

crutch_master ★★★★★
()

Язык не убийца. Убийцы сидят в другом месте...

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

А что нужно?

Какого-нибудь compile-time ассоц массива с произвольными ключами не хватает что-ли. Нужны, например, названия всех функций, чтобы потом сделать из них какой-нибудь рест. Надо еще список аргументов функции с типами, чтобы он парсил на входе название метода, аргументы в char* и потом вызывал, что надо, преобразовывая аргументы и ругаясь на юзера.

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

Вызов по имени переменных бы еще приделать, т.е. как-то так:

 
fn int foo(x : int, y : double, z : char*) { ... };
...

foo(z : someCharVar, y : someDoubleVar, x : someIntVar);
//или
foo({z, x, y});
//если у них такие же имена, как в сигнатуре

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

Нужны, например, названия всех функций, чтобы потом сделать из них какой-нибудь рест.

Ага, мне это тоже понадобилось для встроенного юнит-тестирования/бенчмарков (которых пока нет). Я предложил что-то вроде этого:

foreach(Module m, $$imports)
{
    foreach(Func f, m)
    {
      $$if(f.name.ends_with("_test"))
      {
         @test(f);
      }
    }
}

Автор не против.

Надо еще список аргументов функции с типами

Недавно было добавлено:

import std::io;

macro print_args($Type)
{
        var $params = $Type.params;
        $foreach ($param : $params):
                io::println($param.nameof);
        $endforeach
}

fn int hello(int a, double b, int[4] d, args...) => 0;

fn void main()
{
        print_args($typeof(&hello));
        io::println($typeof(&hello).returns.nameof);

}

Пока не сообразил, как получить имя параметра. Спрошу.

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

@hobbit Я уже не могу отредактировать первое сообщение. Просьба добавить туда ссылку на Discord.

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

Грамматика определят синтаксис. Синтаксис - это скучно. Я показал, как можно при одинаковом синтаксисе иметь разную семантику, менять её прямо в рантайме. Тебе дали теорию и ты на ней зациклися, ограничился ей. Я вижу пределы применимости теории.

чем будет являться a * b в результате твоего разбора

Это анскил. Тупо синтаксис. Как напишу, так и будет.

name ::= [a-zA-Z]+
star ::= '*'
manya ::= name star
prog ::= manya name

В результате разбора a * b будет manya name. Грамматика контекстно-свободная (или докажи, что нет).

Далее следует семантика. Правило такое: если раньше определили id как тип, manya означает указатель на id. Иначе это бинарная операция умножения, где левый операнд - идентификатор id. Аргумент про «допарсивания» несостоятелен (или докажи эквивалентность синтаксиса и семантики).

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

Опа, и что, он будет на вот это ругаться?

/*
* @require i > 0 && i < 100
*/
fn int foo(int i) {
   return i + 1;
}

...
int x = readIntFromStream(); //
foo(x); //потенциально за границей [0 - 100]
...

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

В общем, я так понимаю ты совсем заврался?

Я показал, как можно при одинаковом синтаксисе иметь разную семантику, менять её прямо в рантайме. Тебе дали теорию и ты на ней зациклися, ограничился ей.

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

Это анскил. Тупо синтаксис. Как напишу, так и будет.

Нет, мимо.

В результате разбора a * b будет manya name. Грамматика контекстно-свободная (или докажи, что нет).

зачем ты пытаешься мне показываешь то, что я рассказал тебе?

Грамматика контекстно-свободная (или докажи, что нет).

Нет, в языке никакого маня-нейма нет. Ты опять сел в лужу. В языке есть var decl/op*.

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

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

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

Сам будет вряд ли, но можно так:

fn int foo(int x, double y, char z)
{
    return 0;
}

fn void main()
{
    int a  = foo(1, 2, 3);
    int b  = foo(.z = 1, .x = 2, .y = 3);
}
dataman ★★★★★
() автор топика
Ответ на: комментарий от right_security

я так понимаю ты совсем заврался

«нет ты» (с)

Ты сообщал, что можно что-то сделать потом оставив ll1-парсинг.

Показывай, где у меня контекстно-зависимый парсинг.

зачем ты пытаешься мне показываешь то, что я рассказал тебе?

Ты там вроде начал что-то понимать, но потом скатился в отрицалово. Объясняю словами, которые ты понимаешь.

Нет, в языке никакого маня-нейма нет

Вот же я тебе прямо грамматику с маня-неймом показал. Докажи, что это не грамматика языка.

В языке есть var decl/op*

Показывай код.

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

Показывай, где у меня контекстно-зависимый парсинг.

Показывай где var decl/op*, которые там должны быть.

Ты там вроде начал что-то понимать, но потом скатился в отрицалово. Объясняю словами, которые ты понимаешь.

Я начал понимать, но почему-то ты пастишь то, что я говорил. Как там вышло? Не позорься так сильно.

Вот же я тебе прямо грамматику с маня-неймом показал. Докажи, что это не грамматика языка.

Никаких маня-неймов ворованных у меня в грамматике нет. Тебе сказали, что в ней есть.

Показывай код.

Это твоя задача, не моя. Ты утверждал и рассказывал куллстори.

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

Похоже кому-то снова лень делать язык для людей.

Ну это сложно. Хотя на самом деле нет, но всё равно. Нужно менять методичку.

Хм, очень странно, а где var?

Т.к. в целом остальное примитивное - это не вызвало у него коллизий.

Они пихают паскалятину когда не осиливают, а не потому что она кому-то нужна. Поэтому никаких странностей там нет.

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

Они пихают паскалятину когда не осиливают, а не потому что она кому-то нужна. Поэтому никаких странностей там нет.

Вообще обычно даже стремления не видно.

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

Ну это вполне себе объяснимо. Внушение хорошо работает на тех у кого опыта нет. Поэтому те же ца раста - всякие неофиты/неосиляторы. У первых нет опыта, у вторых есть обида и мотивация врать. Идеальная цель вообще какой-то обиженный на мир тот, чьей мамкой станет раст/иное.

Когда ЦА те же сишники, которые +/- видели синтаксис для людей, а не «я не осилил написать парсер» - им сложно впарить что-то.

Поэтому мы от подобных персонажей/языков - будем видеть тысячи переобуваний. Когда их фантазии не получается впарить, либо они совсем несостоятельные, то им проходится менять методички. За этим очень интересно наблюдать. Особенно за тем как адепты забывают свои же лозунги через неделю.

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