Programmeertaal

taal om instruksies aan 'n masjien te kommunikeer

'n Programmeertaal is 'n sistematiese metode waarmee mense berekenings vir mense of rekenaars kan beskryf. Programmeertale bestaan omdat ander vorme van uitdrukking, soos natuurlike tale, nie baie geskik is om berekening mee te beskryf nie.[1] Berekeninge wat in programmeertale uitgedruk word, word programme genoem en die opstel van 'n program word programmering genoem.

Die bronkode van 'n rekenaarprogram in C. Die grys reëls is kommentaar wat die program vir mense verduidelik. Wanneer dit vertaal en uitgevoer word, lewer dit die afvoer "Hello, world!".

Om 'n program op 'n rekenaar te kan uitvoer, is 'n implementering nodig: dit kan na 'n uitvoerbare program vertaal word, of dit kan geïnterpreteer word. Buiten dié twee uiterstes gebruik sommige implementerings hibriede benaderings soos intydse vertaling en die interpretasie van greepkode.[2]:46-51 Programmeertale word ook soms volgens die mate beskryf waartoe hulle hoëvlak- en/of laevlakopdragte en -konstrukte behartig.

Die ontwerp van programmeertale is sterk deur die rekenaarargitektuur beïnvloed: die meeste imperatiewe tale is om die alomteenwoordige Von Neumann-argitektuur ontwerp.[2]:41 Waar die vroeë programmeertale nou aan die hardeware gebonde was, maak moderne hoëvlaktale beter sagteware met minder moeite moontlik deurdat hulle op 'n hoër vlak van abstraksie werk.[3]

Duisende programmeertale is al geskep.[4] 'n Taal word gewoonlik in terme van 'n sintaks, wat die vorm van 'n program bepaal, en 'n semantiek, wat sy betekenis bepaal, gedefinieer. Die sintaks en grammatika van 'n programmeertaal word gewoonlik streng uiteengesit, sodat dit nie dubbelsinnig is vir 'n vertaler of interpreteerder nie.

Verhouding tot natuurlike tale

wysig

Programmeertale toon 'n mate van ooreenkoms met natuurlike tale deurdat hulle die uitruil van idees tussen mense moontlik maak. Programme is gewoonlik vir mense leesbaar en kan ingewikkelde idees uitdruk, maar die soort idees wat 'n programmeertaal kan uitdruk, bly tot die gebied van berekening beperk.[1]

Die term rekenaartaal word soms as sinoniem vir programmeertaal gebruik,[5] maar party voer aan dat dit verskillende begrippe is. Sommige hou programmeertale vir 'n deelversameling van rekenaartale.[6] Ander beskou 'n programmeertaal as 'n teoretiese konstruk waarmee 'n abstrakte masjien geprogrammeer word, en 'n rekenaartaal as die deel daarvan wat op 'n fisiese rekenaar met eindige hardewarehulpbronne loop.[7]

John C. Reynolds beklemtoon dat 'n formelespesifikasietaal net so veel 'n programmeertaal is as enige taal wat vir uitvoering bedoel is. Hy voer aan dat teks- en selfs grafiese invoerformate wat die gedrag van 'n rekenaar beïnvloed, programmeertale is, al is hulle gewoonlik nie Turing-volledig nie, en merk op dat onkunde oor programmeertaalbegrippe aan die wortel van baie gebreke in invoerformate lê.[8]

Geskiedenis

wysig

Vroeë ontwikkeling

wysig

Die eerste programmeerbare rekenaars is in die 1940's uitgevind, en daarmee saam die eerste programmeertale.[9][10]:519 Die vroegste rekenaars is in eerstegenerasietale geprogrammeer, oftewel masjientaal: eenvoudige instruksies wat die verwerker direk kon uitvoer. Dié kode was baie moeilik om te ontfout en kon nie tussen verskillende rekenaarstelsels oorgedra word nie.[10]:520-521 Om programmering te vergemaklik, is assembleertale, oftewel tweedegenerasietale, uitgevind, wat van masjientaal afgewyk het om programme vir mense makliker verstaanbaar te maak, al het dit nie die oordraagbaarheid verbeter nie.[10]:521

Aanvanklik was hardewarehulpbronne skaars en duur, terwyl menslike arbeid goedkoper was. Daarom is swaarhandige tale verkies wat tydsaam was om te gebruik, maar nader aan die hardeware gestaan het en dus doeltreffender was.[10]:522 Die koms van hoëvlaktale, oftewel derdegenerasietale, het programmering ingrypend verander. Dié tale het deur abstraksie van die besonderhede van die hardeware weggedoen en is eerder ontwerp om algoritmes uit te druk wat mense makliker kan verstaan. Rekenkundige uitdrukkings kon nou byvoorbeeld in simboliese notasie geskryf en later na masjienkode vertaal word wat die hardeware kon uitvoer.[10]:521 In 1957 is Fortran (FORmula TRANslation) uitgevind. Dit word dikwels as die eerste vertaalde hoëvlakprogrammeertaal beskou[10]:521[11]:42 en is tot in die een-en-twintigste eeu nog gebruik.[10]:524

1960's en 1970's

wysig
Twee mense gebruik in 1957 'n IBM 704-hoofraamrekenaar, die eerste hardeware wat vlottendepuntrekenkunde ondersteun het. Fortran is vir dié masjien ontwerp.[11]:42-44[10]:524

Omstreeks 1960 is die eerste hoofraamrekenaars, oftewel algemenedoelrekenaars, ontwikkel, hoewel net vakkundiges hulle kon bedryf en die koste buitengewoon hoog was. Data en instruksies is met ponskaarte ingevoer, wat beteken het dat geen invoer bygevoeg kon word terwyl die program loop nie. Die tale van dié tyd is gevolglik vir die minimum interaksie ontwerp.[10]:523-524 Na die uitvinding van die mikroverwerker het rekenaars in die 1970's dramaties goedkoper geword.[10]:527 Nuwe rekenaars het ook meer gebruikerinteraksie toegelaat, wat deur nuwer programmeertale ondersteun is.[10]:528

