Laajennettava ohjelmointi - Extensible programming

Laajennettava ohjelmointi on tietotekniikassa käytetty termi kuvaamaan tietokoneohjelmointityyliä, joka keskittyy mekanismeihin ohjelmointikielen , kääntäjän ja ajonaikaisen ympäristön laajentamiseksi . Laajennettavat ohjelmointikielet, jotka tukevat tätä ohjelmointityyliä, olivat aktiivinen työalue 1960 -luvulla, mutta liike syrjäytyi 1970 -luvulla. Laajennettavasta ohjelmoinnista on tullut kiinnostava aihe 2000 -luvulla.

Historiallinen liike

Ensimmäinen paperi, joka yleensä liittyy laajennettavaan ohjelmointikielen liikkeeseen, on M. Douglas McIlroyn 1960-luvun paperi korkeamman tason ohjelmointikielten makroista . Toinen varhainen kuvaus laajennettavuuden periaatteesta löytyy Brookerin ja Morrisin julkaisusta Compiler-Compiler vuonna 1960 . Liikehuipun merkitsi kaksi akateemista symposiumia, vuosina 1969 ja 1971. Vuoteen 1975 mennessä Thomas A. Standishin liikeartikkeli -artikkeli oli lähinnä post mortem. Forth ohjelmointikieli oli poikkeus, mutta se meni pääosin huomaamatta.

Historiallisen liikkeen hahmo

Kuten tyypillisesti kuvitellaan, laajennettava ohjelmointikieli koostui peruskielestä, joka tarjoaa alkeislaskentapalveluja, ja metakielestä, joka pystyy muokkaamaan peruskieltä. Ohjelma koostui sitten metakielisistä muutoksista ja koodista muokatulla peruskielellä.

Liikkeessä näkyvin kielenlaajennustekniikka oli makrojen määrittely. Kieliopin muokkaaminen liittyi myös läheisesti liikkeeseen, mikä johti lopulta adaptiivisten kieliopin muotoilujen kehittämiseen . Lisp kieliyhteisön pysyivät erillään laajennettavissa kieliyhteisön, ilmeisesti siksi, koska yksi tutkija havaittu,

mitä tahansa ohjelmointikieltä, jolla ohjelmat ja tiedot ovat olennaisesti keskenään vaihdettavissa, voidaan pitää laajennettavana kielenä. ... tämä voidaan nähdä hyvin helposti siitä, että Lisp on ollut laajennettava kieli vuosien ajan.

Vuoden 1969 konferenssissa Simula esiteltiin laajennettavana ohjelmointikielenä.

Standish kuvasi kolmea kielenlaajennusluokkaa , joita hän kutsui parafraasiksi , ortofraasiksi ja metafraasiksi (muuten parafraasi ja metafraasi ovat käännöstermit ).

  • Parafrase määrittelee laitoksen näyttämällä kuinka vaihtaa se johonkin aiemmin määriteltyyn (tai määriteltävään). Esimerkkeinä hän mainitsee makromääritelmät, tavalliset menettelymääritykset, kieliopilliset laajennukset, datamääritelmät, operaattorimääritelmät ja ohjausrakenteen laajennukset.
  • Ortofraasi lisää ominaisuuksia kielelle, joita ei voitu saavuttaa peruskielellä, kuten lisäämällä i/o -järjestelmä peruskieleen, jolla ei aiemmin ollut i/o -alkeistoa. Laajennukset on ymmärrettävä ortofraasiksi suhteessa johonkin tiettyyn peruskieleen , koska ominaisuus, jota ei ole määritelty peruskielellä , on määritettävä jollain muulla kielellä. Ortofraasi vastaa nykyaikaista käsitettä laajennuksista .
  • Metafraasi muuttaa olemassa olevien lausekkeiden tulkintasääntöjä. Se vastaa nykyaikaista heijastuskäsitettä .

Historiallisen liikkeen kuolema

Standish katsoi laajennettavuusliikkeen epäonnistumisen peräkkäisten laajennusten ohjelmoinnin vaikeuteen. Tavallinen ohjelmoija saattaisi rakentaa yhden makrokuoren peruskielen ympärille, mutta jos sen ympärille rakennettaisiin toinen makrokuori, ohjelmoijan pitäisi tuntea sekä peruskieli että ensimmäinen kuori; kolmas kuori edellyttäisi perehtymistä pohjaan ja sekä ensimmäiseen että toiseen kuoreen; ja niin edelleen. (Huomaa, että ohjelmoijan suojaaminen alemman tason yksityiskohdilta on abstraktio- liikkeen tarkoitus, joka korvasi laajennettavuuden.)

