Språket som programmer er skrevet på er et programmeringsspråk. Liste over programmeringsspråk

Når du prøver å finne ut hvilket programmeringsspråk du skal begynne å lære, vil du sannsynligvis komme over begrepene "høyt nivå" og "lavt nivå". Folk snakker om programmeringsspråk på høyt nivå hele tiden. lavt nivå. Men hva betyr dette egentlig? Og hva vil det si å lære å skrive kode? La oss starte med definisjonene av hver.


Programmeringsspråkene "Høyt" og "Lavt nivå".

I denne artikkelen vil jeg snakke om "høyt" og "lavt nivå" språk. Men det er ingen spesielle kriterier for å bestemme dette. Bare husk at dette i stor grad avhenger av perspektivet ditt. Hvis du er en C-programmerer, kan Java virke ganske høyt nivå. Hvis du er vant til Ruby, kan Java virke som et språk på lavt nivå.

Maskinkode og lavnivåspråk

Enten et språk anses på høyt eller lavt nivå (eller et sted midt i mellom), handler det om abstraksjon. Maskinkode har ingen abstraksjon - den inneholder separate instruksjoner, overført til datamaskinen. Og siden maskiner kun omhandler tall, er de representert i binær(selv om de noen ganger er skrevet med desimal eller heksadesimal notasjon).

Her er et eksempel på maskinkode:

I maskinkode må operasjoner spesifiseres nøyaktig. For eksempel, hvis en del informasjon må hentes fra minnet, vil maskinkoden måtte fortelle datamaskinen hvor i minnet den skal finne den.

Å skrive direkte til maskinkode er mulig, men veldig vanskelig.

Programmeringsspråk på lavt nivå legger til litt abstraksjon til maskinkoder. Denne abstraksjonen skjuler spesifikke maskinkodeinstruksjoner bak erklæringer som er mer lesbare for mennesker. Monteringsspråk er språkene på laveste nivå ved siden av maskinkode.

I maskinkode kan du skrive noe sånt som "10110000 01100001", men assemblerspråk kan forenkle dette som "MOV AL, 61h". Det er fortsatt nesten en-til-en samsvar mellom det som er skrevet på assemblerspråk og instruksjonene som gis til maskinen.

Når du beveger deg inn i mer populære programmeringsspråk, ender du opp med noe sånt som C. Selv om dette språket ikke er like lavt nivå som assemblerspråk, er det fortsatt en sterk samsvar mellom det som er skrevet i C og maskinkode. De fleste operasjoner skrevet i C kan fullføres uten stort beløp maskinkodeinstruksjoner.

Programmeringsspråk på høyt nivå

I likhet med språk på lavere nivå, dekker høyere nivåer et bredt spekter av abstraksjoner. Noen språk, som Java (mange anser det som et mellomprogrammeringsspråk), gir deg fortsatt mye kontroll over hvordan datamaskinen administrerer minne og data.

Andre, som Ruby og Python, er veldig abstrakte. De gir deg mindre tilgang til funksjoner på lavere nivå, men syntaksen er mye lettere å lese og skrive. Du kan gruppere ting i klasser som arver egenskaper, så du trenger bare å deklarere dem én gang.

Variabler, objekter, subrutiner og looper er viktige deler av språk høy level. Disse og andre konsepter vil hjelpe deg å fortelle maskinen mange ting med korte, konsise utsagn.

Mens assembly-språket har en nesten ensartet tilordning mellom instruksjonene og maskinkodeinstruksjonene, kan et språk på høyere nivå sende dusinvis av kommandoer med en enkelt kodelinje.

Det er viktig å merke seg at "programmeringsspråk på høyt nivå" kan inkludere alt som er mer abstrakt enn assemblerspråk.

Hvilket språk skal du studere: lavt eller høyt nivå?

Dette er definitivt generelt spørsmål blant nye og ambisiøse programmerere. Hvilke programmeringsspråk er bedre å lære: høyt eller lavt nivå? Som med mange programmeringsspørsmål, er spørsmålet om programmeringsspråk på høyt nivå og lavt nivå ikke så enkelt.

Begge typer språk har viktige fordeler. Språk på lavt nivå, fordi de krever lite tolkning av datamaskinen, har en tendens til å være veldig raske. Og de gir programmerere mye kontroll over datalagring, minne og gjenfinning.

Høynivåspråk er imidlertid intuitive og lar programmerere skrive kode mye mer effektivt. Disse språkene anses også som "tryggere" fordi det er flere sikkerhetstiltak som hindrer koderen i å utstede dårlig skrevne kommandoer som kan forårsake skade. Men de gir ikke programmerere den samme kontrollen over prosesser på lavt nivå.

Med det i tankene, her er en liste over populære språk på en skala fra lav til høy:

  • JavaScript
  • Python

Dette er selvfølgelig delvis subjektivt. Og den inkluderer bare en liten brøkdel av de tilgjengelige språkene.

Men dette burde gi deg en ide om hvilket nivå språkene du er interessert i er på.

Hva vil du gjøre?

Når du bestemmer deg for hvilket språk du skal lære, bør ditt første spørsmål være: hva vil du programmere?

Hvis du vil programmere operativsystemer, kjerner eller annet som må kjøres på topphastighet, kan et språk på lavere nivå være godt valg. Stor en del av Windows, OS X og Linux er skrevet på C- og C-avledede språk som C++ og Objective-C.

