Programmeringsspråk

Et programmeringsspråk , i informatikk , er et formelt språk som spesifiserer et sett med instruksjoner som kan brukes til å produsere utdata: det kan brukes til å kontrollere oppførselen til en formell maskin eller en implementering av den (vanligvis en datamaskin ) eller i programmeringsfasen av dette gjennom skriving av kildekoden til et program av en programmerer : et programmeringsspråk anses for alle hensikter og formål som sådan hvis det er Turing-komplett .

Historie

Det første programmeringsspråket i historien er det mekaniske språket som ble brukt av Ada Lovelace for programmering av Charles Babbages maskin , som ble fulgt av Konrad Zuses Plankalkül , utviklet av ham i det nøytrale Sveits under andre verdenskrig og utgitt i 1946 . Plankalkül ble egentlig aldri brukt til programmering. Programmeringen av de første datamaskinene ble i stedet gjort i kort kode [1] , hvorfra sammenstillingen utviklet seg , som utgjør en symbolsk representasjon av maskinspråket. Den eneste formen for flytkontroll er den betingede hoppinstruksjonen, som fører til å skrive programmer som er svært vanskelige å følge logisk på grunn av de konstante hoppene fra ett punkt til et annet i koden.

De fleste av de senere programmeringsspråkene prøvde å abstrahere seg fra dette grunnleggende nivået, og ga muligheten til å representere datastrukturer og kontrollstrukturer som er mer generelle og nærmere den (menneskelige) måten å representere vilkårene for problemene vi sikter mot å skrive programmer. Blant de første høynivåspråkene som oppnådde en viss popularitet var Fortran , opprettet i 1957 av John Backus , som BASIC ( 1964 ) senere kom fra : i tillegg til det betingede hoppet, gjengitt med IF-setningen, denne nye generasjonen av språk introduserer nye flytkontrollstrukturer som WHILE og FOR-løkker og CASE- og SWITCH-instruksjoner: på denne måten reduseres bruken av hoppinstruksjoner (GOTO), noe som gjør koden mer oversiktlig og elegant, og derfor enklere vedlikehold.

Etter fremkomsten av Fortran ble en rekke andre historiske programmeringsspråk født, som implementerte en rekke innovative ideer og paradigmer : de viktigste er Lisp ( 1959 ) og ALGOL ( 1960 ). Alle programmeringsspråk som eksisterer i dag kan betraktes som etterkommere av ett eller flere av disse førstespråkene, som de låner mange grunnleggende konsepter fra; den siste store stamfaderen til moderne språk var Simula ( 1967 ), som var den første som introduserte konseptet (da knapt skissert) av et programvareobjekt . I 1970 publiserte Niklaus Wirth Pascal , det første strukturerte språket, for didaktiske formål; i 1972 opprettet BCPL først B (raskt glemt) og deretter C , som i stedet var en stor suksess fra begynnelsen. Samme år dukker også Prolog opp , så langt hovedeksemplet på logisk språk, som selv om det normalt ikke brukes til industriell utvikling av programvare (på grunn av sin ineffektivitet), representerer en ekstremt fascinerende teoretisk mulighet.

Med de første mini- og mikrodatamaskinene og forskningen i Palo Alto, ble Smalltalk født i 1983 , det første språket som er virkelig og fullstendig objektorientert, inspirert av Simula og Lisp: i tillegg til å være fortsatt i bruk i dag i visse sektorer , objektorienterte paradigmet i sin første modne inkarnasjon . Eksempler på dagens objektorienterte språk er Eiffel ( 1986 ), C++ (som kom ut samme år som Eiffel) og senere Java , klasse 1995 .

Beskrivelse

Grunnleggende

Alle eksisterende programmeringsspråk er definert av et leksikon , en syntaks og en semantikk og har:

Noen konsepter finnes også på de fleste språk:

Kildekode

Programmering i et gitt programmeringsspråk betyr vanligvis å skrive en eller flere enkle ASCII -tekstfiler , kalt kildekode som uttrykker programalgoritmen oversatt til programmeringsspråket. Fonter, farger og generelt det grafiske aspektet er irrelevant for programmeringsformål i seg selv: av denne grunn bruker ikke programmerere tekstbehandlingsprogrammer, men tekstredigerere ( som emacs og brief ) som i stedet tilbyr avanserte tekstbehandlingsfunksjoner. ( vanlige uttrykk , betingede erstatninger og søk på flere filer, mulighet for å ringe eksterne verktøy osv.).