Lisp, wat in 1958 geïmplementeer is, was die eerste funksionele programmeertaal.[12] In teenstelling met Fortran het dit rekursie en voorwaardelike uitdrukkings ondersteun,[11]:47-48 en dit het ook dinamiese geheuebestuur op 'n hoop en outomatiese afvalinsameling ingevoer.[10]:526 Lisp het die volgende dekades lank die toepassings van kunsmatige intelligensie oorheers.[11]:50 In 1978 het 'n ander funksionele taal, ML, afgeleide tipes en polimorfiese parameters ingevoer.[10]:528[11]:701-703

Nadat ALGOL (ALGOrithmic Language) in 1958 en 1960 vrygestel is,[10]:524-525 het dit die standaard in die rekenaarliteratuur geword om algoritmes te beskryf. Hoewel sy kommersiële sukses beperk was, stam die gangbaarste imperatiewe tale, waaronder C, Pascal, Ada, C++, Java en C#, direk of onregstreeks van ALGOL 60 af.[11]:56-57[10]:524 Onder sy vernuwings wat later programmeertale oorgeneem het, tel groter oordraagbaarheid en die eerste gebruik van 'n konteksvrye BNF-grammatika.[10]:525 Simula, die eerste taal wat objekgeoriënteerde programmering ondersteun het, met inbegrip van subtipes, dinamiese afvaardiging en oorerwing, stam ook van ALGOL af en het kommersiële sukses behaal.[10]:526-527 C, nog 'n afstammeling van ALGOL, het sy gewildheid tot in die een-en-twintigste eeu behou. C gee toegang tot laervlakmasjienoperasies as ander tale van sy tyd. Sy krag en doeltreffendheid, wat deels uit buigsame wyseroperasies kom, gaan met die nadeel gepaard dat dit moeiliker is om korrekte kode te skryf.[10]:528

Prolog, wat in 1972 ontwerp is, was die eerste logiese programmeertaal en kommunikeer met 'n rekenaar in die notasie van formele logika.[10]:531[11]:79 By logiese programmering spesifiseer die programmeerder 'n verlangde resultaat en laat die interpreteerder besluit hoe om dit te bereik.[10]:530[11]:79

1980's tot 2000's

wysig
'n Klein keur uit handboeke oor programmeertale te koop in Bangalore, Indië, 2011

In die 1980's het die uitvinding van die persoonlike rekenaar die rolle waarvoor programmeertale gebruik is, omgekeer.[10]:532-533 Nuwe tale van die 1980's het C++ ingesluit, 'n superversameling van C wat C-programme kan vertaal maar ook klasse en oorerwing ondersteun.[10]:534 Ada en ander nuwe tale het ondersteuning vir gelyklopendheid ingevoer.[10]:534-535 Die Japannese regering het swaar in die sogenaamde vyfdegenerasietale belê, wat gelyklopendheid by die konstrukte van logiese programmering gevoeg het, maar dié tale is deur ander tale met gelyklopendheidsondersteuning oortref.[10]:535[11]:736

Weens die snelle groei van die Internet en die Wêreldwye web in die 1990's is nuwe programmeertale ingevoer om webbladsye en rekenaarnetwerke te ondersteun.[10]:536 Java, wat op C++ gegrond is en vir groter oordraagbaarheid tussen stelsels en vir sekuriteit ontwerp is, het groot sukses behaal omdat dié eienskappe vir baie internettoepassings noodsaaklik is.[10]:536-537[11]:91-92 'n Verdere ontwikkeling was dié van dinamies getipeerde skriftale, naamlik Python, JavaScript, PHP en Ruby, wat ontwerp is om vinnig klein programme te lewer wat bestaande toepassings koördineer. Omdat hulle met HTML integreer, is hulle ook gebruik om webbladsye te bou wat op bedieners gehuisves word.[10]:538-539[11]:97-99

2000's tot nou

wysig

In die 2000's het die ontwikkeling van nuwe programmeertale wat wye gewildheid behaal, verlangsaam.[10]:542 Een vernuwing was diensgeoriënteerde programmering, wat ontwerp is om verspreide rekenaarstelsels te ontgin waarvan die komponente deur 'n netwerk verbind is. Dienste stem met objekte in objekgeoriënteerde programmering ooreen, maar loop in 'n afsonderlike proses.[10]:474-475, 477, 542 C# en F# het idees tussen imperatiewe en funksionele programmering oorgedra.[10]:542-543 Ná 2010 het verskeie nuwe tale, naamlik Rust, Go, Swift, Zig en Carbon, om die werkverrigtingkritiese sagteware meegeding waarvoor C histories gebruik is.[10]:544 Die meeste nuwe programmeertale gebruik statiese tipering, terwyl enkele nuwe tale soos Julia dinamiese tipering gebruik.[13]

Sommige van die nuwe programmeertale word as visuele programmeertale geklassifiseer, soos Scratch en LabVIEW. Party van dié tale meng teks- en visuele programmering, soos Ballerina.[14][15][16] Baie speletjie-enjins, soos Unreal en Unity, ondersteun visuele skripting.[17][18]

Definisie

wysig

'n Programmeertaal word dikwels deur die spesifikasie van 'n formele taal vasgelê, waarin sowel sy sintaks, oftewel sy vorm, as sy semantiek, oftewel sy betekenis, uiteengesit word.

Sintaks

wysig
Ontleedboom van Python-kode met 'n insetsel wat die tokenisering wys
Sintakskleuring word dikwels gebruik om programmeerders te help om die elemente van bronkode te herken. Die taal hierbo is Python.

Die oppervlakvorm van 'n programmeertaal staan as sy sintaks bekend. Die meeste programmeertale is suiwer tekstueel: hulle gebruik rye teks met woorde, syfers en interpunksie, net soos geskrewe natuurlike tale. Daarteenoor is sommige programmeertale grafies en gebruik hulle visuele verhoudings tussen simbole om 'n program te spesifiseer.

Die sintaks van 'n taal beskryf die moontlike kombinasies van simbole wat 'n sintakties korrekte program vorm. Die betekenis wat aan 'n kombinasie van simbole gegee word, word deur die semantiek hanteer, hetsy formeel, hetsy vas ingebou in 'n verwysingsimplementering. Aangesien die meeste tale tekstueel is, behandel hierdie artikel tekstuele sintaks.

Die sintaks van 'n programmeertaal word gewoonlik met 'n kombinasie van reguliere uitdrukkings, vir die leksikale struktuur, en die Backus-Naur-vorm, vir die grammatikale struktuur, gedefinieer. Hieronder volg 'n eenvoudige grammatika wat op Lisp gegrond is:

