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

Парадигмы программирования

Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы[1](в частности, на стадии компиляции их исходного кода) либо программ, которые меняют себя во время выполнения (самомодифицирующийся код). Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).

Генерация кода

При этом подходе код программы не пишется вручную, а создаётся автоматически программой-генератором на основе другой программы.

Такой подход приобретает смысл, если при программировании вырабатываются различные дополнительные правила (более высокоуровневые парадигмы, выполнение требований внешних библиотек, стереотипные методы реализации определённых функций и пр.). При этом часть кода (или данных) теряет содержательный смысл и становится лишь механическим выполнением правил. Когда эта часть становится значительной, возникает мысль задавать вручную лишь содержательную часть, а остальное добавлять автоматически. Это и проделывает генератор.

Различаются два принципиально различных вида кодогенерации:

  1. генератор является физически отдельной бинарной программой, не обязательно написанной на целевом языке.
  2. целевой язык является одновременно языком реализации генератора, так что метапрограмма составляет с целевой программой единое целое.

Наиболее распространённым и наглядным примером первого случая являются GUI-построители, где метапрограмма нацелена на пользовательское программирование, позволяя не сведущим в программировании специалистам в области эргономики принимать непосредственное участие в разработке программных продуктов. В этом случае метапрограмма оказывается заведомо намного более сложной, крупной и трудоёмкой в разработке, чем порождаемый ею код, и её разработка оправдывается частотой её использования. Следует отметить, что на практике, как правило[источник не указан 3266 дней] (но не обязательно), такого рода метапрограммы пишутся на императивных языках для использования в императивных же языках, и поставляются в скомпилированном виде. Недостатком этого метода является невозможность повторного использования кода метапрограммы при разработке новых, более сложных метапрограмм.

Другим примером являются генераторы синтаксических и лексических анализаторов, такие как Lex, YACC, ANTLR, bison.

Второй случай представляет собой встраивание языка и реализуется тремя статическими методами c использованием макросредств языка или чистым встраиванием. В этом случае наработки, накопленные в процессе разработки метапрограмм, в дальнейшем могут интенсивно повторно использоваться для разработки новых метапрограмм[2].

Другие примеры:

  • В Perl существует понятие «source filters» («фильтров исходного кода») — метода переработки файлов с исходным кодом перед выполнением, позволяющего полностью менять синтаксис и семантику языка. Одним из известных примеров является модуль Lingua::Romana::Perligata, позволяющий писать код Perl на латыни.[3]
  • В Форт программисту предоставляют встроенные в язык возможности по изменению своего синтаксиса и семантики. Это достигается определением архитектуры виртуальной машины и полным доступом к возможностям изменения её составляющих.

Возможность изменять или дополнять себя во время выполнения превращает программу в виртуальную машину. Хотя такая возможность существовала уже давно на уровне машинных кодов (и активно использовалась, например, при создании полиморфных вирусов), с метапрограммированием обычно связывают перенос подобных технологий в высокоуровневые языки.

Основные методы реализации:

  • Гомоиконность — инструкции по самоидентификации или изменению кода основываются на том же синтаксисе, что и сам код.
  • Интроспекция — представление внутренних структур языка в виде переменных встроенных типов с возможностью доступа к ним из программы (в терминах C++ это будет соответствовать технологиям динамического полиморфизма и динамического приведения типов).
Позволяет во время выполнения просматривать, создавать и изменять определения типов, стек вызовов, обращаться к переменной по имени, получаемому динамически и пр.
  • Пространство имён System.Reflection и тип System.Type в .NET; классы Class, Method, Field в Java; представление пространств имен и определений типов через встроенные типы данных в Python; стандартные встроенные возможности в Форт по доступу к ресурсам виртуальной машины; получение значения и изменение свойств почти любого из объектов в ECMAScript (с оговорками).
  • Интерпретация произвольного кода, представленного в виде строки.
    • Существует естественным образом во множестве интерпретируемых языков (впервые функция eval была реализована в Lisp, а точнее, непосредственно перед ним, ставшим её первым реализованным интерпретатором).
    • Компилятор Tiny C позволяет «на лету» компилировать и исполнять код на языке C, представленный в виде строки символов.
    • Для Форт использования процедуры интерпретации из строки EVALUATE.

В языке Пролог метапрограммирование позволяет автоматизировать разработку и верификацию (проверку свойств) Пролог-программ. Метапрограммы рассматривают программы на Прологе как термы и позволяют анализировать их свойства и взаимоотношения, строить программы для управления другими Пролог-программами[4].

См. также

Примечания

  1. Джонатан Бартлетт, Искусство метапрограммирования, Часть 1: Введение в метапрограммирование. Дата обращения: 4 октября 2012. Архивировано 24 декабря 2013 года.
  2. Paul Hudak. Modular Domain Specific Languages and Tools. — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998. Архивировано 17 октября 2013 года.
  3. Lingua::Romana::Perligata — search.cpan.org
  4. Metakides, G. and Nerode, A. (1998): Principles of logic and logic programming (translation in Romanian). Tehnical Publishing House, Bucharest.

Ссылки

Read other articles:

