LINUX.ORG.RU

c3c 0.7.6

 c3, , , ,


2

5

4 октября состоялся выпуск 0.7.6 кроссплатформенного компилятора и стандартной библиотеки языка программирования C3.

C3 – это эволюция, а не революция: язык, похожий на C, для программистов, которые любят C.
C3 – это язык программирования, основанный на синтаксисе и семантике языка C, с целью его развития при сохранении привычности для программистов C.
Благодаря полной ABI-совместимости с C, можно без труда смешивать C и C3 в одном проекте. В качестве демонстрации, vkQuake был скомпилирован с небольшой частью кода, преобразованной в C3 и скомпилированной с помощью компилятора c3c.

Компилятор написан на языке C с использованием фреймворка LLVM (поддерживаются версии 17-22) и распространяется по лицензии GNU LGPL.
Стандартная библиотека распространяется по лицензии MIT.

Основные изменения:

  • Добавлена compile-time функция lengthof().
  • Добавлена поддержка документирующих комментариев к отдельным членам структур, определениям ошибок и значениям перечислений.
  • В $defined теперь можно использовать $alignof, $offsetof и $nameof.
  • Вывод общих параметров lhs -> rhs, например List{int} x = list::NOHEAP.
  • Объединение generic- и обычных пространств имён модулей.
  • env::PROJECT_VERSION теперь возвращает версию в project.json.
  • Теперь работает сравнение слайсов и массивов пользовательских типов, реализующих оператор ==.
  • Добавлены опции оптимизации loop-vectorize, slp-vectorize, unroll-loops и merge-functions.
  • Добавлен вывод времени выполнения $exec при использовании опции -vv.
  • Добавлен оператор +++=.
  • Другие исправления ошибок и улучшения стандартной библиотеки.

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

★★★★★

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

Как будто есть другая альтернатива с такими же возможностями и с такой же лицензией.

Возможность состоит в том, чтобы быть придатком к компилятору Эппла?

Для вещей очень важен относительный масштаб.

Вон FreePascal на собственном бэке живет. Потому он фигура. Он сам по себе создаёт ценность для своих пользователей.

Rust может себе позволить жить на чужом бэке. Zig - тоже может попытаться.

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

Какой-нибудь FASM или С-- смотрятся солиднее. Там авторская работа. Штучный продукт.

Когда ты не Эппл и не Гугл, то единственное, что тебя может выделить - идея и смелость.

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

Мир не ограничен:

The current version of QBE can target amd64 (linux and osx), arm64, and riscv64.

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

проблема в том, что «комптайм вычисления» ровно ничем не отличаются от простой компиляции библиотек. поэтому странно слышать какие-то восторги насчёт этого. как будто люди никогда не писали библиотек и вдруг - о, чудо! - их код может выполнять что-то там, что уже скомпилировано до основного кода. мне это казалось естественным при изучении самых основ программирования и, например, добавить другие сишные или ассемблерные модули в сишный код не было чем-то необычным. а сейчас это считается «чудом». компилятор сам создал модуль и его прилинковал к основной програме. просто потрясающее достижение.

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

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

Проблема в этом коде в файле CMakeLists.txt:

if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
    # We are inside of a git repository so rebuilding the hash every time something changes.
    add_custom_command(
            OUTPUT "${CMAKE_BINARY_DIR}/git_hash.h"
            COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_LIST_DIR}/git_hash.cmake"
            DEPENDS "${CMAKE_CURRENT_LIST_DIR}/.git")
else()
    # We are NOT inside of a git repository. Building the has only once.
    add_custom_command(
            OUTPUT "${CMAKE_BINARY_DIR}/git_hash.h"
            COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_LIST_DIR}/git_hash.cmake"
    )
endif()

В результате работы получаем вызов cmake -P <путь без экранирования>.