expression ::= atom | list
atom       ::= number | symbol
number     ::= [+-]?['0'-'9']+
symbol     ::= ['A'-'Z''a'-'z'].*
list       ::= '(' expression* ')'

Dié grammatika spesifiseer die volgende:

  • 'n expression is óf 'n atom óf 'n list;
  • 'n atom is óf 'n number óf 'n symbol;
  • 'n number is 'n ononderbroke ry van een of meer desimale syfers, met 'n plus- of minusteken wat dit opsioneel voorafgaan;
  • 'n symbol is 'n letter wat deur nul of meer alfabetiese karakters gevolg word, spasies uitgesluit; en
  • 'n list is 'n passende paar hakies met nul of meer expressions daarbinne.

Die volgende is voorbeelde van goedgevormde tokenrye in dié grammatika: 12345, () en (a b c232 (1)).

Nie alle sintakties korrekte programme is semanties korrek nie. Baie sintakties korrekte programme is nogtans volgens die reëls van die taal wangevorm en kan, na gelang van die taalspesifikasie en die deugdelikheid van die implementering, 'n fout tydens vertaling of uitvoering veroorsaak. In sommige gevalle is die gedrag van sulke programme ongedefinieerd. Selfs wanneer 'n program binne 'n taal goed gedefinieer is, kan dit steeds 'n betekenis hê wat die skrywer nie bedoel het nie.

As 'n mens natuurlike taal as voorbeeld neem, is dit soms nie moontlik om 'n betekenis aan 'n grammatikaal korrekte sin toe te ken nie, of is die sin onwaar:

  • "Kleurlose groen idees slaap woedend" is grammatikaal goedgevormd maar het geen algemeen aanvaarde betekenis nie.
  • "Jan is 'n getroude oujongkêrel" is grammatikaal goedgevormd maar druk 'n betekenis uit wat nie waar kan wees nie.

Die volgende brokkie C-kode is sintakties korrek, maar voer operasies uit wat nie semanties gedefinieer is nie: die operasie *p >> 4 het geen betekenis vir 'n waarde met 'n komplekse tipe nie, en p->im is nie gedefinieer nie omdat die waarde van p die nulwyser is.

complex *p = NULL;
complex abs_p = sqrt(*p >> 4 + p->im);

Sou die tipeverklaring op die eerste reël weggelaat word, sou die program tydens vertaling 'n fout oor die ongedefinieerde veranderlike p veroorsaak. Die program sou egter steeds sintakties korrek wees, aangesien tipeverklarings slegs semantiese inligting verskaf.

Die grammatika wat nodig is om 'n programmeertaal te spesifiseer, kan volgens sy plek in die Chomsky-hiërargie geklassifiseer word. Die sintaks van die meeste programmeertale kan met 'n tipe 2-grammatika, met ander woorde met 'n konteksvrye grammatika, gespesifiseer word.[19] Sommige tale, waaronder Perl en Lisp, bevat konstrukte wat uitvoering tydens die ontledingsfase toelaat. Tale met konstrukte waarmee die programmeerder die gedrag van die ontleder kan verander, maak sintaksanalise 'n onbeslisbare probleem en laat die onderskeid tussen ontleding en uitvoering in die algemeen verdof.[20] In teenstelling met Lisp se makrostelsel en Perl se BEGIN-blokke, wat algemene berekeninge kan bevat, is C se makro's bloot stringvervangings en verg hulle geen uitvoering van kode nie.[21]

Semantiek

wysig

Semantiek verwys na die betekenis van inhoud wat aan 'n taal se sintaks voldoen.

Statiese semantiek

wysig

Statiese semantiek stel beperkings op die struktuur van geldige tekste wat moeilik of onmoontlik is om in standaard sintaktiese formalismes uit te druk. By vertaalde tale sluit statiese semantiek in wese dié semantiese reëls in wat tydens vertaling nagegaan kan word. Voorbeelde is 'n kontrole dat elke identifiseerder verklaar is voordat dit gebruik word, in tale wat sulke verklarings vereis, of dat die etikette op die arms van 'n gevalstelling van mekaar verskil.[22] Baie belangrike beperkings van dié aard kan as reëls in 'n logika wat 'n tipestelsel genoem word, vasgelê word: 'n kontrole dat identifiseerders in die toepaslike konteks gebruik word, byvoorbeeld dat 'n heelgetal nie by 'n funksienaam gevoeg word nie, of dat subroetine-aanroepe die regte getal argumente van die regte tipe het. Ander vorme van statiese analise, soos datavloei-analise, kan ook deel van die statiese semantiek wees. Programmeertale soos Java en C# het bepaaldetoekenninganalise, 'n vorm van datavloei-analise, as deel van hul statiese semantiek.[23]

Dinamiese semantiek

wysig

Sodra die data gespesifiseer is, moet die masjien opdrag ontvang om operasies op die data uit te voer. Die semantiek kan byvoorbeeld die strategie vasstel waarmee uitdrukkings tot waardes geëvalueer word, of die wyse waarop beheerstrukture stellings voorwaardelik uitvoer. Die dinamiese semantiek, ook bekend as die uitvoeringsemantiek, van 'n taal bepaal hoe en wanneer die onderskeie konstrukte van 'n taal 'n programgedrag moet lewer. Daar is baie maniere om uitvoeringsemantiek te definieer. Natuurlike taal word dikwels gebruik om die uitvoeringsemantiek van tale wat in die praktyk algemeen gebruik word, te spesifiseer. 'n Aansienlike hoeveelheid akademiese navorsing word aan die formele semantiek van programmeertale gewy, wat dit moontlik maak om uitvoeringsemantiek op 'n formele wyse te spesifiseer.[24]

Eienskappe

wysig

'n Taal verskaf eienskappe waarmee 'n programmeerder sagteware kan ontwikkel. Enkele opvallende eienskappe word hieronder beskryf.

Tipestelsel

wysig

'n Datatipe is 'n versameling toelaatbare waardes en operasies wat op dié waardes uitgevoer kan word.[11]:244 Elke programmeertaal se tipestelsel bepaal watter datatipes bestaan, wat die tipe van 'n uitdrukking is, en hoe tipe-ekwivalensie en tipeversoenbaarheid in die taal werk.[11]:245