Huolimatta siitä, että Simula oli aiemmin esitetty laajennettavana, Standishin kysely ei käytännössä näytä sisältävän uudempia abstraktioihin perustuvia tekniikoita (vaikka hän käytti hyvin yleistä laajennettavuuden määritelmää, joka teknisesti olisi voinut sisällyttää ne). Vuoden 1978 ohjelmoinnin abstraktion historia tietokoneen keksimisestä (silloiseen) nykypäivään ei maininnut makroja eikä antanut vihjeitä siitä, että laajennettavissa olevien kielten liike olisi koskaan tapahtunut. Makrot otettiin alustavasti mukaan abstraktio -liikkeeseen 1980 -luvun lopulla (ehkä johtuen hygieenisten makrojen tulosta ), koska heille myönnettiin salanimi syntaktiset abstraktiot .

Moderni liike

Nykyaikaisessa mielessä järjestelmä, joka tukee laajennettavaa ohjelmointia, tarjoaa kaikki alla kuvatut ominaisuudet.

Laajennettava syntaksi

Tämä tarkoittaa yksinkertaisesti sitä, että käännettävä lähdekieli ei saa olla suljettu, kiinteä tai staattinen. Uusia avainsanoja, käsitteitä ja rakenteita on voitava lisätä lähdekieleen. Kielet, jotka sallivat konstruktioiden lisäämisen käyttäjän määrittelemällä syntaksilla, ovat Camlp4 , OpenC ++ , Seed7 , Red , Rebol ja Felix . Vaikka on hyväksyttävää, että jotkut perustavanlaatuiset ja luontaiset kielipiirteet ovat muuttumattomia, järjestelmä ei saa luottaa pelkästään näihin kielipiirteisiin. Uusia tulee olla mahdollista lisätä.

Laajennettava kääntäjä

Laajennettavissa ohjelmoinnissa kääntäjä ei ole monoliittinen ohjelma, joka muuntaa lähdekooditulon binääriseksi suoritettavaksi lähdöksi. Itse kääntäjän on oltava laajennettavissa siihen pisteeseen, että se on todellakin kokoelma laajennuksia, jotka auttavat kääntämään lähdekielen syötteen mihin tahansa . Esimerkiksi laajennettava kääntäjä tukee objektikoodin, koodidokumentaation, uudelleen muotoillun lähdekoodin tai minkä tahansa muun halutun tuloksen luomista. Kääntäjän arkkitehtuurin on sallittava käyttäjien "päästä sisään" kokoamisprosessiin ja tarjota vaihtoehtoisia käsittelytehtäviä jokaisessa järkevässä vaiheessa kokoamisprosessia.

Laajennettavan kääntäjän pitäisi vain kääntää lähdekoodia tietokoneella suoritettavaksi.

  • käyttää laajennusta tai komponentti-arkkitehtuuria lähes kaikkiin toimintoihinsa
  • selvittää, mitä kieltä tai kieliversiota käännetään, ja etsi sopiva laajennus kyseisen kielen tunnistamiseksi ja vahvistamiseksi
  • käyttää muodollisia kielimäärityksiä mielivaltaisten lähdekielien syntaktiseen ja rakenteelliseen vahvistamiseen
  • auttaa mielivaltaisten lähdekielien semanttisessa validoinnissa kutsumalla asianmukaista validointilaajennusta
  • antaa käyttäjille mahdollisuuden valita erilaisista koodigeneraattoreista, jotta tuloksena oleva suoritettava tiedosto voidaan kohdistaa eri prosessoreille, käyttöjärjestelmille, virtuaalikoneille tai muulle suoritusympäristölle.
  • tarjota mahdollisuuksia virheiden luomiseen ja niiden laajentamiseen
  • sallia uudenlaisia ​​solmuja abstraktissa syntaksipuussa (AST),
  • sallia uusia arvoja AST -solmuissa,
  • sallia uudenlaisia ​​reunoja solmujen välillä,
  • tukea tulon AST: n tai sen osien muuttamista jollakin ulkoisella "passilla"
  • tukea tulon AST tai sen osien kääntämistä toiseen muotoon jollakin ulkoisella "passilla"
  • auttaa tiedonkulussa sisäisten ja ulkoisten kulkujen välillä, kun ne sekä muuttavat että kääntävät AST: n uusiksi AST: ksi tai muihin esityksiin