Mange moderne applikasjoner skrevet på språk på høyere nivå eller til og med domenespesifikke språk. Python og Ruby er spesielt populære for nettapplikasjoner, selv om HTML5 blir kraftigere. Språk som Swift, C#, JavaScript og SQL har sine egne styrker og svakheter.

Jeg leste nylig en tråd på et programmeringsforum og kom over et interessant forslag: studer begge nivåene samtidig. Du vil få en dypere forståelse av typene abstraksjoner som gjør et språk på høyere nivå mer effektivt.

Selvfølgelig er det ikke lett å lære to språk samtidig, så det kan være lurt å spre læringen litt. Og det kan være nyttig å velge to språk som ligner mest.

Igjen, vi går tilbake til det jeg sa før: velg et språk basert på hva du vil gjøre. Gjør noen undersøkelser for å finne ut hvilke språk folk bruker innen sitt felt. Bruk deretter denne informasjonen til å velge et språk på høyt og lavt nivå og begynne å lære dem.

Du vil snart se parallellene og du vil få en mye dypere forståelse av hvordan programmering fungerer.

Fokuser på målet, ikke midlet.

Det er mange kriterier du kan bruke for å velge et programmeringsspråk. Et av kriteriene er høyt og lavt nivå. Men i nesten alle tilfeller er kriteriene du bør bruke det du vil programmere.

Prosjektet ditt kan dra nytte av et språk på lavt nivå. Eller det kan være mye mer effektivt på et høyt nivå. Det er opp til deg å velge riktig verktøy for jobben. Fokuser på målet ditt og velg riktig språk hver gang.

Har du erfaring med språk på høyt og lavt nivå? Foretrekker du det ene fremfor det andre? Del dine tanker i kommentarene nedenfor!

Dataprogrammer blir ofte beskrevet som "sett med instruksjoner", og dataspråk oppfattes av mange bare som et vokabular og en syntaktisk måte å gi disse instruksjonene på.

Fra dette synspunktet, ulike språk programmering kan ha forskjellig grammatikk eller forskjellige ordforråd. Hvert språk kan behandle semikolon forskjellig eller kreve store bokstaver skriftlig, selv om alle språk stort sett er basert på samme prinsipp.

Men virkeligheten med programmering er mye mer kompleks.

Programmering i dag

Det er rart, men de fleste av de virkelig "globale" ideene innen dataprogrammering ble utviklet tilbake på 1950- og 60-tallet. Siden den gang har mange nye språk dukket opp, men ingen av dem implementerer en virkelig ny tilnærming til logikk og beregning.

Utviklingen av nye programmeringsspråk de siste tiårene har vært basert på erfaringene til utviklere. Dette betyr at det er kode som er lettere å skrive ( drivkraft Ruby) og lettere å lese (Python), og gjør visse typer logiske strukturer og måter å løse problemer mer intuitivt på.

Noen språk ble designet for å løse spesifikke programmeringsproblemer (som PHP og SASS), for å administrere visse typer systemer (), eller for å jobbe i et bestemt miljø eller plattform (Java og JavaScript). Noen språk ble utviklet spesielt for å hjelpe nybegynnere å lære å programmere ( klassiske eksempler er BASIC og Scratch).

Siden teorier og praksiser rundt språkdesign har utviklet seg til (for det meste) allment akseptert ortodoksi, har mye av det nye og interessant arbeid Utviklingen av programmeringspraksis er nå sentrert rundt systemarkitektur.

En relativt ny utvikling inkluderer konseptet SOA (Service Oriented Architecture). Service Orientert Arkitektur) og MVC (Model-View-Controller), samt rammeverk som , som lar programmerere enkelt jobbe innenfor disse paradigmene.

Liste over programmeringsspråk

En voksende liste over populære programmeringsspråk, markeringer og protokoller. Lenker til beskrivelser av hver av dem:

ASCII-koding

  • Tegnkoding er en av de grunnleggende aspektene ved datamaskiner og Internett. ASCII er det første mye brukte tegnkodingssystemet. Den ble erstattet av UTF-8, men ASCII er fortsatt grunnlaget for de aller fleste karakterene på Internett i dag. Å forstå dette er veldig viktig for programmerere. Les mer her (engelsk):

ASP/ASP.NET

  • ASP er et akronym for Active Server Pages. Det er det første skriptspråket på serversiden for Microsoft IIS-nettserveren. ASP har blitt erstattet av et åpen kildekode-rammeverk på serversiden - ASP.NET. Flere detaljer (engelsk):

AutoLISP

Uff

  • Awk er et ekstremt kraftigråk som lar deg trekke ut data fra en fil eller annen kilde og sende det ut i et hvilket som helst format du trenger. Det er et eldre verktøy, men er fortsatt like nyttig som alltid. Finn ut mer (engelsk): .

BASH

  • Bash er det mest brukte grensesnittet kommandolinje i Unix-verdenen. Dette er standard tekstbasert grensesnitt for både Linux og Mac OS X. Les mer:

Vanlig Lisp

  • Lisp er et ganske unikt programmeringsspråk, kanskje det eldste språket og fortsatt i bruk i dag. Dette er spesielt viktig i området kunstig intelligens. Flere detaljer (engelsk):

