Abstrakcja metajęzykowa
W informatyce abstrakcja metajęzykowa to proces rozwiązywania złożonych problemów poprzez tworzenie nowego języka lub słownictwa w celu lepszego zrozumienia przestrzeni problemowej. Mówiąc bardziej ogólnie, obejmuje również zdolność lub umiejętność programisty do myślenia poza z góry przyjętymi pojęciami określonego języka w celu odkrywczego zbadania przestrzeni problemowej w poszukiwaniu rozwiązań, które są dla niej najbardziej naturalne lub poznawczo ergonomiczne . Jest to powracający temat w przełomowym podręczniku MIT Structure and Interpretation of Computer Programs , który używa Scheme , dialektu Lispa , jako ramy do konstruowania nowych języków.
Wyjaśnienie
Rozważmy na przykład modelowanie lotniska w komputerze. Lotnisko zawiera elementy takie jak pasażerowie, rezerwacje, pracownicy, budżety, samoloty, bagaż, przyloty i odloty oraz usługi tranzytowe.
Programista proceduralny (np. C ) może tworzyć struktury danych reprezentujące te elementy lotniska oraz procedury lub procedury operujące na tych strukturach danych i aktualizujące je, modelując lotnisko jako serię procesów, jakim poddawane są jego różne elementy. Np. rezerwacje to baza danych używana do synchronizacji pasażerów i samolotów poprzez aktualizacje rejestrowane jako przyloty i odloty, budżety są podobne, ale dla pieniędzy: lotniska to wiele rzeczy, które należy zrobić we właściwej kolejności, aby pasażerowie dotarli tam, gdzie chcą idę.
Programista zorientowany obiektowo (np. Java ) może tworzyć obiekty reprezentujące elementy lotniska za pomocą metod które reprezentują ich zachowania, modelując lotnisko jako zbiór prawdopodobnie powiązanych ze sobą rzeczy, które w charakterystyczny sposób wchodzą ze sobą w interakcje. Np. pasażerowie, pracownicy i samoloty posiadają atrybuty lokalizacji, które można modyfikować za pomocą odpowiednich metod tranzytu: usługi tranzytowe mają metody przywożenia pracowników i pasażerów na lotniska i z nich, samoloty mają metody przewożenia pasażerów ze sobą między różnymi lotniskami: lotniska są grupowanie rzeczy współpracujących zgodnie z przeznaczeniem.
Programista funkcyjny (np. Scheme ) może tworzyć funkcje wyższego rzędu reprezentujące zarówno elementy, jak i zachowania lub procesy lotniska, modelując lotnisko jako mapę relacji między elementami w różnych jego domenach i tych w ich różnych domenach kodowych. Np. porty lotnicze mapują budżety na harmonogramy rezerwacji, z których każdy sam jest mapą elementów na elementy: bilanse dochodów i wydatków oraz bilanse przylotów i odlotów, z których każdy jest rekurencyjnie własnym odwzorowaniem elementów i ich własnymi odwzorowaniami w naturze, łącznie składających się na zestaw morfizmów: porty lotnicze są przejściowo wartościującą transformacją pewnej gospodarki czasoprzestrzennej.
Wreszcie, programista metajęzykowy może streścić problem, tworząc nowe języki specyficzne dla domeny do modelowania lotnisk, z osobliwymi prymitywami i typami do tego celu. Nowy język mógłby obejmować dowolne lub wszystkie z powyższych podejść tam, gdzie jest to najbardziej odpowiednie, potencjalnie umożliwiając programiście zachowanie zarówno abstrakcyjnej ogólności modelu funkcjonalnego, intuicyjnej wrażliwości modelu obiektowego, jak i opartego na szczegółach pragmatyzmu modelu proceduralnego.
Ponieważ tworzenie funkcjonalnych abstrakcji metajęzykowych w językach niefunkcjonalnych może być kłopotliwe, podczas gdy sytuacja odwrotna jest zwykle trywialna (np. generalnie dużo łatwiej jest wziąć abstrakcję programistyczną pozbawioną efektów ubocznych i po prostu dodać do niej efekty niż wziąć stanowa abstrakcja i obejście lub enkapsulacja jej propagacji stanu), a ze względu na elastyczność składniową i bezpieczeństwo referencyjne makr funkcjonalnych , programowanie metajęzykowe jest w większości idiomatyczne dla funkcjonalnych języków programowania.
Zobacz też
- Język specyficzny dla domeny
- Multimodelowanie specyficzne dla domeny
- Programowanie zorientowane na język
- Metakompilator
- metajęzyk
- ^ Struktura i interpretacja programów komputerowych, część 4 — Abstrakcja metajęzykowa