Sproget, som programmer er skrevet på, er et programmeringssprog. Liste over programmeringssprog

Når du forsøger at finde ud af, hvilket programmeringssprog du skal begynde at lære, vil du sandsynligvis støde på udtrykkene "højt niveau" og "lavt niveau". Folk taler om programmeringssprog på højt niveau hele tiden. lavt niveau. Men hvad betyder det helt præcist? Og hvad vil det sige at lære at skrive kode? Lad os starte med definitionerne af hver.


Programmeringssprog "Højt" og "Lavt niveau".

I denne artikel vil jeg tale om sprog på "højt" og "lavt niveau". Men der er ingen særlige kriterier til at bestemme dette. Bare husk på, at dette i høj grad afhænger af dit perspektiv. Hvis du er en C-programmør, kan Java virke ret højt niveau. Hvis du er vant til Ruby, kan Java virke som et sprog på lavt niveau.

Maskinkode og sprog på lavt niveau

Uanset om et sprog betragtes som et højt eller lavt niveau (eller et sted midt imellem), handler det om abstraktion. Maskinkode har ingen abstraktion - den indeholder separate instruktioner, overført til computeren. Og da maskiner kun beskæftiger sig med tal, er de repræsenteret i binær(selvom de nogle gange er skrevet med decimal eller hexadecimal notation).

Her er et eksempel på maskinkode:

I maskinkode skal operationer specificeres præcist. For eksempel, hvis et stykke information skal hentes fra hukommelsen, skal maskinkoden fortælle computeren, hvor i hukommelsen den skal finde den.

At skrive direkte til maskinkode er muligt, men meget svært.

Programmeringssprog på lavt niveau tilføjer en smule abstraktion til maskinkoder. Denne abstraktion skjuler specifikke maskinkodeinstruktioner bag erklæringer, der er mere læselige for mennesker. Samlingssprog er sprogene på det laveste niveau ved siden af ​​maskinkoden.

I maskinkode kunne du skrive noget som "10110000 01100001", men assemblersprog kan forenkle dette som "MOV AL, 61h". Der er stadig næsten en-til-en overensstemmelse mellem det, der er skrevet på assemblersprog, og instruktionerne til maskinen.

Bevæger man sig over i mere populære programmeringssprog, ender man med noget som C. Selvom dette sprog ikke er så lavt niveau som assemblersprog, er der stadig en stærk overensstemmelse mellem, hvad der er skrevet i C og maskinkode. De fleste operationer skrevet i C kan gennemføres uden stort beløb maskinkode instruktioner.

Programmeringssprog på højt niveau

Ligesom sprog på lavere niveau dækker højere niveauer en bred vifte af abstraktioner. Nogle sprog, såsom Java (mange betragter det som et mellemprogrammeringssprog), giver dig stadig meget kontrol over, hvordan computeren håndterer hukommelse og data.

Andre, som Ruby og Python, er meget abstrakte. De giver dig mindre adgang til funktioner på lavere niveau, men syntaksen er meget lettere at læse og skrive. Du kan gruppere ting i klasser, der arver karakteristika, så du kun behøver at erklære dem én gang.

Variabler, objekter, subrutiner og loops er vigtige dele af sprog højt niveau. Disse og andre koncepter vil hjælpe dig med at fortælle maskinen en masse ting med korte, præcise udsagn.

Mens assemblersproget har en næsten ensartet kortlægning mellem dets instruktioner og maskinkodeinstruktioner, kan et sprog på højere niveau sende dusinvis af kommandoer med en enkelt kodelinje.

Det er vigtigt at bemærke, at "programmeringssprog på højt niveau" kan omfatte alt, der er mere abstrakt end assemblersprog.

Hvilket sprog skal du studere: lavt eller højt niveau?

Dette er bestemt generelt spørgsmål blandt nye og håbefulde programmører. Hvilke programmeringssprog er bedre at lære: højt niveau eller lavt niveau? Som med mange programmeringsspørgsmål er spørgsmålet om programmeringssprog på højt niveau og lavt niveau ikke så enkelt.

Begge typer sprog har vigtige fordele. Sprog på lavt niveau, fordi de kræver lidt fortolkning af computeren, har tendens til at være meget hurtige. Og de giver programmører en masse kontrol over datalagring, hukommelse og hentning.

Men sprog på højt niveau er intuitive og giver programmører mulighed for at skrive kode meget mere effektivt. Disse sprog betragtes også som "sikrere", fordi der er flere sikkerhedsforanstaltninger, der forhindrer koderen i at udstede dårligt skrevne kommandoer, der kan forårsage skade. Men de giver ikke programmører den samme kontrol over processer på lavt niveau.

Med det i tankerne er her en liste over populære sprog på en skala fra lav til høj:

  • JavaScript
  • Python

Dette er selvfølgelig delvist subjektivt. Og det inkluderer kun en lille brøkdel af de tilgængelige sprog.

Men dette burde give dig en idé om, hvilket niveau de sprog, du er interesseret i, er på.

Hvad vil du lave?

Når du beslutter dig for hvilket sprog du vil lære, bør dit første spørgsmål være: hvad vil du programmere?

Hvis du vil programmere operativsystemer, kerner eller andet, der skal køre på maksimal hastighed, kan et sprog på et lavere niveau være godt valg. Stor del af Windows, OS X og Linux er skrevet i C- og C-afledte sprog som C++ og Objective-C.