C

  • Hvis vi her inkluderer to derivater av dette språket, så kan vi trygt si at ingen språk har vært mer nyttig og mer innflytelsesrik enn C. Dette er spesielt viktig for utvikling av operativsystemer og annen programvare. Mange kompilatorer og tolker for andre språk er skrevet i C. Les mer:

C++

  • Opprinnelig kalt "C med klasser", C++ er på mange måter bare en mer avansert etterfølger til C (selv om den generelle situasjonen er mer kompleks). C++ ble designet for å legge til et høyt nivå til C-programmeringsparadigmet, samtidig som de beholder lavnivå-maskinvaremanipulasjonsevner. Mange av disse tilleggene har blitt lagt til C i løpet av årene, og språkene er mer som to dialekter av samme språk. Flere detaljer (engelsk):

C#

  • Brukes som primærspråk for .NET-programmering, i likhet med C++, en utvidelse av programmeringsspråket C, men med viktig tillegg i form av objektorienterte evner. Flere detaljer (engelsk):

CSS/CSS3

  • CSS, eller Cascading Style Sheets, er heller ikke et programmeringsspråk, men et sidestilspråk – et språk som gir stil- og layoutregler til dokumenter og applikasjoner. Det er det viktigste stilspråket som brukes på Internett. Mer informasjon:

Emacs Lisp

  • Emacs har lenge vært kjent som populær og kraftig tekstredigerer. Men ved å legge til Emacs Lisp blir det et integrert utviklingsmiljø for nesten alle programmeringsspråk. Flere detaljer (engelsk): .

F#

  • F# – programmeringsspråk generelt formål. Designet for å være ekstremt effektivt. Å være opprinnelig bare Microsofts språk, er nå et åpen kildekodespråk og brukes på alle plattformer. Flere detaljer (engelsk): .

FORTAN

FREM

  • Arbeidet med Forth begynte i 1968, og språket brukes vanligvis på maskinvare som ikke har et tradisjonelt operativsystem. Det er også mye brukt til å kontrollere maskinverktøy. Flere detaljer (engelsk):

Haskell

  • Haskell er et av de mest populære funksjonelle programmeringsspråkene, i tillegg til å være prototypen for et dusin andre språk. Det er mye brukt i næringslivet og akademia og er et flott språk å begynne å lære om. funksjonell programmering. Flere detaljer (engelsk):

HTML

  • HTML er ikke et programmeringsspråk. Dette er et markup language - et språk for å legge til semantiske og stilistiske merknader til innhold. Det er hovedspråket for nettinnhold. Kunnskap om det er nødvendig og obligatorisk for alle webdesignere og webutviklere, samt alle (skribenter, redaktører) som produserer Internett-innhold. Flere detaljer (engelsk): og

IDL

  • IDL, eller Interactive Data Language, er et programmeringsspråk som primært brukes til dataanalyse og visualisering. Det er fortsatt mye brukt i romfart og astronomi. Flere detaljer (engelsk):

INTERKALT

  • INTERCAL er et parodidataspråk utviklet på begynnelsen av 1970-tallet. Den ble laget som en spøk for å vise hvordan språk er teknisk komplekse og vanskelige å lese. Dette er et ekte språk som du kan laste ned, og som du til og med kan gjøre noe med. Det antas at du må være veldig kjent med det for å gjøre dette - men igjen, ikke så godt, fordi INTERCAL selv vil like det heller. Flere detaljer (engelsk):

Java

  • Java er et språk på høyt nivå designet for bruk på Java Virtual Machine. Har svært få eksterne avhengigheter, og ble designet for å fungere på alle fysisk maskin. Brukt mye i nettverksarkitektur, så vel som i innebygde enheter og andre dataapplikasjoner. Flere detaljer (engelsk): .

Javascript

  • JavaScript (egentlig ikke relatert til Java) er skriptspråk, opprinnelig designet for bruk i nettlesere. Derfor har den innebygd kapasitet til å jobbe med Document Object Model (DOM), representasjonen i minnet av nettsideinnhold. Det er det viktigste programmeringsspråket for front-end webutvikling. Hovedsakelig hendelsesdrevet, og takket være Node.JS, I det siste mottatt anerkjennelse som et server-side språk. Flere detaljer (engelsk): og. Og her:

Ksh

  • Korn Shell (ksh) er et kommandolinjegrensesnitt som brukes på Unix. Det var et tidlig skall, kompatibelt med standard Bourne-skallet, men med alle de kule interaktive funksjonene til C-skallet. Flere detaljer:

Linux programmering

  • Linux-programmering inkluderer alt fra shell-scripting til applikasjonsutvikling til kjerneutvikling. Flere detaljer (engelsk):

Logo

  • Logo er et av de tidligste språkene for undervisning i programmering, og er fortsatt sannsynligvis det mest kjente. Han er kjent for skilpadden sin, som barn får til å bevege seg med datamaskinkommandoer. En morsom måte å lære programmering på. Flere detaljer (engelsk):

M.L.

  • ML ble opprinnelig designet som et metaprogrammeringsspråk: et språk for å lage andre språk. Men over tid ble det et allmennspråk, mye brukt i utdanning, matematikk, naturfag og til og med finans. Flere detaljer (engelsk): .

