Компілятор: Компілятор — це програма, яка перетворює вихідний код (оригінальна мова), написаний однією мовою програмування, на іншу (цільову мову). Компіляція — це процес перекладу з вихідного коду (зазвичай високорівневої мови) на об'єктний код (зазвичай низькорівневу мову або машинну мову), який може виконуватися безпосередньо комп'ютером або віртуальною машиною.
У платформі .NET існують два різні компілятори на різних етапах виконання моделі: один називається компілятором Roslyn, який компілює код C# і VB у асемблеї; Інший називається компілятором RyuJIT, який компілює код IL (проміжна мова) у асемблері у машинний код.
Ця стаття починається з компілятора Roslyn. Нам не потрібно заглиблюватися в те, як це працює, але щоб зрозуміти, як це працює, щоб знати, для чого це можна використовувати.
Спочатку компілятор мови C# писався на C++, а пізніше Microsoft представила новий компілятор, написаний безпосередньо на C#: Roslyn, який є компілятором bootstrap.
Компілятор bootstrap означає, що компілятор певної мови програмування написаний безпосередньо на цій мові. Кожна версія завантажувального компілятора компільується з версією, що передувала їй, але його перша версія має бути компільована компілятором, написаним іншою мовою, наприклад, перша версія Roslyn, скомпільована компілятором, написаним на C++. Багато мов програмування розвиваються і пишуть власні компілятори, використовуючи саму мову, наприклад, C# та Go.
На платформі .NET компілятор Roslyn відповідає за компіляцію коду C# та VB у асемблеї.
Більшість існуючих традиційних компіляторів — це шаблони «чорної скриньки», які конвертують вихідний код у виконувані файли або бібліотечні файли, і ми не маємо способу знати, що відбувається між ними. На відміну від Roslyn, Roslyn дозволяє отримати доступ до кожного етапу процесу компіляції коду через API.
Його робочий механізм базується на конвеєрі, має чотири етапи, кожен з яких є незалежним модулем, і кожен модуль надає відповідний API. Інтегровані середовища розробки (IDE) можуть використовувати ці API для надання зручних інструментів для підвищення ефективності розробки, таких як підсвічування коду, розумні підказки, інструменти рефакторингу, аналіз продуктивності та інше. Крім того, з Roslyn розробники можуть використовувати компілятор як сервіс у своїх програмах.
Використовуйте API, надані Roslyn, для динамічної генерації зразків коду
По-перше, створіть нову бібліотеку ClassLibraryGenerator і створіть проєкт стандартної бібліотеки .NET, орієнтований на бренд netstandard2.0 target framework (TFM). Додайте пакети NuGet Microsoft.CodeAnalysis.Analyzers та Microsoft.CodeAnalysis.CSharp, csproj налаштований таким чином:
Створіть новий C#-файл під назвою TestSourceGenerator.cs, який вказує ваш власний генератор вихідного коду наступним чином:
З контекстного об'єкта ми можемо отримати доступ до скомпільованої точки входу або до основного методу. Екземпляр mainMethod — це IMethodSymbol, який представляє символ методу або подібного методу (включно з конструкторами, деструкторами, операторами або атрибутами/подіями). Метод Microsoft.CodeAnalysis.Compilation.GetEntryPoint повертає IMethodSymbol точки входу програми. Інші методи дозволяють знайти будь-який символ методу у вашому проєкті. У цьому об'єкті можна вивести простір імен (якщо він існує) і тип, який він містить. Джерело в цьому прикладі — це інтерпольований рядок, який шаблонує вихідний код для генерації, а інтерпольовані прогалини заповнюють місткову інформацію про простір імен та тип. Додайте джерело до контексту за допомогою назви запиту. Для цього прикладу конструктор створює новий вихідний файл збірки, який містить реалізацію часткового методу в консольному додатку. Генератор джерел можна написати для додавання будь-якого улюбленого джерела.
Створіть новий консольний додаток ConsoleApp4 (без верхніх операторів) з таким кодом:
Водночас додайте посилання на проєкт ClassLibraryGenerator, наступним чином:
Спробуйте запустити додаток консолі з таким результатом:
У Visual Studio натисніть на проєкт "Dependencies" - > "Analyzer" - > "ClassLibraryGenerator" - > "ClassLibraryGenerator.TestSourceGenerator", двічі клацніть на файл "Program.g.cs", щоб побачити згенерований код, наступним чином:
Оперативне:Модифікація коду конструктора може вимагати перезапуску Visual Studio для його перегляду。
Адреса Roslyn GitHub:Вхід за гіперпосиланням видно.
Посилання:
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно. |