ПредишенСледващото

генериране на код за програмиране с помощта на Microsoft.NET платформа

въведение
поколение Code "на челото"
генериране на код за използването на шаблони
генериране на код, използвайки XSLT шаблони
генериране на код, използвайки ASP.NET
генериране на код на различни езици
генериране на код на различни езици, използващи CodeDOM шаблони
генериране на код по време на работа

Алгоритмите за генериране код

Не е тайна, че понякога при програмирането някои задачи трябва да изпълни голяма част от досадна рутинна работа и да се отърве от него чрез редовно средство за освобождение на Палестина се провали. Освен това, ситуацията се влошава и от липсата на основни видове в езиците за .NET.

В рамката на .NET код поколение също се използва доста често. Например, с помощта на генератора на код, базиран на XSD-файла с данни схемата на неуспешните опити са масиви от данни (въведените от масиви от данни), създаване на прокси класове за уеб услуги, използващи генератора на код. По време на работа, генериране на код, за да се подобри ефективността System.Xml.Serialization.XmlSerializer класове, System.Text.RegularExpressions.Regex, System.Web.UI.PageParser.

поколение Code "на челото"

Първото нещо, което обикновено идва на ум -. Е за генериране на код на всеки език за програмиране "директно" Да предположим, че искате по определен набор от качества, описващи генерираните класове. Ние определяме описание под формата на XML файл:

Това описание ще бъде в една от проекта изгражда като ресурс.

Да представлява класовата структура в рамките на програмата ще се създаде набор от класове, които ще работят алгоритъм код поколение. За да се създаде ръчно за представяне само от XML, използвайте клас XmlSerializer.

Класът XmlSerializer е serializer обект за XML. В този случай, за разлика от формата, издаден от SoapFormatter, в този случай формата на XML се поддава на по-обстойна проверка. По-специално, се дава следният пример, даден от атрибута XmlRoot корен етикет на име на атрибут XmlAttribute дадени свойства за съхранение на стойността на атрибут с посоченото име, атрибути и XmlArray XmlArrayItem начин на представяне на масиви и списъци.

И въпреки, че функцията "смисъл" не се е променило, то е станало по-кратък и по-важното е, много по-ясно, когато четете. В случаите, когато много статичен текст, например, в случай на въведени колекции, такъв подход е много по-удобно да на първо място. Въпреки това, в нашия пример, генератор код е доста много ръчен код. Основната причина за това е необходимостта да се извърши ръчно повторения. Би било хубаво, това повторение точка директно в шаблон. Можете, разбира се, напиши съответния макро процесора, но да отидем в другата посока. Ние използваме готови решения.

генериране на код, използвайки XSLT шаблони

Един от готови решения за създаване на шаблони и е част от стандартната W3C XSL - XSL трансформация, съкратено XSLT. Тази технология е предназначена за преобразуване на XML файлове в различна гледна точка и е с много висока степен на гъвкавост.

XSLT е език за програмиране, оптимизиран за правилата за преобразуване на цели ангажиране на. XSLT файл се състои от набор от правила, посочени тагове шаблон. За разлика от класическите езици, XSLT описва превръщането не като последователност от действия, както и набор от правила, които се прилагат към възли на входния XML. Всяко правило съдържа функция логика, предикат, фигуриращ, че можете да се определи дали той е подходящ за текущия възел. В случай на XSLT, за да опише такъв специален езиковите функции, XPath. Ако предиката връща истина, съдържанието на правилата се извършва, който се състои от статичен текст и набор от тагове, наподобяващи синтаксис логически езици - .. Stamp ценности линия състояние, и т.н. В допълнение, маркерът се прилага-шаблони е посочен за вложени продължи обработка на възли. обработка на файла се извършва, като се започне с коренът.

Пълното описание XSLT може да бъде намерена на интернет страницата на World Wide Web Consortium на, www.w3c.org

Всички код генератор готов.

генериране на код на различни езици