MPI

  • Message Passing Interface er en standardprotokoll for å sende meldinger mellom prosesser eller programmer. Det har blitt implementert i en rekke programmeringsspråk, inkludert C, C++, Java og Python. Takket være MPI ble det mulig parallell databehandling. Flere detaljer (engelsk):

Nettverksprogrammering med internett-uttak

Mål-C

  • En annen versjon av C, opprettet på 1980-tallet for å gi en fullstendig objektorientert implementering av C. Språkets hovedbruk i dag er i Mac OSX og operasjonsstuer iOS-systemer. Inntil nylig iOS-applikasjoner skulle vært skrevet i Objective-C, men nå kan du også skrive i Swift. Flere detaljer (engelsk):

OKaml

  • OKaml er et objektorientert funksjonelt dataspråk. I ML-tradisjonen brukes det mye til å skrive andre programmeringsspråk og rammeverk. Flere detaljer (engelsk): .

Utvikling av operativsystem

  • Everest av programmeringsjobber anses å være utviklingen av et operativsystem. Hvis du vil bevise for deg selv at du kan skrive hva som helst, så er det ingenting bedre enn å skrive din egen operativsystemkjerne og tilhørende verktøy. Men vær forsiktig: dette er en reise kun for modige og sanne programmerere. Flere detaljer (engelsk): .

Perl

  • Veldig nyttig verktøy nesten hvilken som helst programmerer. Som et tolket språk trenger det ikke å bli kompilert, noen ganger referert til som "Swiss Army Knife" av skriptspråk. Flere detaljer (engelsk):

PROLOG

  • Prolog er et logisk programmeringsspråk designet for å behandle naturlig språk. Flere detaljer (engelsk):

Rene data

  • Pure Data er et unikt visuelt programmeringsspråk. Ble laget spesielt for å tillate brukere å lage video, lyd og grafiske verk. Flere detaljer (engelsk): .

Python

  • Python er et programmeringsspråk på høyt nivå. Et tolket (ikke-kompilert) språk, også kjent som et "skriptspråk". Primært brukt som et verktøy for å utføre spesialiserte programmeringsoppgaver som automatisering og dataanalyseoppgaver. Har et sterkt sett med verktøy for matematiske og vitenskapelig databehandling, brukes ofte av forskere. Flere detaljer (engelsk):

Ruby on Rails

  • Ruby on Rails er et nettutviklingsrammeverk for Ruby programmeringsspråk. Det gir MVC-arkitektur ( Modellvisning Controller), et databaseabstraksjonslag og mange verktøy for å fremskynde prosessen med å programmere webapplikasjoner. Veldig populær for rask utvikling webapplikasjoner. Flere detaljer (engelsk):

SAS

  • SAS er et spesialspråk utviklet for å analysere statistiske data. Mye brukt i myndigheter, akademia og næringsliv. For personer med mye data er SAS det opplagte valget. Flere detaljer (engelsk): .

Scala

  • Scala er et relativt nytt språk - mer eller mindre nytt og beste Java. Det er et flott språk for Java-programmerere som ønsker å bli mer effektive, eller for folk som akkurat har begynt å lære programmering og ønsker å lære et kraftig språk som ikke vil begrense dem i fremtiden. Flere detaljer (engelsk): .

Opplegg

  • Opplegg gammelt språk, men brukes fortsatt til å undervise i programmering og mer avanserte fag i informatikk. Basert hovedsakelig på Lisp, og delvis på ALGOL. Flere detaljer (engelsk): .

Ripe

  • Programmeringsspråket Scratch ble laget spesielt for å lære programmering til barn i alderen 8 til 16 år. Scratch er enkelt, og det lar barn lære det grunnleggende om programmeringslogikk på en morsom måte. spillform. Flere detaljer (engelsk):

Simula

  • Simula er et historisk viktig språk fordi det var det første språket som introduserte begrepene som ble grunnlaget for objektorientert programmering. Flere detaljer (engelsk): .

SMIL

  • SMIL (Synchronized Multimedia Integration Language) er et verktøy for de som ønsker å lage og distribuere presentasjoner. Spesielt nyttig hvis du ønsker å lage presentasjoner som må oppdateres fra tid til annen. Flere detaljer (engelsk):

SQL

  • SQL (Structured Query Language) – språket som brukes til å kommunisere med den relasjonelle databasen Ledelsessystemer(RDBMSer). SQL lar programmereren lage datastrukturer, sette inn og redigere data og spørre etter dem. Flere detaljer (engelsk):

Stata

  • Stata er et utviklingsmiljø og programmeringsspråk for å løse alvorlige statistiske problemer. Og selv om det ble opprettet for ganske lenge siden, er det fortsatt mye brukt. Hvis du er knyttet til statistisk arbeid, Stata er et flott verktøy. Flere detaljer (engelsk):

Fort

  • Swift er et nytt programmeringsspråk utviklet av av Apple, for iOS, OS X, watchOS, tvOS og Linux. Dette er fremtidens språk for utviklere av programmer og applikasjoner for Apple-enheter. Flere detaljer (engelsk):

S-PLUSS

  • S-PLUS er en kommersiell versjon av det kraftige S-programmeringsspråket designet for å utføre statistisk analyse. GNU-prosjektet har sin egen versjon av S, kalt R. Alle nødvendige ressurser om S med vekt på S-PLUSS:

