Тип работы:
Предмет:
Язык работы:


Кросс-проектный анализ для генеративных поставщиков типов F#

Работа №140348

Тип работы

Магистерская диссертация

Предмет

программирование

Объем работы33
Год сдачи2022
Стоимость4990 руб.
ПУБЛИКУЕТСЯ ВПЕРВЫЕ
Просмотрено
41
Не подходит работа?

Узнай цену на написание


1. Введение 5
2. Постановка задачи 8
3. Обзор 9
3.1. Поставщики типов 9
3.2. Генеративные поставщики типов 10
3.3. ReSharper PSI 11
3.4. Кросс-языковой анализ в Rider 12
3.5. Изолированный запуск поставщиков типов в Rider 13
4. Архитектура 14
4.1. Кросс-языковой анализ генеративных типов 14
4.2. Генеративные типы в модели ReSharper PSI 15
5. Реализация 17
5.1. Обнаружение созданных поставщиками генеративных типов 17
5.2. Кэш генеративных типов 18
5.3. Представление генеративных типов в ReSharper PSI ... 20
5.4. Алгоритм разрешения генеративных типов 23
5.5. Дополнительная функциональность в IDE 25
6. Тестирование и апробация 27
6.1. Прототип 27
6.2. Написание автоматических тестов 27
6.3. Ручное тестирование с помощью FSharp.Data и
OpenApiProvider 29
6.4. Выводы 30
7. Ограничения 31 


Современные программные системы оперируют большими данными, реализуя сложные задачи по их обработке [8]. Известно, что данные реальных источников, как правило, слабо структурированы, в то время как большинство промышленных языков программирования имеют строгую статическую типизацию. Традиционно для реализации доступа программных систем к внешним данным, таким как веб-сервисы или базы данных, требовалось переписывать вручную или генерировать с помощью специальных инструментов программный код. Однако практика кодогенерации в большинстве случаев считается неприемлемой из- за сложности в понимании и поддержке сгенерированного кода.
Поставщики типов языка F# [6] позволяют упростить получение данных из внешних источников, предоставляя необходимые типы данных «на лету» во время написания кода и компиляции, загружая структуру данных из внешнего описания или схемы. Для программиста поставщик типов представлен в виде подключаемой библиотеки, включающей набор определенных типов, при использовании которых во время написания кода и компиляции генерируются требуемые статические типы данных. Типы, созданные генеративными поставщиками, на этапе компиляции записываются в метаданные сборки, в которой они были объявлены, что позволяет использовать полученные типы во всех .NET- совместимых языках.
Библиотека сервисов компилятора (FSharp.Compiler.Service, FCS) [3] с открытым исходным кодом является частью компилятора языка F# и обеспечивает поддержку этого языка в различных средах разработки. В частности, данная библиотека позволяет пользователю подключать поставщики типов в проекты на F# в качестве обычных NuGet- пакетов и использовать сгенерированные ими типы данных в своем коде.
Совместимость F# с языками и библиотеками .NET, способность справляться со сложностью обработки и анализа больших данных, а также удобства системы типов при проектирования домена приложения предлагают привлекательные возможности для бизнеса даже в тех проектах, где большая часть кодовой базы написана на С#. Современные IDE позволяют из проектов на С# обращаться к коду, написанному на F# - и наоборот, однако использование генеративных поставщиков типов в подобных проектах приводит к проблемам: FCS не анализирует код проектов на С#, а средства анализа С#-кода (такие как Roslyn или ReSharper ) ничего не знают о внутреннем устройстве поставщиков типов из F#. В итоге генеративные типы, как правило, не имеют явных деклараций в коде и, следовательно, недоступны для анализа. Данная проблема приводит к ошибкам анализа кода в редакторе и, как следствие, не позволяет программисту во время написания кода использовать в С#-проектах сгенерированные поставщиками типы. Единственный существующий на данный момент способ обойти проблему заключается в компиляции проекта, содержащего генеративные поставщики типов. После этого средства анализа С#-кода смогут прочитать информацию о типах из метаданных физической сборки, а не из исходного кода проекта. Очевидны проблемы при использовании такого подхода: при малейшем изменении кода, к которому могут обращаться проекты на С#, требуется перекомпиляция проекта с поставщиками типов; между проектами не будет работать базовая функциональность IDE, такая как навигация к декларации символа из проекта с поставщиками типов или его переименование. Данная проблема актуальна и для Rider - одной из популярных IDE для .NET компании JetBrains. Движок ReSharper, на основе которого выполняется анализ кода в Rider, не содержит совместимых со своей моделью кода PSI (Program Structure Interface) представлений для генеративных типов, как это реализовано для остальных элементов языка F#. В то же время, для принудительного считывания сгенерированных поставщиками типов из скомпилированного проекта необходимо дополнительно выгружать его из IDE, что не позволяет одновременно работать над этим проектом вместе с проектами, его использующими. Наличие таких критических неудобств при работе с генеративными поставщиками типов в Rider является главной мотивацией данной работы и требует разработки подсистемы, обеспечивающей честный анализ генеративных поставщиков типов из F# в проектах на C#.