Hvis en gitt redaktør er i stand til å jobbe tett med andre arbeidsverktøy (kompilator, linker, tolk, etc.: se nedenfor), så snakker vi mer enn bare en editor om IDE eller integrert utviklingsmiljø. Det skal bemerkes at noen nyere programmeringsspråk også tillater en blandet form for programmering, der utformingen av ASCII-kildekoden også er assosiert med visuelle programmeringsoperasjoner , der programmereren beskriver noen aspekter av programmet ved å tegne på skjermen ved hjelp av musen ; en typisk anvendelse av sistnevnte form for programmering er den interaktive utformingen av programmets GUI (vinduer, menyer og så videre). For å bli utført av prosessoren må kildekoden oversettes til maskinspråk som er språket som maskinen opererer på på fysisk nivå, og dette er mulig gjennom to mulige teknikker: kompilering og tolkning .

Kildekoden, som inneholder instruksjonene som skal utføres og (ofte) noen kjente og konstante data, kan deretter utføres ved å sende den til en tolk som vil utføre instruksjonene i den, som er normal praksis for skriptspråk ; eller den kan kompileres, dvs. oversettes til maskinspråkinstruksjoner av et kompilatorprogram : resultatet er en 'kjørbar' binær fil ( kjørbar kode ) som ikke trenger andre programmer for å kjøre, og er også mye raskere enn et tolket program. Tidligere har kompilering vært normen for alle generelle programmeringsspråk; for tiden er det mange tolkede og generell bruksspråk, for eksempel Java eller .NET -plattformen , som bruker en hybrid tilnærming mellom de to løsningene, ved å bruke en kompilator for å produsere kode i et mellomspråk (kalt bytecode ) som deretter tolkes. Ytelsesforskjellen mellom tolkede og kompilerte språk har blitt redusert med just-in-time kompileringsteknikker , selv om kompilerte språk (hvis ikke montering ) fortsatt brukes for applikasjoner som krever høyest mulig ytelse.

Samling

Kompilering er prosessen der programmet, skrevet i et programmeringsspråk på høyt nivå, blir oversatt til en kjørbar kode ved hjelp av et annet program kalt kompilator . Kompileringen gir en rekke fordeler, først og fremst det faktum å få svært raske kjørbare filer i kjørefasen ved å tilpasse ulike parametere for denne fasen til tilgjengelig maskinvare; men det har den største ulempen i det faktum at det er nødvendig å kompilere en annen kjørbar for hvert operativsystem eller maskinvare ( plattform ) som utførelsen skal gjøres tilgjengelig på eller den såkalte portabiliteten mangler .

Tolkning

For å løse portabilitetsproblemet (avhengigheten eller ikke av språket på plattformen), er det opprettet språk basert på kompilerte biblioteker (komponenter) ad hoc for hver plattform, der kildekoden kjøres direkte, så det er ingen behov for en kompilering på hver type maskin den kjøres på. Defekten til disse språkene er langsomheten i utførelsen; de har imidlertid fordelen av å tillate deg å bruke det samme programmet uten endringer på flere plattformer. I dette tilfellet sies det at programmet er bærbart .

Ytelsestapet som ligger til grunn for de tolkede språkene er det dobbelte arbeidet som er betrodd maskinen som forbereder seg på å behandle dette programmet. I motsetning til et kompilert program, blir hver instruksjon faktisk kontrollert og tolket ved hver kjøring av en tolk . Tolkede språk brukes i utviklingsfasen av et program for å unngå å utføre tallrike kompilasjoner eller i stedet når du ønsker å lage programvare som utfører ikke-kritiske operasjoner som ikke krever optimaliseringer angående hastighet eller størrelse, men som drar mer nytte av portabilitet. Skripting og alle nettorienterte språk blir nesten alltid tolket. PHP , Perl , Tcl / Tk og JavaScript og mange andre er konkrete eksempler på ikke-plattforminteraksjon.

Det er forskjellige forsøk på å gjøre kompilatorer på tvers av plattformer ved å lage et mellomnivå, en slags semi-tolkning, som i det nevnte tilfellet av Java ; på den annen side, for tolkede språk er det forsøk på å generere automatiske kompilasjoner (eller semi-kompilasjoner) spesifikke for maskinen de kjøres på. Det finnes også verktøy for å automatisere så mye som mulig kompileringen av det samme programmet på forskjellige plattformer, for eksempel GNU autoconf / automake , som lar deg lage en distribusjon av kildekoden som kan konfigureres og kompileres automatisk på forskjellige plattformer, generelt sett i det minste alle Unix .

