CBlerr v5.2
Полная Документация

Исчерпывающее руководство по CBlerr v5.2 — от базового синтаксиса до системного программирования, кросс-компиляции и встроенного ассемблера.

Новые возможности CBlerr v5.2

Введение в CBlerr

CBlerr v5.2 — революционный язык программирования, разработанный как идеальный баланс между удобством синтаксиса и производительностью. Название происходит от сочетания «C» (низкий уровень абстракции) и «Blerr» (Assembler), буквально сливая лучшие черты нескольких языков.

Версия 5.2 представляет зрелую реализацию парадигмы «Python с зубами»: читаемый синтаксис Python, производительность C, встроенный ассемблер и мощная система типов.

Основные характеристики

Быстрый старт

Установка

git clone https://gitlab.com/tankman02/cblerr.git
cd cblerr
# Вам также понадобится GCC/Clang или MinGW(для Windows)

Hello, World!

def main() -> int:
    print("Hello, CBlerr v5.2!")
    endofcode

Компиляция и запуск:

python build/build.py hello.cbl
./hello.exe

Ключевое слово endofcode работает точно так же, как return 0, но позволяет явно отметить конец главной функции приложения.

Файлы проектов (.cblproj)

В CBlerr v5.2 добавлена нативная поддержка конфигурационных файлов проектов. Это позволяет управлять сборкой без длинных аргументов командной строки.

# Файл project.cblproj
name = MyProject
main_file = main.cbl
target = Windows
ui = 1
icon = icon.ico
file = abc.abc

# Пример для создания DLL-библиотеки:
# name = MyLibrary
# main_file = lib.cbl
# target = WinLib

Чтобы собрать проект, просто передайте файл проекту компилятору:

python build/build.py project.cblproj

Интерактивная песочница (Мини-IDE)

Попробуйте синтаксис CBlerr прямо в браузере. Редактор поддерживает подсветку синтаксиса.

main.cbl

Парадигма языка

CBlerr следует парадигме «Python с зубами» — простота и читаемость Python, но с производительностью и низкоуровневым контролем C.

Ключевые принципы

Модель компиляции и Кросс-компиляция

CBlerr использует многоэтапную цепь компиляции для превращения исходного кода в высокооптимизированный машинный код.

ЭтапОписаниеРезультат
1. ЛексингРазбивка текста на токеныПоследовательность токенов
2. Парсинг и AST-оптимизацииПостроение AST, DCE, Constant FoldingОптимизированное дерево
3. Анализ типовПроверка типов и мономорфизация genericsAST с полной информацией о типах
4. КодогенерацияГенерация C-кода и сборка через GCC/ClangНативный исполняемый файл

Таргеты сборки

Начиная с версии 5.2, CBlerr поддерживает компиляцию под разные операционные системы и форматы прямо из коробки.

# Сборка под Windows (.exe)
python build/build.py main.cbl

# Сборка Windows DLL (.dll)
python build/build.py main.cbl -t WinLib

# Сборка под Linux (бинарник ELF)
python build/build.py main.cbl -t Linux

Авто-сборка GUI: Если компилятор находит в вашем коде функцию WinMain, он автоматически передает линкеру флаг -mwindows для создания приложения без консольного окна.

Порядок определений (Top-Down)

Критически важный принцип в CBlerr: функция ДОЛЖНА быть определена ПЕРЕД её использованием. Основная функция приложения всегда находится в конце файла.

def add(a: int, b: int) -> int:    # Определена первой
    return a + b

def main() -> int:              # ВСЕГДА в конце!
    result: int = add(5, 3)
    endofcode

Для взаимной рекурсии используйте extern:

extern def function_a(x: int) -> int    # Объявление

def function_b(x: int) -> int:
    if x == 0:
        return 1
    return function_a(x - 1)

def function_a(x: int) -> int:          # Теперь определение
    return function_b(x * 2)

Типы данных

Целочисленные типы

ТипРазмерЗнаковыйПрименение
int32 битДаОбщее использование
i88 битДаСимволы, байты
i1616 битДаЭкономия памяти
i3232 битДаЯвное указание размера
i6464 битДаБольшие числа
u88 битНетБайты, маски
u1616 битНетКоординаты, индексы
u3232 битНетАдреса, счётчики
u6464 битНетОчень большие числа