Возникли сложности?

Нужна помощь преподавателя?

Помощь в написании работ!


В рамках данной работы были достигнуты следующие результаты:
• Изучены механизмы статического связывания генеративных поставщиков типов в FCS, исправлены ошибки кэширования генеративных типов в Rider.
• Разработана архитектура подсистемы кросс-языкового анализа генеративных поставщиков типов с учетом механизмов анализа кода и системы типов ReSharper.
• Для Rider реализованы кэш генеративных типов, алгоритмы обнаружения и разрешения созданных поставщиками генеративных типов, а также совместимые с ReSharper PSI представления для генеративных типов, типов-аббревиатур и их содержимого.
• Реализована функциональность навигации к типу-аббревиатуре для генеративных типов и их содержимого, ограничена функциональность переименования содержимого генеративных типов.
• Выполнено тестирование и апробация реализованной подсистемы: написаны автоматические тесты для основных сценариев использования генеративных поставщиков типов в кросс-проектном анализе и произведено ручное тестирование работоспособности на поставщиках типов из библиотек FShar.Data и OpenApiProvider.
В дальнейшем планируется внедрение реализованного в данной работе решения в новую версию Rider и его апробация пользователями в рамках использования в реальных индустриальных проектах.



[1] Auduchinok Evgeniy. Implementation of F# language support in JetBrains Rider IDE.— 2017.— URL: http://se.math.spbu.ru/SE/diploma/2017/pi/Auduchinok.pdf (дата обращения: 14.03.2022).
[2] Berezhnykh Alexey. Hosting F# type providers out-of-process. — 2020.— URL: https://oops.math.spbu.ru/SE/diploma/2020/bmo/Berezhnykh-report.pdf (дата обращения: 14.03.2022).
[3] F#Software Foundation. F# Compiler Services. — 2019. — URL: https://fsharp.github.io/FSharp.Compiler.Service/ (дата обращения: 07.05.2022).
[4] JetBrains. ReSharper Declared Elements.— 2022.— URL:
https://www.jetbrains.com/help/resharper/sdk/PSI/DeclaredElements.html (дата обращения: 14.04.2022).
[5] Microsoft. Учебник. Создание поставщика типов.— 2022.— URL: https://docs.microsoft.com/ru-ru/dotnet/fsharp/tutorials/type-providers/creating-a-type-provider (дата обращения: 06.04.2022).
[6] Syme Don. The Early History of F#.- 2020.- URL: https://fsharp.org/history/hopl-final/hopl-fsharp.pdf (дата обращения: 14.05.2022).
[7] Syme Don. Generative type providers analysis in F# compiler service. — 2022.— URL: https://github.com/dotnet/fsharp/issues/3234#issuecomment-579396231 (дата обращения: 22.05.2022).
[8] Сошников Дмитрий. F# - компромисс между академическим миром и реальной жизнью. — 2013. — URL: http://samag.ru/archive/article/2371 (дата обращения: 07.05.2022).


Работу высылаем на протяжении 30 минут после оплаты.



Подобные работы


©2025 Cервис помощи студентам в выполнении работ