Koblinger

Hvis programmet, som ofte skjer, bruker biblioteker , eller er sammensatt av flere programvaremoduler , må disse være 'lenket' til hverandre. Verktøyet som gjør dette kalles linkeren , og er hovedsakelig opptatt av å løse sammenkoblingene mellom de ulike modulene. Det er hovedsakelig to forskjellige typer lenker: dynamiske og statiske .

Statisk lenke

Alle programmoduler og biblioteker som brukes er inkludert i den kjørbare filen, som er stor, men inneholder alt nødvendig for utførelse. Hvis en endring i et av bibliotekene blir nødvendig, for å rette en feil eller sikkerhetsproblem , må alle programmer som bruker statisk koblede biblioteker kobles sammen med de nye versjonene av bibliotekene.

Dynamisk lenke

Bibliotekene som brukes lastes av operativsystemet når det er nødvendig ( dynamisk kobling ; eksterne biblioteker kalles "DLL", Dynamic-link-biblioteker i Microsoft Windows -systemer , mens "SO" delt objekt i Unix-lignende systemer ). Den resulterende kjørbare filen er mer kompakt, men avhenger av tilstedeværelsen av bibliotekene som brukes i operativsystemet for å kunne kjøre. På denne måten kan biblioteker kun oppdateres én gang på operativsystemnivå, uten at det er nødvendig å koble programmer på nytt. Det blir også mulig å bruke forskjellige versjoner av samme bibliotek, eller å bruke tilpassede biblioteker med spesifikke egenskaper for den aktuelle verten. I realiseringen av et komplekst programvareprosjekt kan det hende at noen deler av programmet lages som biblioteker, for å lette vedlikeholdet eller for å kunne bruke dem i ulike programmer som er en del av samme prosjekt.

Den ekstra komplikasjonen er at når du installerer et dynamisk lenkeprogram, må du se etter bibliotekene det bruker, og til slutt installere disse også. Pakkeadministrasjonssystemer, som tar seg av å installere programmer på et operativsystem, holder vanligvis styr på disse avhengighetene automatisk. Dynamisk kobling er generelt foretrukket for å lage små programmer og generelt redusere RAM -minnet som er opptatt, forutsatt at de nødvendige bibliotekene allerede er tilstede i systemet, eller noen ganger distribuere dem sammen med programmet.

Sammenligning mellom kompilering og tolkning

Disse to metodene for å lage og kjøre et program har både fordeler og ulemper: den største fordelen med kompilering er utvilsomt den mye høyere effektiviteten når det gjelder ytelse, til prisen for å forbli bundet til en plattform (kombinasjon av maskinvarearkitektur og systemoperativ) ; et tolket språk på den annen side har i prinsippet ikke denne avhengigheten, men er tregere og krever mer minne under kjøring.

Bytekode og P-kode

En mellomløsning mellom kompilering og tolkning ble introdusert i de første versjonene av Pascal (inkludert den som ble opprettet i 1975 av oppfinneren Niklaus Wirth ) og deretter tatt i bruk i Java- og Python-språkene , med bytekode , og i Visual Basic og .NET språkene til Microsoft med P-koden .

I begge disse tilfellene er kildekoden til programmene ikke kompilert i maskinspråk, men i en mellomliggende "hybrid" kode som er bestemt til å bli tolket på tidspunktet for programkjøringen: grunnen til dette doble trinnet er å ha portabiliteten til tolket språk, men også, takket være forhåndskompilering, en enklere og derfor raskere tolkningsfase. Når det gjelder Java-bytekoden, har vi å gjøre med et ekte assemblerspråk , som opprinnelig måtte implementeres i en ekte prosessormodell, men som aldri ble realisert; noen moderne mikroprosessorer, for eksempel ARM med Jazelle , implementerer naturlig mange bytekode-instruksjoner og er derfor i stand til å utføre Java-bytekode som om det var montering.

Mellomkoden er imidlertid enklere både å tolke og å kompilere: av denne grunn er det utviklet JIT (Just In Time)-kompilatorer for både Java- og .NET-språk, som de kompilerer på tidspunktet for lansering av et Java- eller .NET-program mellomkode på farten og kjør innfødt maskinkode, helt eliminerer behovet for en tolk og gjør programmer skrevet på disse språkene nesten like raskt som de kompilerte programmene deres.