Если поменять двойные кавычки на одинарные, то это исправит проблему, но я не большой знакток CMake скорее всего нужно использовать file(TO_CMAKE_PATH ... или что-то подобное…

В целом собралось.

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

А Вала не канает? Вроде же, обычный C с glib-ом?

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

Наследие C2: http://c2lang.org/site/.

https://github.com/c2lang/c2compiler 🤔

@wandrien, посмотри, если интересно.

// $ cat main.c2

module hello_main;

import stdio as io;

public fn i32 main(i32 argc, char** argv) {
    io.printf("Hello C2!\n");
    return 0;
}

c2c main.c2 транспилируется в:

// WARNING: this file is auto-generated by the C2 compiler.
// Any changes you make might be lost!

#ifndef EXTERNAL_H
#define EXTERNAL_H

#if defined(__clang__)
#  pragma clang diagnostic ignored "-Wincompatible-library-redeclaration"
#  pragma clang diagnostic ignored "-Wunknown-warning-option"
#  pragma clang diagnostic ignored "-Wparentheses-equality"
#  pragma clang diagnostic ignored "-Wsometimes-uninitialized"
#  pragma clang diagnostic ignored "-Wtypedef-redefinition"
#  pragma clang diagnostic ignored "-Wstring-plus-int"
#  if (__clang_major__ >= 10)
#    define fallthrough  __attribute__((fallthrough))
#  endif
#elif defined(__GNUC__)
#  if (__GNUC__ >= 11)
#    define fallthrough  [[fallthrough]]
#  elif (__GNUC__ >= 7)
#    define fallthrough  __attribute__((fallthrough))
#  endif
#  pragma GCC diagnostic ignored "-Wmain"
#  if (__GNUC__ >= 10)
#    pragma GCC diagnostic ignored "-Wzero-length-bounds"
#  endif
#  if (__GNUC__ >= 7)
#    pragma GCC diagnostic ignored "-Wformat-overflow"
#    pragma GCC diagnostic ignored "-Wstringop-overflow"
#  endif
#endif

#ifndef fallthrough
#  define fallthrough
#endif

// --- internally added ---
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef signed long int64_t;
typedef unsigned long uint64_t;
typedef signed long ssize_t;
typedef unsigned long size_t;
#define true 1
#define false 0

#define NULL ((void*)0)
#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
#define offsetof(type, member) __builtin_offsetof(type, member)
#define to_container(type, member, ptr) ((type*)((char*)(ptr) - offsetof(type, member)))

int dprintf(int fd, const char *format, ...);
void abort(void);
static int c2_assert(const char* filename, int line, const char* funcname, const char* condstr) {
    dprintf(2, "%s:%d: function %s: Assertion failed: %s\n", filename, line, funcname, condstr);
    abort();
    return 0;
}
static int c2_strswitch(const char* s1, const char* s2) {
    if (!s1) return 0;  // nil
    if (!*s1) return 1; // ""
    int idx = 2;
    while (*s2) {
        unsigned len = *s2++ & 0xFF;
        for (unsigned i = 0;; i++) {
            if (i == len) {
                if (s1[i] == '\0')
                    return idx;
                break;
            }
            if (s1[i] != s2[i])
                break;
        }
        s2 += len;
        idx++;
    }
    return idx;
}
#endif

// --- module c2 ---



// --- module varargs ---
// Note: this module is a special case and is custom generated
#define va_list __builtin_va_list
#define va_start __builtin_va_start
#define va_end __builtin_va_end


// --- module stdio ---

__attribute__((__format__(printf, 1, 2)))
int printf(const char* __format, ...);


// --- module hello_main ---

int32_t main(int32_t argc, char** argv);

int32_t main(int32_t argc, char** argv)
{
   printf("Hello C2!\n");
   return 0;
}
dataman ★★★★★
() автор топика

а етот ваш c3, он собсна зачем? Что в нем есть такого, чего нет в c?

daniyal
()

Пока не сделают C4, неинтересно. Вот C4 будет бомба.

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

Самое главное, что нет понимания, зачем это. Какая идея. Для чего.

Зашел об этом написать, а тут как раз коммент ниже: «а етот ваш c3, он собсна зачем?».

Типа мы добавили несколько модных слов в исходник: module, import, public. Вместо немодного дедовского include.

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

Самое главное, что нет понимания, зачем это. Какая идея. Для чего.

У меня тот же вопрос о Qod. Опубликовал исходники компилятора, над которым работаю.

Зачем ты тратишь на это время?

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

Сейчас это эксперимент с синтаксисом, в перспективе - эксперимент с компонентной/модульной системой.

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

По этой же причине не начато создание стдлибы. Сначала нужно представить в голове весь пайплайн.

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

Это верхнеуровневые, максимально абстрактные цели.

Более прикладные - я хочу получить язык и компилятор, масштабирующийся от системной разработки под компьютеры общего назначения до программирования микроконтроллеров и legacy-микрокомпьютеров. Во втором качестве - рекомендую посмотреть на https://cowlark.com/cowgol/index.html , чтобы понять, что приблизительно я держу в голове.

wandrien ★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.