Mange moderne applikationer skrevet på overordnede sprog eller endda domænespecifikke sprog. Python og Ruby er især populære til webapplikationer, selvom HTML5 bliver mere kraftfuldt. Sprog som Swift, C#, JavaScript og SQL har deres egne styrker og svagheder.

Jeg læste for nylig en tråd på et programmeringsforum og stødte på et interessant forslag: læs begge niveauer på én gang. Du får en dybere forståelse af de typer abstraktioner, der gør et sprog på et højere niveau mere effektivt.

Det er selvfølgelig ikke nemt at lære to sprog på samme tid, så du kan godt sprede din læring lidt. Og det kan være nyttigt at vælge to sprog, der ligner mest.

Igen, vi går tilbage til det, jeg sagde tidligere: vælg et sprog baseret på, hvad du vil gøre. Foretag nogle undersøgelser for at finde ud af, hvilke sprog folk bruger inden for deres felt. Brug derefter disse oplysninger til at vælge et sprog på højt og lavt niveau og begynde at lære dem.

Du vil snart se parallellerne, og du vil få en meget dybere forståelse af, hvordan programmering fungerer.

Fokuser på målet, ikke midlet.

Der er mange kriterier, du kan bruge til at vælge et programmeringssprog. Et af kriterierne er højt og lavt niveau. Men i næsten alle tilfælde er de kriterier, du skal bruge, det, du vil programmere.

Dit projekt kan drage fordel af et sprog på lavt niveau. Eller det kan være meget mere effektivt på et højt niveau. Det er op til dig at vælge det rigtige værktøj til opgaven. Fokuser på dit mål og vælg det rigtige sprog hver gang.

Har du erfaring med sprog på højt og lavt niveau? Foretrækker du det ene frem for det andet? Del dine tanker i kommentarerne nedenfor!

Computerprogrammer beskrives ofte som "sæt af instruktioner", og computersprog opfattes af mange kun som et ordforråd og en syntaktisk måde at give disse instruktioner på.

Fra dette synspunkt, forskellige sprog programmering kan have forskellig grammatik eller forskellige ordforråd. Hvert sprog kan behandle semikolon forskelligt eller kræve store bogstaver skriftligt, selvom alle sprog stort set er baseret på det samme princip.

Men virkeligheden i programmering er meget mere kompleks.

Programmering i dag

Det er mærkeligt, men de fleste af de virkelig "globale" ideer inden for computerprogrammering blev udviklet tilbage i 1950'erne og 60'erne. Siden da er der dukket mange nye sprog op, men ingen af ​​dem implementerer en virkelig ny tilgang til logik og beregning.

Udviklingen af ​​nye programmeringssprog gennem de sidste par årtier har været baseret på udvikleres erfaringer. Det betyder, at der er kode, der er nemmere at skrive ( Drivkraft Ruby) og lettere at læse (Python), og gør visse typer logiske strukturer og måder at løse problemer mere intuitivt på.

Nogle sprog blev udviklet til at løse specifikke programmeringsproblemer (såsom PHP og SASS), til at administrere visse typer systemer () eller til at arbejde i et specifikt miljø eller platform (Java og JavaScript). Nogle sprog blev designet specifikt til at hjælpe begyndere med at lære at programmere ( klassiske eksempler er BASIC og Scratch).

Siden teorier og praksisser omkring sprogdesign har udviklet sig til (for det meste) bredt accepteret ortodoksi, er meget af det nye og interessant arbejde Udviklingen af ​​programmeringspraksis er nu centreret omkring systemarkitektur.

En relativt ny udvikling omfatter konceptet SOA (Service Oriented Architecture). serviceorienteret arkitektur) og MVC (Model-View-Controller), samt rammer som , som gør det muligt for programmører nemt at arbejde inden for disse paradigmer.

Liste over programmeringssprog

En voksende liste over populære programmeringssprog, opmærkninger og protokoller. Links til beskrivelser af hver af dem:

ASCII-kodning

  • Tegnkodning er et af de grundlæggende aspekter af computere og internettet. ASCII er det første udbredte tegnkodningssystem. Det er blevet erstattet af UTF-8, men ASCII er stadig grundlaget for langt de fleste karakterer på internettet i dag. At forstå dette er meget vigtigt for programmører. Læs mere her (engelsk):

ASP/ASP.NET

  • ASP er et akronym for Active Server Pages. Det er det første scriptsprog på serversiden til Microsoft IIS-webserveren. ASP er blevet erstattet af en open source server-side framework - ASP.NET. Flere detaljer (engelsk):

AutoLISP

Awk

  • Awk er et ekstremt kraftfuldtrog, der giver dig mulighed for at udtrække data fra en fil eller anden kilde og udlæse det i ethvert format, du har brug for. Det er et ældre værktøj, men er stadig lige så nyttigt som nogensinde. Få mere at vide (engelsk): .

BASH

  • Bash er den mest brugte grænseflade kommandolinje i Unix-verdenen. Dette er den tekstbaserede standardgrænseflade til både Linux og Mac OS X. Læs mere:

Almindelig Lisp

  • Lisp er et ret unikt programmeringssprog, måske det ældste sprog og stadig i brug i dag. Dette er især vigtigt i området kunstig intelligens. Flere detaljer (engelsk):

