Ohjaustaulukko - Control table
Ohjaustaulukot ovat taulukoita, jotka ohjaavat ohjausvirtaa tai joilla on tärkeä osa ohjelman ohjauksessa. Ohjaustaulukon rakenteesta tai sisällöstä ei ole jäykkiä sääntöjä - sen määrittävä ominaisuus on sen kyky ohjata ohjausvirta jollakin tavalla suorittimen tai tulkin suorittaman "suorituksen" kautta . Tällaisten taulukoiden suunnittelua kutsutaan joskus taulukko-ohjattavaksi suunnitteluksi (vaikka tämä viittaa tyypillisesti koodin luomiseen automaattisesti ulkoisista taulukoista suorien ajo-taulukoiden sijaan). Joissakin tapauksissa ohjaustaulukot voivat olla erityisiä toteutuksia äärelliseen tilaan-koneeseen perustuvaan automaattipohjaiseen ohjelmointiin . Jos ohjaustaulukossa on useita hierarkkisia tasoja, ne voivat käyttäytyä tavalla, joka vastaa UML-tilakoneita
Ohjaustaulukot usein vastaa ehdollista ilmaisuja tai toiminnon viittaukset upotettu niitä yleensä ennakoivat niiden suhteellinen sarake asemaansa yhdistyksen luetteloon . Ohjaustaulukot vähentävät samanlaisten rakenteiden tai ohjelmalausekkeiden ohjelmoinnin tarvetta uudestaan ja uudestaan. Useimpien taulukoiden kaksiulotteisuus tekee niistä helpommin tarkasteltavissa ja päivitettävissä kuin ohjelmakoodin yksiulotteisuus. Joissakin tapauksissa ei-ohjelmoijat voidaan osoittaa ylläpitämään ohjaustaulukoita.
Tyypillinen käyttö
- Syöttöarvojen muuntaminen:
- indeksin , myöhempää haarautuminen tai osoitin haku
- ohjelman nimi, suhteellinen aliohjelman numero, ohjelma etiketti tai ohjelma offset , jotta alter kontrollivuo
- Ohjaamiseksi päävirtapiirin in event-driven ohjelmointi käyttäen ohjaussuure varten tilasiirtymien
- Ohjaamalla ohjelman syklin online-tapahtumien käsittelyn sovelluksia
Edistyneempi käyttö
- Toimii virtuaalisina ohjeina virtuaalikoneelle , jota tulkki käsittelee
- samanlainen kuin tavukoodi - mutta yleensä toiminnoilla, jotka itse taulukon rakenne viittaa
Taulukon rakenne
Taulukoilla voi olla useita ulottuvuuksia, kiinteät tai vaihtelevat pituudet, ja ne ovat yleensä siirrettävissä tietokonealustojen välillä , mikä vaatii vain muutoksen tulkkiin, ei itse algoritmiin - jonka logiikka sisältyy olennaisesti taulukon rakenteeseen ja sisältöön. Taulukon rakenne voi olla samanlainen kuin monikarttainen assosiatiivinen taulukko , jossa data-arvo (tai data-arvojen yhdistelmä) voidaan yhdistää yhteen tai useampaan suoritettavaan toimintoon.
Yksiulotteiset taulukot
Ehkä yksinkertaisimmassa toteutuksessaan ohjaustaulukko voi joskus olla yksiulotteinen taulukko raakatietoarvon suoraan kääntämiseksi vastaavaksi aliohjelman siirtymäksi , indeksiksi tai osoittimeksi käyttämällä raakatietoarvoa joko suoraan taulukon indeksinä tai suorittamalla joitakin aritmeettisia tietoja tiedoista etukäteen. Tämä voidaan saavuttaa vakio ajan (ilman lineaarinen haku tai binäärinen haku käyttäen tyypillistä hakutaulukkoon koskevasta assosiatiivisia array ). Useimmissa arkkitehtuureissa tämä voidaan toteuttaa kahdella tai kolmella koneohjeella - ilman vertailuja tai silmukoita. Tekniikkaa kutsutaan " triviaaliksi hash-funktioksi " tai, kun sitä käytetään erityisesti haarapöytiin, " double dispatch ". Jotta tämä olisi mahdollista, datan kaikkien mahdollisten arvojen alueen on oltava pieni (esim. ASCII- tai EBCDIC-merkkiarvo, jolla on heksadesimaaliluku '00' - 'FF'. Jos todellinen alue taataan pienemmäksi matriisi voidaan katkaista alle 256 tavuun).
Taulukko, jolla käännetään ASCII-raaka-arvot (A, D, M, S) uuteen alirutiini-indeksiin (1,4,3,2) vakiona, käyttäen yksiulotteista taulukkoa
(alueen aukot esitetään tässä esimerkissä "..", mikä tarkoittaa "kaikkia heksadesimaaliarvoja seuraavaan riviin asti". Kaksi ensimmäistä saraketta eivät ole osa taulukkoa)
| ASCII | Hex | Taulukko |
|---|---|---|
| tyhjä | 00 | 00 |
| .. | .. | 00 |
| @ | 40 | 00 |
| A | 41 | 01 |
| .. | .. | 00 |
| D. | 44 | 04 |
| .. | .. | 00 |
| M | 4D | 03 |
| .. | .. | 00 |
| S | 53 | 02 |
In automaatti-ohjelmointi ja pseudoconversational tapahtuman käsittely, jos määrä eri ohjelma toteaa on pieni, "tiheä sekvenssi" säätömuuttuja voidaan käyttää tehokkaasti sanella koko virtaus pääohjelmasilmukasta.
Kahden tavun raakatiedon arvo vaatisi vähintään 65 536 tavun taulukon koon - kaikkien syöttömahdollisuuksien käsittelemiseksi - sallien samalla vain 256 erilaista lähtöarvoa. Tämä suora käännöstekniikka tarjoaa kuitenkin erittäin nopean validoinnin ja muuntamisen (suhteelliseksi) aliohjelmaosoittimeksi, jos heuristiikka yhdessä riittävän nopean muistin kanssa sallii sen käytön.
Haarapöydät
Haara taulukko on yksiulotteinen 'matriisi' vierekkäisten koneen koodi haara / hyppy ohjeet, jotta saadaan aikaan moniraitainen haara on ohjelma merkintä, kun haarautunut jota välittömästi edeltävän, ja indeksoitu haara. Optimoiva kääntäjä tuottaa sen joskus suorittamaan kytkinlausekkeen - edellyttäen, että syöttöalue on pieni ja tiheä, ja siinä on vähän aukkoja (kuten edellisessä taulukkoesimerkissä on luotu) [2] .
Vaikka Ifhaaran ohjeet ovatkin melko pienikokoisia - verrattuna moniin vastaaviin lausekkeisiin -, niillä on silti jonkin verran redundanssia, koska haaran opkoodi ja ehtokoodimaski toistetaan haarasiirtymien rinnalla. Ohjaustaulukot, jotka sisältävät vain ohjelmasiirtymien siirtymät, voidaan rakentaa tämän redundanssin voittamiseksi (ainakin kokoonpanokielillä) ja vaativat kuitenkin vain vähäistä suoritusaikaa yleiskustannuksiin verrattuna tavanomaiseen haarataulukkoon.
Moniulotteiset taulukot
Useammin, valvonta taulukko voidaan ajatella Totuustaulukko tai suoritettavana ( "binary") täytäntöönpano painetun päätöstaulu (tai puu päätöstaulukoiden useilla tasoilla). Ne sisältävät (usein implisiittisiä) ehdotuksia yhdessä yhden tai useamman liittyvän 'toiminnan' kanssa. Nämä toiminnot suoritetaan yleensä yleisillä tai räätälöityillä aliohjelmilla , joita kutsutaan " tulkki " -ohjelmaksi. Tulkki toimii tässä tapauksessa tehokkaasti virtuaalikoneena , joka 'suorittaa' ohjaustaulukon merkinnät ja tarjoaa siten korkeamman abstraktiotason kuin tulkin taustalla oleva koodi.
Ohjaustaulukko voidaan rakentaa samalla tavalla kuin kielestä riippuvainen kytkinlauseke, mutta lisätty mahdollisuus testata tuloarvojen yhdistelmiä (käyttäen loogista tyyliä JA / TAI- ehtoja) ja mahdollisesti kutsua useita aliohjelmia (vain yhden arvojoukon sijasta) ja 'haara' ohjelmatunnisteet). (Kytkinlausekekonstruktio ei välttämättä ole saatavana, tai siinä on hämmentävän erilaiset toteutukset korkean tason kielillä ( HLL ). Ohjaustaulukonseptilla ei ole sisäisiä kieliriippuvuuksia, mutta se voidaan kuitenkin toteuttaa eri tavalla käytettävissä olevien kielien mukaan valitun ohjelmointikielen tietojen määrittelyominaisuudet.)
Taulukon sisältö
Ohjaustaulukko ilmentää olennaisesti tavanomaisen ohjelman " olemusta ", josta on poistettu ohjelmointikielen syntaksin ja alustasta riippuvat komponentit (esim. JOS / SITTEN TEHDÄ .. tiivistetty 'sen muuttujiin (esim. input1), arvoihin (esim.' A ',' S ',' M 'ja' D ') ja alirutiinitunnuksiin (esim.' Lisää ',' vähennä, .. 'tai # 1, # 2, ..). Taulukon rakenne itsessään tarkoittaa tyypillisesti (oletus) loogisia toimintoja - kuten "tasa-arvon testaus", aliohjelman suorittaminen ja "seuraava operaatio" tai oletussekvenssin noudattaminen (sen sijaan, että nämä ilmoitettaisiin nimenomaisesti ohjelmalausekkeissa - tarpeen mukaan) muissa ohjelmointiparadigmoissa ).
Moniulotteinen ohjaustaulukko sisältää yleensä vähintään arvo / toimintapareja ja voi lisäksi sisältää operaattoreita ja tyyppitietoja , kuten syöttö- tai lähtödatan sijainnin, koon ja muodon, onko tietojen muunnos (tai muu ajonaika) käsittelyvivahteita) vaaditaan ennen käsittelyä tai sen jälkeen (ellei sitä jo ole implisiittisesti itse toiminnossa). Taulukko voi sisältää tai ei välttämättä sisältää hakemistoja tai suhteellisia tai absoluuttisia viitteitä yleisiin tai räätälöityihin primitiiveihin tai aliohjelmiin , jotka suoritetaan riippuen muista "rivin" arvoista.
Seuraavassa esitetty taulukko koskee vain tuloa1, koska taulukossa ei ole määritelty mitään erityistä syötettä.
olosuhteet ja toimet, joihin rakenne viittaa
(implisiittinen) JOS = (implisiittinen) suorittaa arvo toiminta arvo toiminta
(Tällä vierekkäisellä arvon ja toiminnan pariliitoksella on yhtäläisyyksiä tapahtumapohjaisen ohjelmoinnin rakenteisiin , nimittäin 'tapahtuman havaitseminen' ja 'tapahtumankäsittely', mutta ilman itse tapahtuman asynkronista luonnetta.)
Ohjaustaulukkoon koodattavien arvojen valikoima riippuu suurelta osin käytetystä tietokoneen kielestä . Kokoonpanokieli tarjoaa laajimman laajuuden tietotyypeille, mukaan lukien (toiminnoille) mahdollisuus suoraan suoritettavaan konekoodiin . Tyypillisesti ohjaustaulukko sisältää arvot jokaiselle mahdolliselle vastaavalle tuloluokalle yhdessä vastaavan osoittimen toiminnan aliohjelmaan. Jotkut kielet väittävät, etteivät ne tue osoittimia (suoraan), mutta voivat silti tukea indeksiä, jota voidaan käyttää edustamaan 'suhteellista aliohjelmalukua' ehdollisen suorituksen suorittamiseksi, jota ohjataan taulukon merkinnässä olevalla arvolla (esim. Käytettäväksi optimoidussa SWITCHissa) lause - suunniteltu ilman aukkoja (ts. monitiehaara ).
Jokaisen sarakkeen yläpuolelle sijoitetut kommentit (tai jopa upotetut tekstidokumentit) voivat tehdä päätöksestäulukon "ihmisen luettavissa" myös sen jälkeen, kun "tiivistyminen" (koodaus) on olennaista (ja silti pitkälti alkuperäisen ohjelmaspesifikaation mukaisesti - varsinkin jos painettu päätöstaulu, luetellaan kukin yksittäinen toiminta, on luotu ennen koodausta alkaa). Taulukkomerkinnät voivat myös sisältää laskureita ajoaikatilastojen keräämiseksi 'lennon aikana' tai myöhempää optimointia varten
Pöydän sijainti
Ohjaustaulukot voivat sijaita staattisessa tallennustilassa, apuvälineessä , kuten tasaisessa tiedostossa tai tietokannassa, tai ne voidaan vaihtoehtoisesti rakentaa osittain tai kokonaan dynaamisesti ohjelman alustushetkellä parametreista (jotka itse voivat olla taulukossa). Parhaan tehokkuuden saavuttamiseksi taulukon tulisi olla muistissa, kun tulkki alkaa käyttää sitä.
Tulkki ja aliohjelmat
Tulkki voidaan kirjoittaa millä tahansa sopivalla ohjelmointikielellä, mukaan lukien korkean tason kieli . Sopivasti suunniteltu yleinen tulkki sekä hyvin valittu joukko yleisiä aliohjelmia (kykenevät käsittelemään yleisimmin esiintyviä primitiivejä ) edellyttäisivät tavanomaista lisäkoodausta vain uusille mukautetuille aliohjelmille (itse ohjaustaulukon määrittelyn lisäksi). Tulkki voi valinnaisesti soveltaa vain joihinkin tarkoin määriteltyihin osiin täydellistä sovellusohjelmaa (kuten pääohjaussilmukka ), eikä muihin, vähemmän ehdollisiin osioihin (kuten ohjelman alustus, lopetus ja niin edelleen).
Tulkin ei tarvitse olla kohtuuttoman monimutkainen, eikä sitä tule tuottaa ohjelmoijalta, jolla on kääntäjän kirjoittajan edistyneet tiedot, ja se voidaan kirjoittaa aivan kuten mikä tahansa muu sovellusohjelma - paitsi että se on yleensä suunniteltu tehokkuutta silmällä pitäen. Sen ensisijainen tehtävä on "suorittaa" taulukon merkinnät joukko "ohjeita". Ohjaustaulukon merkintöjen jäsentämiselle ei tarvitse olla vaatimusta, ja ne on sen vuoksi suunniteltava mahdollisuuksien mukaan 'suoritusvalmiiksi', edellyttäen vain muuttujien "kytkemistä" sopivista sarakkeista jo koottuun yleiseen koodiin. tulkki. Ohjelman ohjeet ovat, teoriassa, äärettömän laajennettavissa ja muodostavat (mahdollisesti mielivaltaista) arvojen taulukon jotka ovat mielekkäitä vain tulkki. Valvonta virtaus tulkin on tavallisesti peräkkäinen käsittely Kunkin taulukon rivin vaan sitä voidaan muunnella erityisten toimia taulukon merkinnät.
Nämä mielivaltaiset arvot voidaan siten suunnitella tehokkuutta silmällä pitäen - valitsemalla arvot, joita voidaan käyttää suorina hakemistoina data- tai toiminto-osoittimille . Erityisestä alustat / kieltä , he voivat olla erityisesti suunniteltu minimoimaan käskytiellä pituudet käyttämällä haara taulukon arvoja tai jopa joissakin tapauksissa, kuten tutkintaryhmän kerääjiä, koostuvat suoraan suoritettavan konekoodia " katkelmia " (tai osoittimet niihin).
Alirutiinit voidaan koodata joko samalla kielellä kuin tulkki itse tai millä tahansa muulla tuetulla ohjelmakielellä (edellyttäen, että on olemassa sopivat kielien väliset puheluyhteysmekanismit). Tulkin ja / tai aliohjelmien kielen valinta riippuu yleensä siitä, kuinka siirrettävän sen on oltava eri alustoilla . Tulkista voi olla useita versioita ohjaustaulukon siirrettävyyden parantamiseksi. Alisteinen ohjaustaulukon osoitin voi valinnaisesti korvata aliohjelman osoittimen "action" -sarakkeissa, jos tulkki tukee tätä rakennetta, mikä edustaa ehdollista "pudotusta" alemmalle loogiselle tasolle, matkimalla tavanomaista jäsennettyä ohjelmarakennetta .
Suorituskykyä koskevat näkökohdat
Ensi silmäyksellä ohjaustaulukoiden käyttö näyttäisi lisäävän melko paljon ohjelman yleiskustannuksia , mikä vaatii tulkkiprosessia, ennen kuin "alkuperäisen" ohjelmointikielen käskyt suoritetaan. Näin ei kuitenkaan aina ole. Erottamalla (tai "kapseloimalla") suoritettava koodaus logiikasta, kuten taulukossa on esitetty, se voidaan kohdistaa helpommin suorittamaan tehtävänsä tehokkaimmin. Tämä voidaan kokea ilmeisimmin taulukkolaskentaohjelmassa - missä taustalla oleva taulukkolaskentaohjelmisto muuntaa läpinäkyvästi monimutkaiset loogiset 'kaavat' tehokkaimmalla mahdollisella tavalla, jotta tulokset voidaan näyttää.
Seuraavat esimerkit on valittu osittain havainnollistamaan potentiaalisia suorituskyvyn parannuksia, jotka voivat paitsi kompensoida merkittävästi lisätaitotasoa, mutta myös parantaa vähemmän tehokasta, vähemmän ylläpidettävää ja pidempää koodia. Vaikka esitetyt esimerkit koskevat 'matalan tason' kokoonpanokieliä ja C-kieltä , voidaan molemmissa tapauksissa nähdä, että ohjaustaulukkoa koskevan lähestymistavan toteuttamiseksi tarvitaan hyvin vähän koodiriviä ja että ne voivat kuitenkin saavuttaa erittäin merkittävän vakioajan suorituskyvyn parannuksia, vähentää toistuvia lähde koodaus ja selventävät, verrattuna monisanainen tavanomaisia ohjelmia kielen ominaisuuksia. Katso myös lainaukset by Donald Knuth , jotka koskevat taulukoita ja tehokkuutta multiway haarautuvan tässä artikkelissa.
Esimerkkejä ohjaustaulukoista
Seuraavat esimerkit ovat mielivaltaisia (ja perustuvat vain yhteen syötteeseen yksinkertaisuuden vuoksi), mutta tarkoituksena on kuitenkin vain osoittaa, kuinka ohjausvirta voidaan toteuttaa käyttämällä taulukoita säännöllisten ohjelmalausekkeiden sijaan. On oltava selvää, että tätä tekniikkaa voidaan helposti laajentaa käsittelemään useita syötteitä joko lisäämällä sarakkeiden määrää tai käyttämällä useita taulukon merkintöjä (valinnaisen ja / tai operaattorin kanssa). Vastaavasti käyttämällä (hierarkkisia) linkitettyjä ohjaustaulukoita voidaan toteuttaa jäsennelty ohjelmointi (vaihtoehtoisesti sisennyksen avulla korostamaan alemman tason ohjaustaulukoita).
"CT1" on esimerkki ohjaustaulusta, joka on yksinkertainen hakutaulukko . Ensimmäinen sarake edustaa tulon arvo testataan (mukaan hiljaista 'IF input1 = x') ja, jos TOSI, joka vastaa 2 sarakkeessa (jäljempänä 'tapahtuma') sisältää aliohjelma osoite suorittaa, jonka puhelu (tai hypätä ja - samanlainen kuin SWITCH- käsky). Se on itse asiassa monitievä haara, jolla on paluu (" dynaamisen lähetyksen " muoto). Viimeinen merkintä on oletustapaus, jossa vastaavuutta ei löydy.
CT1
tulo 1 osoitin A -> Lisää S -> Vähennä M -> Kerro D. -> Jaa ? -> Oletus
Jos ohjelmointikieli tukee tietorakenteissa olevia osoittimia muiden data-arvojen rinnalla, yllä olevaa taulukkoa (CT1) voidaan käyttää ohjaamaan virtaus sopiviin aliohjelmiin taulukon vastaavan arvon mukaan (ilman saraketta, joka osoittaisi toisin, tasa-arvo oletetaan tämä yksinkertainen tapaus).
Konekielellä esimerkiksi varten IBM / 360 (maksimi 16 Mt-osoitteet) tai Z / Arkkitehtuuri
Tämän ensimmäisen esimerkin koodauksen hakua ei yritetä optimoida, ja se käyttää sen sijaan yksinkertaista lineaarista hakutekniikkaa - pelkästään havainnollistamaan konseptia ja osoittamaan vähemmän lähdeviivoja. Kaikkien 256 eri syöttöarvon käsittelemiseksi tarvitaan noin 265 lähdekoodiriviä (lähinnä yhden rivin taulukon merkinnät), kun taas useita vertailua ja haarautumista olisi yleensä tarvittu noin 512 lähdekoodiriville ( binäärikoko on myös noin puolittunut, jokainen taulukon merkintä vaatii vain 4 tavua noin 8 tavun sijasta sarjaan vertaile välitöntä / haara -ohjetta (Suuremmille syötemuuttujille säästö on vielä suurempi).
* ------------------ interpreter --------------------------------------------*
LM R14,R0,=A(4,CT1,N) Set R14=4, R15 --> table, and R0 =no. of entries in table (N)
TRY CLC INPUT1,0(R15) ********* Found value in table entry ?
BE ACTION * loop * YES, Load register pointer to sub-routine from table
AR R15,R14 * * NO, Point to next entry in CT1 by adding R14 (=4)
BCT R0,TRY ********* Back until count exhausted, then drop through
. default action ... none of the values in table match, do something else
LA R15,4(R15) point to default entry (beyond table end)
ACTION L R15,0(R15) get pointer into R15,from where R15 points
BALR R14,R15 Perform the sub-routine ("CALL" and return)
B END go terminate this program
* ------------------ control table -----------------------------------------*
* | this column of allowable EBCDIC or ASCII values is tested '=' against variable 'input1'
* | | this column is the 3-byte address of the appropriate subroutine
* v v
CT1 DC C'A',AL3(ADD) START of Control Table (4 byte entry length)
DC C'S',AL3(SUBTRACT)
DC C'M',AL3(MULTIPLY)
DC C'D',AL3(DIVIDE)
N EQU (*-CT1)/4 number of valid entries in table (total length / entry length)
DC C'?',AL3(DEFAULT) default entry – used on drop through to catch all
INPUT1 DS C input variable is in this variable
* ------------------ sub-routines ------------------------------------------*
ADD CSECT sub-routine #1 (shown as separate CSECT here but might
. alternatively be in-line code)
. instruction(s) to add
BR R14 return
SUBTRACT CSECT sub-routine #2
. instruction(s) to subtract
BR R14 return
. etc..
parantamalla tulkin suorituskykyä yllä olevassa esimerkissä
- Jos haluat tehdä valinnan yllä olevassa esimerkissä, keskimääräinen komentopolun pituus (lukuun ottamatta aliohjelmakoodia) on '4n / 2 +3', mutta se voidaan helposti vähentää, missä n = 1-64, vakioksi ajaksi polun pituudella '5: stä nolla vertailua , jos ensin käytetään 256 tavun kääntotaulukkoa luomaan suora indeksi CT1: een EBCDIC-raakatiedoista. Jos n = 6, tämä vastaisi sitten vain kolmea peräkkäistä vertailu- ja haaroitusohjetta. Kuitenkin, kun n <= 64, se tarvitsee keskimäärin noin 13 kertaa vähemmän ohjeita kuin useiden vertailujen käyttö. Jos n = 1 - 256, se käyttäisi keskimäärin noin 42 kertaa vähemmän käskyjä - koska tässä tapauksessa tarvitaan yksi lisäohje (indeksin kertominen 4: llä).
Parannettu tulkki (jopa 26 kertaa vähemmän suoritettuja ohjeita kuin keskimäärin edellisessä esimerkissä, jossa n = 1-64 ja jopa 13 kertaa vähemmän kuin mitä tarvittaisiin käyttämällä useita vertailuja).
64 erilaisen syöttöarvon käsittelemiseksi tarvitaan noin 85 riviä lähdekoodia (tai vähemmän) (lähinnä yhden rivin taulukon merkinnät), kun taas useat vertailut ja haarat vaativat noin 128 riviä ( binäärikoko on myös melkein puolittunut - huolimatta 256 tavun ylimääräinen taulukko, jota tarvitaan toisen indeksin purkamiseen).
* ------------------ interpreter --------------------------------------------*
SR R14,R14 ********* Set R14=0
CALC IC R14,INPUT1 * calc * put EBCDIC byte into lo order bits (24–31) of R14
IC R14,CT1X(R14) * * use EBCDIC value as index on table 'CT1X' to get new index
FOUND L R15,CT1(R14) ********* get pointer to subroutine using index (0,4, 8 etc.)
BALR R14,R15 Perform the sub-routine ("CALL" and return or Default)
B END go terminate this program
* --------------- additional translate table (EBCDIC --> pointer table INDEX) 256 bytes----*
CT1X DC 12AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) 12 identical sets of 16 bytes of x'00
* representing X'00 – x'BF'
DC AL1(00,04,00,00,16,00,00,00,00,00,00,00,00,00,00,00) ..x'C0' – X'CF'
DC AL1(00,00,00,00,12,00,00,00,00,00,00,00,00,00,00,00) ..x'D0' – X'DF'
DC AL1(00,00,08,00,00,00,00,00,00,00,00,00,00,00,00,00) ..x'E0' – X'EF'
DC AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) ..x'F0' – X'FF'
* the assembler can be used to automatically calculate the index values and make the values more user friendly
* (for e.g. '04' could be replaced with the symbolic expression 'PADD-CT1' in table CT1X above)
* modified CT1 (added a default action when index = 00, single dimension, full 31 bit address)
CT1 DC A(DEFAULT) index =00 START of Control Table (4 byte address constants)
PADD DC A(ADD) =04
PSUB DC A(SUBTRACT) =08
PMUL DC A(MULTIPLY) =12
PDIV DC A(DIVIDE) =16
* the rest of the code remains the same as first example
Parempi tulkki (jopa 21 kertaa vähemmän suoritettuja käskyjä (missä n> = 64) kuin ensimmäisessä esimerkissä keskimäärin ja jopa 42 kertaa vähemmän kuin mitä tarvittaisiin käyttämällä useita vertailuja).
256 eri syöttöarvon käsitteleminen, noin 280 riviä lähdekoodia tai vähemmän, vaaditaan (lähinnä yhden rivin taulukkomerkinnät), kun taas useat vertailut ja haarat vaativat noin 512 riviä (myös binäärikoko puolittuu kerran lisää).
* ------------------ interpreter --------------------------------------------*
SR R14,R14 ********* Set R14=0
CALC IC R14,INPUT1 * calc * put EBCDIC byte into lo order bits (24–31) of R14
IC R14,CT1X(R14) * * use EBCDIC value as index on table 'CT1X' to get new index
SLL R14,2 * * multiply index by 4 (additional instruction)
FOUND L R15,CT1(R14) ********* get pointer to subroutine using index (0,4, 8 etc.)
BALR R14,R15 Perform the sub-routine ("CALL" and return or Default)
B END go terminate this program
* --------------- additional translate table (EBCDIC --> pointer table INDEX) 256 bytes----*
CT1X DC 12AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) 12 identical sets of 16 bytes of x'00'
* representing X'00 – x'BF'
DC AL1(00,01,00,00,04,00,00,00,00,00,00,00,00,00,00,00) ..x'C0' – X'CF'
DC AL1(00,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00) ..x'D0' – X'DF'
DC AL1(00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00) ..x'E0' – X'EF'
DC AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) ..x'F0' – X'FF'
* the assembler can be used to automatically calculate the index values and make the values more user friendly
* (for e.g. '01' could be replaced with the symbolic expression 'PADD-CT1/4' in table CT1X above)
* modified CT1 (index now based on 0,1,2,3,4 not 0,4,8,12,16 to allow all 256 variations)
CT1 DC A(DEFAULT) index =00 START of Control Table (4 byte address constants)
PADD DC A(ADD) =01
PSUB DC A(SUBTRACT) =02
PMUL DC A(MULTIPLY) =03
PDIV DC A(DIVIDE) =04
* the rest of the code remains the same as the 2nd example
C-kieli- esimerkki Tämä esimerkki C: stä käyttää kahta taulukkoa, joista ensimmäinen (CT1) on yksinkertainen lineaarinen haun yksiulotteinen hakutaulukko - indeksin saamiseksi ottamalla sisäänsyöttö (x) ja toinen liitetty taulukko (CT1p) on taulukko osoitetiedoista, joihin voit siirtyä.
static const char CT1[] = { "A", "S", "M", "D" }; /* permitted input values */
static const void *CT1p[] = { &&Add, &&Subtract, &&Multiply, &&Divide, &&Default}; /* labels to goto & default*/
for (int i = 0; i < sizeof(CT1); i++) /* loop thru ASCII values */
{if (x==CT1[i]) goto *CT1p[i]; } /* found --> appropriate label */
goto *CT1p[i+1]; /* not found --> default label */
Tämä voidaan tehdä tehokkaammaksi, jos 256 tavun taulukkoa käytetään kääntämään raaka ASCII-arvo (x) suoraan tiheäksi peräkkäiseksi indeksiarvoksi käytettäväksi haaraosoitteen löytämisessä suoraan CT1p: stä (ts. " Indeksikartoitus " tavunlaajuisesti taulukko). Sitten se suorittaa vakiona kaikki x: n mahdolliset arvot (jos CT1p sisälsi funktioiden nimet tarrojen sijasta, hyppy voidaan korvata dynaamisella funktiokutsulla, joka eliminoi kytkimen kaltaisen toiminnan - mutta heikentää suorituskykyä lisäkustannuksilla toiminnallinen siivous ).
static const void *CT1p[] = {&&Default, &&Add, &&Subtract, &&Multiply, &&Divide};
/* the 256 byte table, below, holds values (1,2,3,4), in corresponding ASCII positions (A,S,M,D), all others set to 0x00 */
static const char CT1x[]={
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x01', '\x00', '\x00', '\x04', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x03', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x02', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x03', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'};
/* the following code will execute in constant time, irrespective of the value of the input character (x) */
i = CT1x(x); /* extract the correct subroutine index from table CT1x using its ASCII value as an index initially */
goto *CT1p[i]; /* goto (Switch to) the label corresponding to the index (0=default, 1=Add, 2=Subtract,.) - see CT1p */
Seuraava esimerkki kuvaa, kuinka samanlainen vaikutus voidaan saavuttaa kieliä, jotka eivät ole tue osoitin määritelmien tietorakenteita, mutta eivät tuki indeksoitu haarautumisen aliohjelmaan -, joka sisältyy ( 0-pohjainen ) joukko aliohjelma osoittimia. Taulukkoa (CT2) käytetään indeksin purkamiseen (toisesta sarakkeesta) osoitinryhmään (CT2P). Jos osoitinmatriiseja ei tueta, SWITCH-käskyä tai vastaavaa voidaan käyttää muuttamaan ohjausvirta ohjelmakoodien sarjaksi (esim. Tapaus0, tapaus1, tapaus2, tapaus3, tapaus4), jotka sitten joko käsittelevät syötteen suoraan tai muuten soita (paluu) sopivaan alirutiiniin (oletus, Lisää, vähennä, kerro tai jaa, ..) käsittelemään sitä.
CT2
tulo 1 subr # A 1 S 2 M 3 D. 4 ? 0
Kuten yllä olevissa esimerkeissä, on mahdollista muuntaa erittäin tehokkaasti potentiaaliset ASCII- tuloarvot (A, S, M, D tai tuntematon) osoitinryhmäindeksiin ilman, että tosiasiallisesti käytetään taulukkohakua, mutta se on tässä esitetty taulukkona yhdenmukaisuuden kanssa ensimmäinen esimerkki.
- CT2P osoitin array
Moniulotteisia ohjaustaulukoita voidaan rakentaa (ts. Räätälöidä), jotka voivat olla "monimutkaisempia" kuin yllä olevat esimerkit, jotka saattavat testata useita ehtoja useilla tuloilla tai suorittaa useamman kuin yhden "toiminnon" joidenkin yhteensopivuuskriteerien perusteella. 'Toiminto' voi sisältää osoittimen toiseen alisteiseen ohjaustaulukkoon. Alla olevassa yksinkertaisessa esimerkissä implisiittinen TAI-ehto on sisällytetty ylimääräiseksi sarakkeeksi (pienten kirjainten käsittelemiseksi, mutta tässä tapauksessa tämä olisi voitu hoitaa myös yksinkertaisesti siten, että jokaiselle pienelle kirjaimelle on lisämerkintä, joka määrittää sama aliohjelman tunniste kuin isoilla kirjaimilla). Mukana on myös ylimääräinen sarake, joka laskee kunkin syötteen todelliset ajoaikaiset tapahtumat niiden tapahtuessa.
CT3
tulo 1 vuorotellen subr # Kreivi A a 1 0 S s 2 0 M m 3 0 D. d 4 0 ? ? 0 0
Ohjaustaulukon merkinnät ovat tällöin paljon samanlaisia kuin ehdolliset lauseet menettelykielillä, mutta ratkaisevasti ilman, että todellisia (kielestä riippuvia) ehdollisia lauseita (eli käskyjä) on läsnä (yleinen koodi on fyysisesti tulkissa, joka käsittelee taulukon merkintöjä, ei itse taulukossa - joka yksinkertaisesti ilmentää ohjelmalogiikkaa sen rakenteen ja arvojen kautta).
Tällaisissa taulukoissa, joissa samanlaisten taulukkomerkintöjen sarja määrittelee koko logiikan, taulukon merkinnän numero tai osoitin voi tosiasiallisesti korvata ohjelmalaskurin sijainnin tavanomaisemmissa ohjelmissa ja se voidaan nollata myös toiminnossa, joka on määritelty myös kohdassa taulukon merkintä. Alla oleva esimerkki (CT4) osoittaa, kuinka edellisen taulukon laajentaminen 'seuraavan' merkinnän sisällyttämiseksi (ja / tai 'alter flow' ( hypätä ) aliohjelman sisällyttäminen) voi luoda silmukan (Tämä esimerkki ei todellakaan ole tehokkain tapa rakenna tällainen ohjaustaulukko, mutta osoittamalla asteittaisen 'evoluution' yllä olevista ensimmäisistä esimerkeistä, osoittaa kuinka lisäsarakkeita voidaan käyttää käyttäytymisen muuttamiseen.) Viides sarake osoittaa, että useampi kuin yksi toiminto voidaan aloittaa yhdellä taulukon merkinnällä - tässä tapauksessa suoritettavan toiminnon jälkeen normaalin käsittelyn kukin merkintä ( '-' arvot keskimääräinen 'ei olosuhteet' tai 'ei toimintaa').
Rakenteinen ohjelmointi tai "Goto-less" -koodi (joka sisältää vastaavanlaisen DO WHILE- tai " for loop " -rakenteita) voidaan myös sijoittaa sopivasti suunniteltujen ja "sisennyttyjen" ohjaustaulukorakenteiden kanssa.
CT4 (täydellinen 'ohjelma' tulon1 ja prosessin lukemiseen, toistetaan, kunnes 'E' havaitaan)
tulo 1 vuorotellen subr # Kreivi hypätä - - 5 0 - E e 7 0 - A a 1 0 - S s 2 0 - M m 3 0 - D. d 4 0 - ? ? 0 0 - - - 6 0 1
- CT4P osoitin array
Taulukko-ohjattava luokitus
Televiestinnän luokittelun erikoisalalla (joka koskee tietyn puhelun hinnan määrittämistä) taulukko-ohjattavat luokitustekniikat kuvaavat ohjaustaulukoiden käyttöä sovelluksissa, joissa säännöt voivat muuttua usein markkinavoimien vuoksi. Muut kuin ohjelmoijat voivat muuttaa maksuja määrittäviä taulukoita lyhyellä varoitusajalla.
Jos algoritmeja ei ole valmiiksi rakennettu tulkkiin (ja vaativat siksi taulukossa olevan lausekkeen ylimääräistä ajonaikaista tulkintaa), se tunnetaan nimellä "Sääntöpohjainen luokitus" eikä taulukkopohjainen luokitus (ja kuluttaa siten huomattavasti enemmän yleiskustannuksia) ).
Laskentataulukot
Laskentataulukon tiedot voidaan ajatella kaksiulotteinen ohjaus taulukko, jossa ei tyhjät solut edustavat tiedot alla olevaan taulukkolaskentaohjelmaan (tulkki). Kaavan sisältävät solut on yleensä etuliitetty yhtäläisyysmerkillä, ja ne yksinkertaisesti nimeävät erityistyyppisen tietojen syötteen, joka sanelee muiden viitattujen solujen prosessoinnin muuttamalla tulkin sisäistä ohjausvirtaa. Kaavojen ulkoistaminen taustalla olevasta tulkista tunnistaa selvästi molemmat laskentataulukot ja yllä mainitun "sääntöpohjaisen luokituksen" esimerkin helposti tunnistettavissa olevina tapauksina, kun muut kuin ohjelmoijat käyttävät ohjaustaulukoita.
Ohjelmointiparadigma
Jos ohjaustaulukotekniikan voidaan sanoa kuuluvan johonkin tiettyyn ohjelmointiparadigmaan , lähin analogia saattaa olla automaattipohjainen ohjelmointi tai "heijastava" ( metaprogrammin muoto), koska taulukon merkintöjen voidaan sanoa 'muuttavan' tulkki). Tulkki itse ja alirutiinit voidaan kuitenkin ohjelmoida käyttämällä mitä tahansa käytettävissä olevista paradigmista tai jopa seosta. Taulukko itsessään voi olennaisesti olla kokoelma " raakatiedot " -arvoja, joita ei edes tarvitse koota ja jotka voidaan lukea ulkoisesta lähteestä (lukuun ottamatta erityisiä, alustasta riippuvia toteutuksia, jotka käyttävät suoraan muistiosoittimia paremman tehokkuuden saavuttamiseksi).
Analogia tavukoodiin / virtuaalikoneen käskyjoukkoon
Moniulotteisella ohjaustaulukolla on joitain käsitteellisiä yhtäläisyyksiä virtuaalikoneessa toimivien tavujen koodeihin , koska todellisen suorituksen suorittamiseen tarvitaan yleensä alustasta riippuvainen "tulkki" -ohjelma (joka on suurelta osin ehdollisesti määritelty taulukoiden sisällön mukaan). On myös joitain käsitteellisiä yhtäläisyyksiä viimeaikaisen Common Intermediate Language (CIL) -kielen kanssa tavoitteena luoda yhteinen välitasoinen 'ohjeisto', joka on riippumaton alustasta (mutta toisin kuin CIL, ei mitään väitteitä käytettäväksi yhteisenä resurssina muille kielille) . P-koodia voidaan myös pitää samanlaisena, mutta aikaisempana toteutuksena, jonka alkuperä on peräisin jo vuonna 1966.
Ohjehaku
Kun moniulotteista ohjaustaulukkoa käytetään ohjelmavirran määrittämiseen, normaalia "laitteisto" ohjelmalaskuritoimintoa simuloidaan tehokkaasti joko osoittimella ensimmäiseen (tai seuraavaan) taulukon merkintään tai muuten siihen hakemistoon . Komennon "noutaminen" käsittää kyseisen taulukon merkinnän tietojen dekoodaamisen - välttämättä kopioimalla ensin kaikkia tietoja tai osan niistä. Ohjelmointikielillä, jotka pystyvät käyttämään osoittimia, on kaksi etua, että vähemmän yleiskustannuksia aiheutuu sekä sisällön saannista että myös laskurin edistämisestä osoittamaan seuraavaan taulukon merkintään suorituksen jälkeen. Seuraava 'käsky' -osoitteen (eli taulukon merkinnän) laskeminen voidaan suorittaa jopa jokaisen yksittäisen taulukon merkinnän valinnaisena lisätoimintona, joka sallii silmukoiden ja / tai hyppykäskyjen missä tahansa vaiheessa.
Valvontataulukon suorituksen seuranta
Tulkkiohjelma voi valinnaisesti tallentaa ohjelmalaskurin (ja muut asiaankuuluvat yksityiskohdat käskytyypistä riippuen) kussakin vaiheessa tallentaakseen täydellisen tai osittaisen jäljen todellisesta ohjelmavirrasta virheenkorjausta , hot spot -havaintoa, koodin peittoanalyysiä ja suorituskykyanalyysiä varten (katso esimerkkejä CT3 ja CT4 yllä).
Edut
- selkeys - Tiedotus taulukot ovat läsnä kaikkialla ja enimmäkseen luontaisesti ymmärtänyt edes jota yleisö (erityisesti vianmääritystarkoituksia taulukot tuoteoppaita )
- siirrettävyys - voidaan suunnitella 100% kielestä riippumattomaksi (ja alustasta riippumattomaksi - paitsi tulkki)
- joustavuus - kyky suorittaa joko primitiivit tai aliohjelmat läpinäkyvästi ja räätälöidä ongelman mukaan
- kompakti - taulukko näyttää yleensä ehtojen / toimintojen pariliitoksen vierekkäin (ilman tavallisia alustan / kielen toteutusriippuvuuksia), mikä johtaa usein myös
- binaaritiedosto - kokoa pienennetään vähentämällä ohjeiden kopiointia
- lähdetiedosto - pienennetään poistamalla useita ehdollisia lauseita
- parannettu ohjelman lataus (tai lataus) nopeus
- ylläpidettävyys - taulukot vähentävät usein ylläpidettävien lähdelinjojen määrää v. useita vertailuja
- viittauksen sijainti - kompaktit taulukkorakenteet johtavat siihen, että taulukot jäävät välimuistiin
- koodin uudelleenkäyttö - "tulkki" on yleensä uudelleenkäytettävä. Usein se voidaan helposti mukauttaa uusiin ohjelmointitehtäviin täsmälleen samaa tekniikkaa käyttäen ja se voi kasvaa "orgaanisesti", jolloin siitä tulee käytännössä testattujen ja testattujen alirutiinien standardikirjasto , jota ohjaavat taulukon määritelmät.
- tehokkuus - mahdollinen järjestelmänlaajuinen optimointi. Mikä tahansa tulkin suorituskyvyn parantaminen parantaa yleensä kaikkia sitä käyttäviä sovelluksia (katso esimerkkejä yllä olevasta CT1: stä).
- laajennettavissa - uusia "ohjeita" voidaan lisätä - yksinkertaisesti laajentamalla tulkki
- tulkki voidaan kirjoittaa kuten sovellusohjelma
Vaihtoehtoisesti: -
- tulkki voi olla sisäänpäin kääntyneitä ja "itse optimoida " käyttämällä ajonaikaisen mittareita kerätään itse taulukko (ks CT3 ja CT4 - joissa merkinnät, joita voitaisiin määräajoin lajiteltu laskeva määrä). Tulkki voi myös valita tehokkaimman hakutekniikan dynaamisesti ajon aikana kerätyistä tiedoista (esim. Taulukon koko, arvoalue, lajiteltu tai lajittelematon)
- dynaaminen lähetys - yhteiset toiminnot voidaan ladata valmiiksi ja harvinaisemmat toiminnot voidaan hakea vasta ensimmäisellä kohtaamisella muistin käytön vähentämiseksi . Tämän saavuttamiseksi voidaan käyttää muistiinpanoja taulukossa .
- Tulkissa voi olla sisäänrakennettu virheenkorjaus-, jäljitys- ja monitoriominaisuuksia - jotka voidaan sitten kytkeä päälle tai pois päältä haluamallaan tavalla testi- tai live-tilan mukaan
- ohjaustaulukot voidaan rakentaa 'lennossa' (joidenkin käyttäjän antamien tietojen tai parametrien perusteella) ja sitten tulkki suorittaa ne (ilman rakennuskoodia kirjaimellisesti).
Haitat
- koulutusvaatimus - sovellusohjelmoijia ei yleensä kouluteta tuottamaan yleisiä ratkaisuja
Seuraava koskee lähinnä niiden käyttöä moniulotteisissa taulukoissa, ei aiemmin käsiteltyjä yksiulotteisia taulukoita.
- overhead - lisääntynyt jonkin verran, koska ylimääräinen taso välillisen aiheuttama virtuaalinen ohjeita tarvitse olla 'tulkittava' (tämä kuitenkin voidaan yleensä enemmän kuin kompensoi hyvin suunniteltu geneerinen tulkki täysimääräinen tehokkaan suoran kääntää, etsiä ja ehdollinen testaustekniikoiden jotka saattavat ei ole muuten käytetty)
- Monimutkaisia lausekkeita ei voida aina käyttää suoraan taulukon merkinnöissä vertailua varten
- (nämä 'väliarvot' voidaan kuitenkin laskea etukäteen sen sijaan alirutiinissa ja niiden arvot, joihin viitataan ehdollisen taulukon kohdissa. Vaihtoehtoisesti alirutiini voi suorittaa koko kompleksisen ehdollisen testin (ehdottomana 'toimintona') ja asettamalla totuuslippu tuloksena, se voidaan sitten testata seuraavassa taulukossa. Katso Strukturoidun ohjelman lause )
Lainaukset
Monisuuntainen haarautuminen on tärkeä ohjelmointitekniikka, joka korvataan liian usein tehottomalla if-testien sekvenssillä. Peter Naur kirjoitti minulle äskettäin, että hän pitää taulukoiden käyttöä ohjelmavirran hallitsemiseksi tietotekniikan perusajatteluna, joka on melkein unohdettu; mutta hän odottaa, että se on kypsä löydettäväksi uudelleen joka päivä. Se on avain tehokkuuteen kaikissa parhaimmissa kääntäjissä, joita olen tutkinut.
- Donald Knuth , jäsennelty ohjelmointi ja siirry lausuntoihin
On toinen tapa tarkastella tulkitsevalla kielellä kirjoitettua ohjelmaa. Sitä voidaan pitää sarjana aliohjelmakutsuja yksi toisensa jälkeen. Tällainen ohjelma voidaan itse asiassa laajentaa pitkäksi sarjaksi kutsuja aliohjelmissa, ja päinvastoin, sellainen sekvenssi voidaan yleensä pakata koodattuun muotoon, joka tulkitaan helposti. Tulkintatekniikoiden etuna ovat esityksen pienikokoisuus, koneen riippumattomuus ja lisääntynyt diagnostiikkakyky. Tulkki voidaan usein kirjoittaa niin, että itse koodin tulkintaan ja haarautumiseen sopivaan rutiiniin kuluva aika on vähäinen
- Donald Knuth , The Art of Computer Programming, osa 1, 1997, sivu 202
Ohjelman esittämiseen tarvittavaa tilaa voidaan usein vähentää käyttämällä tulkeja, joissa yhteiset toimintosekvenssit on esitetty tiiviisti. Tyypillinen esimerkki on äärellisen tilan koneen käyttö monimutkaisen protokollan tai leksikaalisen muodon koodaamiseksi pieneksi taulukoksi
- Jon Bentley , Tehokkaiden ohjelmien kirjoittaminen
Hyppypöydät voivat olla erityisen tehokkaita, jos etäisyystestit voidaan jättää pois. Esimerkiksi, jos ohjausarvo on lueteltu tyyppi (tai merkki), se voi sisältää vain pienen kiinteän arvoalueen ja aluetesti on tarpeeton edellyttäen, että hyppytaulukko on riittävän suuri käsittelemään kaikkia mahdollisia arvoja
- David. SPULER, kääntäjäkoodinmuodostus monitievälitteisille haarakäskyille staattisena hakuongelmana
Ohjelmat on kirjoitettava ihmisten lukemista varten ja vain satunnaisesti koneiden suorittamista varten.
- "Tietokoneohjelmien rakenne ja tulkinta", esipuhe ensimmäiseen painokseen, Abelson & Sussman
Näytä minulle vuokaaviosi ja piilota taulukosi, niin minä jatkan mysti. Näytä taulukot, enkä yleensä tarvitse vuokaaviota; se on ilmeistä.
- "Myyttinen ihmiskuukausi: esseitä ohjelmistotuotannosta", Fred Brooks
Katso myös
- Automaattipohjainen ohjelmointi
- Tietokantakeskeinen arkkitehtuuri
- Tietoihin perustuva testaus
- Päätöstaulukko
- Ääretilainen kone
- Avainsanavetoinen testaus
- Osoitin (tietokoneohjelmointi)
- Vaihda lause - monitiehaarautuminen yhteen useista ohjelmatunnisteista riippuen yhdestä tulomuuttujasta
- Kierteitetty koodi
- Tunnuksen ketjuttaminen
Huomautuksia
Viitteet
- Päätöstaulukkoihin perustuva menetelmä
- Strukturoidut Ohjelmointi mennä liitetiedot by Donald Knuth
- Kääntäjäkoodin luominen monitiehaara-lauseille staattisena hakuongelmana 1I994, kirjoittanut David A. Spuler
Ulkoiset linkit
- Windows PowerShellin kytkinlauseke kuvaa laajennukset vakiokytkinlausekkeeseen (tarjoaa joitain vastaavia ominaisuuksia ohjaustaulukoihin)
- Ohjaustaulukon esimerkki "C" -kielellä osoittimilla , kirjoittanut Christopher Sawtell c1993, tietojenkäsittelytieteen laitos, Aucklandin yliopisto
- Taulukko perustuva suunnittelu Wayne Cunneyworth of DataKinetics
- Vaatimuksista taulukoihin koodeihin ja testeihin George Brooke
- Joitakin kommentteja PJH Kingin ja RG Johnsonin, Univ , epäselvän päätöksentaulukon käytöstä ja niiden muuntamisesta tietokoneohjelmiksi . Lontoosta, Lontoosta, Iso-Britannia
- Epäselvyys PJH Kingin rajoitetuissa osallistumispäätöstaulukoissa
- PJH Kingin päätöksentaulukkojen muuntaminen tietokoneohjelmiksi sääntömaski- tekniikoilla
- Superway-optimoijaanalyysi monitiehaaraisten haarakoodien luomisesta, osio 3.9, sivu 16 hakemistokartoitus
- Hyppypöydät toiminnon osoitinryhmien kautta C / C ++ Jonesissa, Nigel. "Taulukot toiminnoille osoittavista viitteistä [3] ", sulautettujen järjestelmien ohjelmointi, toukokuu 1999.
- Tämän artikkelin sivunäkymätilastot joulukuussa 2009