Showing posts with label coding. Show all posts
Showing posts with label coding. Show all posts

Thursday, April 13, 2023

Язык программирования Аргентум

(Argentum programming language: aglang.org)



Пару месяцев назад я начал новый проект - это язык программирования Argentum.
А как же Фламберг, спросите вы и будете совершенно правы. Фламберг был хорошим оценочным проектом, на котором обкатались идеи, многие из которых стали основой Аргентума - это объектная модель, интерполяция строк, легковесные лямбды. Вместе с тем было выброшено и переделано все, что мешает в больших структурированных проектах - синтаксис основанный на отступах, модульность через текстовые инклуды, тяжелый interop с Си.

Итак новый язык:

  • Работает без сборщика мусора, поэтому не запинается в лучайные моменты времени, не жрет двух- трехкратный объем памяти, и не тратит лишнего процессорного времени.
  • Гарантированно удаляет объекты в предсказуемые моменты времени.
  • Гарантирует отсутствие утечек памяти (в отличие от Java, Rust, Swift и т.д.)
  • Язык безопасен:
    • Проверки типов -только динамические (но очень быстрые).
    • Синтаксически невозможно обратиться по null-указателю или optional none.
    • Нет висящих ссылок, и двойного удаления объектов.
    • Нет race между потоками.
    • Изменяемые объекты не могут шарится между иерархиями объектов, а разделяемые объекты не могут изменяться.
    • Неизменяемость объектов - гарантирована. Нет const_cast, нет взлома финальности через рефлексию.
  • Язык очень быстр:
    • Прямая компиляция в машинный код.
    • Динамическая проверка типов - пара машинных инструкций.
    • Вызов методов интерфейса и приведение к интерфейсу имеет такой же порядок сложности, что и вызов обычного метода класса.
    • Работа с делегатами и лямбдами не требует аллокаций.
    • Счетчики в шареных объектах не используют атомарные инструкции (вообще примитивы синхронизации используются только при передаче объектов между пртоками).
  • Язык компактен (hello_world.exe может быть собран в 12Kb без дополнительных DLL).
  • Программа на Аргентуме может напрямую вызывать код на Си.

Thursday, January 12, 2017

Менеджер памяти (Allocator) для С++

Исходный текст аллокатора можно взять тут: allocator.zip

Стандартный аллокатор из C++ runtime library - не очень эффективная штука. Он унаследован из мира plain C и поэтому расчитан на несколько другой стиль использования, нежели принят в С++. Он расчитан на отностительно редкий захват крупных блоков. В то время как в С++ принято создавать и убивать тысячи мелких объектов в секунду. Поэтому стандартный аллокатор имеет две существенные проблемы: 
  • он медленный,
  • он сильно фрагментирует память.

Попробуем это исправить. :-)

Monday, November 28, 2016

Игры, которые играют нами. История Рокмана

Часть первая, 1989 год.

27 лет назад компьютеры были большими, программы - маленькими, cоюз - нерушимым, а я - повернутым на компьютерах школьником-старшеклассником.
Наш школьный компьютерный класс состоял из Агат-7 - неудачных "аналогов" Apple II.
Агат-7
Игр для него было исчезающе мало, поэтому мы писали их сами (что есть хорошо: многие стали программистами).
Я уже написал игру а ассемблере про какого-то робота в лабиринте и ходил гоголем (возняком?), снисходительно поглядывая на одноклассников, искавших на клавиатуре any key.

Tuesday, June 17, 2014

Простой эффективный логгер на C++

Проект начинается с логгера

Хотя... некоторые проекты логгером и заканчиваются :-)

Обычно начинающие кодеры полагают, что логгер не нужен. Ведь приложение можно погонять под отладчиком. 
Ну что сказать, отладчик вешь хорошая, пока не придется отлаживать многопоточные приложения с проблемами временнОй синхронизации. Или ставить приложения на платформу, где отладка затруднена. Или получать от заказчика невнятное: "У вас не работает", вместо лога с регулируемой детализацией.

Есть еще одно заблуждение, что достаточно понатыкать в код что-то подобное: 
std::out << "message";
OutputDebugStr("message");

Почему это не катит? Потому что логгер это не только простой вывод сообщений куда-то, логгер должен решать множество задач.

Какие задачи решает логгер:

  • Фильтрация (какие сообщения показывать, а какие блокировать)
  • Форматирование (текстовое представления разнотипных данных)
  • Атрибутирование (добавление в лог маркеров, упрощающих анализ)
  • Буфферизация (накапливание фрагментов сообщения в для ускорения работы)
  • Вывод.

Thursday, June 5, 2014

C/C++. Парсер и калькуллятор выражений, заданных текстовой строкой

Выражения состоят из double-констант, операторов +-*/ и скобок.
Ловятся синтаксические ошибки. Результат выдается в double.
38 строк исходного текста - просто, прямолинейно, расширяемо, без использования сторонних библиотек.
in english

Sunday, February 23, 2014

Бинарный формат для сериализации объектов

Я уже пару месяцев использую CatML для сохранения данных приложения в файлы, передачи объектов по сети и даже для дампа объектов в лог.
Формат хорош. В своих проектах я отказался от XML/Json/Yaml и не жалею.
Но с ростом объемов данных все более заметными становятся фундаментальные недостатки текстовых форматов:
- они избыточно-огромные,
- они долго записываются и еще дольше парсятся.

Поэтому, в общем, вот новый бинарный формат BinaryCatML.

  • Он однозначно конвертируется в текстовый CatML и обратно. Для этого есть консольная утилитка. Вы можете открыть бинарный файл, просмотреть его содержимое, если надо исправить в любом текстовом редакторе и уаковать обратно в бинарный вид.
  • Как и текстовый CatML, он имеет в себе всю метаинформацию и умеет кодировать произвольные графы объектов. 
  • Он разумно компактен. Любое имя поля, имя структуры или объект присутствуют в файле ровно один раз. Это не компрессия, компрессия - убирает избыточность, а BinaryCatML просто не вносит ненужной избыточности.
  • Он быстро записывается и быстро загружается. Все идентификаторы - стркутур, объектов - просто индексы в массивах. Никих look-up-ов в словари, никаких сравнений текстовых строк.
  • Кодек по минимуму использует память и может работать даже на очень слабых устройствах.
  • Он не зависит от разрядности или порядка байт архитектуры, в нем нет ни одного зашитого в формат ограничения.
  • Его кодек занимает меньше 300 строк на Java и может быть портирован на любой язык буквально за день.

Thursday, October 24, 2013

Текстовое представление объектов

Почему XML и JSON – плохо, и как сделать хорошо.

Краткое резюме:

  • XML, JSON, YAML, SDL – плохо пригодны для описания произвольных иерархий типизированных объектов.
  • Но теперь у нас есть альтернативный формат CatML:
    • простой,
    • интуитивно понятный,
    • не допускающий неоднозначности,
    • удобный для парсинга,
    • кодирующий и строго типизированные данные,
    • кодирующий перекрестные ссылки,
    • кодирующий глобально именованные объекты и ссылки на них.
  • Можно прямо сейчас скачать и использовать его енкодер и декодер для Java, который поддерживает:
    • сериализацию объектов
    • и DOM-like способ доступа.
  • Java-библиотека занимает около 1 тыс. строк и может легко портироваться на любой язык.
Скачать Библиотеку энкодера и декодера CatML