Volgens die tipeteorie is 'n taal volledig getipeer as die spesifikasie van elke operasie die datatipes bepaal waarop die operasie van toepassing is.[25] Daarteenoor laat 'n ongetipeerde taal, soos die meeste assembleertale, enige operasie op enige data toe, gewoonlik rye bisse van verskillende lengtes.[25] In die praktyk is min tale volledig getipeer, maar die meeste bied 'n mate van tipering.[25]

Omdat verskillende tipes, soos heelgetalle en vlottendepuntgetalle, waardes verskillend verteenwoordig, volg onverwagte uitkomste wanneer die een tipe gebruik word waar die ander verwag word. Tipekontrole merk dié fout, gewoonlik tydens vertaling, aangesien tipekontrole tydens looptyd duurder is.[11]:15, 408-409 By sterk tipering kan tipefoute altyd opgespoor word, tensy veranderlikes uitdruklik na 'n ander tipe omgeskakel word. Swak tipering kom voor wanneer tale implisiete omskakeling toelaat, byvoorbeeld om operasies tussen veranderlikes van verskillende tipes moontlik te maak sonder dat die programmeerder 'n uitdruklike tipe-omskakeling doen. Hoe meer gevalle waarin sulke tipedwang toegelaat word, hoe minder tipefoute kan opgespoor word.[11]:303-304

Algemeen ondersteunde tipes

wysig

Vroeë programmeertale het dikwels net ingeboude numeriese tipes ondersteun, soos die heelgetal, met en sonder teken, en die vlottendepuntgetal, wat operasies op reële getalle wat nie heelgetalle is nie, moontlik maak. Die meeste programmeertale ondersteun verskeie groottes vlottendepuntgetalle, dikwels float en double genoem, en heelgetalle na gelang van die grootte en presisie wat die programmeerder nodig het. Wanneer 'n heelgetal in 'n tipe gestoor word wat te klein is om dit te verteenwoordig, lei dit tot heelgetaloorloop. Negatiewe getalle word met tekentipes meestal in tweekomplement verteenwoordig, hoewel eenkomplement ook gebruik word.[11]:246-247 Ander algemene tipes is die Boole-tipe, wat óf waar óf onwaar is, en die karakter, tradisioneel een greep, wat genoeg is om al die ASCII-karakters te verteenwoordig.[11]:249

Skikkings is 'n datatipe waarvan die elemente in baie tale uit 'n enkele tipe van vaste lengte moet bestaan. Ander tale definieer skikkings as verwysings na data wat elders gestoor word, en ondersteun elemente van verskillende tipes.[11]:260 Afhangend van die programmeertaal kan rye van meer as een karakter, wat strings genoem word, as skikkings van karakters of as 'n eie primitiewe tipe ondersteun word.[11]:250 Strings kan van vaste of veranderlike lengte wees, wat groter buigsaamheid teen die prys van meer bergingsruimte en meer ingewikkeldheid bied.[11]:254 Ander datatipes wat ondersteun kan word, is lyste,[11]:281-282 assosiatiewe oftewel ongeordende skikkings wat met sleutels bereik word,[11]:272-273 rekords waarin data in 'n geordende struktuur op name afgebeeld word,[11]:276-277 en tupels, wat met rekords ooreenstem maar sonder name vir die datavelde.[11]:280 Wysers stoor geheueadresse en verwys gewoonlik na plekke op die hoop waar ander data gestoor word.[11]:289-290

Die eenvoudigste gebruikergedefinieerde tipe is 'n ordinale tipe, dikwels 'n enumerasie genoem, waarvan die waardes op die versameling positiewe heelgetalle afgebeeld kan word.[11]:255 Sedert die middel 1980's ondersteun die meeste programmeertale ook abstrakte datatipes, waarin die verteenwoordiging van die data en die operasies vir die gebruiker verborge is en net 'n koppelvlak bereikbaar is.[11]:244-245 Die voordele van data-abstraksie kan groter betroubaarheid, minder ingewikkeldheid en minder kans op naambotsings insluit, en laat toe dat die onderliggende datastruktuur sonder enige aanpassing van die kliënt se kode verander word.[11]:477

Statiese en dinamiese tipering

wysig

By statiese tipering word die tipes van alle uitdrukkings bepaal voordat 'n program uitgevoer word, gewoonlik tydens vertaling.[25] Die meeste wydgebruikte, staties getipeerde programmeertale verg dat die tipes van veranderlikes uitdruklik gespesifiseer word. In sommige tale is tipes implisiet; een vorm hiervan is wanneer die vertaler tipes uit die konteks kan aflei. Die nadeel van implisiete tipering is dat foute moontlik onopgemerk bly.[11]:211 Volledige tipe-afleiding word tradisioneel met funksionele tale soos Haskell en ML verbind.[26]

By dinamiese tipering is die tipe nie aan die veranderlike gekoppel nie, maar net aan die waarde wat daarin vervat is. 'n Enkele veranderlike kan vir 'n waarde van 'n ander tipe hergebruik word. Hoewel dit die programmeerder meer buigsaamheid gee, kom dit teen die prys van laer betroubaarheid en van 'n kleiner vermoë by die programmeertaal om vir foute te kontroleer.[11]:212-213 Sommige tale laat veranderlikes van 'n verenigingstipe toe waaraan enige tipe waarde toegeken kan word, as uitsondering op hul gewone reëls vir statiese tipering.[11]:284-285

Gelyklopendheid

wysig

In die rekenaarwese kan verskeie instruksies gelyktydig uitgevoer word. Baie programmeertale ondersteun gelyklopendheid op instruksievlak en op subprogramvlak.[11]:576 Teen die een-en-twintigste eeu het bykomende verwerkingskrag op rekenaars toenemend uit die gebruik van bykomende verwerkers gekom, wat van programmeerders verg om sagteware te ontwerp wat verskeie verwerkers gelyktydig gebruik om beter werkverrigting te behaal.[11]:579 Geïnterpreteerde tale soos Python en Ruby ondersteun nie die gelyklopende gebruik van verskeie verwerkers nie.[11]:585 Ander programmeertale ondersteun wel die bestuur van data wat tussen verskillende drade gedeel word, deur die volgorde waarin sleutelinstruksies uitgevoer word met semafore te beheer, deur toegang tot gedeelde data met 'n monitor te beheer, of deur boodskapoordrag tussen drade moontlik te maak.[11]:585-586

