Задания на лабораторную работу:
- Изучить механизм интеропа между языками, попробовать у себя вызывать C/C++ (Не C++/CLI) код (суммы чисел достаточно) из Java и C#. В отчёте описать логику работы, сложности и ограничения этих механизмов.
- Написать немного кода на Scala и F# с использованием уникальных возможностей языка - Pipe operator, Discriminated Union, Computation expressions и т.д. . Вызвать написанный код из обычных соответствующих ООП языков (Java и С#) и посмотреть во что превращается написанный раннее код после декомпиляции в них.
- Написать алгоритм обхода графа (DFS и BFS) на языке Java, собрать в пакет и опубликовать (хоть в Maven, хоть в Gradle, не имеет значения). Использовать в другом проекте на Java/Scala этот пакет. Повторить это с C#/F#. В отчёте написать про алгоритм работы пакетных менеджеров, особенности их работы в C# и Java мирах.
- Изучить инструменты для оценки производительности в C# и Java. Написать несколько алгоритмов сортировок (и взять стандартную) и запустить бенчмарки (в бенчмарках помимо времени выполнения проверить аллокации памяти). В отчёт написать про инструменты для бенчмаркинга, их особености, анализ результатов проверок.
- Используя инструменты dotTrace, dotMemory, всё-что-угодно-хоть-windbg, проанализировать работу написанного кода для бекапов. Необходимо написать сценарий, когда в цикле будет выполняться много запусков, будут создаваться и удаляться точки. Проверить два сценария: с реальной работой с файловой системой и без неё. В отчёте неоходимо проанализировать полученные результаты, сделать вывод о написанном коде. Опционально: предложить варианты по модернизации или написать альтернативную имплементацию.
Опционально:
- Бенчмарк памяти для джавы
Цель: используя инструмент Roslyn API написать программу, которая генерирует HTTP-клиент для сервера написанного на другом языке.
Написать HTTP-сервер, которые предоставляет несколько методов (в качестве примера, можно взять 2-3 лабораторные второго подпотока). Рекомендуемый язык - Java ввиду простоты поднятия и прочего. Можно использовать любой другой (лучше заранее согласовать). Примеры необходимого функционала:
- GET, POST запросы
- Запросы с аргументами в Query, в Body
- Сложные модели с Response (не примитивы, хотя бы классы с полями)
- Аргументы, которые являются коллекциями, респонсы, которые коллекции содержат
Написать упрощённый парсер (на C#) для этого сервера, чтобы можно было получить семантическую модель (можно использовать любые библиотеки для этого), а именно:
- Описание методов из API - url, список аргументов, возвращаемое значение
- Модели, которые используются в реквестах и респонсах
Используя Roslyn API реализовать генерацию HTTP-клиента для данного сервера. Для API должны генерироваться все нужные модели, методы. Можно посмотреть на Swager codegen, примеры его работы и результат его генерации.
На защите нужно продемонстрировать написанные сервер и генератор, генерацию методов и моделей.
- Склонировать шаблон https://github.com/is-tech-y24-1/AnalyzerTemplate и назвать {username}_Analyzer
- В соответствии со своим вариантом выбрать два задания во вкладке Варианты.
- Для каждого задания необходимо реализовать анализатор и кодфиксер с использованием Roslyn.
- Добавить тесты, которые бы отобразили работаспособность анализатора и кодфиксера. Учесть, что тестами для анализатора лучше покрывать как случаи срабатывания, так и случаи, когда не должно срабатывать.
- Для проверки на null использовать конструкции is null и is not null вместо == null и != null
- В сигнатурах свойств и публичных методов использовать IReadOnlyCollection вместо List и Array
Цель: ознакомиться с инструментами и подходами, которые позволяют минимизировать аллокации памяти, расходы на GC. Написать решение, которое было бы оптимальным с точки зрения аллокаций и перфоманса.
- Ознакомьтесь с прикладной областью представленных вариантов, выберите какой-то из них.
- Напишите минимальную реализацию поставленной задачи, опишите решение в первом пункте отчёта.
- Соберите метрики: запустите бенчмарки тех частей алгоритмов, которые кажутся наиболее важными, сохраните результаты.
Протестируйте реализацию в dotTrace и dotMemory, сохраните полученные результаты (лучше их как-то подписать, т.к. их будет много).
Во второй пункт отчёта вставьте полученные результаты, а также дополните анализом: опишите проблемы, которые вы можете видеть на трейсах, предполагаемые причины и возможные фиксы.
- Возьмите один из предложенных вариантов исправлений, которые были получены в пункте 3 и
- реализуйте его,
- соберите повторно метрики,
- сравните.
- Повторите действия из пункта 4. Результаты (как успешные, так и не очень), добавьте в третий пункт отчёта.
Требуется реализовать алгоритм, который по заданным ограничениям будет подбирать оптимальное решение задачи, используя подходы, построенные на генетических алгоритмах.