Microsoft.NET платформа поддържа програмиране на няколко езика. Ако това е важно не само да се получи крайният резултат, но за да получите изходния код езиците за програмиране raznyz много желани са в подкрепа на различни езици. Въпреки това, примерите, дадени по-горе генераторите, за да добавите езикова поддръжка или се нуждаят от пълно пренаписване, или, най-малкото, пълните модели преустройство. За да се реши този проблем, Microsoft предлага технология CodeDOM.

Процесът на генериране на код използването на тази технология е, както следва. Първо построен дърво генерализирана синтаксиса на език, който след CodeDOM доставчик специфичен език се превръща в оригиналния текст.

Да изпълни код генератор на първия пример за използване на CodeDOM.

Код генератор за Visual Basic.NET ще генерира следния код:

Но това е лесно да се забележи, че точно над например има същия недостатък, с които ние се борихме цялата статия, а именно производството на статични (неизменни) части от кода. За съжаление, тези подходи, които сме свикнали да се преодолее този недостатък, в случай на конфигурация многоезичен вече не е подходяща.

генериране на код на различни езици, използващи CodeDOM шаблони

Ясно е, че в този случай шаблона, за да генерира трябва да се представи като CodeDOM дърво. Единственият въпрос е как да го получи. Можете, разбира се, да се разглоби на изходния код в C # и същ, но такъв език разбор - не е лесно, и не всички проекти на C # могат да бъдат изразени в CodeDOM.

Ето защо, като език за описание на CodeDOM използване шаблон език анализатора готов - XML.

За съжаление, тази статия не може да се реализира на описанието на XML-анализатора CodeDOM с всичките му функции, така че прилагането само частта, която е необходима за изпълнение на един пример. За изпълнение на използването по същия начин, че сме изтеглили необработените данни, което означава, че XmlSerializer. За класовете, които представляват елементи на модела определят абстрактен базов клас:

Тя ще разкажа един виртуален метод, който връща елемента, съответстващ на модела на елемента CodeDom. Пълният сорс кода за класовете, за да се зареждат от XML е включен в компактдиска със списание.

Сега ние прилагаме шаблона. Тъй като входни както и изходни данни са изразени като XML и след това се използва XSLT трансформация.

Използването на подобна техника, е възможно да се приложи много ефективни алгоритми, които са оптимизирани за конкретна информация. Изпълнение на компетентния изпълнението на генериране на код е сравнима с пълен ръчен изпълнение на алгоритми за конкретна информация. Например, deserializing скорост структура XmlSerializer дърво е по същество същата като на потребителя четене на XmlReader и значително (2-3 пъти) по-висока скорост SoapFormatter използване на универсален алгоритъм и механизма на отражение (отражение). Скоростта на ASP.NET, с помощта на генериране на код за сложни алгоритми значително по-високи скорости на ASP, използващи тълкуване.

Въпреки това, има примера и един недостатък, а в някои случаи значително. Съставяне от изходния код - това е един много бавен процес. Може да се отбележи, например, чрез значително закъснение ASPX-зареждане на страницата, когато тя се променя. Но в този случай, има начин - .NET Framework ви позволява да създадете монтаж директно в IL-кодове.

Когато само по време на разтоварването монтаж цялото поколение домейн да се разтоварят от паметта. Ето защо, когато честото регенериране монтаж е по-добре да се създаде отделен домейн и разтоварват този домейн, веднага след като необходимостта от него изчезва.

генериране на код директно в IL-код

За да създадете модули "в движение" механизъм размисъл предоставя набор от опции, идентифицирани в пространството от имена System.Reflection.Emit. Нека се опитаме да генерират класове наведнъж в събранието, като се избягва образуването на изходния код и събират.

заключение

Горните примери показват как да използвате генериране на код за изграждане на най-гъвкави и адаптивни системи без увреждания, използвани езици.

За съжаление, при генериране на код има един сериозен недостатък - в резултат на генериране на код не може да се променя. Наскоро, обаче, на пазара има системи, които могат не само да генерират код от структурата на данните, но също така и за преобразуване на кода обратно към първоначалните данни. Това се постига чрез разбор генерирания код и сравняване на оригиналните структури и дърветата, произтичащи от откриване ръчно се променя, така че по-късно, в следващото поколение, се вземат предвид тези промени. Най-вероятно с харесва на бъдещи системи.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!