CBlerr v5.2
Полная Документация
Исчерпывающее руководство по CBlerr v5.2 — от базового синтаксиса до системного программирования, кросс-компиляции и встроенного ассемблера.
Новые возможности CBlerr v5.2
- Фронтенд-Оптимизации: Агрессивное удаление мертвого кода (DCE) на этапе AST и Constant Folding (компиляция константных выражений).
- Файлы проектов .cblproj: Мощная система для сборки сложных проектов (настройки UI, иконки, таргета и исходных файлов).
- Сборка динамических библиотек: Новый таргет
-t WinLibпозволяет легко создавать.dllдля использования в других приложениях. - Linux Кросс-компиляция: Теперь поддерживается нативная генерация бинарников под Windows x64 и Linux x64 с помощью параметра
-t Linux. - Улучшенная диагностика ошибок: Точный показ строки с ошибкой, предпросмотр кода и подсказки исправлений опечаток (на базе расстояния Левенштейна).
- Английские логи & Тайминг: Вся система компилятора переведена на английский язык. Добавлено отображение времени выполнения сборки после ее окончания.
Введение в CBlerr
CBlerr v5.2 — революционный язык программирования, разработанный как идеальный баланс между удобством синтаксиса и производительностью. Название происходит от сочетания «C» (низкий уровень абстракции) и «Blerr» (Assembler), буквально сливая лучшие черты нескольких языков.
Версия 5.2 представляет зрелую реализацию парадигмы «Python с зубами»: читаемый синтаксис Python, производительность C, встроенный ассемблер и мощная система типов.
Основные характеристики
- Синтаксис на базе Python — легко читать и писать
- Полный контроль над памятью, как в C — явное выделение и освобождение
- Встроенный ассемблер для микрооптимизации
- Строгая статическая типизация, проверяемая при компиляции
- Сборка в исполняемые файлы и .dll библиотеки через C-backend с поддержкой кросс-компиляции
- Поддержка проектов через формат `.cblproj`
- Умные нативные функции
print()иlen()
Быстрый старт
Установка
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 прямо в браузере. Редактор поддерживает подсветку синтаксиса.
Парадигма языка
CBlerr следует парадигме «Python с зубами» — простота и читаемость Python, но с производительностью и низкоуровневым контролем C.
Ключевые принципы
- Явность: всегда показывайте типы и намерения. Неявное поведение скрывает ошибки.
- Полный контроль: нет скрытых механизмов — вы знаете, как происходит выделение памяти.
- Предсказуемая память: нет случайных сборщиков мусора, которые могут заморозить программу.
- Детерминированная производительность: если код работает 1 мс, он всегда работает 1 мс.
Модель компиляции и Кросс-компиляция
CBlerr использует многоэтапную цепь компиляции для превращения исходного кода в высокооптимизированный машинный код.
| Этап | Описание | Результат |
|---|---|---|
| 1. Лексинг | Разбивка текста на токены | Последовательность токенов |
| 2. Парсинг и AST-оптимизации | Построение AST, DCE, Constant Folding | Оптимизированное дерево |
| 3. Анализ типов | Проверка типов и мономорфизация generics | AST с полной информацией о типах |
| 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)
Типы данных
Целочисленные типы
| Тип | Размер | Знаковый | Применение |
|---|---|---|---|
int | 32 бит | Да | Общее использование |
i8 | 8 бит | Да | Символы, байты |
i16 | 16 бит | Да | Экономия памяти |
i32 | 32 бит | Да | Явное указание размера |
i64 | 64 бит | Да | Большие числа |
u8 | 8 бит | Нет | Байты, маски |
u16 | 16 бит | Нет | Координаты, индексы |
u32 | 32 бит | Нет | Адреса, счётчики |
u64 | 64 бит | Нет | Очень большие числа |
Числа с плавающей точкой
| Тип | Размер | Точность | Применение |
|---|---|---|---|
float / f32 | 32 бит | ~7 знаков | Графика, игры |
f64 | 64 бит | ~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 % 5 | 2 |
** | Возведение в степень (нативно) | 2 ** 10 | 1024 |
& | ^ ~ | Побитовые: И, ИЛИ, XOR, НЕ | 12 ^ 10 | 6 |
<< >> | Сдвиги (влево, вправо) | 1 << 4 | 16 |
# Составное присваивание
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):
- Удаление мертвого кода (DCE): Недостижимый или неиспользуемый код вырезается еще до передачи в C-бекенд.
- Сворачивание констант (Constant Folding): Выражения, состоящие только из констант, вычисляются компилятором во время сборки.
# Этот код:
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 аккаунт забанило по неизвестной причине)