Utviklings- og utførelsesmiljøer

Med utviklingsmiljø mener vi settet med verktøy for utvikling av programmets kildekode , mens vi med utførelsesmiljø typisk mener settet med programvarebiblioteker , også kalt programvareplattform , som brukes av selve programmet for å fungere korrekt.

Språkklasser

Generelt er det ca 2500 mer eller mindre kjente og utbredte programmeringsspråk. Disse klassifiseres først, i henhold til abstraksjonsnivået, fra maskinspråk opp til menneskelig logisk språk, i lavnivå- og høynivåspråk (på nittitallet ble til og med de på det høyeste nivået skilt ut ). På sin side kan språk klassifiseres i kompilerte og tolkede språk som vist ovenfor. Språk deles da vanligvis inn i tre store familier basert på referanseprogrammeringsparadigmet : imperative , funksjonelle og logiske språk .

Imperativer

På imperative språk er instruksjonen en eksplisitt kommando som opererer på en eller flere variabler eller på den interne tilstanden til maskinen, og instruksjonene utføres i en forhåndsbestemt rekkefølge. Å skrive et program på et imperativt språk betyr i hovedsak å forholde seg til hva maskinen må gjøre for å få resultatet du ønsker, og programmereren er opptatt med å finjustere algoritmene som trengs for å manipulere dataene. Kontrollstrukturer har form av flytsetninger (GOTO, FOR, IF / THEN / ELSE etc.) og beregningen fortsetter ved iterasjon i stedet for ved rekursjon. Variableverdier tilordnes ofte fra konstanter eller andre variabler (tilordning) og sjelden ved å sende parametere (instansiering).

Typiske imperative språk:

Strukturert

Strukturert programmering er en teknikk hvis formål er å begrense kompleksiteten til programkontrollstrukturen. Programmereren er bundet til å bare bruke de kanoniske kontrollstrukturene definert av Böhm-Jacopini-teorem , det vil si sekvensen , valget og løkken , og unngår de ubetingede hoppinstruksjonene.

Objektorientert

Objektorientert programmering er basert på en utvikling av konseptet abstrakt datatype preget av innkapsling , arv , polymorfisme . I tillegg til spesialiserte språk som fullt ut implementerer prinsippene for denne metodikken (som Smalltalk eller Java), inneholder mange moderne språk noen konsepter for objektorientert programmering.

Funksjonell

Funksjonelle språk er basert på det matematiske funksjonsbegrepet. I et rent funksjonelt språk er eksplisitte tildelinger til og med helt fraværende, og kun bestått av parametere brukes. Typisk i denne modellen styres kontrollen av beregningen av rekursjon og mønstertilpasning (handlingen av å sjekke tilstedeværelsen av et bestemt motiv - mønster - inne i et sammensatt objekt), mens den vanligste datastrukturen er listen , en sekvens av elementer . Den viktigste eksponenten for denne kategorien er utvilsomt Lisp (LISt Processing).

Deklarativ (eller logisk)

På logiske språk er instruksjon en klausul som beskriver et forhold mellom data: programmering på et logisk språk betyr å beskrive settet med relasjoner som eksisterer mellom dataene og det ønskede resultatet, og programmereren er engasjert i å etablere hvordan dataene må utvikle seg under beregningen . Det er ingen forhåndsbestemt rekkefølge for utførelse av de ulike klausulene, men det er opp til tolken å finne riktig rekkefølge. Hovedkontrollstrukturen er representert av kuttet , som kalles rødt hvis det endrer oppførselen til programmet eller grønt hvis det bare gjør beregningen mer effektiv, som fortsetter ved rekursjon og ikke ved iterasjon. Variabler får sin verdi ved instansiering eller fra andre variabler som allerede er tilordnet i ( forening ) klausulen og nesten aldri ved tilordning, som bare brukes ved direkte beregning av numeriske uttrykk.

For at de skal kunne brukes i et deklarativt program, må alle normale algoritmer omformuleres i rekursive og tilbakesporende termer ; dette gjør programmering med disse språkene til en helt ny opplevelse og krever en radikalt annen måte å tenke på, fordi mer enn å beregne et resultat, krever det å demonstrere den nøyaktige verdien. Overfor disse kravene lar deklarative språk oppnå eksepsjonelle resultater når det gjelder å manipulere grupper av enheter i forhold til hverandre.

