Ohjelmointiparadigma | tapa ryhmitellä ohjelmointikieliä sen mukaan, mitä ne tekevät
Ohjelmointiparadigmat ovat tapa ryhmitellä ohjelmointikieliä sen mukaan, mitä ne tekevät. Kielet voivat kuulua useampaan kuin yhteen paradigmaan.
Joissakin paradigmoissa tarkastellaan tapaa, jolla koodia suoritetaan, esimerkiksi sallitaan sivuvaikutukset tai asiat on tehtävä tietyssä järjestyksessä. Toiset paradigmat tarkastelevat tapaa, jolla koodi ryhmitellään, kuten koodin sijoittamista yhteen tai kahteen osaan (tai sen sijaan moniin pieniin osiin). Joissakin muissa paradigmoissa tarkastellaan järjestystä ja paloja, jotka tekevät ohjelmasta sellaisen kuin se on.
Paradigmoja on kaksi pääryhmää, imperatiiviset ja deklaratiiviset. Kieli voi olla samanaikaisesti molempia.
Imperatiivinen ohjelmointi
Imperatiivisissa ohjelmissa ohjelmoijat antavat tietokoneelle joukon järjestettyjä vaiheita, jotka on suoritettava, jotta jokin asia voidaan tehdä. Jos joku haluaisi tietokoneen piirtävän kissan kasvot, hän voisi antaa ohjeita kuten "Piirrä ympyrä tähän, piirrä kaksi pienempää ympyrää tähän, piirrä kaksi kolmiota päälle" ja niin edelleen. Imperatiivisilla ohjelmilla on joskus paljon sivuvaikutuksia.
On olemassa kaksi suurta imperatiivista paradigmaa, ja usein kielessä on molemmat:
- Strukturoitu - Tietokoneelle annetaan ohjeita, jotka ovat aina tietyssä järjestyksessä. Vaiheet kuten "palaa vaiheeseen 3" (ns. goto-lausekkeet) eivät ole sallittuja.
- Proseduraalinen - Ohjelma antaa ohjelmoijalle mahdollisuuden antaa nimen toimeksiantoluettelolle, jolloin toimeksiannot muuttuvat "proseduuriksi", jota voidaan käyttää myöhemmin. Useimmat strukturoidut kielet ovat myös proseduraalisia.
- Oliokeskeisyys - Ideat selitetään tietokoneelle objekteilla, koodinpalasilla, joilla on joukko käskyjä, joita niille voidaan antaa, ja joitakin tietoja niistä.
Deklaratiivinen ohjelmointi
Deklaratiivisissa paradigmoissa ohjelmoija kertoo tietokoneelle, mitä sen sijaan, että hän kertoisi, miten se tehdään. Jos tietokoneen haluttaisiin piirtävän kissan kasvot, hän voisi antaa ohjeita kuten "Piirrä kasvot, piirrä kaksi silmää, kaksi korvaa ja suu".
Tunnetuimmat deklaratiiviset paradigmat ovat:
- Toiminnallinen - Toiminnot tekevät suurimman osan työstä ilman sivuvaikutuksia.
- Logiikka - Todetaan joukko tosiasioita, ja sitten esitetään yksi tai useampi "kysymys".
- Tapahtumapohjainen - Koodin osat asetetaan toimimaan, kun tietyt asiat tapahtuvat (kuten tietokoneen käynnistäminen).
Muut paradigmat
Joitakin paradigmoja löytyy sekä imperatiivisista että deklaratiivisista kielistä. Nämä paradigmat esiintyvät yleensä yhdessä jonkin edellä mainitun paradigman kanssa sen sijaan, että ne esiintyisivät yksinään.
- Rinnakkain: Useampi kuin yksi koodinpätkä suoritetaan samanaikaisesti.
- Meta: Kielen erityiset asiat antavat ohjelmoijalle mahdollisuuden muuttaa tapaa, jolla kieli itse toimii.
Yleiskatsaus
Ohjelmointikielet ryhmitellään paradigmojen mukaan samalla tavalla kuin koneet ryhmitellään sen mukaan, mihin niitä käytetään.
Muutamat kielet sopivat vain yhteen pääparadigmaan, kuten:
- Smalltalk (oliopohjainen)
- Kokoonpano (imperatiivinen, mutta ei strukturoitu tai oliopohjainen)
- Haskell (funktionaalinen)
- Prolog (logiikka)
Useimmissa kielissä on kuitenkin useampi kuin yksi paradigma. Joitakin niistä, jotka erottuvat edukseen useamman kuin yhden paradigman ansiosta, ovat:
- Scala (oliopohjainen, funktionaalinen, rinnakkainen)
- Visual Basic (tapahtumapohjainen, oliopohjainen)
- Common Lisp (proseduraalinen, funktionaalinen, oliopohjainen, meta)
- Scheme (funktionaalinen, proseduraalinen, meta)
- Perl (funktionaalinen, proseduraalinen, meta, oliopohjainen, tapahtumapohjainen).
- Python (funktionaalinen, oliopohjainen, proseduraalinen)
- Ruby (toiminnallinen, oliopohjainen, proseduraalinen)
- Wolfram Language (funktionaalinen, proseduraalinen, yleensä deklaratiivinen)
- Oz (looginen, funktionaalinen, imperatiivinen, oliopohjainen)
- F# (funktionaalinen, imperatiivinen, oliopohjainen, meta)
Useampien paradigmojen olemassaolo ei aina ole hyvä asia. Yksi kerta, jolloin vähemmän paradigmoja voi olla hyvä asia, on silloin, kun on olemassa kieli, joka on pelkästään funktionaalinen. Tällaisen kielen funktio tekee joskus vähemmän työtä (esimerkiksi käy läpi vain ne asiat, joita sen todella tarvitsee tehdä) kuin sen olisi pitänyt tehdä, jos kieli olisi myös proseduraalinen.
Monet ohjelmointiparadigmat tunnetaan yhtä hyvin asioista, joita ne eivät anna ihmisten tehdä, kuin niistä, joita ne antavat ihmisten tehdä. Tämä pätee esimerkiksi funktionaalisiin kieliin. Kun funktionaalinen kieli on vain tai enimmäkseen funktionaalinen, se ei yleensä salli sivuvaikutuksia. Toinen tapaus, jossa tämä pätee, on strukturoitu ohjelmointi: se eroaa tavallisista imperatiivisista kielistä siinä, että se ei anna ohjelmoijien käyttää "goto-lauseita" (lauseita, jotka käskevät ohjelmaa siirtymään aikaisempaan vaiheeseen). Tämän ja muiden syiden vuoksi ihmiset ajattelevat joskus, että uudet paradigmat eivät salli tarpeeksi asioita. Joskus on kuitenkin ihan ok, että tietokone ei anna ihmisten tehdä asioita: se voi auttaa ihmisiä välttämään ongelmia koodissaan ja antaa tietokoneen tehdä arvauksia, jotta se voi ajaa koodia nopeammin, tai jopa tarkistaa koodin ongelmien varalta ennen kuin koodi suoritetaan!
Katsaus eri ohjelmointiparadigmoihin Peter Van Royn mukaan
Paradigmojen ongelmat
Jotkut ohjelmointikieliä tutkivat ihmiset, kuten Harper ja Krishnamurthi, eivät pidä siitä, että ohjelmointikieliä ryhmitellään paradigmojen avulla. Nämä ihmiset sanovat, että monia ohjelmointikieliä ei voi vain ryhmitellä paradigmoihin, koska kielet lainaavat asioita ja ideoita monista paradigmoista.
Historia
Ajan myötä on luotu uusia paradigmoja, ja ihmiset ovat joko tuolloin tai jälkikäteen huomauttaneet niistä. Yksi ensimmäisistä paradigmoista, joka tunnistettiin uudeksi ohjelmointitavaksi, oli 1960-luvulla syntynyt strukturoitu ohjelmointi. Ajatus "ohjelmointiparadigmasta" on peräisin vuodelta 1978, ellei jopa aikaisemmin, jolloin Robert W. Floyd käytti sitä opettaessaan. Sanaa "paradigma" Robertin tarkoittamalla tavalla käytti ensimmäisen kerran Thomas Kuhn kirjassaan The Structure of Scientific Revolutions (1962).
Konekoodi
Alimmalla tasolla (lähimpänä sitä, miten tietokone haluaa ymmärtää asioita) ja vanhin ohjelmointiparadigma on konekoodi, imperatiivinen paradigma. Konekoodin ohjeet ovat vain joukko numeroita tietyssä järjestyksessä. Kokoonpanokieli on hieman vähemmän matala-asteinen (ja hieman vähemmän vanha). Kokoonpanokielessä tietokoneen ohjeille annetaan mnemonyymit (helpommin muistettavat nimet), ja muistiosoitteille (ohjeet, joiden avulla löydetään jokin tieto tietokoneesta) voidaan antaa nimet. Näitä kutsutaan joskus ensimmäisen ja toisen sukupolven kieliksi.
1960-luvulla assembler-kieliä parannettiin lisäämällä niihin uusia asioita, kuten kirjaston COPY, makrot ("erikoiskoodin" palaset, jotka muutettiin tavalliseksi koodiksi ennen ohjelman suorittamisen aloittamista), proseduurien suorittaminen (joukko ohjeita, joille annetaan nimi ja jotka tallennetaan myöhempää käyttöä varten) ja muuttujat (nimiä, jotka tallennetaan myöhempää käyttöä varten) ohjelman ulkopuolelta. Näin ihmiset pystyivät käyttämään jotakin koodia useammassa kuin yhdessä projektissa, eikä heidän tarvinnut huolehtia laitteistokohtaisista ongelmista (ongelmista, jotka esiintyvät vain yhdenlaisissa tietokoneissa) READ/WRITE/GET/PUT-tyyppisten komentojen (ohjeiden nimet) ansiosta.
Kokoonpanoa käytettiin ja käytetään joskus vieläkin järjestelmissä, joissa on tärkeää, että koodi on nopeaa, ja sitä käytetään paljon myös sulautetuissa järjestelmissä, koska sen avulla käyttäjä voi hallita tarkasti, mitä kone tekee.
Proseduraaliset kielet
Aivan 1960-luvun lopulla alettiin keksiä proseduraalisia kieliä. Näissä kolmannen sukupolven kielissä (ensimmäisissä niistä kielistä, joita nykyään kutsumme korkean tason kieliksi) oli sanoja, jotka liittyivät siihen, mitä niillä yritettiin ratkaista. Esimerkiksi,
- COmmon Business Oriented Language (COBOL) - käyttää sanoja kuten file, move ja copy.
- FORmula TRANslation (FORTRAN) - käyttää matemaattisia sanoja ja symboleja ( kirjoituksessa ja kirjoittamisessa käytettävät muodot). Se on kehitetty lähinnä luonnontieteiden ja tekniikan alalle.
- ALGOrithmic Language (ALGOL) - tehty algoritmien kirjoittamista varten (joukko vaiheita, jotka kertovat tietokoneelle, mitä tehdä). Siinä käytetään matemaattisia sanoja ja symboleja, aivan kuten FORTRANissa.
- Programming Language One (PL/I) - sen piti olla hyödyllinen kaikille.
- Aloittelijoiden yleiskäyttöinen symbolinen ohjekoodi (BASIC) - tehty auttamaan aloittelijoita ohjelmoinnissa.
- C - ohjelmointikieli, jolla voidaan tehdä monia asioita. Dennis Ritchie työskenteli sen parissa AT&T Bell Labsissa vuosina 1969-1973.
Oliopohjainen ohjelmointi
Kun monet ihmiset olivat alkaneet käyttää proseduraalisia kieliä, keksittiin olio-ohjelmointikielet. Näissä kielissä data ja sen "metodit" (tavat käsitellä dataa) kootaan yhteen "objektiin". Jotkut ohjelmoijat, kuten Richard Stallman, eivät ole samaa mieltä siitä, että oliokeskeiset kielet soveltuvat paremmin ideoiden selittämiseen tietokoneelle kuin proseduraaliset kielet.
Koska olio-ohjelmointi on paradigma, ei kieli, on luotu olio-ohjelmointikieliä, kuten HLA (High Level Assembly).
Deklaratiiviset paradigmat
Samaan aikaan jotkut ihmiset kehittivät deklaratiivisia ohjelmointikieliä. Eräs kieli, joka on hyvin tunnettu deklaratiivisuudestaan, on SQL (kieli, jolla lisätään ja poistetaan asioita taulukoista).
Aiheeseen liittyvät sivut
- Mindset
- Tyyppijärjestelmä
- Turingin täydellisyys
Kysymyksiä ja vastauksia
K: Mikä on ohjelmointiparadigma?
A: Ohjelmointiparadigma on tapa ryhmitellä ohjelmointikieliä sen perusteella, miten ne toimivat.
K: Mitkä ovat paradigmojen kaksi pääryhmää?
A: Paradigmojen kaksi pääryhmää ovat imperatiivinen ja deklaratiivinen.
K: Miten imperatiivinen ja deklaratiivinen paradigma eroavat toisistaan?
V: Imperatiivisissa paradigmoissa tarkastellaan tapaa, jolla koodia suoritetaan, kuten sivuvaikutusten sallimista tai asioiden tekemistä tietyssä järjestyksessä, kun taas deklaratiivisissa paradigmoissa tarkastellaan tapaa, jolla koodi ryhmitellään, kuten koodin sijoittamista yhteen tai kahteen osaan (tai sen sijaan moniin pieniin osiin).
K: Voiko kieli olla sekä imperatiivinen että deklaratiivinen paradigma?
V: Kyllä, kieli voi olla samanaikaisesti sekä imperatiivinen että deklaratiivinen paradigma.
K: Miten ohjelmointiparadigma ryhmittelee kieliä?
V: Ohjelmointiparadigmat ryhmittelevät kieliä sen mukaan, mitä ne tekevät. Niissä tarkastellaan sitä, miten koodi suoritetaan, miten se on ryhmitelty ja missä järjestyksessä ja mistä osista ohjelma koostuu.
K: Onko olemassa muitakin ohjelmointiparadigmoja kuin imperatiivinen ja deklaratiivinen?
V: Kyllä, on olemassa muitakin ohjelmointiparadigmoja kuin imperatiivinen ja deklaratiivinen. Joissakin tarkastellaan esimerkiksi tapaa, jolla koodi suoritetaan (esimerkiksi sivuvaikutusten salliminen), kun taas toisissa tarkastellaan tapaa, jolla koodi ryhmitellään (esimerkiksi koodin sijoittaminen yhteen tai kahteen osaan).
Kysymys: Kuuluuko jokainen kieli vain yhteen ohjelmointiparadigman tyyppiin?
V: Ei, kaikki kielet eivät kuulu vain yhteen ohjelmointiparadigmatyyppiin; jotkin kielet voivat kuulua useampaan kuin yhteen paradigmatyyppiin.