Числа с плавающей точкой

ТипРазмерТочностьПрименение
float / f3232 бит~7 знаковГрафика, игры
f6464 бит~15 знаковНаучные вычисления

Другие типы

# Логический тип
flag: bool = true
other: bool = false

# Указатели
ptr: *int = 0        # NULL-указатель
ptr2: *void = &my_function   # Указатель на функцию

# Строки
message: str = "Hello, CBlerr!"

# Приведение типов
x: int = 5
y: f64 = (x as f64)
buf_ptr: *void = (buffer as *void)

Строки: Тип str — это специальная структура flux_string, содержащая .data (содержимое) и .length (длину). Для сравнения строк компилятор сам под капотом вызывает функции memcmp или strcmp!

Переменные и константы

Все переменные в CBlerr требуют явной типизации.

# Объявление с инициализацией
x: int = 10
name: str = "Alice"
active: bool = true

# Константы (неизменяемые, известны на этапе компиляции)
const PI: f64 = 3.14159265359
const SCREEN_WIDTH: int = 1920

Опасно: Переменная без инициализации содержит мусорное значение (за исключением статических глобальных переменных). Всегда инициализируйте явно: initialized: int = 0.

Операторы

Оператор Моржа (Walrus :=)

Позволяет совместить вычисление выражения и присваивание его значения переменной. Крайне полезно в условиях:

if (value := get_data()) > 0:
    print("У нас есть данные: ", value)

Арифметические и Побитовые

ОператорОписаниеПримерРезультат
+ - * / %Базовая арифметика17 % 52
**Возведение в степень (нативно)2 ** 101024
& | ^ ~Побитовые: И, ИЛИ, XOR, НЕ12 ^ 106
<< >>Сдвиги (влево, вправо)1 << 416
# Составное присваивание
x += 5    # x = x + 5
x -= 3    # x = x - 3
x *= 2    # x = x * 2
x &= 0x0F # Побитовое И с присваиванием

Управление потоком

If / Else

if age < 13:
    category: str = "Child"
else:
    category: str = "Adult"

Цикл While

i: int = 0
while i < 10:
    print(i)
    i += 1

# Бесконечный цикл с break/continue
while true:
    if counter >= 5:
        break
    counter += 1

Цикл For

# Простой for с range
for i in range(0, 5):
    print(i)   # 0 1 2 3 4

# For с явной инициализацией
for i = 0; i < 10; i += 1:
    print(i)

Match-Case (Pattern Matching)

status: int = get_status()
match status:
    case 0:
        print("Success")
    case 1, 2:
        print("Warning or Minor Error")
    default:
        print("Unknown")

Функции

# Обычная функция
def add(a: int, b: int) -> int:
    return a + b

# Встроенная функция (inline)
@inline
def square(x: int) -> int:
    return x * x

# Функция с неизвестным количеством аргументов (Vararg)
extern def printf(fmt: *void, ...) -> int

Структуры и Перечисления

# Объявление структуры
struct Point:
    x: int
    y: int

# Инициализация с помощью {}
p1: Point = {10, 20}

# Установка полей вручную
p2: Point
p2.x = 5

# Перечисления
enum GameState:
    MainMenu = 0
    Playing = 1

# Packed-структура (без выравнивания памяти)
@packed
struct CompactData:
    a: u8
    b: u8
    c: u16

Дженерики (Generics)

CBlerr поддерживает универсальное программирование через шаблоны типов. Компилятор автоматически создаёт специализированные версии для каждого типа (мономорфизация).

def swap<T>(a: *T, b: *T) -> void:
    temp: T = *a
    *a = *b
    *b = temp

# Использование
x: int = 5
y: int = 10
swap<int>(&x, &y)   # x = 10, y = 5

Указатели и Память

# Базовые операции с указателями
x: int = 42
ptr: *int = &x          # & — получить адрес
value: int = *ptr       # * — разыменование, value = 42

# Динамическое выделение памяти (требуется extern)
extern def malloc(size: int) -> *int
extern def free(ptr: *int) -> void