Uitsonderinghantering

wysig

Baie programmeertale bevat uitsonderinghanteerders, 'n gedeelte kode wat deur looptydfoute geaktiveer word en hulle op twee hoofmaniere kan hanteer:[11]:630, 634

  • Beëindiging: die program sluit af en gee beheer aan die bedryfstelsel oor. Dié keuse word as die eenvoudigste beskou.
  • Hervatting: die program hervat naby waar die uitsondering voorgekom het. Dit kan 'n herhaling van die uitsondering veroorsaak, tensy die uitsonderinghanteerder waardes kan verander om te voorkom dat die uitsondering weer voorkom.

Sommige programmeertale ondersteun dit dat 'n blok kode uitgevoer word ongeag of 'n uitsondering voorkom voordat die kode bereik word; dit word finalisering genoem.[11]:635

Daar is 'n afweging tussen 'n groter vermoë om uitsonderings te hanteer en swakker werkverrigting.[11]:631 Al is foute met skikkingindekse algemeen,[11]:261 kontroleer C hulle byvoorbeeld om werkverrigtingsredes nie.[11]:631 Hoewel programmeerders kode kan skryf om gebruikergedefinieerde uitsonderings te vang, kan dit 'n program onoorsigtelik maak. Die standaardbiblioteke van sommige tale, soos C, gebruik hul terugkeerwaardes om 'n uitsondering aan te dui.[11]:632 Sommige tale en hul vertalers kan fouthantering tydelik of permanent aan- en afskakel.[11]:631, 635-636

Ontwerp en implementering

wysig

Een van die belangrikste invloede op die ontwerp van programmeertale was die rekenaarargitektuur. Imperatiewe tale, die gangbaarste soort, is ontwerp om goed op die Von Neumann-argitektuur te werk, die algemeenste argitektuur vir digitale rekenaars.[11]:18 In die Von Neumann-argitektuur stoor die geheue sowel die data as die instruksies, terwyl die sentrale verwerkingseenheid wat die instruksies op die data uitvoer, apart staan en data heen en weer daarheen gevoer moet word. Die sentrale elemente in dié tale is veranderlikes, toekenning en iterasie, wat op sulke masjiene doeltreffender is as rekursie.[11]:19

Baie programmeertale is van nuuts af ontwerp, aangepas om nuwe behoeftes te dien en met ander tale gekombineer, en baie het mettertyd in onbruik verval. Die geboorte van programmeertale in die 1950's is deur die begeerte aangespoor om 'n universele programmeertaal te skep wat vir alle masjiene en doeleindes geskik is, sodat kode nie vir verskillende rekenaars geskryf hoef te word nie.[27]:55 Teen die vroeë 1960's is die gedagte van 'n universele taal laat vaar weens die verskillende vereistes van die verskeidenheid doeleindes waarvoor kode geskryf is.[27]:60

Afwegings

wysig

Gewenste eienskappe van programmeertale is leesbaarheid, skryfbaarheid en betroubaarheid.[11]:8 Dié eienskappe kan die koste om programmeerders in 'n taal op te lei, die tyd wat nodig is om programme in die taal te skryf en te onderhou en die koste om die kode te vertaal, verminder, en kan terselfdertyd die werkverrigting tydens looptyd verhoog.[11]:16-17

  • Hoewel vroeë programmeertale dikwels doeltreffendheid bo leesbaarheid gestel het, het leesbaarheid sedert die 1970's in belang gegroei. Verskeie operasies wat dieselfde resultaat lewer, kan die leesbaarheid skaad, net soos operatoroorlading, waardeur dieselfde operator meer as een betekenis kan hê.[11]:8-9 Nog 'n eienskap wat vir leesbaarheid belangrik is, is ortogonaliteit, wat die getal konstrukte beperk wat 'n programmeerder moet leer.[11]:9-10 'n Sintaksstruktuur wat maklik verstaanbaar is en spesiale woorde wat onmiddellik duidelik is, dra ook tot leesbaarheid by.[11]:12-13
  • Skryfbaarheid is die gemak waarmee kode geskryf kan word om die verlangde probleem op te los. Saam met dieselfde eienskappe wat vir leesbaarheid noodsaaklik is,[11]:13 help abstraksie, oftewel koppelvlakke wat besonderhede vir die kliënt verberg, en uitdrukkingskrag, wat korter programme moontlik maak, die programmeerder verder om kode te skryf.[11]:14-15 Namate die ondersteuning vir abstraksie gegroei het, kon programmeerders idees uitdruk wat verder van 'n eenvoudige vertaling na onderliggende hardeware-instruksies af staan, en kan hulle programme meer berekening met minder moeite van die programmeerder doen.[28] Die meeste programmeertale kom met 'n standaardbiblioteek van algemeen gebruikte funksies.[29]
  • Betroubaarheid beteken dat 'n program onder 'n wye verskeidenheid omstandighede presteer soos gespesifiseer.[11]:15 Tipekontrole, uitsonderinghantering en beperkte aliasvorming, waar meer as een naam van 'n veranderlike dieselfde gebied van die geheue bereik, kan alles 'n program se betroubaarheid verbeter.[11]:8, 16

Die ontwerp van 'n programmeertaal gaan dikwels met afwegings gepaard.[11]:18, 23 Eienskappe wat die betroubaarheid verbeter, kom byvoorbeeld meestal teen die prys van werkverrigting.[11]:23 Groter uitdrukkingskrag deur 'n groot getal operators maak dit makliker om kode te skryf, maar kom teen die prys van leesbaarheid.[11]:23

Natuurliketaalprogrammering is as 'n manier voorgestel om die behoefte aan 'n gespesialiseerde taal vir programmering uit te skakel. Dié doel is egter nog nie bereik nie en die voordele daarvan is oop vir debat. Edsger W. Dijkstra het die standpunt gehuldig dat die gebruik van 'n formele taal noodsaaklik is om die invoer van sinlose konstrukte te voorkom.[30] Alan Perlis was net so afwysend oor die gedagte.[31]

Spesifikasie

wysig

Die spesifikasie van 'n programmeertaal is 'n artefak waarmee die gebruikers en die implementeerders van die taal kan ooreenkom of 'n stuk bronkode 'n geldige program in dié taal is, en indien wel, wat sy gedrag moet wees.

