omex:nøglen til ekspressionsevaluering
A omdirigeret (Kort til reducerbar udtryk ) er en del af et udtryk på et programmeringssprog, der kan forenkles eller reduceret I henhold til sprogets evalueringsregler . Tænk på det som et underudtryk, der er "moden" til beregning.
I det væsentlige er en Redex det kode, hvor det næste beregningstrin kan ske.
hvordan det relaterer til evaluering:
Evaluering af et udtryk involverer gentagne gange at identificere og reducere Redekser, indtil udtrykket er i en "normal form" - en tilstand, hvor ingen yderligere reduktioner er mulige. Denne normale form repræsenterer det endelige resultat af udtrykket.
Her er en sammenbrud af forbindelsen:
1. Identificer Redex: Evalueringsprocessen starter med at scanne udtrykket for at finde en underekspression, der matcher en kendt reduktionsregel. Dette er Redex.
2. Reducer Redex: Redex er derefter "reduceret" eller "omskrevet" ved hjælp af den tilsvarende reduktionsregel. Dette involverer normalt udskiftning af Redex med et enklere udtryk.
3. Gentag: Processen gentages. Det nye udtryk (efter reduktionen) er kontrolleret for en anden Redex. Dette fortsætter, indtil der ikke findes flere Retexes.
4. Normal form: Det endelige udtryk, der ikke indeholder nogen Redexes, betragtes som resultatet af evalueringen. Det er "værdien" af det originale udtryk.
Eksempler til at illustrere:
1. Lambda Calculus (en simpel beregningsmodel):
* Ekspression: `(λx. x + 1) 5` (dette repræsenterer en funktion, der tilføjer 1 til dens argument, anvendt til værdien 5)
* omdrivex: `(λx. x + 1) 5` i sig selv er Redex. Det er en anvendelse af en Lambda -funktion til et argument.
* Reduktionsregel: Beta-reduktionsreglen (erstatter argumentet for parameteren i funktionskroppen).
* reduktion: `(λx. x + 1) 5` reduceres til` 5 + 1`
* Næste Redex: `5 + 1`
* Reduktionsregel: Derudover.
* reduktion: `5 + 1` reduceres til` 6`
* Normal form: `6` (ikke flere Redexes. Dette er det endelige resultat.)
2. Aritmetisk udtryk:
* Ekspression: `(2 + 3) * 4`
* Redex (under en streng evalueringsordre, som på de fleste sprog): `2 + 3`
* Reduktionsregel: Derudover.
* reduktion: `(2 + 3) * 4 'reduceres til` 5 * 4`
* Næste Redex: `5 * 4`
* Reduktionsregel: Multiplikation.
* reduktion: `5 * 4` reduceres til` 20`
* Normal form: `20`
3. Betinget erklæring (på et hypotetisk sprog):
* Ekspression: `Hvis sandt, så 10 andet 20`
* omdrivex: `Hvis sandt, så 10 andet 20`
* Reduktionsregel: Hvis tilstanden er sand, skal du udskifte hele udtrykket med "derefter" gren.
* reduktion: `Hvis sandt, reduceres 10 ellers 20` til` 10`
* Normal form: `10`
nøglekoncepter relateret til omdirigering:
* Evalueringsstrategi: Den rækkefølge, hvor RedExes vælges til reduktion, påvirker evalueringsprocessen. Almindelige strategier inkluderer:
* Anvendelsesordre (ivrig evaluering): Evaluer argumenterne til en funktion * før * anvender selve funktionen. Dette implementeres ofte med streng evaluering (som mange imperative sprog såsom Java, C ++, Python).
* Normal ordre (doven evaluering): Evaluer argumenterne til en funktion * kun når * deres værdier faktisk er nødvendige. Dette bruges på rent funktionelle sprog som Haskell.
* CALL-by-Name: Udskift det uevaluerede argument direkte i funktionslegemet.
* Opkald til værdi: Evaluer argumentet og videregiver dens værdi til funktionen. Svarende til ansøgningsordre.
* Opkald til behov: I lighed med opkald-for-navn, men meminerer resultatet af den første evaluering, så efterfølgende anvendelser af argumentet ikke kræver reevaluering. Haskell bruger dette.
* sammenløb: En ønskelig egenskab ved et reduktionssystem er, at uanset den rækkefølge, hvor RedExes reduceres, vil den endelige normale form (hvis den findes) være den samme. Dette er kendt som Church-Rosser-sætningen, og det gælder for Lambda Calculus og mange andre formelle systemer.
Hvorfor er Redekser vigtige?
* formel semantik: Regler og reduktionsregler giver en præcis og formel måde at definere semantikken (hvilket betyder) af et programmeringssprog.
* kompilatoroptimering: Kompilatorer kan bruge Redex -identifikation og reduktion til at optimere koden. For eksempel er konstant foldning (evaluering af konstante udtryk på kompileringstidspunktet) en form for Redex -reduktion.
* Teoretisk forståelse: Redexes er grundlæggende for at forstå, hvordan beregningen fungerer på et meget grundlæggende niveau. De er en hjørnesten i mange programmeringssprogsteori -koncepter.
* Ligational ræsonnement: Ræsonnement om programkorrekthed ved at bruge reduktionsregler til at omdanne kode til ækvivalente formularer.
Sammenfattende er begrebet en Redex centralt for at forstå, hvordan udtryk evalueres i programmeringssprog. Det giver en ramme for at definere, implementere og resonnere om beregning. Ved gentagne gange at finde og reducere Redekser kan vi bestemme det endelige resultat af et udtryk.