
Ohjelmointikielet ovat formaaleja kieli?, joita ohjelmoijat k?ytt?v?t tietokoneen ohjelmointiin algoritmin toteuttamiseksi. Ohjelmointikielell? tehdyst? l?hdekoodista tuotetaan tietokoneen ymm?rt?m?? konekielist? bin??ri? k??nt?j?ll? tai tulkilla.[1] Tietokoneen ymm?rt?m? bin??ri voidaan tehd? v?likielen kautta.
Historia
[muokkaa | muokkaa wikiteksti?]
Ohjelmien kaltaisia ratkaisuja on k?ytetty muun muassa kutomakoneille ja automaattipianoille ennen digitaalisen tietokoneen kehitt?mist?.[2]
Ada Lovelace kirjoitti 1800-luvulla Charles Babbagen analyyttiselle koneelle algoritmin Bernoullin lukujen laskemiseen, jonka johdosta Lovelacea pidet??n ensimm?isen? ohjelmoijana.[3][4] T?rkeimp?n? havaintona pidet??n sit?, ett? Lovelace hahmotti ohjelman ja algoritmin abstraktin ilmaisun, jolloin kone voi tehd? l?hes mit? vain.[5]
Ensimm?isen? ylemm?n tason ohjelmointikielen? pidet??n Konrad Zusen 1940-luvulla kehitt?m?? Plankalkülia.[6] Kielen kuvaus julkaistiin kuitenkin vasta 1972 ja ensimm?inen k??nt?j? kielelle toteutettiin vasta 1998.[7] Kieli oli korkean tason imperatiivinen kieli.[7]
Small-Scale Experimental Machine (SSEM) oli ensimm?inen tietokone, jossa ohjelma voitiin tallettaa tietokoneen muistiin ja ohjelmaa voitiin vaihtaa ilman fyysisi? muutoksia tietokoneeseen (tallennetun ohjelman tietokone).[8][9]
Ennen vuotta 1954 l?hes kaikki ohjelmointi tehtiin matalan tason ohjelmointikielill? kuten konekielell? tai assemblyll?.[10] 1950-luvun lopulla syntyneit? ohjelmointikieli? olivat ALGOL, COBOL ja Fortran.[5] Suuri osa ohjelmoijien ty?st? liittyi tuon ajan tietokoneiden rajoitteisiin.[10] Varhaiset automaattisen ohjelmoinnin menetelm?t olivat kalliita k?ytt?? koska ne hidastivat tietokonetta 5-10-kertaisesti.[10] FORTRANin kehitykseen vaikutti my?s, ett? my?s ohjelmoijien kustannukset olivat suuret ja merkitt?v? osa ajasta kului debuggaukseen.[10] Taloudelliset syyt olivat merkitt?v? tekij? FORTRAN-projektin rahoittamiseen.[10]
Yleisesti tunnustetaan ett? ohjelmointikielet ovat kehittyneet kolmen selke?sti tunnistettavan sukupolven kautta: konekieli, assembly ja ylemm?n tason proseduraaliset kielet kuten COBOL ja FORTRAN.[11] Kielten sukupolvia ovat m??ritt?neet kasvava siirrett?vyys, riippumattomuus laitteistoarkkitehtuurista ja k?yt?n helppous.[11]
Ohjelmointikielet voidaan jakaa sukupolviin seuraavasti:[12]
1 | Ensimm?inen sukupolvi | konekieli | |
---|---|---|---|
2 | Toinen sukupolvi | assembly | isomorfinen muunnos, symbolinen konekieli |
3 | Kolmas sukupolvi | algoritminen ja proseduraalinen | ei-isomorfinen muunnos, k??nnett?v?t ja tulkittavat kielet |
4 | Nelj?s sukupolvi | nelj?nnen sukupolven kielen k?sitett? k?ytet??n v?lj?sti ja k?yt?nn?llisesti |
Nelj?nnen sukupolven kielist? on keskusteltu 1970-luvulta alkaen.[12] Niin kutsuttujen "ei-proseduraalisten" kielten on sanottu olevan nelj?nnen sukupolven kieli?, mutta my?s assemblya voi sanoa "ei-proseduraaliseksi".[12][13] Nelj?nnen sukupolven kielien ilmestyminen on hyvin dokumentoitu, mutta ohjelmien monimuotoisuus on tehnyt vaikeaksi tarkan m??rittelyn.[11] Nelj?nnen sukupolven kielet on kehitetty pragmaattisemmin kuin akateemiseen ty?h?n perustuen.[12]
1960- ja 1970-luvuilla Simula oli merkitt?v? kieli, jonka ajatuksia Smalltalkissa kehitettiin edelleen.[12] T?m? vaikutti olio-ohjelmointikielien kehitykseen.[12]
Viidennen sukupolven kieli? on toisinaan mainostettu, mutta laitteistoabstraktion kannalta nelj?s sukupolvi on jo korkeimmalla tasolla.[14] Er??t tahot esitt?v?t ett? viides sukupolvi perustuu enemm?n ohjelmalle annetun rajoitteiden m??rittelyyn kuin ongelmanratkaisualgoritmin kehitt?miseen: k?ytt?kohteena p??asiassa teko?lytutkimus.[15][12]
Yleist?
[muokkaa | muokkaa wikiteksti?]Ohjelmointikielet ovat formaaleja kieli?, joita k?ytet??n ??rellisell? automaatilla (nyky??n usein tietokone tai ohjelmoitava logiikka). Ohjelmointikieliss? on rajallinen m??r? sanoja ja s??nt?j?, joita ohjelmoinnissa voi k?ytt??. S??nt?jen mukaisesti tulos on aina deterministinen. Sanojen ja s??nt?jen ulkopuolella tulos on ep?deterministinen (m??rittelem?t?n) ja yleens? virhe.
Ohjelmointikielet poikkeavat luonnollisista kielist? s??nn?nmukaisuuden ja rajatun kieliopin suhteen.[16][17]
Ohjelmointikielet noudattavat abstraktioperiaatetta siin? suhteessa, ett? k?ytt?j?n ei tarvitse tiet?? miten asia on toteutettu vaan ainoastaan sen rajapinta: komponentin toteutusta voidaan muuttaa ilman sen vaikuttamista tai ilmoittamista sen k?ytt?j?lle.[18] Periaatetta k?ytet??n yleisesti ohjelmoinnissa toistuvien kaavojen v?hent?miseen.[19]
Laskettavuusteorian mukaan Turing-t?ydelliset kielet ovat korvattavissa toisella.[20][21]
Yleens? ohjelmointikielen sanotaan olevan Turing-t?ydellinen jos sit? voi k?ytt?? simuloimaan Turingin konetta.[21] Yleisk?ytt?iset ohjelmointikielet ovat Turing-t?ydellisi?.[22] Ensimm?isen? yleisk?ytt?isen? ylemm?n tason kielen? pidet??n FORTRAN:ia.[23]
Tietylle sovellusalueelle erikoistuneet t?sm?kielet eiv?t yleens? ole Turing-t?ydellisi?.[24][25]
Ohjelmointikieliss? sallittu syntaksi on usein esitetty konteksivapaalla Backus–Naur-muodolla (BNF).[26][27] Kontekstivapaata kielioppia kuten BNF voidaan k?ytt?? k??nt?j?n k??nt?j?n kuten YACC-ohjelman kanssa.[27] L?hdekoodin k??nt?minen ohjelmatiedostoksi ei viel? tarkoita ett? ohjelman suoritus toimii oikein. Muun muassa nollalla jakaminen on useissa kieliss? syntaksin mukaan mahdollista, mutta tulosta ei voida m??ritt??.
Verratessa ohjelmointikieli? kuten FORTRAN, LISP, APL ja SNOBOL ne eroavat ilmaisumuodossa, kontrollirakenteiden valinnassa ja k?yt?ss?, sek? tiedon esityksen tyypiss? ja hallinnassa.[28] Ohjelmointikielen semantiikka m??ritt?? sen abstraktin konemallin ja kun algoritmi vastaa kielen mallia ohjelmointi on k?tev?? ja toteutus on tehokas; kun algoritmin vaatima prosessointi ei vastaa kielen mallia ohjelmointi on vaikeaa ja ohjelma on tehoton.[28]
Muita eroja ovat muun muassa tyyppij?rjestelm?n toteutus ja poikkeuksien k?sittely. Muistik?sittely voi olla ohjelmoijan vastuulla tai kieli voi tukea automaattista roskienkeruuta.
K?ytt?
[muokkaa | muokkaa wikiteksti?]Ohjelmointikielill? asian voi ilmaista vain rajallisella m??r?ll? toimintoja, esimerkiksi muuttujan saldo arvon v?hent?minen 10:ll? ilmaistaan: saldo -= 10;
tai saldo = saldo-10;
.[29]
Esimerkiksi C-kieless? vaihtoehtoja on runsaasti, sill? kokonaislukumuuttujan arvoon voi lis?t? yhden useammalla eri tavalla:[29]
muuttuja = muuttuja + 1;
muuttuja += 1;
++muuttuja;
muuttuja++;
Erillisin? lauseina n?iden merkitys on aivan sama, eli muuttujan arvon kasvattaminen yhdell?, mutta lausekkeen osana viimeisen rivin merkitys poikkeaa aiemmista.[29] Kolme ylint? tapaa palauttavat lausekkeen osana ollessaan muuttujan uuden arvon, kun alin palauttaa vanhan, vaikka kasvattaakin itse muuttujan arvoa.[29] Arvon lis?ykseen oikotien? k?ytett?v?t k?ytett?v?t operaattorit kuten +=
ja ++
ovat per?isin tilanteesta, jossa jokainen ominaisuuden lis?ys kasvatti k??nt?j?n tarvitsemaa muistim??r?? mutta uusien ominaisuuksien k?ytt?minen pienensi sen tarvitsemaa muistia.[30] B-kielen ja C-kielen kehityksen yhteydess? k?ytett?viss? olevan tietokoneen rajallinen muistim??r? oli usein ongelma.[30]
Ohjelmointikielten jaottelu
[muokkaa | muokkaa wikiteksti?]- P??artikkeli: Ohjelmointiparadigma
Ohjelmointikielet voidaan jaotella eri ryhmiin kielen paradigman mukaan:[31]
- Paradigma
Ohjelmointikielet voivat toteuttaa useaa paradigmaa eli ovat moniparadigmaisia. Esimerkiksi C++ tukee eri paradigmoja (proseduraalinen-, olio- ja geneerinen ohjelmointi) ja on siten moniparadigmainen kieli.[32]
Ohjelmointikielet voidaan jakaa muun muassa algoritmisiin (FORTRAN, ALGOL), liiketoimintaan orientoituneisiin (COBOL) ja koulutukseen orientoituneisiin (BASIC, Logo).[33]
Ohjelmointikielet sanotaan voitavan jakaa deklaratiivisiin ja imperatiivisiin, joiden alalajeja ovat funktionaaliset, logiikkapohjaiset ja proseduraaliset ohjelmointikielet.[34]
Ohjelmointikieli?
[muokkaa | muokkaa wikiteksti?]- P??artikkeli: Luettelo ohjelmointikielist?
Er?it? tunnetuimpia, yleisimpi? tai merkitt?vimpi? ohjelmointikieli?:[35]
Katso my?s
[muokkaa | muokkaa wikiteksti?]L?hteet
[muokkaa | muokkaa wikiteksti?]- ↑ What are Computer Programming Languages? computerscience.org. Viitattu 12.7.2018.
- ↑ 1801: Punched cards control Jacquard loom computerhistory.org. Viitattu 4.3.2020. (englanniksi)
- ↑ Ada Lovelace Computer History Museum. Viitattu 12.7.2018. (englanniksi)
- ↑ John Markoff: It Started Digital Wheels Turning 7.11.2011. The New York Times. Viitattu 9.1.2020. (englanniksi)
- ↑ a b Harry Fairhead: History of Computer Languages - The Classical Decade, 1950s i-programmer.info. Viitattu 13.9.2020. (englanniksi)
- ↑ F.L. Bauer & H. W?ssner: The "Plankalkül" of Konrad Zuse: A Forerunner of Today's Programming Languages (PDF) Communications of the ACM. hein?kuu 1972. Arkistoitu doi:10.1145/361454.361515 Viitattu 10.7.2018. (englanniksi)
- ↑ a b Plankalkül history-computer.com. Arkistoitu 5.2.2020. Viitattu 5.2.2020. (englanniksi)
- ↑ The Manchester Small Scale Experimental Machine -- "The Baby" curation.cs.manchester.ac.uk. Viitattu 25.8.2017.
- ↑ Guy Fedorkow: About the Computer History Museum’s IBM 1401 Machines computerhistory.org. 19.2.2015. Viitattu 28.1.2020. (englanniksi)
- ↑ a b c d e John Backus: FORTRAN Session (PDF) Computer History Musem. Viitattu 10.2.2020. (englanniksi)
- ↑ a b c David Benyon: SECTION ONE FOURTH GENERATION LANGUAGES (PDF) (Automating Systems Development) 1988. Plenum Press. doi:10.1007/978-1-4613-1033-4_13 ISBN 978-1-4613-1033-4 Viitattu 5.2.2020. (englanniksi)
- ↑ a b c d e f g Roger Clarke: A Contingency Approach to the Application Software Generations rogerclarke.com. 1991. Viitattu 4.2.2020. (englanniksi)
- ↑ Programming languages on the mainframe IBM. Viitattu 4.2.2020. (englanniksi)
- ↑ Philip Howard: What makes a 5GL? 17.1.2007. The Register. Viitattu 10.2.2020. (englanniksi)
- ↑ Sébastien Miellet: Matlab: Introduction (PDF) moodle.unifr.ch. Viitattu 11.2.2020. (englanniksi)[vanhentunut linkki]
- ↑ Noah Chomsky: Syntactic Structures (PDF) linguist.univ-paris-diderot.fr. Arkistoitu 31.3.2020. Viitattu 10.2.2020. (englanniksi)
- ↑ Three Models for the Description of Language – Internet Archive
- ↑ The Abstraction Principle cs.sjsu.edu. Viitattu 10.2.2020. (englanniksi)
- ↑ The Abstraction Principle cs.cornell.edu. Viitattu 10.2.2020. (englanniksi)
- ↑ Turing Machines plato.stanford.edu. Viitattu 7.2.2020. (englanniksi)
- ↑ a b Turing Completeness cs.odu.edu. Viitattu 10.2.2020. (englanniksi)
- ↑ Turing Complete wiki.c2.com. Viitattu 6.2.2020. (englanniksi)
- ↑ Paul E. Ceruzzi: A History of Modern Computing, s. 79. (Second edition) MIT Press, 1998. ISBN 0-262-53203-4 (englanniksi)
- ↑ Adam Vartanian: It doesn’t have to be Turing complete to be useful increment.com. Viitattu 7.2.2020. (englanniksi)
- ↑ An Approach for the Systematic Development of Domain-Specific Languages (PDF) eprints.cs.univie.ac.at. Viitattu 7.2.2020. (englanniksi)
- ↑ The language of languages matt.might.net. Viitattu 10.2.2020. (englanniksi)
- ↑ a b Yacc/Bison cs.ccu.edu.tw. Viitattu 10.2.2020. (englanniksi)
- ↑ a b Lawrence Snyder: Type Architectures, Shared Memmory, and the Corollary of Modest Potential (PDF) homes.cs.washington.edu. 1986. (englanniksi)
- ↑ a b c d Oualline, Steve: Practical C Programming. (Third edition) O'Reilly, 1997. ISBN 1-56592-306-5 (englanniksi)
- ↑ a b Ritchie, Dennis M.: The Development of the C Language bell-labs.com. Viitattu 24.7.2017.
- ↑ Ohjelmointiparadigmat, Turun yliopisto, Ohjelmoinnin jatkokurssi (Kev?t 2006), luentokalvot
- ↑ Stroustrup, Bjarne: The C++ Programming Language, 4th ed. Addison-Wesley, 2015. ISBN 0-321-56384-0 (englanniksi)
- ↑ David Hemmendinger: Computer programming language britannica.com. Viitattu 6.2.2020. (englanniksi)
- ↑ A simple taxonomy of programming languages keanw.com. 17.3.2008. Viitattu 23.3.2020. (englanniksi)
- ↑ TIOBE Index for November 2020 tiobe.com. Viitattu 22.11.2020. (englanniksi)
Aiheesta muualla
[muokkaa | muokkaa wikiteksti?]- Aikajana muutamista ohjelmointikielist? (englanniksi)
- What is Programming? (englanniksi)
- Koodikirja.fi