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å

Referencer

eksterne links