buffer: *int = malloc(256)
if buffer == 0:
    print("Memory allocation failed")
    endofcode

free(buffer)
buffer = 0   # Хорошая практика — обнулять после free

Массивы

# Объявление и инициализация литералами
arr: *int =[1, 2, 3, 4, 5]

# Узнать длину массива можно встроенной функцией len
length: int = len(arr)

# Доступ к элементам
first: int = arr[0]    # = 1
arr[0] = 999           # Изменение значения

Работа со строками

# Длина строки
str1: str = "Hello"
length: int = len(str1)

# Сравнение строк работает нативно (==, !=, <, >)
if str1 == "Hello":
    print("Строки равны!")

# Если нужно использовать в C-функциях, берите .data:
extern def strlen(s: *void) -> int
c_len: int = strlen(str1.data as *void)

Модули и импорты

import "lib.cbl"                              # Весь модуль
from "utils.cbl" import calculate, validate   # Конкретные функции

Встроенный Ассемблер

Декоратор @asm переключает тело функции в режим внедрения сырого кода.

# Чтение счётчика тактов процессора
@asm
def get_cpu_cycles() -> int:
    asm "rdtsc"
    asm "ret"

# SIMD — сложение векторов через SSE
@asm
def vector_add_sse(a: *void, b: *void, result: *void) -> void:
    asm "movdqa xmm0, [rdi]"
    asm "movdqa xmm1, [rsi]"
    asm "paddd xmm0, xmm1"
    asm "movdqa [rdx], xmm0"

Оптимизация (Frontend)

В CBlerr v5.2 интегрированы агрессивные методы оптимизации прямо в процессе построения AST (Abstract Syntax Tree):

# Этот код:
x: int = 2 + 2 * 8

# Превращается компилятором напрямую в:
x: int = 18

Диагностика ошибок

Компилятор обладает продвинутой системой диагностики и англоязычной системой логов. Если вы допустили опечатку, CBlerr v5.2 покажет точную строку, выведет фрагмент кода и предложит исправление с использованием алгоритма расстояния Левенштейна.

# Пример ошибки компилятора:
Unknown function: pritnf
Did you mean: printf ?

Также, по завершении процесса сборки, всегда отображается точное время компиляции, например: Build completed in 0.842s.

Нативные функции

В CBlerr v5.2 есть мощные встроенные функции, которые генерируют умный код во время компиляции.

print(...)

Функция print автоматически понимает типы переданных переменных и форматирует их. В конце автоматически добавляется перенос строки \n.

name: str = "Alice"
age: int = 25
print("Пользователь ", name, " имеет возраст ", age)
# Вывод: Пользователь Alice имеет возраст 25

len(obj)

Специальная функция len вычисляет длину массивов и строк (как sizeof(arr)/sizeof(arr[0]) или str.length).

arr: *int =[10, 20, 30]
print(len(arr))  # 3

Внешние функции C (CRT)

Чтобы использовать функции стандартной библиотеки C, их нужно явно объявить.

extern def scanf(fmt: *void, ...) -> int
extern def malloc(size: int) -> *int
extern def free(ptr: *void) -> void
extern def memcpy(dst: *void, src: *void, n: int) -> *void
extern def Sleep(ms: int) -> void

Примеры программ

Калькулятор с нативным print

extern def scanf(fmt: *void, ...) -> int

def main() -> int:
    a: int = 0
    b: int = 0
    op: int = 0
    
    print("Enter first number: ")
    scanf("%d".data as *void, &a)
    print("Operator (1=+, 2=-, 3=*, 4=/): ")
    scanf("%d".data as *void, &op)
    print("Enter second number: ")
    scanf("%d".data as *void, &b)
    
    result: int = 0
    if op == 1:  result = a + b
    else: if op == 2: result = a - b
    else: if op == 3: result = a * b
    else: if op == 4 and b != 0: result = a / b
    
    print("Result: ", result)
    endofcode

Готовы к разработке на CBlerr v5.2?

Начните писать быстрый нативный код с синтаксисом Python уже сегодня.

⭐ Скачать с Gitlab (github аккаунт забанило по неизвестной причине)