Svakt eller sterkt skrevet språk

En annen klassifisering ønsker fra synspunkt av typen data uttrykt, den ønsker underinndeling i språk med sterk skriving eller svak skriving.

Esoteriske språk

Parallelle språk

Moderne superdatamaskiner og – nå – alle høye og mellomstore datamaskiner er utstyrt med flere CPUer . Som en åpenbar konsekvens krever dette evnen til å utnytte dem; av denne grunn ble multithreading først utviklet , dvs. muligheten til å starte flere deler av det samme programmet samtidig på forskjellige CPUer, og deretter noen språk studert på en slik måte at de kunne identifisere seg selv under kompileringsfasen, delene av koden som skal lanseres parallelt.

Skriptspråk

Skriptspråk ble født som batch-språk , for å automatisere lange og repeterende oppgaver som skal utføres, faktisk i batch-modus . I stedet for å skrive kommandoene én etter én for å utføre en bestemt oppgave, lagres de i rekkefølge i en fil, som igjen kan brukes som en sammensatt kommando. De første skriptspråkene var de av Unix - skallene ; senere, gitt nytten av konseptet, har mange andre interaktive programmer begynt å tillate lagring og kjøring av filer som inneholder lister med kommandoer, eller lagring av opptak av visuelle kommandoer (de såkalte makroene til tekstbehandlingsprogrammer , for eksempel) . Det neste trinnet, i mange tilfeller, har vært utvidelsen av språk med assosiasjonen av symboler til verdier, dvs. bruken av variabler, med flytstyringskommandoer, dvs. betingede hoppkonstruksjoner, loopinstruksjoner eller rekursjon, og dermed gjøre dem komplette språk. Nylig har mange programmer utviklet for formål som er svært forskjellige fra programmering, og tilbyr brukere muligheten til å programmere dem autonomt ved å bruke skriptspråk.

Syntaksen til mange skriptspråk, som PHP eller ECMAScript - dialektene , ligner på C, mens andre, som Perl eller Python , tar i bruk en nydesignet. Siden veldig ofte skriptspråk er født for å påkalle eksterne kommandoer eller prosedyrer, blir de like ofte tolket , dvs. utført av et annet program, for eksempel moderprogrammet, som skriptspråket er en utvidelse av, eller en passende tolk .

Andre språk

Andre typer språk er programmeringsspråk på svært høyt nivå som brukes av fagfolk og visuelle programmeringsspråk som ikke krever spesiell avansert programmeringskunnskap.

Evaluering

Generelt gir det ingen mening å snakke om bedre eller dårligere språk, eller om de beste språkene av alle: hvert språk er født til å møte en mer eller mindre bred klasse av problemer, på en bestemt måte og i en bestemt kontekst. Men å måtte si om et gitt språk er egnet for en bestemt bruk eller ikke, er det nødvendig å vurdere egenskapene til de ulike språkene.

Iboende egenskaper

De er kvalitetene til selve språket, bestemt av dets syntaks og dets interne arkitektur. De påvirker programmererens arbeid direkte og betinger ham. De avhenger ikke av verktøyene som brukes (kompilator / tolk, IDE, linker) eller av operativsystemet eller maskintypen.

Noen ganger kan et veldig komplekst og vanskelig lesbart program på et gitt språk bli helt enkelt og greit hvis det skrives om på et annet, mer passende klassespråk.

Det vanligste eksemplet på robust språk er Pascal, som, etter å ha blitt laget for didaktiske formål, alltid antar at en uregelmessighet i koden er et resultat av en feil fra programmereren; mens montering er det typiske eksempelet på et helt fritt språk, der ingenting binder programmereren (og hvis han skriver farlig eller feil kode, er det ingenting å advare ham).

Eksterne funksjoner

I tillegg til de nevnte kvalitetene til språk, kan de i miljøene de opererer i undersøkes. En programmerer arbeider med programvareverktøy, hvis kvalitet og produktivitet avhenger av et sett med faktorer som også må veies i henhold til typen programmer som skal skrives.

Merknader

  1. ^ Robert W. Sebesta, Concepts of Programming Languages , 2006, s. 44. ISBN 0-321-33025-0
  2. ^ TIOBE Software nettsted som månedlig utarbeider en popularitetsrangering av programmeringsspråk .

Bibliografi

Relaterte elementer

Andre prosjekter

Eksterne lenker