UNIX programmering

  • Bredden av programmering på Unix er stor. Den dekker området fra administrative skript til tekstbasert kode til X Window-utvikling. Flere detaljer (engelsk):

XML

  • XML er bra strukturert språk for merking, beregnet for både menneskelig og maskinell lesing. Flere detaljer (engelsk):

Leksjon utarbeidet av: Akulov Ivan

Recoursia-brukere lurer ofte på hvilket programmeringsspråk som er verdt å lære. Vi har forberedt oss kort veiledning for de som bestemmer seg for sitt første programmeringsspråk. Vi vil gjerne påpeke at det ikke er ment å være omfattende – det er bare en veldig rask titt på hva utviklere gjør i dag, og hvilket programmeringsspråk som kanskje er det første.

Et av de ganske populære webprogrammeringsspråkene, som imidlertid i det hviterussiske arbeidsmarkedet ikke alltid er i stand til å gi sin morsmål en best betalende jobb. Ruby-kurs er neppe verdt å studere for å mestre det første programmeringsspråket, for med stor sannsynlighet vil søket etter en arbeidsgiver bli forsinket, siden ledige stillinger for junoirer i Ruby dukker opp ganske sjelden.

For bare fem til syv år siden var det Delphi som var standard første programmeringsspråk – selvfølgelig fordi Pascal-språket, som er forgjengeren til Delphi, ble oppfunnet for å lære skolebarn og elever programmering. Men for det virkelige liv Delphi er allerede veldig egnet, siden programmering på den betaler merkbart under gjennomsnittet, og nytt store prosjekter Du finner det ikke på dette språket. Anbefaler derfor

PROGRAMMERINGSSPRÅK OG DETS TYPER

Et programmeringsspråk er et formelt tegnsystem designet for å skrive dataprogrammer. Et programmeringsspråk definerer et sett med leksikalske, syntaktiske og semantiske regler som definerer utseende programmer og handlinger som utøveren (datamaskinen) vil utføre under dens kontroll.

Et programmeringsspråk på høyt nivå er et programmeringsspråk designet for å være raskt og enkelt å bruke av programmereren. Hovedtrekket til høynivåspråk er abstraksjon, det vil si introduksjonen av semantiske konstruksjoner som kort beskriver slike datastrukturer og operasjoner på dem, hvis beskrivelser i maskinkode (eller annet lavnivåprogrammeringsspråk) er svært lang og vanskelig å forstå.

Lavnivå programmeringsspråk (lavnivå programmeringsspråk) er et programmeringsspråk som er nær programmering direkte i maskinkodene til den virkelige eller virtuelle (for eksempel Java, Microsoft .NET) prosessoren som brukes. En mnemonisk notasjon brukes vanligvis for å betegne maskininstruksjoner. Dette gjør at kommandoer ikke kan huskes som en sekvens av binære enere og nuller, men som meningsfulle forkortelser av ord på menneskelig språk (vanligvis engelsk).

PROGRAMMERINGSSPRÅK PÅ LAVT NIVÅ

Tidlige datamaskiner måtte programmeres ved hjelp av binære maskinkoder. Programmering på denne måten er imidlertid ganske arbeidskrevende og vanskelig oppgave. For å forenkle denne oppgaven begynte programmeringsspråk på lavt nivå å dukke opp, noe som gjorde det mulig å spesifisere maskinkommandoer i en form som er mer forståelig for mennesker. For å konvertere dem til binær kode ble opprettet spesielle programmer- oversettere.

Figur 1. Et eksempel på maskinkode og dens representasjon i assembler

Oversettere er delt inn i:

    kompilatorer - konverter programtekst til maskinkode, som kan lagres og deretter brukes uten kompilator (et eksempel er kjørbare filer med *.exe-utvidelsen);

    tolker - gjør en del av programmet til maskinkode, kjør det og gå videre til neste del. I dette tilfellet brukes en tolk hver gang programmet kjøres.

Et eksempel på et lavnivåspråk er assembly-språk. Språk på lavt nivå er fokusert på en bestemt type prosessor og tar hensyn til dens funksjoner, så for å portere et assembly-språkprogram til en annen maskinvareplattform, må det skrives nesten fullstendig om. Det er også visse forskjeller i syntaksen til programmer for forskjellige kompilatorer. Riktignok er sentrale prosessorer for datamaskiner fra AMD og Intel praktisk talt kompatible og skiller seg bare i noen spesifikke kommandoer. Men spesialiserte prosessorer for andre enheter, for eksempel skjermkort og telefoner, inneholder betydelige forskjeller.

Fordeler

Språk på lavt nivå skaper effektive og kompakte programmer fordi utvikleren har tilgang til alle egenskapene til prosessoren.

Feil

    En programmerer som arbeider med lavnivåspråk må være høyt kvalifisert og ha en god forståelse av strukturen til mikroprosessorsystemet som programmet lages for. Så hvis et program er opprettet for en datamaskin, må du kjenne enheten til datamaskinen og spesielt enheten og driftsfunksjonene til prosessoren;

    det resulterende programmet kan ikke overføres til en datamaskin eller enhet med en annen type prosessor;

    betydelig utviklingstid for store og komplekse programmer.