C

  • Hvis vi her medtager to derivater af dette sprog, så kan vi roligt sige, at intet sprog har været mere nyttigt og mere indflydelsesrigt end C. Dette er især vigtigt for udviklingen af ​​operativsystemer og anden software. Mange compilere og tolke til andre sprog er skrevet i C. Læs mere:

C++

  • Oprindeligt kaldt "C med klasser", C++ er på mange måder simpelthen en mere avanceret efterfølger til C (selvom den overordnede situation er mere kompleks). C++ blev designet til at tilføje et højt niveau til C-programmeringsparadigmet og samtidig bibeholde på lavt niveau. Mange af disse tilføjelser er blevet tilføjet til C gennem årene, og sprogene ligner mere to dialekter af samme sprog. Flere detaljer (engelsk):

C#

  • Anvendes som det primære sprog til .NET-programmering, svarende til C++, en udvidelse af C-programmeringssproget, men med vigtig tilføjelse i form af objektorienterede evner. Flere detaljer (engelsk):

CSS/CSS3

  • CSS, eller Cascading Style Sheets, er heller ikke et programmeringssprog, men et sidestilsprog – et sprog, der giver stil- og layoutregler til dokumenter og applikationer. Det er det vigtigste stilsprog, der bruges på internettet. Flere detaljer:

Emacs Lisp

  • Emacs har længe været kendt som populær og kraftfuld tekst editor. Men at tilføje Emacs Lisp til det gør det til et integreret udviklingsmiljø for næsten ethvert programmeringssprog. Flere detaljer (engelsk): .

F#

  • F# – programmeringssprog generelle formål. Designet til at være ekstremt effektiv. Kun at være oprindeligt Microsoft sprog, er nu et open source-sprog og bruges på alle platforme. Flere detaljer (engelsk): .

FORTAN

FREM

  • Arbejdet med Forth begyndte i 1968, og sproget bruges typisk på hardware, der ikke har et traditionelt styresystem. Det er også meget brugt til at styre værktøjsmaskiner. Flere detaljer (engelsk):

Haskell

  • Haskell er et af de mest populære funktionelle programmeringssprog, udover at være prototypen for et dusin andre sprog. Det er meget brugt i erhvervslivet og den akademiske verden og er et fantastisk sprog at begynde at lære om. funktionel programmering. Flere detaljer (engelsk):

HTML

  • HTML er ikke et programmeringssprog. Dette er et opmærkningssprog - et sprog til at tilføje semantiske og stilistiske annotationer til indhold. Det er det primære sprog for webindhold. Kendskab til det er nødvendigt og obligatorisk for alle webdesignere og webudviklere samt alle (skribenter, redaktører), der producerer internetindhold. Flere detaljer (engelsk): og

IDL

  • IDL, eller Interactive Data Language, er et programmeringssprog, der primært bruges til dataanalyse og visualisering. Det er stadig meget brugt i rumfart og astronomi. Flere detaljer (engelsk):

INTERKAL

  • INTERCAL er et parodi computersprog udviklet i begyndelsen af ​​1970'erne. Den blev skabt som en joke for at vise, hvordan sprog er teknisk komplekse og svære at læse. Dette er et rigtigt sprog, som du kan downloade, og som du endda kan gøre noget med. Det antages, at du skal være meget fortrolig med det for at gøre dette - men igen, ikke for godt, for INTERCAL selv vil heller ikke lide det. Flere detaljer (engelsk):

Java

  • Java er et sprog på højt niveau designet til brug på Java Virtual Machine. Har meget få eksterne afhængigheder og er designet til at fungere på evt fysisk maskine. Brugt meget i netværksarkitektur, såvel som i indlejrede enheder og andre computerapplikationer. Flere detaljer (engelsk): .

Javascript

  • JavaScript (faktisk ikke relateret til Java) er scriptsprog, oprindeligt designet til brug i webbrowsere. Derfor har den indbygget mulighed for at arbejde med Document Object Model (DOM), repræsentationen i hukommelsen af ​​websideindhold. Det er det vigtigste programmeringssprog til front-end webudvikling. Hovedsageligt begivenhedsdrevet, og takket være Node.JS, På det sidste modtaget anerkendelse som et server-side sprog. Flere detaljer (engelsk): og. Og her:

Ksh

  • Korn Shell (ksh) er en kommandolinjegrænseflade, der bruges på Unix. Det var en tidlig shell, kompatibel med standard Bourne shell, men med alle de smarte interaktive funktioner i C-skallen. Flere detaljer:

Linux programmering

  • Linux-programmering omfatter alt fra shell-scripting til applikationsudvikling og kerneudvikling. Flere detaljer (engelsk):

Logo

  • Logo er et af de tidligste sprog til undervisning i programmering og er stadig nok det mest berømte. Han er berømt for sin skildpadde, som børn får til at bevæge sig med computerkommandoer. En sjov måde at lære programmering på. Flere detaljer (engelsk):

M.L.

  • ML blev oprindeligt designet som et meta-programmeringssprog: et sprog til at skabe andre sprog. Men med tiden blev det et almindeligt sprog, der blev brugt i vid udstrækning inden for uddannelse, matematik, naturvidenskab og endda finans. Flere detaljer (engelsk): .

