Spiiin's blog

daScript - как учить

На что в первую очередь посмотреть при изучении нового языка программирования, на примере daScript, но можно и применительно к другим языкам. Сырой список.

Обзор языка, мотивация

  • Кто и зачем делает ещё один язык программирования, какие проблемы он решает
  • Какие возможности даёт язык, позволяет ли сочетание этих возможностей потеницально решить какие-либо ещё мои проблемы, кроме декларируемых авторами
  • Официальная документация, обзорные статьи, поиск существующих комьюнити
  • Лицензия, support
  • Планы, роадмап, периодичность обновлений, стабильность ядра языка
  • Поддерживаемые платформы и архитектуры, использование бекэндов/фронтэндов (llvm)
С++ в геймдеве
daScript - перевод интервью с создателем языка

Чтение кода

  • Примеры от авторов, код тестов
  • Чтение кода стандартной библиотеки
  • Сторонние библиотеки
daScript ссылки

Практика 1. Простые примеры

  • Как хранятся в памяти типы
    — работа со значениями/указателями/ссылками
    — когда неожиданное дополнительное копирование, когда можно избежать, есть ли быстрые способы настройки/проверки
    — особенности преобразования и приведения типов, что можно настроить для своих типов
    — базовые типы
    — особенности типизации
    — настройки мутабельности/чистоты
    — Глобальные/статические переменные
  • Конструкции управления
  • Часто используемые фичи языка (ленивость, аннотации, генераторы etc)
  • Строки
    — какие есть типы для представления строк
    — представление в памяти различных типов
    — кодировки
  • Композия типов
    — Классы, типы наследования, способы композиции данных
    — модули
  • Стандартные контейнеры/коллекции/последовательности
daScript - решение задачек
daScript - мелочи

Практика 2

  • Стандартная библиотека
    — работы с вводом/выводом, файлами и путями, сетью
    — идиомы языка
    — асинхронность - потоки, файберы, примитива синхронизации, корутины, асинхронное выполнение кода. Jobque
Итераторы, колстеки, корутины
Файберы, диспетчеры, асинки
  • приёмы обработки ошибок
  • generic-программирование
daScript: обобщенное программирование
  • макросы, работа с AST языка
daScript macro
daScript macro - 2
  • compile-time вычисления
  • способы генерации кода
  • rtti, рефлексия — возможности настройки

DSL языка

  • форматирование и способы вывода различных типов данных
  • json_boost, regexp_boost, decs_boost, opengl_boost
  • способы создания своих dsl
daScript. Brainfuck и оптимизации

Работа с памятью

  • Способы аллокации и освобождения памяти
  • Принятые паттерны работы с выделением и освобождением памяти, время жизни объектов
    — gc
    — raii
    — опции и настройки компилятора
    — способа кастомизации объектов в памяти — кастомная аллокация, выравнивание, способы переопределить расположение данных в памяти
    — способы реификации стандартных систем языка в памяти (для изучения стоимости этих фич) — способы наследования, корутины, генераторы, continuations, функторы, замыкания, внутренности контейнеров

Работа с мультимедиа

  • рендер, графика, анимация, звук, гуи, работа со стандартными форматами файлов, 3d-математика
  • шейдеры, системы материалов, способы реализации эффектов
daScript OpenGL
daScript - live-режим
daScript. SFML, dasBox и semi-transparent render target
daScript. SFML, dasBox и спайны

Отладка

  • Особенности обнаружения и сигналов о различных типах ошибок компилятором
  • Отладочные контексты
  • Профайлер
  • Отладчик
  • Настройки компилятора для режимов отладки
  • Способы работы с тестами
  • Возможность настроить язык (уровень проверки ошибок, всякие прагмы -Wall, -pedantic) и расширять язык, диалекты
daScript - контексты

Среда разработки

  • Поддержка интеграции в IDE (подсветка, автодополнение, подсказки, переходы по коду, апи связи с существующими тулзами, language server plugin etc)
  • Проверка наличия и качеств собственной среды разработки. Dasbox
  • Сочетаемость с инструментами (санитайзеры, профайлеры etc)
  • Особенности системы сборки
  • Способы сборки (интерпретация, компиляция, транспиляция, настройки vm, jit/aot)
  • Линтеры
  • Работа с документацией

Встраивание, кросс-языковое взаимодействие

  • FFI, вызовы кода на других языках
  • Модули расширения языка
  • Написание и генерация обёрток для своих и чужих классов и готовых библиотек
  • Передача управления между кодом на разных языках
  • Настройки встраивания языка в программу
  • Возможные архитектуры программы на C++ + daScript (настройка AoT, хот релоадинг, расширение классов C++ на daScript)
  • Способы работы со скриптовыми контекстами из C++
  • Способы межпроцессного/междуконтекстного взаимодействия
daScript: C++ auto-bindings, msgpack
daScript: C++ auto-bindings, assimp

Поддержка паттернов и парадигм программирования

  • ECS
  • Функциональное программирование
  • Особенности ООП
ECS - типы и проблемы
daScript: ООП и всякое

Практика 3

  • Реализация/портирование библиотеки или программы на ~1000 строк
  • Разбиение кода на модули
  • Настройка нескольких целей сборки, тестирование, документация, профилирование, средства рефакторинга
daScript tiny renderer port

Оптимизация

  • Настройки компилятора
  • Возможности по улучшению производительности существующего кода
  • Best practicies от авторов языка и библиотек
  • Возможности векторизации
  • Доступ к особенностям железа (интринсики, инлайн кода на ассемблере)
  • Бенчмарки с различными языками
daScript in imaginery world
daScript - скорость
Устройство интерпретаторов lua-jit и daScript

Особенности сборки под различные платформы

  • win/mac/linux
  • мобильные платформы
  • консоли