Laajennettava käyttöaika

Suorituksen aikana laajennettavien ohjelmointijärjestelmien on sallittava kielten laajentaa sallittuja toimintoja. Jos järjestelmä käyttää esimerkiksi tavukooditulkkia , sen on sallittava uusien tavukoodiarvojen määrittäminen. Kuten laajennettavan syntaksin tapauksessa, on hyväksyttävää, että on olemassa joitakin (pieniä) joukkoja perus- tai luontaisia ​​toimintoja, jotka ovat muuttumattomia. Näitä luontaisia ​​toimintoja on kuitenkin voitava ylikuormittaa tai lisätä, jotta uutta tai lisäkäyttäytymistä voidaan tukea.

Sisältö erotettu lomakkeesta

Laajennettavien ohjelmointijärjestelmien tulisi katsoa ohjelmia käsiteltäviksi tiedoiksi. Näiden ohjelmien pitäisi olla täysin vailla minkäänlaisia ​​muotoilutietoja. Ohjelmien visuaalisen näyttämisen ja muokkaamisen käyttäjille tulisi olla laajennettavan kääntäjän tukema käännöstoiminto, joka muuntaa ohjelmatiedot muotoihin, jotka sopivat paremmin katseltavaksi tai muokattavaksi. Tämän pitäisi luonnollisesti olla kaksisuuntainen käännös. Tämä on tärkeää, koska laajennettavia ohjelmia on voitava käsitellä helposti eri tavoin. On mahdotonta hyväksyä, että lähdekielen syötteen ainoat käyttötavat ovat muokkaus, katselu ja konekoodiksi kääntäminen. Ohjelmien mielivaltaista käsittelyä helpottaa irrottamalla lähdesyöttö määritelmistä, miten se tulisi käsitellä (muotoilla, tallentaa, näyttää, muokata jne.).

Lähdekielen virheenkorjaustuki

Laajennettavien ohjelmointijärjestelmien on tuettava ohjelmien virheenkorjausta käyttäen alkuperäisen lähdekielen rakenteita riippumatta ohjelman laajennuksista tai muunnoksista, jotta ohjelma voidaan suorittaa. Erityisesti ei voida olettaa, että ainoa tapa näyttää ajonaikaiset tiedot ovat rakenteissa tai matriiseissa . Virheenkorjaimen tai tarkemmin sanottuna "ohjelmatarkastajan" on sallittava ajonaikaisten tietojen näyttäminen lähdekielelle sopivissa muodoissa. Jos kieli esimerkiksi tukee liiketoimintaprosessin tai työnkulun tietorakennetta, virheenkorjaimen on voitava näyttää kyseinen tietorakenne kalakaaviona tai muuna laajennuksen tarjoamana.

Esimerkkejä

Katso myös

Viitteet

Ulkoiset linkit

Yleistä

  1. Greg Wilsonin artikkeli ACM -jonossa
  2. Slashdot -keskustelu
  3. Nykyaikaiset laajennettavat kielet - Daniel Zingaron paperi

Työkalut

  1. MetaL - laajennettava ohjelmointikääntäjämoottorin toteutus
  2. XPS - eXtensible Programming System (kehitteillä)
  3. MPS - JetBrains Metaprogramming -järjestelmä

Ohjelmointikielet laajennettavalla syntaksilla

  1. OpenZz
  2. xtc - eXTensible C
  3. Englanninkielinen kirjoitus
  4. Nemerle -makrot
  5. Boo -syntaktiset makrot
  6. Stanfordin yliopiston Intermediate Format -kääntäjä
  7. Seed7 - Laajennettava ohjelmointikieli
  8. Katahdin - ohjelmointikieli, jolla on syntaksi ja semantiikka, jotka ovat muutettavissa ajon aikana
  9. π - toinen ohjelmointikieli, jolla on laajennettava syntaksi, joka on toteutettu käyttämällä Earley -jäsennintä