MPI

  • Message Passing Interface er en standardprotokol til at sende beskeder mellem processer eller programmer. Det er blevet implementeret i en række programmeringssprog, herunder C, C++, Java og Python. Takket være MPI blev det muligt parallel computing. Flere detaljer (engelsk):

Netværksprogrammering med internetstik

Mål-C

  • En anden version af C, skabt i 1980'erne for at give en fuldt objektorienteret implementering af C. Sprogets hovedanvendelse i dag er i Mac OSX og operationsstuer iOS-systemer. Indtil for nylig iOS-applikationer skulle have været skrevet i Objective-C, men nu kan du også skrive i Swift. Flere detaljer (engelsk):

OKaml

  • OKaml er et objektorienteret funktionelt computersprog. I ML-traditionen bruges det meget til at skrive andre programmeringssprog og rammer. Flere detaljer (engelsk): .

Udvikling af operativsystemer

  • Everest af programmeringsopgaver anses for at være udviklingen af ​​et operativsystem. Hvis du vil bevise over for dig selv, at du kan skrive hvad som helst, så er der ikke noget bedre end at skrive din egen styresystemkerne og dens tilhørende værktøjer. Men vær forsigtig: dette er kun en rejse for de modige og sande programmører! Flere detaljer (engelsk): .

Perl

  • Meget nyttigt værktøj næsten enhver programmør. Som et fortolket sprog behøver det ikke at blive kompileret, nogle gange omtalt som "Swiss Army Knife" af scriptsprog. Flere detaljer (engelsk):

PROLOG

  • Prolog er et logisk programmeringssprog designet til at behandle naturligt sprog. Flere detaljer (engelsk):

Rene data

  • Pure Data er et unikt visuelt programmeringssprog. Blev oprettet specifikt for at give brugere mulighed for at skabe video, lyd og grafiske værker. Flere detaljer (engelsk): .

Python

  • Python er et programmeringssprog på højt niveau. Et fortolket (ikke-kompileret) sprog, også kendt som et "scriptsprog". Anvendes primært som et værktøj til at udføre specialiserede programmeringsopgaver såsom automatiserings- og dataanalyseopgaver. Har et stærkt sæt værktøjer til matematiske og videnskabelig databehandling, bruges ofte af forskere. Flere detaljer (engelsk):

Ruby on Rails

  • Ruby on Rails er en webudviklingsramme for Ruby-programmeringssproget. Det giver MVC-arkitektur ( Modelvisning Controller), et databaseabstraktionslag og mange værktøjer til at fremskynde processen med at programmere webapplikationer. Meget populær for hurtig udvikling webapplikationer. Flere detaljer (engelsk):

SAS

  • SAS er et specialiseret sprog designet til at analysere statistiske data. Udbredt i regeringen, den akademiske verden og erhvervslivet. For folk med meget data er SAS det oplagte valg. Flere detaljer (engelsk): .

Scala

  • Scala er et relativt nyt sprog - mere eller mindre nyt og bedste Java. Det er et fantastisk sprog for Java-programmører, der ønsker at være mere effektive, eller for folk, der lige er begyndt at lære programmering og ønsker at lære et kraftfuldt sprog, der ikke vil begrænse dem i fremtiden. Flere detaljer (engelsk): .

Ordning

  • Ordning gammelt sprog, men bruges stadig til at undervise i programmering og mere komplekse fag i datalogi. Baseret hovedsageligt på Lisp, og delvist på ALGOL. Flere detaljer (engelsk): .

Kradse

  • Scratch-programmeringssproget blev skabt specielt til undervisning i programmering til børn i alderen 8 til 16 år. Scratch er nemt, og det giver børn mulighed for at lære det grundlæggende i programmeringslogik på en sjov måde. spilform. Flere detaljer (engelsk):

Simula

  • Simula er et historisk vigtigt sprog, fordi det var det første sprog, der introducerede de begreber, der blev grundlaget for objektorienteret programmering. Flere detaljer (engelsk): .

SMIL

  • SMIL (Synchronized Multimedia Integration Language) er et værktøj til de mennesker, der ønsker at skabe og distribuere præsentationer. Særligt nyttigt, hvis du vil lave præsentationer, der skal opdateres fra tid til anden. Flere detaljer (engelsk):