'n Spesifikasie van 'n programmeertaal kan verskeie vorme aanneem, waaronder die volgende:

  • 'n Uitdruklike definisie van die sintaks, die statiese semantiek en die uitvoeringsemantiek van die taal. Terwyl die sintaks gewoonlik met 'n formele grammatika gespesifiseer word, kan semantiese definisies in natuurlike taal geskryf word, soos in die geval van C, of as 'n formele semantiek, soos in die spesifikasies van Standard ML[32] en Scheme.[33]
  • 'n Beskrywing van die gedrag van 'n vertaler vir die taal, soos in die spesifikasies van C++ en Fortran. Die sintaks en semantiek van die taal moet uit dié beskrywing afgelei word, wat in natuurlike of formele taal geskryf kan wees.
  • 'n Verwysings- of modelimplementering, soms in die taal self geskryf, soos in die geval van Prolog of ANSI REXX.[34] Die sintaks en semantiek van die taal is uitdruklik in die gedrag van die verwysingsimplementering.

Implementering

wysig

'n Implementering van 'n programmeertaal is die omsetting van 'n program in masjienkode wat die hardeware kan uitvoer. Die masjienkode kan dan met die hulp van die bedryfstelsel uitgevoer word.[11]:23-24 Die algemeenste vorm van implementering in produksiekode is deur 'n vertaler, wat die bronkode deur 'n tussentaal na masjienkode omsit, bekend as 'n uitvoerbare program. Sodra die program vertaal is, loop dit vinniger as met ander implementeringsmetodes.[11]:25-27 Sommige vertalers kan verdere optimering bied om die gebruik van geheue of berekening te verminder wanneer die uitvoerbare program loop, maar dit verleng die vertaaltyd.[11]:27

'n Ander implementeringsmetode is om die program met 'n interpreteerder te laat loop, wat elke reël sagteware net voor uitvoering na masjienkode omsit. Al kan dit ontfouting vergemaklik, is die nadeel van interpretasie dat dit 10 tot 100 keer stadiger loop as 'n vertaalde uitvoerbare program.[11]:28 Hibriede metodes van interpretasie bied deur gedeeltelike vertaling party van die voordele van vertaling en party van die voordele van interpretasie. Een vorm hiervan is intydse vertaling, waarby die sagteware vooraf na 'n tussentaal vertaal word en dan onmiddellik voor uitvoering na masjienkode.[11]:29-30

Eiendomstale

wysig

Hoewel die meeste van die gangbaarste programmeertale oop spesifikasies en implementerings het, bestaan baie programmeertale net as eiendomstale waarvan die implementering slegs van een verskaffer beskikbaar is. Sommige tale lê op die grens tussen eiendomsreg en openheid: Oracle maak byvoorbeeld aanspraak op eiendomsreg op sommige aspekte van die programmeertaal Java, en Microsoft se C#, waarvan die meeste dele oop implementerings het, het in die Common Language Runtime ook 'n geslote omgewing.[35]

Baie eiendomstale word ten spyte van hul geslote aard wyd gebruik; voorbeelde is MATLAB, VBScript en die Wolfram-taal. Sommige tale maak die oorgang van geslote na oop: Erlang was oorspronklik Ericsson se interne programmeertaal.[36]

Oopbronprogrammeertale is veral nuttig vir toepassings in die oop wetenskap, aangesien hulle die vermoë tot replikasie en tot die deel van kode verbeter.[37]

Gebruik

wysig

Duisende verskillende programmeertale is geskep, hoofsaaklik op die gebied van die rekenaarwese.[4] Individuele sagtewareprojekte gebruik gewoonlik vyf of meer programmeertale.[38]

Programmeertale verskil van die meeste ander vorme van menslike uitdrukking deurdat hulle 'n groter mate van presisie en volledigheid verg. Wanneer mense natuurlike taal gebruik om met ander mense te kommunikeer, kan skrywers en sprekers dubbelsinnig wees en klein foute maak en steeds verwag dat hul bedoeling verstaan word. Rekenaars doen egter, figuurlik gesproke, presies wat hulle beveel word en kan nie "verstaan" watter kode die programmeerder bedoel het om te skryf nie. Die kombinasie van die taaldefinisie, 'n program en die program se invoere moet die eksterne gedrag wat tydens uitvoering voorkom, binne die beheergebied van dié program volledig bepaal. Idees oor 'n algoritme kan daarteenoor met pseudokode aan mense oorgedra word, sonder die presisie wat vir uitvoering nodig is; pseudokode wissel natuurlike taal met kode in 'n programmeertaal af.

'n Programmeertaal verskaf 'n gestruktureerde meganisme om stukke data te definieer, sowel as die operasies of transformasies wat outomaties op dié data uitgevoer kan word. 'n Programmeerder gebruik die abstraksies in die taal om die begrippe in 'n berekening te verteenwoordig. Dié begrippe word as 'n versameling van die eenvoudigste beskikbare elemente verteenwoordig, wat primitiewe genoem word.[39] Programmering is die proses waardeur programmeerders dié primitiewe kombineer om nuwe programme saam te stel, of bestaande programme vir nuwe gebruike of 'n veranderende omgewing aan te pas.

Programme vir 'n rekenaar kan in 'n bondelproses sonder enige menslike wisselwerking uitgevoer word, of 'n gebruiker kan opdragte in 'n interaktiewe sessie van 'n interpreteerder tik. In dié geval is die "opdragte" bloot programme waarvan die uitvoering aaneengeskakel word. Wanneer 'n taal sy opdragte sonder om te vertaal deur 'n interpreteerder kan laat loop, soos 'n Unix-dop of 'n ander opdraglynkoppelvlak, word dit 'n skriftaal genoem.[40]

Meting van taalgebruik

wysig

Dit is moeilik om te bepaal watter programmeertaal die wydste gebruik word, aangesien die definisie van gebruik volgens die konteks wissel. Die een taal kan die grootste getal programmeerderure in beslag neem, 'n ander het meer reëls kode, en 'n derde gebruik die meeste verwerkertyd. Sommige tale is baie gewild vir bepaalde soorte toepassings. COBOL staan byvoorbeeld steeds sterk in die korporatiewe datasentrum, dikwels op groot hoofraamrekenaars;[41][42] Fortran in wetenskaplike en ingenieurstoepassings; Ada in die lug- en ruimtevaart, vervoer, die weermag en intydse en ingebedde toepassings; en C in ingebedde toepassings en bedryfstelsels. Ander tale word gereeld gebruik om baie verskillende soorte toepassings te skryf.