Språk på lavt nivå brukes vanligvis til å skrive små systemprogrammer, enhetsdrivere, grensesnittmoduler med ikke-standardutstyr, programmering av spesialiserte mikroprosessorer, når de viktigste kravene er kompakthet, hastighet og muligheten til direkte tilgang til maskinvareressurser.

Montering er et språk på lavt nivå som fortsatt er mye brukt i dag.

PROGRAMMERINGSSPRÅK PÅ HØYT NIVÅ

Det første programmeringsspråket på høyt nivå vurderes dataspråk Plankalkül, utviklet av den tyske ingeniøren Konrad Zuse tilbake i perioden 1942-1946. En oversetter for det fantes imidlertid ikke før i 2000. Verdens første språkoversetter på høyt nivå er PP (Programming Program), også kjent som PP-1, testet med suksess i 1954. Oversetter PP-2 (1955, 4. i verden) translator) var allerede i ferd med å optimalisere og inneholdt sin egen laster og debugger, et bibliotek med standardprosedyrer, og PP-oversetteren for Strela-4-datamaskinen inneholdt allerede en linker av moduler. Imidlertid begynte den utbredte bruken av høynivåspråk med fremkomsten av Fortran og opprettelsen av en kompilator for dette språket (1957).

Språk på høyt nivå streber ikke bare etter å gjøre det enklere å løse komplekse programoppgaver, men også for å forenkle portering av programvare. Bruken av ulike oversettere og tolker sikrer tilkoblingen av programmer skrevet på høynivåspråk med ulike operativsystemer og maskinvare, mens kildekoden deres forblir, ideelt sett, uendret.

Denne typen isolasjon av høynivåspråk fra maskinvareimplementeringen av datamaskinen, i tillegg til mange fordeler, har også ulemper. Spesielt lar det deg ikke lage enkle og presise instruksjoner for utstyret som brukes. Programmer skrevet på høynivåspråk er lettere for programmereren å forstå, men er mindre effektive enn deres kolleger laget med lavnivåspråk. En av konsekvensene av dette var at det ble lagt til støtte for et eller annet lavnivåspråk (assembly language) til en rekke moderne profesjonelle høynivåprogrammeringsspråk.

Eksempler: C, C++, C#, Java, Python, PHP, Ruby, Perl, Pascal, Delphi, Lisp. Språk på høyt nivå er preget av evnen til å jobbe med komplekse datastrukturer. De fleste av dem har integrert støtte for strengtyper, objekter, operasjoner fil I/O etc. Ulempen med språk på høyt nivå er større størrelse programmer sammenlignet med programmer på et lavnivåspråk. Derfor brukes høynivåspråk hovedsakelig for å utvikle programvare for datamaskiner og enheter som har en stor mengde minne. Og forskjellige undertyper av assembler brukes til å programmere andre enheter der størrelsen på programmet er kritisk.

Imperative språk er basert på flere viktige ideer, inkludert representasjon av handlinger som matematiske formler, begrepet datatype og strukturell transformasjonsteoremet.

Et program på et imperativt språk er bygget opp fra funksjoner (subrutiner). Assembly språkprogrammer kan også bestå av subrutiner, og dette er ikke noe nytt, men høynivåspråk lar deg ikke tenke på slike problemer som organisering av samtaler, overføring av kildedata og returnering av resultater. Beskrivelsen av en funksjon består av et navn, en liste over parametere (startdata), typen resultat og handlingene som fører til å oppnå dette resultatet. En av funksjonene til programmet er den viktigste, utførelsen er programmets arbeid.

Et enkelt eksempel er en funksjon som beregner sinus til et tall. Det kan kalles sin, inndataene består av ett reelt tall, resultatet er også et reelt tall oppnådd ved å summere et segment av en kjent uendelig rekke (eller utføre fsin-kommandoen til en matematisk koprosessor).

Settet med handlinger som kan utføres inne i en funksjon er svært begrenset. Den består av å evaluere formeluttrykk, kalle opp andre funksjoner (som ikke er en separat handling - et funksjonskall er ofte inkludert i et uttrykk), tilordninger, grener (en gruppe handlinger som utføres bare hvis en betingelse er sann) og løkker ( en gruppe handlinger som utføres gjentatte ganger, antall repetisjoner avhenger av en tilstand). Handlinger kan nestes i hverandre. Det kan virke som om settet med grener og løkker er for lite, men det er ikke slik. Det er bevist at enhver algoritme som består av funksjonelle blokker (på et lavt nivå - aritmetiske kommandoer og dataoverføringskommandoer), betingede og ubetingede overganger kan konverteres til en ekvivalent algoritme som kun består av strukturelle blokker - funksjonelle blokker, grener og sløyfer med betingelse sjekke på slutten. Denne uttalelsen ble formulert i papiret av Corrado Bohm og Giuseppe Jacopini, "Flowdiagrams, turing machines and languages ​​with only to formation rules" (Communications of ACM, Volume 9 / Number 5 / May, 1965).

Hvis mellomresultater må lagres et sted for å utføre de nødvendige handlingene, plasseres spesielle erklæringer som inneholder variabelnavn og eventuelt annen informasjon inne i funksjonen. Adressene til RAM-cellene vil bli tildelt dem automatisk. På noen språk kan funksjoner også inneholde konstant- og typedefinisjoner. I Pascal-lignende språk er en funksjon som et program og kan inkludere definisjoner av ikke bare konstanter, typer og variabler, men også andre funksjoner.