SQL

  • SQL (Structured Query Language) – det sprog, der bruges til at kommunikere med den relationelle database Ledelsessystemer(RDBMS'er). SQL giver programmøren mulighed for at oprette datastrukturer, indsætte og redigere data og forespørge på dem. Flere detaljer (engelsk):

Stata

  • Stata er et udviklingsmiljø og programmeringssprog til løsning af alvorlige statistiske problemer. Og selvom den blev skabt for lang tid siden, er den stadig meget brugt. Hvis du er forbundet med statistisk arbejde, Stata er et fantastisk værktøj. Flere detaljer (engelsk):

Swift

  • Swift er et nyt programmeringssprog udviklet af af Apple, til iOS, OS X, watchOS, tvOS og Linux. Dette er fremtidens sprog for udviklere af programmer og applikationer til Apple-enheder. Flere detaljer (engelsk):

S-PLUS

  • S-PLUS er en kommerciel version af det kraftfulde S programmeringssprog designet til at udføre statistisk analyse. GNU-projektet har sin egen version af S, kaldet R. Alle de nødvendige ressourcer om S med vægt på S-PLUS:

UNIX programmering

  • Bredden af ​​programmering på Unix er stor. Det dækker området fra administrative scripts til tekstbaseret kode til X Window-udvikling. Flere detaljer (engelsk):

XML

  • XML er godt struktureret sprog til mærkning, beregnet til både menneskelig og maskinel læsning. Flere detaljer (engelsk):

Lektion forberedt af: Akulov Ivan

Recoursia-brugere spekulerer ofte på, hvilket programmeringssprog der er værd at lære. Vi har forberedt os kort guide for dem, der beslutter sig for deres første programmeringssprog. Vi vil gerne påpege, at det ikke er meningen, at det skal være omfattende – det er bare et meget hurtigt kig på, hvad udviklere laver i dag, og hvilket programmeringssprog, der kan være det første eller ikke.

Et af de ret populære webprogrammeringssprog, som dog på det hviderussiske arbejdsmarked ikke altid er i stand til at give sit modersmål et topbetalende job. Ruby-kurser er næppe værd at studere for at mestre det første programmeringssprog, for med en høj grad af sandsynlighed vil søgningen efter en arbejdsgiver blive forsinket, da ledige stillinger for junoirer i Ruby dukker op ret sjældent.

For bare fem til syv år siden var Delphi det første standardprogrammeringssprog – selvfølgelig fordi Pascal-sproget, som er forgængeren til Delphi, blev opfundet for at lære skolebørn og elever programmering. Men for I virkeligheden Delphi er allerede meget velegnet, da programmering på det betaler sig mærkbart under gennemsnittet og nyt større projekter Du finder det ikke på dette sprog. Anbefal derfor

PROGRAMMERINGSSPROG OG DETS TYPER

Et programmeringssprog er et formelt tegnsystem designet til at skrive computerprogrammer. Et programmeringssprog definerer et sæt leksikalske, syntaktiske og semantiske regler, der definerer udseende programmer og handlinger, som udføreren (computeren) vil udføre under dens kontrol.

Et programmeringssprog på højt niveau er et programmeringssprog designet til at være hurtigt og nemt at bruge af programmøren. Hovedtræk ved højt niveau sprog er abstraktion, det vil sige indførelsen af ​​semantiske konstruktioner, der kort beskriver sådanne datastrukturer og operationer på dem, hvis beskrivelser i maskinkode (eller andet lavniveau programmeringssprog) er meget lang og svær at forstå.

Programmeringssprog på lavt niveau (programmeringssprog på lavt niveau) er et programmeringssprog, der er tæt på at programmere direkte i maskinkoderne for den anvendte rigtige eller virtuelle (for eksempel Java, Microsoft .NET) processor. En mnemonisk notation bruges normalt til at angive maskininstruktioner. Dette gør det muligt at huske kommandoer ikke som en sekvens af binære enere og nuller, men som meningsfulde forkortelser af ord på det menneskelige sprog (normalt engelsk).

PROGRAMMERINGSPROG PÅ LAVT NIVEAU

Tidlige computere skulle programmeres ved hjælp af binære maskinkoder. Programmering på denne måde er dog ret arbejdskrævende og vanskelig opgave. For at forenkle denne opgave begyndte programmeringssprog på lavt niveau at dukke op, hvilket gjorde det muligt at specificere maskinkommandoer i en form, der er mere forståelig for mennesker. At konvertere dem til binær kode blev skabt særlige programmer- oversættere.

Fig.1. Et eksempel på maskinkode og dens repræsentation i assembler

Oversættere er opdelt i:

    compilere - konverter programtekst til maskinkode, som kan gemmes og derefter bruges uden en compiler (et eksempel er eksekverbare filer med *.exe-udvidelsen);

    tolke - gør en del af programmet til maskinkode, kør det og gå videre til næste del. I dette tilfælde bruges en tolk, hver gang programmet køres.

Et eksempel på et sprog på lavt niveau er assemblersprog. Sprog på lavt niveau er fokuseret på en bestemt type processor og tager højde for dens funktioner, så for at porte et assemblersprogsprogram til en anden hardwareplatform skal det næsten omskrives fuldstændigt. Der er også visse forskelle i syntaksen af ​​programmer for forskellige compilere. Sandt nok er centrale processorer til computere fra AMD og Intel praktisk talt kompatible og adskiller sig kun i nogle specifikke kommandoer. Men specialiserede processorer til andre enheder, for eksempel videokort og telefoner, rummer betydelige forskelle.

Fordele

Sprog på lavt niveau skaber effektive og kompakte programmer, fordi udvikleren har adgang til alle processorens muligheder.

Fejl

    En programmør, der arbejder med sprog på lavt niveau, skal være højt kvalificeret og have en god forståelse for strukturen af ​​det mikroprocessorsystem, som programmet oprettes til. Så hvis et program er oprettet til en computer, skal du kende computerens enhed og især enheden og processorens betjeningsfunktioner;

    det resulterende program kan ikke overføres til en computer eller enhed med en anden type processor;

    betydelig udviklingstid for store og komplekse programmer.

Sprog på lavt niveau bruges normalt til at skrive små systemprogrammer, enhedsdrivere, interfacemoduler med ikke-standardudstyr, programmering af specialiserede mikroprocessorer, når de vigtigste krav er kompakthed, hastighed og mulighed for direkte adgang til hardwareressourcer.

Assembly er et sprog på lavt niveau, der stadig er meget udbredt i dag.

PROGRAMMERINGSPROG PÅ HØJT NIVEAU

Det første programmeringssprog på højt niveau overvejes computersprog Plankalkül, udviklet af den tyske ingeniør Konrad Zuse tilbage i perioden 1942-1946. Men en oversætter til det eksisterede først i 2000. Verdens første sprogoversætter på højt niveau er PP (Programming Program), også kendt som PP-1, testet med succes i 1954. Oversætter PP-2 (1955, 4. i verden) translator) var allerede ved at optimere og indeholdt sin egen loader og debugger, et bibliotek med standardprocedurer, og PP-oversætteren til Strela-4-computeren indeholdt allerede en linker af moduler. Imidlertid begyndte den udbredte brug af sprog på højt niveau med fremkomsten af ​​Fortran og oprettelsen af ​​en compiler til dette sprog (1957).

