Forbehandler - Preprocessor
Inden for datalogi er en forprocessor (eller forkompiler ) et program, der behandler sine inputdata for at producere output, der bruges som input til et andet program. Output siges at være en forudbehandlet form for inputdata, som ofte bruges af nogle efterfølgende programmer som kompilatorer . Mængden og typen af behandling, der udføres, afhænger af præprocessorens art; nogle præprocessorer er kun i stand til at udføre relativt simple tekstlige udskiftninger og makro udvidelser, mens andre har magt fuldgyldigt programmeringssprog .
Et almindeligt eksempel fra computerprogrammering er den behandling, der udføres på kildekoden før det næste trin i kompilering. På nogle computersprog (f.eks. C og PL/I ) er der en fase af oversættelse, der kaldes forbehandling . Det kan også omfatte makrobehandling, filinddragelse og sprogudvidelser.
Leksikale forbehandlere
Leksikale preprocessorer er det laveste niveau af preprocessorer, da de kun kræver leksikalsk analyse , det vil sige, at de opererer på kildeteksten, før enhver parsing , ved at udføre simpel substitution af tokeniserede tegnsekvenser for andre tokeniserede tegnsekvenser i henhold til brugerdefineret regler. De typisk udføre makro substitution , tekstmæssige inddragelse af andre filer, og betinget kompilering eller inklusion.
C preprocessor
Det mest almindelige eksempel på dette er C -preprocessoren , der tager linjer, der begynder med '#' som direktiver . Fordi det ikke ved noget om det underliggende sprog, er dets anvendelse blevet kritiseret og mange af dets funktioner indbygget direkte i andre sprog. Eksempelvis er makroer erstattet med aggressiv inlining og skabeloner, herunder import af kompileringstid (dette kræver bevarelse af typeoplysninger i objektkoden, hvilket gør denne funktion umulig at eftermontere til et sprog); betinget kompilering opnås effektivt med if-then-elseog eliminering af død kode på nogle sprog. Et vigtigt punkt at huske er imidlertid, at alle forbehandlingsdirektiver skal starte på en ny linje.
Andre leksikale præprocessorer
Andre leksikale præprocessorer omfatter den generelle m4 , der oftest bruges i cross-platform build-systemer, såsom autoconf , og GEMA , en open source-makroprocessor, der fungerer på kontekstmønstre.
Syntaktiske præprocessorer
Syntaktiske forbehandlere blev introduceret med Lisp -familien af sprog. Deres rolle er at transformere syntakstræer i henhold til en række brugerdefinerede regler. For nogle programmeringssprog er reglerne skrevet på det samme sprog som programmet (kompilering af tids-refleksion). Dette er tilfældet med Lisp og OCaml . Nogle andre sprog er afhængige af et fuldt eksternt sprog for at definere transformationerne, f.eks. XSLT -forbehandleren til XML eller dens statisk typede modstykke CDuce .
Syntaktiske præprocessorer bruges typisk til at tilpasse et sprogs syntaks, udvide et sprog ved at tilføje nye primitiver eller integrere et domænespecifikt programmeringssprog (DSL) i et sprog til generelle formål.
Tilpasning af syntaks
Et godt eksempel på syntakstilpasning er eksistensen af to forskellige syntakser i Objective Caml -programmeringssproget. Programmer kan skrives ligegyldigt ved hjælp af "normal syntaks" eller "revideret syntaks" og kan være smukt trykt med enten syntaks efter behov.
På samme måde tilpasser en række programmer skrevet i OCaml sprogets syntaks ved tilføjelse af nye operatører.
Udvidelse af et sprog
De bedste eksempler på sprogudvidelse gennem makroer findes i Lisp -familien af sprog. Mens sprogene i sig selv er simple dynamisk typede funktionelle kerner, tillader standardfordelingerne af Scheme eller Common Lisp imperativ eller objektorienteret programmering samt statisk typning. Næsten alle disse funktioner implementeres ved syntaktisk forbehandling, selvom det er opmærksom på, at "makroudvidelse" -fasen af kompilering håndteres af kompilatoren i Lisp. Dette kan stadig betragtes som en form for forbehandling, da det finder sted før andre faser af kompilering.
Specialiseret et sprog
En af de usædvanlige træk ved Lisp -familien af sprog er muligheden for at bruge makroer til at oprette en intern DSL. Typisk kan et modul i et stort Lisp -baseret projekt skrives i en række forskellige minisprog , en måske ved hjælp af en SQL -baseret dialekt af Lisp , en anden skrevet på en dialekt specialiseret til GUI'er eller smuk udskrivning osv. Almindelig Lisp 's standardbibliotek indeholder et eksempel på dette niveau af syntaktisk abstraktion i form af LOOP-makroen, som implementerer et Algol-lignende minisprog for at beskrive kompleks iteration, mens det stadig muliggør brug af standard Lisp-operatører.
Den MetaOCaml Præprocessoren / sprog leverer tilsvarende funktioner til eksterne DSLs. Denne forprocessor tager beskrivelsen af et sprogs semantik (dvs. en tolk) og ved at kombinere kompileringstidstolkning og kodegenerering gør denne definition til en kompilator til OCaml programmeringssprog-og fra dette sprog, enten til bytecode eller til oprindelig kode.
Generel forbehandling
De fleste forbehandlere er specifikke for en bestemt databehandlingsopgave (f.eks. Kompilering af C -sproget). En forprocessor kan fremmes som et generelt formål , hvilket betyder, at den ikke er rettet mod et specifikt brugs- eller programmeringssprog, og er beregnet til at blive brugt til en lang række tekstbehandlingsopgaver.
M4 er sandsynligvis det mest kendte eksempel på en sådan generel præprocessor, selvom C-forbehandleren undertiden bruges i en ikke-C-specifik rolle. Eksempler:
- ved hjælp af C -forbehandling til JavaScript -forbehandling.
- ved hjælp af C preprocessor til devicetree -behandling inden for Linux -kernen .
- ved hjælp af M4 (se eksempeleksempel) eller C preprocessor som skabelonmotor til HTML- generation.
- imake , en make -grænseflade ved hjælp af C -preprocessoren, skrevet til X Window System, men nu afbrudt til fordel for automake .
- grompp , en preprocessor til simuleringsinputfiler til GROMACS (en hurtig, gratis kildekode til nogle problemer inden for beregningskemi ), der kalder systemet C-preprocessor (eller en anden preprocessor som bestemt af simuleringsinputfilen) for at analysere topologien, hovedsagelig ved hjælp af #define og #include mekanismer til at bestemme den effektive topologi ved grompp -driftstid.
GPP er en leksikalsk preprocessor til generelle formål, der ligner cpp. Den kan blandt andet bruges til forbehandling af markdown -filer.
Se også
- Direktiv (programmering) - Sprogkonstruktion, der angiver, hvordan en kompilator skal behandle sit input
- Metaprogrammering
- Makroer - I datalogi, en kortfattet fremstilling af et mønster
- Kilde-til-kilde-kompilator , også kendt som Transpiler-Oversætter, der tager kildekoden til et program og producerer en tilsvarende kildekode i det samme eller et andet programmeringssprog
- Sass (stylesheet sprog) - Stilark sprog
- Stylus (stylesheet sprog)
- Mindre (stylesheet sprog) - Dynamisk stylesheet sprog
- Uddrag (programmering) -Lille område med genanvendelig kildekode, maskinkode eller tekst
- Skabelonmotor - Software designet til at kombinere skabeloner med en datamodel til fremstilling af resultatdokumenter
- Den C præprocessor - Macro præprocessor bruges i C, C ++, og Objective-C programmeringssprog
- Den OCaml Præprocessoren-pretty-printer
- Den PL / I præprocessoren
- Den Windows-software spor præprocessor
- Makroprocessor til generelle formål -Makroprocessor, der ikke er knyttet til eller integreret med et bestemt sprog eller et stykke software.
Referencer
eksterne links
- DSL Design i Lisp
- Programmering nedefra og op
- Den generiske præprocessor
- Gema, makroprocessoren til generelle formål
- Den PIKT piktc tekst, script, og konfigurationsfil præprocessor
- pyexpander, en pythonbaseret makroprocessor til generelle formål
- minimac, en minimalistisk makroprocessor
- Forberedelse til Java -kommentar