En dataerklæring er en liste over navngitte objekter. Disse objektene kalles variabler. På en rekke språk må typen av en variabel spesifiseres, noe som bestemmer mengden minne som kreves for plassering og settet med operasjoner den kan delta i. Men dette er ikke nødvendigvis tilfellet, det er språk der typen av en variabel ikke er spesifisert og kan endres under programkjøring.

Vanligvis gir programmeringsspråk et ganske begrenset sett med forhåndsdefinerte variabeltyper og verktøy for å lage nye typer. Noen av følgende typer er forhåndsdefinert:

    naturlige tall og heltall av forskjellige størrelser;

    reelle tall;

    symboler - bokstaver, tall, aritmetiske tegn, etc.;

    tegnstrenger;

    boolske verdier;

    pekere

Handlinger på data kan utføres ved hjelp av funksjoner og operatører.

I C-språket er for eksempel ikke symboler, strenger og booleaner definert. Dens type char er faktisk et kort heltall og tillater aritmetiske operasjoner.

Nye typer dannes ved å kombinere til en enkelt helhet flere elementer av samme type (en matrise, hvert av dets elementer har et serienummer) eller elementer av forskjellige typer (en struktur, hvert av dets elementer har fornavn). For eksempel er komplekse tall ikke definert på de fleste språk, men de kan defineres:

På noen språk (for eksempel i C++) kan operatorer også defineres for opprettede typer, som lar deg bruke variabler av disse typene på samme måte som variabler av forhåndsdefinerte typer.

Det finnes andre måter å lage nye typer på. For eksempel, i Pascal er det mulig å lage:

    områdetyper (ved å spesifisere et verdiområde);

    oppregningstyper (ved å telle opp mulige verdier);

    sett typer

Variabler av setttyper kan brukes til å lagre informasjon om et sett med egenskaper for alle objekter. Noe lignende kan gjøres ved å bruke heltallsvariabler, bits satt som indikerer tilstedeværelsen av tilsvarende egenskaper. Tilsynelatende er bruk av sett mer motstandsdyktig mot programmeringsfeil.

Programmerer William W. Vold forteller historien

I løpet av de siste seks månedene har jeg jobbet med å lage et programmeringsspråk (PL) kalt Pinecone. Jeg vil ikke våge å kalle det komplett, men du kan allerede bruke det – det inneholder nok elementer til dette, som variabler, funksjoner og tilpassede datastrukturer. Hvis du vil sjekke det ut før du leser, foreslår jeg at du besøker den offisielle siden og depotet på GitHub.

Introduksjon

Jeg er ingen ekspert. Da jeg begynte å jobbe med dette prosjektet ante jeg ikke hva jeg gjorde, og det har jeg fortsatt ikke. Jeg har aldri målrettet studert prinsippene for å lage et språk - jeg leste bare noen materialer på Internett, og selv i dem fant jeg ikke nesten noe nyttig for meg selv.

Men jeg skrev absolutt nytt språk. Og det fungerer. Jeg må gjøre noe riktig.

I denne artikkelen skal jeg prøve å vise hvordan Pinecone (og andre programmeringsspråk) gjør kildekoden til det mange anser som magi. Jeg vil også fokusere på situasjoner der jeg måtte inngå kompromisser og forklare hvorfor jeg tok de avgjørelsene jeg gjorde.

Teksten hevder absolutt ikke å være en fullverdig guide til å lage et programmeringsspråk, men for den nysgjerrige vil den være et godt utgangspunkt.

Første steg

"Hvor skal jeg begynne?" er et spørsmål som andre utviklere ofte stiller når de får vite at jeg skriver mitt eget språk. I denne delen skal jeg forsøke å svare i detalj.

Kompilert eller tolket?

Kompilatoren analyserer hele programmet, gjør det om til maskinkode og lagrer det for senere kjøring. Tolken analyserer og utfører programmet linje for linje i sanntid.

Teknisk sett kan et hvilket som helst språk både kompileres og tolkes. Men for hvert språk er en av metodene mer egnet enn den andre, og valget av paradigme avhenger av tidlige stadier bestemmer videre utforming. I en generell forstand er tolkning fleksibel og kompilering gir høy ytelse, men dette er bare toppen av et veldig komplekst tema.

Jeg ønsket å lage et enkelt, men kraftig språk, som er sjeldent, så jeg bestemte meg for å lage Pinecone kompilert helt fra begynnelsen. Imidlertid har Pinecone også en tolk - til å begynne med var lansering bare mulig med dens hjelp, senere vil jeg forklare hvorfor.

Merk oversettelse Det har vi forresten kort anmeldelse

er en flott øvelse for de som lærer Python.

Språkvalg Et slags meta-trinn: selve programmeringsspråket er et program som må skrives på et eller annet språk. Jeg valgte C++ på grunn av ytelse, stort sett funksjonalitet

, og bare fordi jeg liker ham.

  • Men generelt kan følgende råd gis: tolkbart språksterkt anbefalt skrive
  • på et kompilert språk (C, C++, Swift). Ellers vil ytelsen overhead snøballe mens meta-tolken tolker tolken din; kompilert språk i tolket språk (Python, JS). Kompileringstiden vil øke, men ikke programkjøringstiden.