PSLV-C37Model roket PSLVJenis misiPenempatan 104 satelitOperatorISROSitus webISRO website Properti wahanaWahana antariksaPolar Satellite Launch VehicleJenis wahana antariksaExpendable launch vehicleProdusenISROMassa luncur320.000 kilogram (710.000 pon)Massa muatan1.378 kilogram (3.038 pon) Awal misiTanggal luncur09:28:00, 15 Februari 2017 (2017-02-15T09:28:00) (IST)Roket peluncurPolar Satellite Launch VehicleTempat peluncuranSriharikota Launching RangeKontrakto...

 

American politician A major contributor to this article appears to have a close connection with its subject. It may require cleanup to comply with Wikipedia's content policies, particularly neutral point of view. Please discuss further on the talk page. (January 2023) (Learn how and when to remove this template message) Tom DiNapoli54th Comptroller of New YorkIncumbentAssumed office February 7, 2007GovernorEliot SpitzerDavid PatersonAndrew CuomoKathy HochulPreceded byThomas Sanzillo (Acti...

 

This is a list of airlines which have a current Air Operator Certificate issued by the Afghanistan's Ministry of Transport and Civil Aviation.[1] Scheduled airlines Airline Airline (in Pashto) Image ICAO IATA Callsign Commenced operations Ariana Afghan Airlines د آریانا افغان هوایی شرکت AFG FG ARIANA 1955 Kam Air کام ایر KMF RQ KAMGAR 2003 See also List of airlines List of air carriers banned in the European Union List of defunct airlines of Afghanistan Lis...

The Dawn of the EmpirePoster promosiGenreSejarahDitulis olehLee Hwan-kyungSutradaraJun Sung-hongKim Hyung-ilLee Won-ikPemeranKim Sang-joongJun Hye-jinChoi Jae-sungHong Ri-naKim Min-wooNegara asalKorea SelatanBahasa asliKoreaJmlh. episode94Rilis asliJaringanKBS1Rilis2 Maret 2002 (2002-03-02) –26 Januari 2003 (2003-1-26) Korean nameHangul제국의 아침 Hanja帝國의 아침 Alih AksaraJegug-ui achimMcCune–ReischauerChegugŭi ach'im The Dawn of the Empire (Hangul: ...

 

Obstacles keeping a population from achievement This article is about a metaphor. For more information about the barrier that prevents minorities from reaching the upper rungs of the corporate ladder, see Gender pay gap. A chart illustrating the differences in earnings between men and women of the same educational level (USA 2006) [needs update] Part of a series onDiscrimination Forms Institutional Structural Attributes Age Caste Class Dialect Disability Genetic Hair texture Height La...

 

Territorio di MemelKlaipėdos kraštasMemelland/Memegelbiet Stati Lituania CapoluogoKlaipėda LingueTedescoBasso tedescoLituano Posizione del Territorio di Memel all'interno dell'odierna Lituania Territorio di Memel Coordinate: 55°42′40″N 21°08′50″E / 55.711111°N 21.147222°E55.711111; 21.147222 Col nome di Territorio di Memel (in lituano Klaipėdos kraštas, in tedesco Memelland o Memelgebiet) è stata definita nel periodo 1919-1939 la fascia settentrionale de...

Le pilote Marc Sorel, ici classé à l'Herkomer Konkurrenz 1906 sur Lorraine-Dietrich (vainqueur de Dehli-Bombay et de la Coupe des Pyrénées 1905, recordman du trajet Paris-Nice 1907, toujours avec la marque). Un exemple de voiture actuelle de grande série, la Volkswagen Golf. Une voiture de tourisme (ou voiture de production) est une automobile produite en grande série, à plusieurs milliers d'exemplaires chaque année. Ce genre d'automobiles constitue la plus grosse part des ventes chaq...

 