Sprog på højt niveau stræber ikke kun efter at gøre det lettere at løse komplekse programopgaver, men også for at forenkle porteringen af ​​software. Brugen af ​​forskellige oversættere og tolke sikrer forbindelsen af ​​programmer skrevet på højt niveau sprog med forskellige operativsystemer og hardware, mens deres kildekode ideelt set forbliver uændret.

Denne form for isolation af sprog på højt niveau fra hardwareimplementeringen af ​​computeren har ud over mange fordele også ulemper. Især giver det dig ikke mulighed for at oprette enkle og præcise instruktioner til det anvendte udstyr. Programmer skrevet på højt niveau sprog er nemmere for programmøren at forstå, men er mindre effektive end deres modstykker oprettet ved hjælp af lavt niveau sprog. En af konsekvenserne af dette var tilføjelsen af ​​understøttelse af et eller andet lavniveausprog (assemblersprog) til en række moderne professionelle programmeringssprog på højt niveau.

Eksempler: C, C++, C#, Java, Python, PHP, Ruby, Perl, Pascal, Delphi, Lisp. Sprog på højt niveau er kendetegnet ved evnen til at arbejde med komplekse datastrukturer. De fleste af dem har integreret understøttelse af strengtyper, objekter, operationer fil I/O osv. Ulempen ved sprog på højt niveau er større størrelse programmer sammenlignet med programmer på et lavt niveau sprog. Derfor bruges sprog på højt niveau hovedsageligt til at udvikle software til computere og enheder, der har en stor mængde hukommelse. Og forskellige undertyper af assembler bruges til at programmere andre enheder, hvor størrelsen af ​​programmet er kritisk.

Imperative sprog er baseret på flere vigtige ideer, herunder repræsentationen af ​​handlinger som matematiske formler, begrebet datatype og strukturel transformationssætning.

Et program i et imperativt sprog er bygget af funktioner (underrutiner). Assembly sprogprogrammer kan også bestå af underrutiner, og det er ikke noget nyt, men sprog på højt niveau giver dig mulighed for ikke at tænke på sådanne problemer som at organisere opkald, sende kildedata og returnere resultater. Beskrivelsen af ​​en funktion består af et navn, en liste over parametre (startdata), typen af ​​resultat og de handlinger, der fører til opnåelse af dette resultat. En af programmets funktioner er den vigtigste, dets udførelse er programmets arbejde.

Et simpelt eksempel er en funktion, der beregner sinus af et tal. Det kan kaldes sin, dets inputdata består af et reelt tal, resultatet er også et reelt tal, opnået ved at summere et segment af en kendt uendelig række (eller udføre fsin-kommandoen fra en matematisk coprocessor).

Sættet af handlinger, der kan udføres inde i en funktion, er meget begrænset. Det består af at evaluere formeludtryk, kalde andre funktioner (som ikke er en separat handling - et funktionskald er ofte inkluderet i et udtryk), tildelinger, forgreninger (en gruppe handlinger, der kun udføres, hvis en betingelse er sand) og loops ( en gruppe af handlinger, der udføres gentagne gange, afhænger antallet af gentagelser af en eller anden betingelse). Handlinger kan indlejres i hinanden. Det kan se ud til, at sættet af grene og løkker er for lille, men det er ikke tilfældet. Det er blevet bevist, at enhver algoritme sammensat af funktionelle blokke (på et lavt niveau - aritmetiske kommandoer og dataoverførselskommandoer), betingede og ubetingede overgange kan konverteres til en ækvivalent algoritme kun sammensat af strukturelle blokke - funktionelle blokke, grene og sløjfer med betingelse check i slutningen. Denne erklæring blev formuleret i papiret af Corrado Bohm og Giuseppe Jacopini, "Flowdiagrammer, turingmaskiner og sprog med kun to dannelsesregler" (Communications of ACM, bind 9 / nummer 5 / maj, 1965).

Hvis mellemresultater skal gemmes et sted for at udføre de nødvendige handlinger, placeres særlige erklæringer indeholdende variabelnavne og eventuelt andre oplysninger inde i funktionen. Adresserne på RAM-cellerne vil automatisk blive tildelt dem. På nogle sprog kan funktioner også indeholde konstant- og typedefinitioner. I Pascal-lignende sprog er en funktion som et program og kan indeholde definitioner af ikke kun konstanter, typer og variabler, men også andre funktioner.