Verskeie metodes om die gewildheid van 'n taal te meet, elk met sy eie sydigheid oor wat gemeet word, is voorgestel:

  • om die getal werksadvertensies te tel wat die taal vermeld[43]
  • die getal boeke wat verkoop word wat die taal onderrig of beskryf[44]
  • skattings van die getal bestaande reëls kode wat in die taal geskryf is, wat tale wat nie dikwels in openbare soektogte voorkom nie, kan onderskat[45]
  • tellings van verwysings na die naam van die taal wat met 'n soekenjin op die web gevind word.

In Junie 2024 was Python, C++, C, Java en C# volgens die TIOBE-indeks die vyf voorste programmeertale. TIOBE verskaf 'n lys van die 100 voorste programmeertale volgens sy indeks en werk dié lys maandeliks by.[46]

Volgens die personeel van IEEE Spectrum kan die gewildste programmeertale van vandag hul oorheersing weens die manier waarop kunsmatige intelligensie werk, behou. Dit sal gevolglik vir nuwe tale moeiliker wees om gewild te raak, aangesien programmeerders nie baie programme daarin sal skryf nie.[47]

Klassifikasies

wysig

Programmeertale kan volgens die volgende hoëvlakklassifikasies beskryf word, wat soms oorvleuel:[11]:21

Imperatief
'n Imperatiewe programmeertaal ondersteun die implementering van logika wat as 'n reeks geordende operasies geënkodeer is. Die meeste gangbare tale word as imperatief geklassifiseer.[11]:21-22
Funksioneel
'n Funksionele programmeertaal ondersteun die opeenvolgende toepassing van funksies op die gegewe parameters. Hoewel baie navorsers dit om sy eenvoud en elegansie waardeer, het probleme met doeltreffendheid verhoed dat dit wyd aanvaar word.[11]:12
Logies
'n Logiese programmeertaal is so ontwerp dat die sagteware, eerder as die programmeerder, besluit in watter volgorde die instruksies uitgevoer word.[11]:22
Objekgeoriënteerd
Objekgeoriënteerde programmering word deur eienskappe soos data-abstraksie, oorerwing en dinamiese afvaardiging gekenmerk. Dit word deur die meeste gangbare imperatiewe tale en sommige funksionele tale ondersteun.[11]:21-22
Opmaak
Hoewel 'n opmaaktaal nie as sulks 'n programmeertaal is nie, kan dit integrasie met 'n programmeertaal ondersteun.
Spesiaal
Daar is spesialedoeltale wat nie maklik met ander programmeertale vergelyk kan word nie.[11]:22-23

Sien ook

wysig

Verwysings