Insurgency in Malaysia waged by the Malayan Communist Party from 1968 to 1989 Communist insurgency in MalaysiaPart of the Cold War and continuation of the Malayan EmergencySarawak Rangers (present-day part of the Malaysian Rangers) consisting of Ibans leap from a Royal Australian Air Force Bell UH-1 Iroquois helicopter to guard the Malay–Thai border from potential Communist attacks in 1965, three years before the war starting in 1968.Date17 June 1968 – 2 December 1989(21 years, 5...

 

Cycling race 2022 RideLondon Classique2022 UCI Women's World Tour, race 13 of 25Race detailsDates27–29 MayStages3Distance363.4 km (225.8 mi)Winning time9h 10' 02Results Winner  Lorena Wiebes (NED) (Team DSM)  Second  Elisa Balsamo (ITA) (Trek–Segafredo)  Third  Emma Norsgaard (DEN) (Movistar Team) Points  Lorena Wiebes (NED) (Team DSM) Mountains  Anna Henderson (GBR) (Team Jumbo–Visma) Youth  Julia Borgström...

Частина серії проФілософіяLeft to right: Plato, Kant, Nietzsche, Buddha, Confucius, AverroesПлатонКантНіцшеБуддаКонфуційАверроес Філософи Епістемологи Естетики Етики Логіки Метафізики Соціально-політичні філософи Традиції Аналітична Арістотелівська Африканська Близькосхідна іранська Буддій�...

 

حروب فرنسا الدينية جزء من الحروب الدينية في أوروبا تصوير لمذبحة سان بارتيليمي التي قام بها فرانسوا دوبوا معلومات عامة التاريخ مارس 1562 - أبريل 1598 (36 عامًا وشهرًا واحدًا) من أسبابها هوغونوتيون  تسببت في هنري الرابع ملك فرنسا،  ومرسوم نانت  الموقع  فرنسا النتيجة هدن�...

 

British politician (born 1951) The Right Honourable SirJohn RedwoodOfficial portrait, 2020Shadow Secretary of State for DeregulationIn office6 May 2005 – 5 December 2005LeaderMichael HowardPreceded byPosition establishedSucceeded byPosition abolishedShadow Secretary of State for Environment, Transport and the RegionsIn office15 June 1999 – 2 February 2000LeaderWilliam HaguePreceded byGillian ShephardSucceeded byArchie NormanShadow Secretary of State for Trade and Industr...

COVID-19 pandemic in North CarolinaA closed playground in Apex, North Carolina DiseaseCOVID-19Virus strainSARS-CoV-2LocationNorth Carolina, U.S.Index caseWake CountyConfirmed cases423,623Active cases26,228Severe cases2,541Hospitalized cases921 (current)Recovered341,041Deaths5,752Government websiteNC Department of Health and Human Services The COVID-19 pandemic was confirmed to have reached the U.S. state of North Carolina on March 3, 2020.[1] As of May 2021, North Carolina has the 10...

 

42-й Матч всех звёзд НХЛ Дата 19 января 1991 Арена Чикаго-стэдиум Город Чикаго, Иллинойс 123 Итог Кэмпбелл 254 11 Уэльс 122 5 Лучший игрок Венсан Дамфусс Зрителей 18 472 19901992 42-й Матч всех звёзд НХЛ проводился 19 января 1991 года на арене «Чикаго Стадиум», домашней для клуба «Чикаго Блэкхо�...

 

Election for governor of Connecticut For related races, see 1906 United States gubernatorial elections. 1906 Connecticut gubernatorial election ← 1904 November 6, 1906 1908 →   Nominee Rollin S. Woodruff Charles Frederick Thayer Party Republican Democratic Popular vote 88,384 67,776 Percentage 54.83% 42.05% County results Woodruff:      50–60%      60–70% Governor before election Henry Roberts Republican Ele...

Lambang Morbihan Peta Morbihan Morbihan (56) (bahasa Breton: Mor-Bihan) ialah sebuah departemen di Prancis yang terletak di kawasan Bretagne. Sejarah Departemen ini adalah salah satu dari 83 departemen yang diciptakan pada masa Revolusi Prancis, pada 4 Maret 1790 yang telah disahkan secara hukum pada 22 Desember 1789. Geografi Morbihan berbatasan dengan departemen Finistère di barat, Côtes d'Armor di utara, dan Ille et Vilaine di timur. Di bagian selatan terletaklah Samudra Atlantik. Di sin...

 

1939 film by John H. Auer Calling All MarinesTheatrical release posterDirected byJohn H. AuerScreenplay byEarl FeltonStory byHarrison CarterProduced byArmand SchaeferStarringDon Red BarryHelen MackWarren HymerRobert KentCy KendallLeon AmesCinematographyErnest MillerEdited byErnest J. NimsMusic byWilliam LavaProductioncompanyRepublic PicturesDistributed byRepublic PicturesRelease date September 20, 1939 (1939-09-20) Running time67 minutesCountryUnited StatesLanguageEnglish Calli...

 

Pour les articles homonymes, voir Allison. George Allison Biographie Nom George Frederick Allison Nationalité Anglais Naissance 24 octobre 1883 Hurworth-on-Tees (Angleterre) Décès 13 mars 1957 Londres (Angleterre) Parcours senior1 SaisonsClubsM (B.) Arsenal FC Parcours entraîneur AnnéesÉquipe Stats 1934-1947 Arsenal FC 1 Matchs de championnat uniquement. modifier  George Allison, né le 24 octobre 1883 à Hurworth-on-Tees (Angleterre), mort le 13 mars 1957 à Londres (Anglete...

欧洲议会议长欧洲议会标志欧洲旗現任萝伯塔·梅措拉自2022年1月18日在任欧洲议会尊称议长[1]地位议会主持官员所属欧洲议会機關所在地 法國斯特拉斯堡任命者欧洲议会任期两年半,可连任首任保罗-亨利·斯巴克 / 羅伯特·舒曼[2]设立1952年 / 1958年[2]副職欧洲议会副议长网站europarl.europa.eu 本文是歐洲聯盟 歐盟政府与政治系列条目 成員國 (27) 奧地利 比利...

 

Yue Chinese dialect of Guangxi, China This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Luo–Guang Yue – news · newspapers · books · scholar · JSTOR (December 2022) (Learn how and when to remove this message) Luo-Guang Yue羅廣方言Native toPeople's Republic of ChinaRegionGuangdongLanguage familySino-Tibetan SiniticYueL...