En dataerklæring er en liste over navngivne objekter. Disse objekter kaldes variable. På en række sprog skal typen af ​​en variabel specificeres, hvilket bestemmer mængden af ​​hukommelse, der kræves til dens placering, og det sæt af operationer, den kan deltage i. Men dette er ikke nødvendigvis tilfældet; der er sprog, hvor typen af ​​en variabel ikke er specificeret og kan ændre sig under programafvikling.

Typisk giver programmeringssprog et ret begrænset sæt af foruddefinerede variabeltyper og værktøjer til at skabe nye typer. Nogle af følgende typer er foruddefinerede:

    naturlige tal og heltal i forskellige størrelser;

    reelle tal;

    symboler - bogstaver, tal, aritmetiske tegn osv.;

    tegnstrenge;

    booleske værdier;

    pointer

Handlinger på data kan udføres ved hjælp af funktioner og operatører.

I C-sproget er symboler, strenge og booleaner for eksempel ikke defineret. Dens type char er faktisk et kort heltal og tillader aritmetiske operationer.

Nye typer dannes ved at kombinere flere elementer af samme type til en helhed (en matrix, hver af dens elementer har et serienummer) eller elementer af forskellige typer (en struktur, hver af dens elementer har givet navn). For eksempel er komplekse tal ikke defineret på de fleste sprog, men de kan defineres:

På nogle sprog (for eksempel C++) kan operatorer også defineres for oprettede typer, hvilket giver dig mulighed for at bruge variabler af disse typer på samme måde som variabler af foruddefinerede typer.

Der er andre måder at oprette nye typer på. For eksempel er det i Pascal muligt at oprette:

    områdetyper (ved at angive en række værdier);

    opregningstyper (ved at opregne mulige værdier);

    sæt typer

Variabler af sættyper kan bruges til at gemme information om et sæt egenskaber for ethvert objekt. Noget lignende kan gøres ved hjælp af heltalsvariabler, bits sæt som indikerer tilstedeværelsen af ​​tilsvarende egenskaber. Tilsyneladende er brug af sæt mere modstandsdygtig over for programmørfejl.

Programmør William W. Vold fortæller historien

I løbet af de sidste seks måneder har jeg arbejdet på at skabe et programmeringssprog (PL) kaldet Pinecone. Jeg vil ikke turde kalde det komplet, men du kan allerede nu bruge det – det indeholder nok elementer til dette, såsom variabler, funktioner og brugerdefinerede datastrukturer. Hvis du vil tjekke det ud, før du læser, foreslår jeg, at du besøger den officielle side og repository på GitHub.

Introduktion

Jeg er ikke ekspert. Da jeg begyndte at arbejde på dette projekt, anede jeg ikke, hvad jeg lavede, og det gør jeg stadig ikke. Jeg har aldrig målrettet studeret principperne for at skabe et sprog - jeg læste kun nogle materialer på internettet, og selv i dem fandt jeg ikke næsten noget nyttigt for mig selv.

Jeg skrev dog absolut nyt sprog. Og det virker. Jeg må gøre noget rigtigt.

I denne artikel vil jeg forsøge at vise, hvordan Pinecone (og andre programmeringssprog) gør kildekode til det, som mange betragter som magi. Jeg vil også fokusere på situationer, hvor jeg var nødt til at indgå kompromiser og forklare, hvorfor jeg tog de beslutninger, jeg gjorde.

Teksten gør bestemt ikke krav på at være en fuldgyldig guide til at skabe et programmeringssprog, men for de nysgerrige vil det være et godt udgangspunkt.

Første skridt

"Hvor skal jeg overhovedet starte?" er et spørgsmål, som andre udviklere ofte stiller, når de lærer, at jeg skriver mit eget sprog. I denne del vil jeg forsøge at besvare det i detaljer.

Kompileret eller fortolket?

Compileren analyserer hele programmet, omdanner det til maskinkode og gemmer det til senere afvikling. Fortolkeren analyserer og udfører programmet linje for linje i realtid.

Teknisk set kan ethvert sprog både kompileres og fortolkes. Men for hvert sprog er den ene af metoderne mere egnet end den anden, og valget af paradigme afhænger af tidlige stadier bestemmer videre udformning. I en generel forstand er fortolkning fleksibel, og kompilering giver høj ydeevne, men dette er kun toppen af ​​et meget komplekst emne.

Jeg ønskede at skabe et enkelt, men kraftfuldt sprog, hvilket er sjældent, så jeg besluttede at lave Pinecone kompileret helt fra begyndelsen. Pinecone har dog også en tolk - først var lancering kun mulig med dens hjælp, senere vil jeg forklare hvorfor.

Bemærk oversættelse Det har vi i øvrigt kort anmeldelse er en god øvelse for dem, der lærer Python.

Valg af sprog

En slags meta-trin: selve programmeringssproget er et program, der skal skrives på et eller andet sprog. Jeg valgte C++ på grund af ydeevne, stort sæt funktionalitet, og bare fordi jeg kan lide ham.

Men generelt kan følgende råd gives:

  • fortolkeligt sprog højt anbefaletskrive i et kompileret sprog (C, C++, Swift). Ellers vil præstationen overhead snebold, mens meta-tolken tolker din tolk;
  • kompileret sprog du kan skrive i fortolket sprog (Python, JS). Kompileringstiden vil stige, men ikke programudførelsestiden.

Arkitektur design