Arkitektur design

Strukturen til et programmeringsspråk har flere trinn fra kildekode til kjørbar fil, som hver formaterer data på en bestemt måte, samt funksjoner for overgang mellom disse stadiene. La oss snakke om dette mer detaljert.

Leksikalanalysator/lexer

Kildekodelinjen sendes gjennom lexeren og gjøres om til en liste over tokens.

Det første trinnet på de fleste språk er leksikalsk analyse. Enkelt sagt representerer det inndelingen av tekst i tokens, det vil si språkenheter: variabler, funksjonsnavn (identifikatorer), operatorer, tall. Derfor, ved å mate lexeren en streng med kildekoden som input, vil vi motta som utdata en liste over alle tokens som den inneholder.

Appellerer til kildekode vil ikke lenger forekomme i påfølgende stadier, så lexeren må gi all nødvendig informasjon for dem.

Flex

Da jeg lagde språket, var det første jeg gjorde å skrive en lexer. Senere har jeg utforsket verktøy som kan gjøre leksikalsk analyse enklere og redusere antall feil som oppstår.

Et av de viktigste slike verktøyene er Flex - en leksikalsk analysatorgenerator. Den tar som input en fil som beskriver språkgrammatikken, og lager deretter et C-program, som igjen analyserer strengen og gir det ønskede resultatet.

Mitt valg

Jeg bestemte meg for å beholde analysatoren jeg skrev. Til slutt så jeg ingen spesielle fordeler med Flex, og bruken av den ville bare skape ytterligere avhengigheter som ville komplisere byggeprosessen. I tillegg tillater mitt valg mer fleksibilitet - for eksempel kan du legge til en setning til språket uten å måtte redigere flere filer.

Parser/parser

Listen over tokens går gjennom parseren og blir til et tre.

Det neste trinnet er parseren. Den forvandler kildeteksten, det vil si en liste over tokens (som tar hensyn til parenteser og operasjonsrekkefølge), til et abstrakt syntakstre som lar deg strukturelt representere reglene skapte språk. Selve prosessen kan kalles enkel, men med en økning i antall språkkonstruksjoner blir den mye mer komplisert.

Bison

På dette trinnet tenkte jeg også å bruke et tredjepartsbibliotek, og se på Bison for å generere parseren. Det er mye som Flex - en tilpasset fil med syntaksregler er strukturert ved hjelp av et C-program. Men igjen, jeg bestemte meg for automatiseringsverktøy.

Fordeler med tilpassede programmer

Med lexeren var beslutningen min om å skrive og bruke min egen kode (omtrent 200 linjer lang) ganske åpenbar: Jeg elsker gåter, og denne er også relativt triviell. Parseren er en annen historie: nå er kodelengden for den 750 linjer, og dette er allerede det tredje forsøket (de to første var rett og slett forferdelige).

Jeg bestemte meg imidlertid for å lage parseren selv. Her er hovedårsakene:

  • minimer kontekstbytte;
  • forenkling av montering;
  • ønske om å takle oppgaven selvstendig.

Jeg ble overbevist om gjennomførbarheten av løsningen ved uttalelsen til Walter Bright (skaperen av D-språket) i en av artiklene hans:

Jeg vil ikke anbefale å bruke lexer- og parsergeneratorer, samt andre såkalte "kompilatorkompilatorer". Å skrive en lexer og parser vil ikke ta mye tid, og bruk av generatoren vil binde deg fast til den videre arbeid(som betyr noe når du porterer kompilatoren til ny plattform). I tillegg er generatorer preget av å gi irrelevante feilmeldinger.

Abstrakt semantisk graf

Overgang fra et syntakstre til en semantisk graf

I denne delen implementerte jeg en struktur som i hovedsak er nærmest "mellomrepresentasjonen" i LLVM. Det er en liten, men viktig forskjell mellom et abstrakt syntakstre (AST) og en abstrakt semantisk graf (ASG).

ASG vs ASD

Grovt sett er en semantisk graf et syntaktisk tre med kontekst. Det vil si at den inneholder informasjon som hvilken type funksjonen returnerer eller på hvilke steder den samme variabelen brukes. Fordi grafen trenger å gjenkjenne og huske all denne konteksten, trenger koden som genererer den støtte i form av mange forskjellige forklarende tabeller.

Lansering

Når grafen er tegnet, er det en ganske enkel oppgave å kjøre programmet. Hver node inneholder en implementering av en funksjon som tar litt input, gjør det den er programmert til å gjøre (inkludert mulige kall til hjelpefunksjoner), og returnerer et resultat. Dette er tolken i aksjon.

Kompileringsalternativer

Du lurer kanskje på hvor tolken kom fra, siden jeg opprinnelig definerte Pinecone som et kompilert språk. Poenget er at kompilering er mye vanskeligere enn tolkning - jeg nevnte tidligere at jeg fikk noen problemer med dette trinnet.

Skriv din egen kompilator

Først likte jeg denne ideen – jeg liker å gjøre ting selv, og jeg har lenge hatt lyst til å lære assemblerspråk. Men å lage en kompilator på tvers av plattformer fra bunnen av er vanskeligere enn å skrive maskinkode for hvert element i språket. Jeg fant denne ideen helt upraktisk og ikke verdt ressursene som ble brukt.