На что в первую очередь посмотреть при изучении нового языка программирования, на примере daScript, но можно и применительно к другим языкам. Сырой список.
Обзор языка, мотивация
- Кто и зачем делает ещё один язык программирования, какие проблемы он решает
- Какие возможности даёт язык, позволяет ли сочетание этих возможностей потеницально решить какие-либо ещё мои проблемы, кроме декларируемых авторами
- Официальная документация, обзорные статьи, поиск существующих комьюнити
- Лицензия, support
- Планы, роадмап, периодичность обновлений, стабильность ядра языка
- Поддерживаемые платформы и архитектуры, использование бекэндов/фронтэндов (llvm)
daScript - перевод интервью с создателем языка
Чтение кода
- Примеры от авторов, код тестов
- Чтение кода стандартной библиотеки
- Сторонние библиотеки
Практика 1. Простые примеры
- Как хранятся в памяти типы
— работа со значениями/указателями/ссылками
— когда неожиданное дополнительное копирование, когда можно избежать, есть ли быстрые способы настройки/проверки
— особенности преобразования и приведения типов, что можно настроить для своих типов
— базовые типы
— особенности типизации
— настройки мутабельности/чистоты
— Глобальные/статические переменные - Конструкции управления
- Часто используемые фичи языка (ленивость, аннотации, генераторы etc)
- Строки
— какие есть типы для представления строк
— представление в памяти различных типов
— кодировки - Композия типов
— Классы, типы наследования, способы композиции данных
— модули - Стандартные контейнеры/коллекции/последовательности
daScript - мелочи
Практика 2
- Стандартная библиотека
— работы с вводом/выводом, файлами и путями, сетью
— идиомы языка
— асинхронность - потоки, файберы, примитива синхронизации, корутины, асинхронное выполнение кода. Jobque
Файберы, диспетчеры, асинки
- приёмы обработки ошибок
- generic-программирование
- макросы, работа с AST языка
daScript macro - 2
- compile-time вычисления
- способы генерации кода
- rtti, рефлексия — возможности настройки
DSL языка
- форматирование и способы вывода различных типов данных
- json_boost, regexp_boost, decs_boost, opengl_boost
- способы создания своих dsl
Работа с памятью
- Способы аллокации и освобождения памяти
- Принятые паттерны работы с выделением и освобождением памяти, время жизни объектов
— gc
— raii
— опции и настройки компилятора
— способа кастомизации объектов в памяти — кастомная аллокация, выравнивание, способы переопределить расположение данных в памяти
— способы реификации стандартных систем языка в памяти (для изучения стоимости этих фич) — способы наследования, корутины, генераторы, continuations, функторы, замыкания, внутренности контейнеров
Работа с мультимедиа
- рендер, графика, анимация, звук, гуи, работа со стандартными форматами файлов, 3d-математика
- шейдеры, системы материалов, способы реализации эффектов
daScript - live-режим
daScript. SFML, dasBox и semi-transparent render target
daScript. SFML, dasBox и спайны
Отладка
- Особенности обнаружения и сигналов о различных типах ошибок компилятором
- Отладочные контексты
- Профайлер
- Отладчик
- Настройки компилятора для режимов отладки
- Способы работы с тестами
- Возможность настроить язык (уровень проверки ошибок, всякие прагмы -Wall, -pedantic) и расширять язык, диалекты
Среда разработки
- Поддержка интеграции в IDE (подсветка, автодополнение, подсказки, переходы по коду, апи связи с существующими тулзами, language server plugin etc)
- Проверка наличия и качеств собственной среды разработки. Dasbox
- Сочетаемость с инструментами (санитайзеры, профайлеры etc)
- Особенности системы сборки
- Способы сборки (интерпретация, компиляция, транспиляция, настройки vm, jit/aot)
- Линтеры
- Работа с документацией
Встраивание, кросс-языковое взаимодействие
- FFI, вызовы кода на других языках
- Модули расширения языка
- Написание и генерация обёрток для своих и чужих классов и готовых библиотек
- Передача управления между кодом на разных языках
- Настройки встраивания языка в программу
- Возможные архитектуры программы на C++ + daScript (настройка AoT, хот релоадинг, расширение классов C++ на daScript)
- Способы работы со скриптовыми контекстами из C++
- Способы межпроцессного/междуконтекстного взаимодействия
daScript: C++ auto-bindings, assimp
Поддержка паттернов и парадигм программирования
- ECS
- Функциональное программирование
- Особенности ООП
daScript: ООП и всякое
Практика 3
- Реализация/портирование библиотеки или программы на ~1000 строк
- Разбиение кода на модули
- Настройка нескольких целей сборки, тестирование, документация, профилирование, средства рефакторинга
Оптимизация
- Настройки компилятора
- Возможности по улучшению производительности существующего кода
- Best practicies от авторов языка и библиотек
- Возможности векторизации
- Доступ к особенностям железа (интринсики, инлайн кода на ассемблере)
- Бенчмарки с различными языками
daScript - скорость
Устройство интерпретаторов lua-jit и daScript
Особенности сборки под различные платформы
- win/mac/linux
- мобильные платформы
- консоли