Strukturen af ​​et programmeringssprog har flere trin fra kildekode til eksekverbar fil, som hver især formaterer data på en bestemt måde, samt funktioner til overgang mellem disse stadier. Lad os tale om dette mere detaljeret.

Leksisk analysator/lexer

Kildekodelinjen føres gennem lexeren og omdannes til en liste over tokens.

Det første trin på de fleste sprog er leksikalsk analyse. Enkelt sagt repræsenterer det opdelingen af ​​tekst i tokens, det vil sige sprogenheder: variabler, funktionsnavne (identifikatorer), operatorer, tal. Ved at tilføre lexeren en streng med kildekoden som input, vil vi således som output modtage en liste over alle de tokens, den indeholder.

Appellerer til kildekode vil ikke længere forekomme i efterfølgende stadier, så lexeren skal give alle de nødvendige oplysninger for dem.

Flex

Da jeg oprettede sproget, var det første, jeg gjorde, at skrive en lexer. Senere udforskede jeg værktøjer, der kunne gøre leksikalsk analyse lettere og reducere antallet af fejl, der opstår.

Et af de vigtigste sådanne værktøjer er Flex - en leksikalsk analysatorgenerator. Det tager som input en fil, der beskriver sprogets grammatik, og opretter derefter et C-program, som igen analyserer strengen og producerer det ønskede resultat.

Min beslutning

Jeg besluttede at beholde analysatoren, jeg skrev. I sidste ende så jeg ikke nogen særlige fordele ved Flex, og brugen af ​​det ville kun skabe yderligere afhængigheder, der ville komplicere byggeprocessen. Plus, mit valg giver mulighed for mere fleksibilitet - for eksempel kan du tilføje en erklæring til sproget uden at skulle redigere flere filer.

Parser/parser

Listen over tokens går gennem parseren og bliver til et træ.

Næste trin er parseren. Det transformerer kildeteksten, det vil sige en liste over tokens (under hensyntagen til parenteser og rækkefølge af operationer), til et abstrakt syntakstræ, der giver dig mulighed for strukturelt at repræsentere reglerne skabte sprog. Selve processen kan kaldes simpel, men med en stigning i antallet af sprogkonstruktioner bliver den meget mere kompliceret.

Bison

På dette trin tænkte jeg også på at bruge et tredjepartsbibliotek og se på Bison for at generere parseren. Det minder meget om Flex - en brugerdefineret fil med syntaksregler er struktureret ved hjælp af et C-program. Men igen, jeg besluttede mig for at undgå automatiseringsværktøjer.

Fordele ved tilpassede programmer

Med lexeren var min beslutning om at skrive og bruge min egen kode (ca. 200 linjer lang) ret indlysende: Jeg elsker puslespil, og denne er også relativt triviel. Parseren er en anden historie: nu er kodelængden for den 750 linjer, og dette er allerede det tredje forsøg (de første to var simpelthen forfærdelige).

Jeg besluttede dog at lave parseren selv. Her er hovedårsagerne:

  • minimere kontekstskift;
  • forenkling af montering;
  • lyst til at klare opgaven selvstændigt.

Jeg var overbevist om gennemførligheden af ​​løsningen ved udtalelsen fra Walter Bright (skaberen af ​​D-sproget) i en af ​​hans artikler:

Jeg vil ikke anbefale at bruge lexer og parser generatorer, samt andre såkaldte "compiler compilere". At skrive en lexer og parser vil ikke tage meget tid, og brug af generatoren vil binde dig fast til den i videre arbejde(hvilket betyder noget, når compileren overføres til ny platform). Derudover er generatorer kendetegnet ved at udsende irrelevante fejlmeddelelser.

Abstrakt semantisk graf

Overgang fra et syntakstræ til en semantisk graf

I denne del implementerede jeg en struktur, der i det væsentlige er tættest på "mellemrepræsentationen" i LLVM. Der er en lille, men vigtig forskel mellem et abstrakt syntakstræ (AST) og en abstrakt semantisk graf (ASG).

ASG vs ASD

Groft sagt er en semantisk graf et syntaktisk træ med kontekst. Det vil sige, at den indeholder information såsom hvilken type funktionen returnerer eller hvilke steder den samme variabel bruges. Fordi grafen skal genkende og huske hele denne sammenhæng, har den kode, der genererer den, brug for støtte i form af mange forskellige forklarende tabeller.

Lancering

Når først grafen er tegnet, er det en ret simpel opgave at køre programmet. Hver node indeholder en implementering af en funktion, der tager noget input, gør det, den er programmeret til at gøre (inklusive mulige kald til hjælpefunktioner) og returnerer et resultat. Dette er tolken i aktion.

Kompileringsmuligheder

Du undrer dig måske over, hvor tolken kom fra, da jeg oprindeligt definerede Pinecone som et kompileret sprog. Pointen er, at kompilering er meget sværere end fortolkning - jeg nævnte tidligere, at jeg løb ind i nogle problemer med dette trin.

Skriv din egen compiler

Først kunne jeg godt lide denne idé – jeg kan godt lide at lave ting selv, og jeg har længe ønsket at lære samlesprog. Men at skabe en cross-platform compiler fra bunden er sværere end at skrive maskinkode for hvert element i sproget. Jeg fandt denne idé fuldstændig upraktisk og ikke værd at bruge de ressourcer på.