wysig
  1. 1 2 Chauhan, Sharad (2013). "10". Programming Languages - Design and Constructs. University Science Press. p. 235. ISBN 978-93-81159-41-5. Besoek op 10 September 2025.
  2. 1 2 Sebesta, Robert W. (2022). Concepts of Programming Languages: Global Edition (12de globale uitg.). Harlow: Pearson. ISBN 978-1-292-43682-1.
  3. ↑ "High-level languages". Ada Computer Science. 11 Mei 2026.
  4. 1 2 "HOPL: an interactive Roster of Programming Languages". Australië: Murdoch Universiteit. Geargiveer vanaf die oorspronklike op 18 Februarie 2009. Besoek op 1 Junie 2009. This site lists 8512 languages.
  5. ↑ Robert A. Edmunds, The Prentice-Hall Standard Glossary of Computer Terminology, Prentice-Hall, 1985, p. 91.
  6. ↑ Pascal Lando, Anne Lapujade, Gilles Kassel en Frédéric Fürst, Towards a General Ontology of Computer Programs Geargiveer 7 Julie 2015 op Wayback Machine, ICSOFT 2007 Geargiveer 27 April 2010 op Wayback Machine, pp. 163-170.
  7. ↑ R. Narasimhan, "Programming Languages and Computers: A Unified Metatheory", pp. 189-247 in Franz Alt en Morris Rubinoff (reds.), Advances in Computers, Volume 8, Academic Press, 1994, ISBN 0-12-012108-5, p. 215.
  8. ↑ John C. Reynolds, "Some thoughts on teaching programming and programming languages", SIGPLAN Notices, Volume 43, Uitgawe 11, November 2008, p. 109.
  9. ↑ Hierso, Severine (10 Junie 2022). "Coding From 1849 to 2022: a Guide to The Timeline of Programming Languages". IEEE Computer Society. Geargiveer vanaf die oorspronklike op 1 Maart 2026. Besoek op 1 Maart 2026.
  10. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Gabbrielli, Maurizio; Martini, Simone (2023). Programming Languages: Principles and Paradigms (2de uitg.). Springer. ISBN 978-3-031-34144-1.
  11. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 Sebesta, Robert W. (2012). Concepts of Programming Languages (10de uitg.). Addison-Wesley. ISBN 978-0-13-139531-2.
  12. ↑ "How Lisp Became God's Own Programming Language". twobithistory.org. Geargiveer vanaf die oorspronklike op 10 April 2024. Besoek op 10 April 2024.
  13. ↑ Bezanson, Jeff; Karpinski, Stefan; Shah, Viral B.; Edelman, Alan (2012). "Julia: A Fast Dynamic Language for Technical Computing". [cs.PL].
  14. ↑ Sáez-López, J. M.; Román-González, M.; Vázquez-Cano, E. (2016). "Visual programming languages integrated across the curriculum in elementary school: A two year case study using "Scratch" in five schools". Computers & Education. 97: 129-141.
  15. ↑ Kodosky, J. (2020). "LabVIEW". Proceedings of the ACM on Programming Languages. 4 (HOPL): 1-54.
  16. ↑ Fernando, A.; Warusawithana, L. (2020). Beginning Ballerina Programming: From Novice to Professional. Apress.
  17. ↑ Sewell, B. (2015). Blueprints Visual Scripting for Unreal Engine. Packt Publishing.
  18. ↑ Bertolini, L. (2018). Hands-On Game Development without Coding: Create 2D and 3D games with Visual Scripting in Unity. Packt Publishing.
  19. ↑ Michael Sipser (1996). Introduction to the Theory of Computation. PWS Publishing. ISBN 978-0-534-94728-6. Afdeling 2.2: Pushdown Automata, pp. 101-114.
  20. ↑ Jeffrey Kegler, "Perl and Undecidability Geargiveer 17 Augustus 2009 op Wayback Machine", The Perl Review.
  21. ↑ Marty Hall, 1995, Lecture Notes: Macros Geargiveer 6 Augustus 2013 op Wayback Machine.
  22. ↑ Michael Lee Scott, Programming Language Pragmatics, 2de uitgawe, Morgan Kaufmann, 2006, ISBN 0-12-633951-1, pp. 18-19.
  23. ↑ Winskel, Glynn (5 Februarie 1993). The Formal Semantics of Programming Languages: An Introduction. MIT Press. ISBN 978-0-262-73103-4. Geargiveer vanaf die oorspronklike op 12 Junie 2021.
  24. ↑ Schreiner, Wolfgang. "Formal Semantics of Programming Languages". Johannes Kepler Universiteit Linz. Besoek op 23 September 2026.
  25. 1 2 3 4 Andrew Cooke. "Introduction To Computer Languages". Geargiveer vanaf die oorspronklike op 15 Augustus 2012. Besoek op 13 Julie 2012.
  26. ↑ Leivant, Daniel (1983). "Polymorphic type inference" in ACM SIGACT-SIGPLAN symposium on Principles of programming languages.: 88-98, Austin, Texas: ACM Press. doi:10.1145/567067.567077.
  27. 1 2 Nofre, David; Priestley, Mark; Alberts, Gerard (2014). "When Technology Became Language: The Origins of the Linguistic Conception of Computer Programming, 1950-1960". Technology and Culture. 55 (1): 40-75. doi:10.1353/tech.2014.0031. ISSN 0040-165X. JSTOR 24468397. PMID 24988794.
  28. ↑ Frederick P. Brooks jr., The Mythical Man-Month, Addison-Wesley, 1982, pp. 93-94.
  29. ↑ Busbee, Kenneth Leroy; Braunschweig, Dave (15 Desember 2018). "Standard Libraries". Programming Fundamentals – A Modular Structured Approach. Geargiveer vanaf die oorspronklike op 27 Januarie 2024. Besoek op 27 Januarie 2024.
  30. ↑ Edsger W. Dijkstra, On the foolishness of "natural language programming" Geargiveer 20 Januarie 2008 op Wayback Machine, EWD667.
  31. ↑ Perlis, Alan (September 1982). "Epigrams on Programming". SIGPLAN Notices Vol. 17, No. 9. pp. 7-13. Geargiveer vanaf die oorspronklike op 17 Januarie 1999.
  32. ↑ Milner, R.; M. Tofte; R. Harper; D. MacQueen (1997). The Definition of Standard ML (Revised). MIT Press. ISBN 978-0-262-63181-5.
  33. ↑ Kelsey, Richard; William Clinger; Jonathan Rees (Februarie 1998). "Section 7.2 Formal semantics". Revised5 Report on the Algorithmic Language Scheme. Geargiveer vanaf die oorspronklike op 6 Julie 2006.
  34. ↑ ANSI, Programming Language Rexx, X3-274.1996.
  35. ↑ "Guide to Programming Languages". ComputerScience.org. Geargiveer vanaf die oorspronklike op 13 Mei 2018. Besoek op 13 Mei 2018.
  36. ↑ "The basics". ibm.com. 10 Mei 2011. Geargiveer vanaf die oorspronklike op 14 Mei 2018. Besoek op 13 Mei 2018.
  37. ↑ Abdelaziz, Abdullah I.; Hanson, Kent A.; Gaber, Charles E.; Lee, Todd A. (2023). "Optimizing large real-world data analysis with parquet files in R: A step-by-step tutorial". Pharmacoepidemiology and Drug Safety. 33 (3): e5728. doi:10.1002/pds.5728. PMID 37984998.{{Verwys vaktydskrif}}: VS1-onderhoud: artikelnommer as bladsynommer (link)
  38. ↑ (2015) "An empirical analysis of the utilization of multiple programming languages in open source projects" in Proceedings of the 19th International Conference on Evaluation and Assessment in Software Engineering.: 4:1-4:10, New York: ACM. doi:10.1145/2745802.2745805.
  39. ↑ Abelson, Sussman en Sussman. "Structure and Interpretation of Computer Programs". Geargiveer vanaf die oorspronklike op 26 Februarie 2009. Besoek op 3 Maart 2009.
  40. ↑ Brown, Vicki; Morin, Rich (1999). "Scripting Languages". MacTech. Geargiveer vanaf die oorspronklike op 2 Desember 2017.
  41. ↑ Georgina Swan (21 September 2009). "COBOL turns 50". Computerworld. Geargiveer vanaf die oorspronklike op 19 Oktober 2013. Besoek op 19 Oktober 2013.
  42. ↑ Ed Airey (3 Mei 2012). "7 Myths of COBOL Debunked". developer.com. Geargiveer vanaf die oorspronklike op 19 Oktober 2013. Besoek op 19 Oktober 2013.
  43. ↑ Nicholas Enticknap. "SSL/Computer Weekly IT salary survey: finance boom drives IT job growth". Computer Weekly. Geargiveer vanaf die oorspronklike op 26 Oktober 2011. Besoek op 14 Junie 2013.
  44. ↑ "Counting programming languages by book sales". Radar.oreilly.com. 2 Augustus 2006. Geargiveer vanaf die oorspronklike op 12 Augustus 2006.
  45. ↑ J. M. Bieman en V. Murdock, "Finding code on the World Wide Web: a preliminary investigation", Proceedings First IEEE International Workshop on Source Code Analysis and Manipulation, 2001.
  46. ↑ "TIOBE Index". TIOBE. Geargiveer vanaf die oorspronklike op 24 Junie 2024. Besoek op 24 Junie 2024.
  47. ↑ "Top Programming Languages 2025". IEEE Spectrum. Geargiveer vanaf die oorspronklike op 25 September 2025. Besoek op 25 September 2025.