Hva er programmeringsspråkene. Ulike programmeringsspråk og deres bruksområder. Forelesning i Yandex. Abstrakt semantisk graf

Zalina 13. januar 2016 kl. 15:42

Forskjellige språk programmering og deres bruksområde. Forelesning i Yandex

  • Yandex firmablogg,
  • Utvikling av nettsider,
  • programmering,
  • Industriell programmering

Vi bestemte oss for å vie vårt første innlegg i år til et veldig grunnleggende emne, et foredrag om som ble holdt i Small SHAD. Videregående elever som er interessert i teknologi er engasjert i det, derav spesifisiteten til presentasjonen - forelesningen vil være spesielt interessant for de som akkurat har begynt å programmere og tenker på hvilken retning de skal utvikle. For dem har Yandex et kurs "Introduksjon til programmering (C ++)", som kan tas på Stepic.org-plattformen.

Foreleser Mikhail Gustokashin - kurator for akademiske programmer ved Yandex, direktør for Center for Student Olympiads, Fakultet for informatikk, HMS. Mikhail har forberedt dusinvis av vinnere og prisvinnere av de all-russiske programmerings-olympiadene.

Innenfor rammen av forelesningen fortelles det om hva programmeringsspråk er, hvordan de skiller seg, hvordan de dukket opp og hvilke som er bedre og hvilke som er dårligere. I begynnelsen vil vi snakke litt om historien til språk - hvordan de dukket opp, hvordan folk begynte å programmere, hvordan alt utviklet seg, hva som skjer nå. Den andre delen vil komme inn på hva slags oppgaver språket passer for, hvordan "velge ditt favorittspråk og nyte livet". Foreleseren vil også snakke litt om hvordan man etter hans mening kan lære seg alt dette for så å få jobb.

Som alltid, under klippet er en detaljert utskrift av forelesningen slik at du kan navigere i innholdet.

Historie om programmeringsspråk

La oss starte helt fra begynnelsen. I begynnelsen hadde ikke datamaskiner engang tastatur! Det vil si at alt var veldig dårlig - de hadde ikke tastatur eller skjerm, de hadde hullkort (dette er slike ting med hull eller ingen hull). Følgelig ble enten tappene stukket dit, eller de lyste der med lys. Hvis det er et hull (eller omvendt), betydde det null eller en. Og programmer på den tiden ble skrevet ved hjelp av maskinkoder - hver operasjon i en datamaskin (addisjon, subtraksjon, noen mer komplekse operasjoner) hadde en slags maskinkode. Folk valgte selv denne koden fra tallerkenen, alle mulige adresser i minnet, de slo det hele ut med hendene og dyttet det inn i leseren - og alt ble talt. Selvsagt var nok ikke jobben til en programmerer særlig interessant da - å lage hull - og med utviklingen av vitenskap og teknologi begynte de selvfølgelig å finne på alt mulig mer "interessant". For eksempel assembler (Assembler), som allerede gjorde livet litt lettere.

Vel, hvordan gjorde han livet lettere? I stedet for å huske at det er en slags "magisk" kode for teamet, ble alle slags ord som ligner på "menneske" brukt Engelsk- noen add eller mov - og så ble registrene eller minneområdene, variablene som disse operasjonene må utføres med, oppregnet. Men det er klart at dette generelt også krevde en del mentale påkjenninger for å huske på i hvilket register vi har hva som ligger, hvor hvilke variabler og hva som skjer generelt. Hvorfor skjedde dette? Fordi datamaskiner var "dumme" og kunne ikke forstå noe mer "smart". Faktisk, og bygge fra assembler maskinkode krever også tid, minne (den gang var det selvfølgelig ikke nok av det).

Gradvis ble det klart at utviklingen så stor komplekse programmer veldig vanskelig. Programmererens produktivitet i disse kommandoene var ekstremt lav - det vil si at han skrev flere linjer om dagen (meningsfylt), og hver linje gjorde egentlig ingenting - noen enkle aritmetiske operasjoner. Og folk ønsket å gjøre språk mye mer lik det menneskelige språket, spesielt engelsk, for å gjøre det enklere og mer praktisk å skrive programmer. Og vi går!

Gamle og døde språk

Fortran ble et av de første språkene. Han ble forresten også slått ut på hullkort - det fantes spesielle hullkort for å slå ut Fortran-programmer. Men hvis du tar denne Fortran nå - etter min mening er den til og med et sted mellom 50-60. dukket opp - og prøv å skrive noe på det, så blir du veldig ubehagelig, jeg garanterer deg! Moderne Fortran lever fortsatt i dag, men det er ganske annerledes enn hva det pleide å være.

Andre språk - nå vil jeg skrive en ting som du sannsynligvis har hørt om, men bare på alle arrangementer der de forteller om programmeringshistorien - dette er COBOL. Det var et språk for å skrive forretningsapplikasjoner. Hva er forretningsapplikasjoner? Eventuelle transaksjoner i banker, noe annet, alt dette ble skrevet i Kobol. Det er selvfølgelig ikke veldig populært hos oss. Jeg tror du neppe finner en programmerer i Kobol, i Moskva. Og et sted ikke i Moskva - med enda større vanskeligheter. Men overraskende nok, selv for 10 år siden, ble mer enn halvparten av all koden skrevet av menneskeheten skrevet i Cobol. Og til nå er en betydelig del av alle banktransaksjoner utført ved hjelp av programmer skrevet i den (COBOL), og fortsatt skriver folk noe på den.

Det er også et "morsomt" språk, det ble kalt Algol (versjon 68, som kjennetegner året for opprettelsen). Det er et algoritmisk språk. Generelt klarte de å gjøre noe der, men nå er vi lite interessert i hva de kan. Og på dette kan vår utflukt til antikken og til relativt ubrukte språk fullføres og gå videre til det som fortsatt lever (og som lever aktivt).

Gamle, men levende språk

Algol ble oppfunnet i Europa, og Fortran ble hovedsakelig brukt i USA - det er ingen store forskjeller. Hvilken trend er synlig? Til å begynne med var alt vanskelig og for å skrive måtte man nesten være ingeniør, elektroingeniør, forstå hvor hvilke kontakter som er stengt og noe annet for programmering. Da var det også nødvendig å sitte med bladene og telle minnet, passe på det. Og etter hvert ble alt enklere, enklere, enklere og deretter enda enklere for programmereren - å tenke minst mulig for en person, å gjøre så mye som mulig automatisk. Rundt slutten av denne perioden (foreleseren peker på Algol og Kobol) begynner det å dukke opp språk som på en måte har "overlevd" til i dag.

GRUNNLEGGENDE. Kanskje noen mennesker fortsatt skriver noe på det, i det minste så jeg at i noen institusjoner underviser de på QBasic 'e - et slikt blått vindu der "1989" er skrevet. Generelt lever han "med makt og kraft"! Det ble oppfunnet som et språk for ikke-programmerere. På den tiden var programmereren et så veldig spesialisert yrke. Og her sier de til deg: «Her har vi en kul Grunnleggende språk, og enhver fornuftig person vil ta og skrive et program på det - enkelt." Igjen, at BASIC og moderne BASIC er en enorm forskjell. Alle disse linjene med nummerering etter 10, alle slags GOTO og annen gru - de har ingenting med moderne BASIC å gjøre og har til og med lite med BASIC på 89 å gjøre.

En annen morsom historie er Pascal-språket, viden kjent i universitetskretser, hovedsakelig i Russland og i landene i de tidligere Sovjetunionen... Det har vært og blir fortsatt brukt overraskende som undervisning i språk... I resten av verden er den mindre vanlig, men den lever også i beste velgående. Det er en slik person Wirth - her er han en vitenskapsmann, en teoretiker. Han deltok i diskusjonen om Algol, han likte ikke det som skjedde, og han kom opp med sitt eget språk - Pascal. Og så tok Borland-firmaet (og før det mange andre firmaer - Apple var engasjert) og ødela alt. Han hadde en vakker teori, slank – «alt blir bra» – og de tok og stappet der det folk trenger til jobb. Vel, det gikk ikke så bra som han ønsket.

Og endelig,. Xi ble oppfunnet av ingeniører. Hvis Pascal ble oppfunnet av en vitenskapsmann, så ble C oppfunnet av Kernighan og Ritchie, de jobbet som ingeniører hos Bell. Hvordan skjedde dette? På den tiden var det umulig å skrive noe systemisk på disse språkene (foreleseren peker på Fortran, COBOL, Algol). Hva er "systemisk"? For eksempel et operativsystem, noen drivere, noe annet. Disse språkene var ment for matematiske beregninger, for forretningsberegninger, for alt det der. Og alt annet ble skrevet i Assembler. Det var noen språk, de er nå døde, det vil si at C-språket ikke dukket opp umiddelbart fra Assembler, men gjennom noen mellomting.

Hva er essensen? Kernighan og Ritchie elsket å spille leketøyet Asteroids - fluer romskip, og det er asteroider, han skyter dem, og de faller fra hverandre. De hadde en server som de spilte på, men det var mye folk der, og leken sakket ned. Og de fant ut et sted på kontoret deres at de hadde en slags datamaskin som ingen bruker. Men det var et problem - det var av en annen arkitektur, og spillet ble skrevet i Assembler.

De skrev den om, selvfølgelig, de kuttet til og med inn noen funksjoner for å spille på den. Men dette førte dem til ideen om å omskrive under ny arkitektur hver gang er ikke veldig smart. Og de bestemte seg for å skrive et språk som dette høy level, som vil være egnet for systemprogrammering, det vil si der det vil være mulig å administrere minne, der det vil være mulig å forstå hvor noe er og hvordan man får tilgang til disse minnestykkene. Og slik dukket C-språket opp, som hadde stor innvirkning på alt senere. Alle (foreleseren peker på Algol, Fortran og andre nevnte språk) hadde stor innflytelse, men C - ja ...

Følgelig var det hovedspråket i Unix, et operativsystem som var enda mer populært på den tiden enn det er nå. Og rundt 80-tallet var situasjonen noe slikt (foreleseren viser i Basic, C og andre nevnte språk). La oss si at alt dette allerede har dødd på lur (foreleseren sletter referanser til Assembler, Fortran og Algol) ... Og på 80-tallet ble datamaskinene mindre, smartere, billigere, og folk ville ha alle mulige rariteter, i rekkefølge å leve enda bedre, å leve enda morsommere.

Språk hjemmehørende på 80-tallet

En av de første raritetene var C++-språket. C-språket har et stort antall mangler (vel, bare en stor en) - du kan gjøre hva som helst på det, inkludert å skyte deg selv i beinet, skyte deg selv i beinet med en fiksjon, i det andre beinet, skyte med en fot i det andre beinet, generelt - som du vil gjøre. Men samtidig er noen arkitektoniske ting ganske vanskelige å gjøre der – igjen, som i Assembler, må vi holde styr på hvor vi er, hva og hvilket minne vi har tildelt; det er der hele tiden dette minnet "flyter" et sted - det vil si at vi har valgt, glemt å slette, slettet feil ting, kommet ut av minnet, generelt - vi har en haug med problemer.

C ++ ble opprinnelig laget som et sett med tillegg til C-språket som ville lette utviklingen. På den tiden ble objektorientert programmering mote og folk bestemte at alt kan beskrives i form av et hierarki, det vil si at du har en ball (abstrakt), du arver fra den en fotball, en volleyball, en annen abstrakt ball . Det var på moten da at «nå skriver vi alt i form av et slags hierarki, og alt blir bra, livet blir bedre, alt blir bra og alt». På en måte implementerte C ++ denne objekttilnærmingen - det var ikke det første objektorienterte programmeringsspråket, men det ble ganske populært og alle slags funksjoner begynte å dukke opp i det. Samtidig beholdt C ++ nesten fullstendig kompatibilitet (på det tidspunktet) med C-språket, et program skrevet i C i 99% av tilfellene ble vellykket kompilert som C ++ og fungerte til og med på samme måte. Dette var ment å gjøre det enkelt å migrere fra C til C++.

I tillegg til objekttilnærmingen (i C ++), dukket Standard Template Library (STL) raskt opp. Jeg tror at på skolen oppdaget de som fortsatt underviste Pascal at du for det første ikke hadde innebygd sortering der (i det gamle, blå Borland Pascal, nå finnes det allerede i moderne versjoner) - det er et eksempel (kilde) på sortering, du kan kopiere og lime det inn. Men hvis du vil sortere heltall her, her vil du ha reelle tall, og her er det strenger som kan sammenlignes med hverandre, du måtte skrive tre forskjellige sorteringer som gjør akkurat det samme, de har bare forskjellige datatyper. Dette er ikke veldig bra, og maler som ikke umiddelbart dukket opp i C++ gjorde dette problemet mye enklere. Det vil si at du hadde et abstrakt program som vellykket sorterte noe som kan sammenlignes med hverandre.

Skriptspråk fra 90-tallet

Men tiden sto ikke stille, på 80-tallet skjedde det mye interessant. Men et sted rundt begynnelsen av 80- og 90-tallet ble datamaskinene så gode at det allerede var mulig å gjøre veldig rare og veldig ineffektive ting. Spesielt var dette skriptspråk som ikke ble kompilert til maskinkode, men tolket. BASIC ble også tolket på et tidspunkt, men disse skriptspråkene ble designet hovedsakelig for tekstbehandling - for eksempel Perl, Python (det var ikke særlig kjent da), PHP, Ruby - dette er skriptspråkene som i ett eller i en annen grad lever de fortsatt (de klarte alle å dukke opp før 2000, enda mye tidligere).

La oss gå litt over dem, for dette er spesifikke ting og nå brukes de mange steder. Hva er ideen? Hvis vi ikke kompilerer, kan mye mer tillates. For eksempel kan et program se på koden sin og bruke den på en eller annen måte; hun vet hva som skjer i henne og på grunn av dette kan hun gjøre mye interessant.

Perl ble designet for tekstbehandling - på den tiden var det allerede så mye minne i datamaskiner at det var mulig å stappe litt tekst inn i den og gjøre noe nyttig med denne teksten (for eksempel telle ord, søke etter en slags). Men, etter min mening, ble den designet av folk som var litt ute av hodet, fordi det er en slik vits om ham: "Ethvert sett med karakterer skrevet er et korrekt program i Pearl." Etter min mening kan du bare skrive på den, du kan ikke lese den. Når jeg ser på koden i Perl og prøver å finne ut av noe, forstår jeg ingenting. Kanskje hvis jeg kjente ham bedre, ville jeg forstått noe, men som jeg hørte fra de som fortsatt vet hvordan, sier de at det er lettere å skrive om. Det vil si at programmene er korte og egentlig lettere å skrive om enn å finne ut hva som er der og fikse det.

Rundt denne tiden, på midten av 90-tallet, dukket Internett opp. Til å begynne med var det e-post, nettsteder med statisk HTML, men folk ønsket å legge til en slags dynamikk der slik at alt skulle skje dynamisk for oss, noen skjemaer kunne fylles ut, gjestebøker å gjøre og noe annet. Følgelig krevde dette en slags interaksjon, de kom opp med en protokoll, hvordan den samhandler, og viktigst av alt, genereringen av disse statiske (betinget) sidene som vil bli "spyttet ut" til brukeren som svar på hans forespørsel.

Generelt var ingenting annet enn Pearl egnet på den tiden. Å skrive i ren C eller C++ var en dårlig idé. Og i mangel av et bedre språk på den tiden (og lenge nok), var Pearl et populært språk for webutvikling. Skalaen er selvsagt ikke sammenlignbar med det som skjer nå.

PHP ble til som ... ved et uhell. En person sluttet raskt med dette - han laget sin egen side av noe slag, han hadde en slags gjestebok, noe annet, noen ting. Og han skrev et sett med makroer av noe slag for Pearl, som så ut som C, fordi han visste hvordan han skulle bruke C, rett og slett fordi det var så praktisk for ham. Og jeg kalte det personlig hjemmeside. Delte og sa: «Folk, se hvilken del jeg skrev, alt er mye klarere her enn på Pearl, og dere kan redigere det.» Og folk likte det.

Så henla han saken. Generelt, som et resultat, kom denne PHP til liv og ble mye mer populær over tid enn Perl. Men dette "fødselstraumet" hans (ideen som et sett med makroer for Pearl) spilte en ganske grusom spøk på ham. Språket viste seg å være merkelig. Det vil si at det utviklet seg av seg selv, ingen designet det, ingen administrerte utviklingsprosessen (verken selskapet eller noen person), men det var mange grupper som hver så det de likte. Som et resultat kalles funksjonene der annerledes, det er ikke engang en stil, alt er gjennom understrekinger, generelt er innstillingene her og der, og hvordan alt dette vil fungere er ikke veldig klart. Men du kan sette deg ned og skrive i PHP på to timer, for det var slik han hadde tenkt det.

Python og Ruby: Ruby er mindre populær nå, Python er på en måte bedre "kuttet", la oss snakke om det senere. Det er klart at i disse dager var dette (foreleseren peker på Perl, Python, Ruby, PHP) høyt spesialiserte språk for høyt spesialiserte formål. Generelt ble det ikke skrevet noen systemprogrammering, ingen forretningslogikk i dem på den tiden, og nå gjør de ikke mye av det.

Samlede språk fra 90-tallet

Vi går omtrent samtidig, men i den andre retningen. På den tiden brukte vi C++ for nesten alt som måtte skrives ikke for nettet, ikke for tekstbehandling, men for enkle applikasjoner, for operativsystemer, for leker - generelt, for hva som helst. Men C ++ er faktisk et skummelt språk. Hvorfor? Fordi han for det første arvet pga bakoverkompatibilitet alle C-problemer. Det kan fortsatt bli drept med en million forskjellige måter, de samme som var i C (selvfølgelig ble nye måter lagt til i C ++). På samme tid, hvis du skriver alt godt og riktig, som unnfanget av forfatterne av C ++, så var det selvfølgelig umulig å drepe deg selv med de gamle metodene, og det ser ut til at det var færre av dem. Imidlertid hadde den en veldig merkelig objektmodell særegen. Oppdelingen av programmet i moduler, i deler av et eller annet slag kom vanligvis fra C (hvis du kan skrive inkludere i C eller C++ - faktisk ble det tenkt som å sette inn teksten til biblioteket i programmet ditt, i slutt, når du skriver en haug med inkluderinger, har du alt - hvis det er "primitivt", som det var helt i begynnelsen - blir alt satt inn i en fil og så tar det alt fryktelig lang tid å kompilere, fordi det går rundt flere ganger. senere versjoner ble enda bedre.

Generelt har C ++ mange ulemper. Kvalifikasjonene til en programmerer måtte være høye for å kunne skrive i C++, og slike programmerere var dyre (både opplæring og noe annet, det vil si at det er vanskelig å finne programmerere på markedet, de må betale mye, vel, generelt er dette ikke tilfelle ... ). Og datamaskinene våre teller raskere og raskere, de blir billigere, folk kjøper seg nye datamaskiner og vil ha flere apper, flere leker til telefonen din, mer moro generelt.

Dette er hvordan Java (Java) dukket opp. Der henger også en ganske morsom historie sammen, hvordan navnet dukket opp på dette språket. Det er programmerere der, de drikker kaffe hele tiden og på den tiden var det mote å drikke kaffe, som vokste på øya Java. Språket ble tenkt som et språk for innebygde apparater, spesielt for en kaffemaskin. Slik ble navnet til...
Hva startet med henne, hva var bra med henne, og hvorfor fikk hun så mye popularitet? Først ble de kvitt Sishnys arv fullstendig. Ingen skilt, mye færre måter skyt deg selv en del av kroppen og knekk alt. For det andre implementerte de mye nyere ideer når det gjelder objektmodellen - det vil si at C ++ dukket opp mye tidligere enn Java og brukte en mer arkaisk, "vill" objektmodell. Vel, her (foreleseren peker på Java) var det allerede mer gjennomtenkt da, og i teorien tenkte folk, og i praksis søkte de og gjorde alt mye kulere.

Og til slutt den tredje. Java-programmene våre ble ikke satt sammen til maskinkode, men til kode for en virtuell maskin. Det vil si at du hadde en JVM virtuell maskin (VM) - Javovsky. Programmene dine ble samlet i en slags mellomrepresentasjon, og deretter, ved hjelp av denne maskinen, ble de allerede utført. Hva gjorde det? For det første bremset den ned, for det andre spiste den minne med fryktelig kraft, og for det tredje var den bærbar hvor som helst (teoretisk sett) - til og med til en kaffetrakter, til og med til en kaffekvern, til og med til en datamaskin, til og med til en mobiltelefon. På den ene siden er dette bra, det vil si at du nettopp skrev en implementering av en virtuell maskin, så kjører du Java-programmene dine overalt. Men på den annen side er det ille at den samme telefonen hadde lite minne på den tiden, det var lav ytelse, og alt dette begynte i tillegg å bli kjedelig og tregere.

Men selv dette er ikke hovedgrunnen til at språket ble oppfunnet generelt. Java-språket ble oppfunnet for å redusere kravene til kvalifikasjonene til programmerere. Det vil si at dårligere programmerere kan skrive gode programmer i Java, fordi det ikke tillater deg å skrive dårlige programmer - det er ingen måte å skrive dårlige programmer. Du kan bare skrive bra programmer der. Vel, i forståelsen av skaperne av språket.

Det vil si at hvis i C, i C ++, i Python, på hva som helst, kan vi løse opp en slags skumle søppel fra prosjektet vårt, hvor vi har alt blandet sammen, samlet i timevis og der noe annet. I Java kan du også løse opp søppelbøtta, men for dette må du allerede gjøre litt innsats. Det vil si at det som standard ikke viser seg å være en "søppelhaug", andre problemer oppstår, at noe ble arvet og arvet der - generelt, for en meningsfull linje, oppnås ti ikke veldig meningsfulle. På den annen side kan kanskje en så middels dyktig programmerer skrive en kode av ganske høy kvalitet.
Vi er nesten i mål. Hos oss er det neste som har dukket opp .Net (vil nå), vel, og spesielt er vi interessert i C # (nesten det samme [foreleseren peker på Java], det vil si at det er forskjeller i detaljer, hvis du velger mellom dem - se hvor betaler mer penger).

Og en ting til er JavaScript. Har ingenting å gjøre med Java-språket, dukket opp samme år - ordet var moteriktig, de lisensierte varemerkeå bruke.

Hva er det viktigste du må være oppmerksom på? (Foreleseren trekker piler fra C++ til Java, .Net, C #, JavaScript og PHP). For å skrive et enkelt program på et av disse språkene, og på mange andre - hvis du kan C ++, trenger du vanligvis ikke å kunne noe annet - du tar og skriver i C ++, og legger så til dollar i begynnelsen , noe annet gjør de små tingene og det begynner å fungere for deg på hva som helst (foreleseren peker på språkene som pilene fra C ++ ble tildelt). Det vil si at de er ekstremt like hos noen enkle ting... Hvis du løser noen skoleproblemer, pedagogiske oppgaver eller noe annet (ikke design stort prosjekt- du har én fil som leser tall, viser tall i konsollen, gjør noe annet), så er det nesten ingen forskjell mellom disse språkene. Det er tydelig at JavaScript og PHP er spesialiserte, de har alt litt annerledes. Og her (foreleseren peker på Java og C #) er det veldig liten forskjell generelt.

Siden den gang har alle mulige andre interessante ting dukket opp, men det er ikke klart om de vil leve eller dø med hell. Hva bruker de nå, til hvilke oppgaver?

Språkvalg avhengig av oppgaven

La oss si at du står overfor oppgaven med å skrive en driver for et skjermkort. Hvilket språk vil du bruke i dag? (Rop fra salen: Java!) Hvorfor ... Java er flott, men hvorfor ikke Ruby eller PHP? (Foreleseren snakker sarkastisk.)

Programmering på lavt nivå

Hvis du skriver noe lavt nivå da det beste valget- dette er C, men faktisk hørte jeg noe (men så ikke) at C ++ brukes til dette. Men jeg tror nesten ikke på dette, for i C kan du helt klart styre - siden du har gitt så mange byte med minne, betyr det at det og det blir det. Og i C ++ (STL), hvordan implementeres en streng? Vel, på en eller annen måte implementert. Og til slutt vet vi ikke hvordan og hva som skjer der, kanskje går vi tom for minne på skjermkortet eller noe annet vil skje. Derfor lever C fortsatt og dør ikke, slike systemprogrammeringsoppgaver eksisterer fortsatt - skriv et operativsystem, skriv drivere, skriv noe annet - C er flott for dette. I tillegg er det nå alle slags enheter (tingenes internett lover at det er i ferd med å komme) som lever på batterier (og selvfølgelig vil det være millioner av dem, alt vil henge med dette tingenes internett) , de skal være veldig billige og forbruke veldig lite strøm. Følgelig vil det være 2 KB minne, en 5 kHz prosessor, vel, selvfølgelig, hva du skal skru inn noen virtuell maskin eller skriptspråk i nær fremtid vil det ikke fungere - det betyr at du må skrive noe i C. Og selv nå, for eksempel, beregninger på et skjermkort (OpenCL eller annen teknologi) - de kommer ikke opp med et nytt språk for å skrive programmer for dem - de gjør C der med noen store begrensninger. Bare fordi folk allerede vet hvordan, hvorfor lære noe nytt? Formelt sett er dette sannsynligvis også, på en måte, C.

Web programmering

La oss si at du vil skrive en ny Facebook ( sosialt nettverk). Hva vil du skrive dette på? (Fra publikum snakker de om HTML og CSS.) HTML, CSS er design, og vi ønsker å kunne legge til bilder, venner, legge igjen kommentarer der.

For skriptdelen – det vil si hva som skal skje på klientsiden – er det JavaScript. Noen ganger genereres dessuten JavaScript på et annet språk og sendes (det hender at skriptet genereres ... fordi noen ganger er det lettere å håndtere noen endringer i logikken på denne måten).

Overraskende nok er det skrevet i PHP – og Facebook og mange andre store prosjekter. Jeg måtte selvfølgelig skrive mine egne ting for at det fortsatt skulle fungere fint, og ikke som "tyap-blooperen" ble gjort, men de klarte det. I utgangspunktet spiller det ingen rolle hva du skriver i, men jeg anbefaler ikke Perl. Her og nå er det selvsagt ingen som skriver noe fra bunnen av for nettet. Alle skriver en form for rammeverk eller noe. Online-butikk? Vi lastet ned et rammeverk for en nettbutikk - vel, det var det, vi skrev en nettbutikk.

Forretningsprogrammering

Deretter vil du skrive en kjedelig banksøknad. Eller har du for eksempel noen som selger simkort? Kanskje du noen gang har kjøpt en telefon eller noe annet, og de sa til deg: "Her henger systemet, vi kan ikke gjøre noe." Hva skal du skrive en slik søknad på? (Et rop fra publikum om Python) Du kan ikke skrive dette i Python, hva er du?! Det er ikke verdt å skrive noe for virksomheten i Python. Hvorfor? For når du skriver noe i Python, kan du ikke finne et betydelig antall feil i skriveprosessen. Python skrives dynamisk på alle mulige måter, og generelt der kan du skjule en feil slik at den dukker opp i en slik situasjon at du ikke engang kan forstå hva disse skjeve brukerne har gjort der, at alt er ødelagt for deg. Det vil si at det er bedre å skrive små skript for deg selv i Python - du forstår hva som skjer der og hva som gjøres. Vel, eller noe det ikke er synd å kaste ut: du vil rulle ut noe før konkurrentene dine, så hva om det går i stykker annenhver gang. Du skrev i Python og det var det – du tok over markedet. Og hvis du skriver noe over lang tid, for eksempel en slags bankapplikasjon (slik at den godkjenner lån, noe annet) - skriver du det i Java. For det er en alvorlig sak, papirer, penger, dokumenter, noe annet, men du kan ikke rote så mye i det at alt går i stykker, ellers vil folk bli fornærmet - pengene deres har gått og har ikke nådd noe sted, fordi du i øyeblikket strengen ble til et tall eller omvendt. Så, det betyr at du metodisk tar Java og skriver, skriver ... Vel, eller på .Net, slike situasjoner skjer i prinsippet også. Der kan du selvfølgelig også støte på problemer, men likevel er sannsynligheten for dette noe lavere.

Programmering for hæren, romfart

Tenk deg nå at de bestemte seg for å sende deg til månen i en rakett. Hva vil du helst bruke for å skrive koden som styrer rakettmotorene? La oss se. Dette (foreleseren viser i Perl, Python, PHP, Ruby), er sannsynligvis ikke verdt det - det bremser ned, noe annet skjer, vel, generelt sett vil jeg ikke gå med på å fly på en slik rakett. I C++? For å være ærlig, ville jeg heller ikke stole på meg, fordi det er for mange måter å drepe deg selv på i C++. Når du er der ute et sted i verdensrommet, er det ikke veldig bra.

Kanskje Java? Det ser ut til at alt er ganske pålitelig der og arkitekturen er god, ingen villtyper, ingen overflødig minne. La oss si at det mest avgjørende øyeblikket har kommet, og vår Java bestemte seg for å samle søppel for oss. Vi må lande, senke farten, og hun sier: "Nei, det går søppel." Generelt sett ikke veldig bra heller.

For å være ærlig, foretrekker jeg at dette programmet er skrevet i Pascal. Jeg liker selvfølgelig ikke Pascal, men på en eller annen måte i slike saker ville det vært veldig kult.

Bruk av flere språk samtidig for programvareutvikling

Vel, hva bør sies generelt om moderne språk. I dag lever mange prosjekter ikke på ett språk, det vil si at noen av dem lever på ett språk, noen på et annet og noen mer på et tredje. For eksempel, hvis du har en slags nettapplikasjon som behandler store mengder informasjon, er tilgangen til disker (ikke engang til databaser, de er så store at selv en database ikke støtter noen allerede skrevet) sannsynligvis skrevet i noen så lave -nivå C for å skrive vilt raskt til disk og alt det der. Naturligvis er det ikke verdt det å skrive hele prosjektet i C. Kanskje det er en slags mellomlogikk skrevet i Java som kaller Cis-funksjoner for raske samtaler. Vel, frontend (det brukeren ser på), er selvfølgelig allerede skrevet i noe, i noen skript, i noe som kjøres direkte av nettleseren (JavaScript). Og alt dette lever sammen og samhandler med suksess.

I utviklingen av noen applikasjoner, til og med store, hva gjør folk noen ganger? De tar og skriver en prototype i Python (hvordan det hele vil fungere), skisserer, tenker over en slags arkitektur. Å skrive på det er veldig raskt - de kastet inn en prototype, eksperimenterte med den og sa: "Wo! Det er så kult! " Og fullstendig omskrevet. Det ser ut til at de gjorde jobben to ganger, det tok dobbelt så lang tid (vel, en og en halv). Men nei! Det viser seg ofte at denne metoden ikke er dårlig, for hvis du skriver med en gang i noe, for eksempel i Java, og deretter bestemmer deg: "Nei, la oss refaktorere, endre arkitekturen fullstendig og alt det der," vil du bruke 10 ganger mer tid... Slike ting finnes også og lever.

Forutsetninger for suksess for ethvert programmeringsspråk

La oss nå snakke om hvorfor noen pene språk ikke overlevde, eller bodde på et veldig begrenset sted. Da Wirth så hva de dårlige selskapene Apple, Borland og alt det gjorde med Pascal hans, kom han på et enda bedre språk – Oberon. Det var bare vilt minimalistisk - det vil si at det var veldig få kommandoer (strenger? Hvorfor trenger vi strenger? Vi lager en rekke tegn!). Vel, noe fungerte ikke for ham, i den grad det kunne.

En ting til. Det amerikanske militæret ba dem utvikle et kult språk også, der alt fungerer og alt kan skrives. Resultatet er et ganske monstrøst språk kalt Ada, hvor de imidlertid fortsatt skriver noe, men igjen - kun for militæret.

Hva er problemet? Hvorfor har noen språk som Python, som ingen selskap støttet det i begynnelsen, overtatt markedet. PHP, som også er dårlig designet, tok også over og fanget markedet (det meste) av seg selv. Og alle slags milliarder av dollar ble investert (foreleseren peker på Ada) og gikk ingen steder, ingenting skjedde. Hva er årsaken til dette? Dette skyldes at det ikke er noen infrastruktur rundt disse språkene. Det vil si at språket kan være utmerket, men så lenge det ikke er dokumentasjon, så lenge det ikke er et fellesskap som kan svare på spørsmål (på Stack Overflow) og, til slutt, viktigst, så lenge det ikke er et stort antall av biblioteker brenner ikke språket. Det vil si at du for eksempel ønsket å skrive en nettside på Oberon. Hvorfor ikke? Og forvirringen begynner ... Du kan ikke heve webserveren din på Oberon for å teste lett, du kan ikke koble til noen biblioteker, fordi de ikke er på Oberon. Og alt dette gjøres gjennom en slags krykker, kreftene forsvinner, og generelt spytter og skriver du nettsiden din i ren C i stedet for Oberon. Og de språkene som er i stand til å bruke biblioteker fra andre språk, lever godt. Den samme Python på de stedene hvor den bremser ned. Vel, generelt er alle slags standardting som sortering og noe annet skrevet i C, og han (Python) vet hvordan han skal samhandle med dem.

Java har også et Java Native Interface. Dette er i hovedsak C, det vil si der (etter min mening ønsker de å forby hele tiden, men det ser ut til at de ennå ikke har forbudt) disse språkene kan samhandle med eksisterende biblioteker (hovedsakelig Sishny-biblioteker). Og på grunn av dette tar de og jobber. Ideen som jeg prøver å formidle til deg er klar, ikke sant? Ikke skriv på språk som ikke vet hvordan du kobler til C-biblioteket. Vel, hvis du vil nyte noe kult. Vel, og gradvis blir de (språk) overgrodd med sin egen type infrastruktur. Og de lever liksom godt.

Programmeringsspråk og karriereveiledning

La oss nå snakke om hvordan du forstår hva du vil i livet. Hva er kule ting? Du kan gjøre noe systemprogrammering, Ja? Det er kult å telle disse syklene der, du vil lansere quadcoptre, noen kameraer og gjøre noe annet. Da er sannsynligvis C ditt valg.

Hvis du vil skrive, kanskje ikke de mest interessante applikasjonene i livet, men det er kult for deg å designe dem, tenke på alt og tjene mye penger, for det faktum at du sitter og savner mesteparten av tiden (du har å betale for dette hvis du er av høy kvalitet miss), her er de - Java, .Net. Du går på jobb i bank, skriver, går på jobb klokken ni i hvit skjorte, får god lønn og skriver etter anbefalingene fra de beste Java-kildene, .Net-sau og alt det der ...

Hvis du vil skrive noen applikasjoner, en slags nettleser, noen leker, noe annet, så er C ++ flott. Hvis du vil skrive nettsider, så er de her, språkene du velger (foreleseren viser i Perl, Python, PHP, Ruby), det er ikke mye forskjell. Det eneste er at PHP vil dø før Python, så hvis du er lat for å lære nye ting, så lær deg Python. Stor forskjell du vil ikke merke det, men du vil vare lenger.

Hva som skjer med Ruby er også uklart. Vel, du kan også PHP, hvis du allerede har lært, siden de er så enkle at det ikke tar så lang tid å omskolere seg.

Og til slutt, det er et annet bruksområde for programmeringsspråk - dette er når en ikke-programmerer bruker dem. La oss si at du er en matematiker, fysiker, kjemiker, analytiker, hvem som helst, og du må raskt beregne noe, analysere noen data (for biologer, for eksempel, hvor mange fjellrever lever på Commander Islands). Du kan kjøre alt dette inn i en tabell i Excel eller analysere det med noe. Python passer også godt for dette, den vet hvordan man jobber med tekst og bibliotekene er fulle av alle slags, statistisk og alt det der. Hvis du vil gjøre en slags maskinlæring, behandle noen data, forutsi, så gjøres dette også raskest i Python nå. Det skal imidlertid bemerkes at oppgavene er svært forskjellige. For eksempel, hvis du ønsker å handle på børsen umiddelbart under forhold når kursene endrer seg hele tiden, uansett hvor kult Machine Learning du skriver i Python, vil folk som har det skrevet i noe raskere ha tid til å kjøpe alt tidligere , mens du vil bli regnet, selv om algoritmene deres er dårligere. Derfor krever selv disse maskinlæringsoppgavene (noen av dem) høy ytelse (og ekstremt høy), og følgelig andre språk.

Den eneste måten å vite hva du vil er å prøve alt. Nå vil jeg si det som en av visjonene om hvordan du kan prøve alt. Hvordan bli en programmerer, og en lykkelig en? Så. MED blanke ark begynne. Her studerer du på skolen din matematikk, russisk språk og andre obligatoriske og valgfrie fag, og dine kunnskaper innen programmering gjenspeiles på tavlen (foreleseren peker på en tom tavle) på dette øyeblikket... Og du vil bli en lykkelig person, gjøre det du elsker, tjene mye penger og ikke nekte deg selv noe og kose deg.

En måte å gjøre dette på. Det er selvfølgelig alle mulige inspirerende historier om folk som aldri gikk på universitetet eller droppet ut og ble milliardærer, bedriftseiere og så videre. Men det bør bemerkes at de fleste som kanskje ikke har blitt milliardærer, men også lever godt, likevel ble uteksaminert fra universitetet på et tidspunkt.

Hva er vår situasjon med å komme inn på universitetet (nå studerer du på skolen)? Mens du er på skolen, må du forstå at neste trinn er å melde deg på og ta vare på det. Bestå eksamen eller vinn Olympiaden. På eksamen kan du bruke Pascal, C ++ (inkludert ren C), Python (jeg skal ikke nevne dem ytterligere). På Olympiaden - den samme Pascal, den samme C ++, den samme Python (vi vil snakke om problemene hans nå) og som oftest er det Java. Alt kan fortsatt skje avhengig av Olympiaden, men ikke essensen.

Hvordan ser grafen for fordelingen av språk ut ved den all-russiske olympiade i informatikk? Folk som deltar i All-Russian, the coolest Olympiad, hva skriver de på? Det ser slik ut (her betyr det Pascal, og her er det omtrent 2000, og her er det omtrent null, her er C ++, og her er det 2015).

I 2000 var det nesten ingen som skrev i C++. Femten år har gått, og nesten ingen skriver i Pascal, til tross for at Pascal er moderne. Dette er et språk som kan gjøre nesten alt likt. Det er bare det at alle har blitt for late til å lære dette, hver nye trend, og alle fortsetter å skrive i Borland Pascal, som selvfølgelig ikke kan gjøre noe. I C ++ skriver folk noen sorteringsalgoritmer (STL) - flott, de skrev sortering () og det er det. På Pascal, på vanlig, på gammel - dette er et problem. De skrev et sett (nødvendig) - flott, de skrev det i C++, i Pascal igjen er plagene kontinuerlig. På de nye Pascalene kan du selvfølgelig gjøre dette, men de koster faktisk penger. Du har kanskje ikke lagt merke til dette, men det er det.

Det finnes også Java, men Java har mange bokstaver. Det er for store prosjekter, men for små engangsprogrammer viser det seg å være helt dårlig, for det er mange ekstra bokstaver. Men også noen skriver, du kan lære å skrive på det. Men på Unified State-eksamenen er det ikke det, og Unified State-eksamenen må for det meste fortsatt bestås.

Hva er best for eksamen? Til eksamen er det best (hvis du ikke kan noe og de ikke lærer deg noe på skolen) å lære Python. Noen oppgaver på eksamen er perfekt løst på den. På Olympiaden, generelt, viser det seg at C ++ er (brukt), fordi Python er veldig treg, ikke alt er løst der.

Dermed har du studert en liten delmengde av språket og noen algoritmer (muligens) og løst mange problemer for å få et diplom fra olympiaden din og gå på universitetet for å få høyere utdanning.

Nå skal jeg fortelle deg om hvordan vi i HMS bygger kurset, i hvilken rekkefølge språkene går, hvordan de studeres i anvendt matematikk og informatikk ved fakultetet for anvendte vitenskaper, som vi gjør med Yandex. I første semester - Python (ikke i sin helhet, om hvordan du bør lære på skolen) og C ++ (bredere, mye bredere enn det vanligvis undervises på skolene). La meg fortelle deg det med en gang slik at du ikke blir redd, hvis du plutselig vil gjøre det, si: "Hvorfor, jeg vet alt dette allerede, hvorfor skal jeg studere et sted? Jeg vil heller dra et annet sted." For de som allerede kan programmere godt, er det en mulighet til å gå direkte til studiet av algoritmer, og i en ganske teoretisk opplæring. Vi ser ikke på dem nå, dette (peker på styret) er for de som programmerer medium eller ikke i det hele tatt.

I første semester studerer de det grunnleggende i Python, bare for at folk skal lære å programmere og slik at ingen blir spesielt fornærmet. Python blir sjelden undervist på skoler, for det meste kommer folk med kunnskap om Pascal eller C++. I utgangspunktet til og med Pascal, hvis det er en masseskole. Vel, slik at ingen blir fornærmet, lærer alle et nytt språk (som om de er under like forhold). Og C ++ ganske enkelt fordi du da kan gå hvor som helst fra C ++.

Deretter kommer kurset «Algorithms» og et eget kursprosjekt. Klassiske algoritmer med implementering. Ikke det at vi i teorien tok noe, beregnet kompleksiteten. På forelesningen tok vi, regnet ut kompleksiteten, på seminaret – tok, implementerte algoritmen. Et prosjekt handler om at elever skal gjøre noe ferdig. For eksempel var et av prosjektene: å telle ... La oss si at du har mange leiligheter i Moskva og du forstår: «Å, jeg har mange unødvendige ting, jeg skal leie noen. Og de setter en pris, og ingen vil leie en leilighet av deg - sannsynligvis for dyrt. Eller de satte en pris, de tok den umiddelbart av og du tenker: "Åh, jeg har nok gitt det ut billig" - og du blir også lei deg. Det vil si at det var nødvendig å beregne hvor mye det kostet å leie en leilighet? Du kjører inn data – det bygger et estimat for deg. Et slikt nettsted, som besto av flere ting: ta forslag, analysere, bruke en slags maskinlæringsalgoritme (sannsynligvis) upretensiøs og lage et vakkert nettfjes der du kan velge noe, kjøre noe, noen meter, et hvilket som helst antall rom, antall badstuer, antall boblebad i leiligheten din og grovt anslå kostnadene. Det vil si en slags ferdig, ikke særlig komplisert ting. Her betyr det (foreleseren peker på kurset om algoritmer) en så kraftig C++, med konsoll I/O. Vel, her (foreleseren peker på inskripsjonen «prosjekt») er det noe under veiledning av en mentor, eventuelt med databaser, kanskje med analyse av tekster og med noe annet.
Så kommer tredje semester, et emne som heter Datasystemer. Det er ganske mye assembler å forstå (veldig lite), og så, noe som ligner på ren C og interaksjon med operativsystemer, systemprogrammering i hovedsak. Og et prosjekt for et seminar er også noe om temaet alle nettverksinteraksjoner, ganske lavt nivå: utvikle noe verktøy, for eksempel rsync (synkronisering, kanskje du vet. I ren C, mer eller mindre, skriv en analog av rsync, som du vil ha over nettverkssynkroniseringsmappene med alle filtilganger, og så videre).

Og til slutt den fjerde. Jeg vet ikke engang hva jeg skal kalle det, dette er en slik vinaigrette av teknologier som er nødvendige for reell utvikling, for eksempel for webutvikling. Det vil si dette praktisk bruk databaser, igjen noe tilsvarende det som ble gjort i prosjektet (foreleseren peker på 2. kursprosjektet), men mer utdypende. Det vil si at slike mer eller mindre konkrete ting allerede er praktisk programmering. Parallelt med dette er det en hvilken som helst teori, vel, her er de også engasjert i vitenskap.

Og etter to kurs sprer folk seg for å gjøre det de er interessert i, fordi denne tingen dekker ganske bredt slike grunnleggende programmeringsprinsipper, og folk på dette tidspunktet forstår allerede at de ikke vil gjøre datasystemer i ingen tilfeller (de likte ikke systemprogrammering, for eksempel), men de ønsker å håndtere noen teoretiske algoritmer, vanskelighetene med å beregne, komme opp med noen nye ting, distribuert eller noe annet. Eller tvert imot, de tror at de ikke har så mye her ( foreleser peker på første kurslinje med Python og C ++) gå da ( foreleser peker på en tredje kurslinje, med systemprogrammering) - som du ikke liker, tell byte og sett alle slags restriksjoner på les-skriv, gjør strømmer, tråder og noe annet. Og i samsvar med dette velger folk en retning og lærer. Altså i prinsippet slik at du ikke utvikler "andungesyndrom" - du så først din Pascal og sier nå "Pascal er makt"; eller mer avansert - du så C ++ og begynte å snakke om alle at C ++ er kraftig, og alt annet ikke er veldig bra.

Her må vi se på dette (foreleseren peker på listen over emner på tavlen) på en bredere måte - dette er en av metodene som ble valgt, spesielt ved HMS (den har nylig dukket opp, så den er ganske moderne ). Det finnes andre måter å bli kjent med hverandre på. I andre gode universiteter i en litt annen rekkefølge og andre aksenter er plassert. Men de prøver også å gjøre folk kjent med alt de har.

Hvordan se etter en jobb som programmerer

du er denne ( foreleser peker på listen over emner) gjorde alt, studerte på universitetet, studerte noe mer produktivt i ytterligere to år, og du må gå på jobb. Hvordan velger du noe å jobbe med? Først fikk du vite alt, gikk dypt et sted og vet allerede hva du elsker. Du må velge det du elsker naturlig. For hvis du elsker, vil du investere energi, du vil ha motivasjon og generelt vil alt gå bra. For det handler ikke bare om penger, det handler om å gjøre det interessant og hyggelig for deg. Vel, og du vil komme inn i et kult selskap, få deg en jobb. Hva slags person ville jeg personlig likt å se? Det kommer for eksempel hundre studenter til meg – jeg må ta to på jobb eller én. Hvorfor kommer de, jeg forstår ikke i det hele tatt hvem de er, hva er de, hvordan har de det? V beste tilfelle de vil vise meg vitnemålet de fikk på universitetet, og jeg vil si: «Wow! Dette er et kult diplom, men det er ikke så kult!" Og jeg kan forresten ta feil. Kanskje personen hadde mye fritid og lærte mye bedre.

Hva ville vært flott? Først et åpen kildekode-prosjekt som du skrev fra begynnelse til slutt. Det er ønskelig, hvis jeg driver med en slags infrastruktur slik at dataene kan leses raskt, eller noe annet, så vil jeg selvfølgelig være interessert i å få skrevet noe åpen kildekode til meg. Ikke laget et nettsted, men noe om temaet. Hvorfor er jeg interessert i dette? Jeg kan se på koden din, jeg kan se hvor ofte du forpliktet deg, jeg kan se hvordan du reagerte på feil fra brukere, feil fra utviklere som bruker den - alt er skrevet ned, jeg ser på alt og tenker: "Wow, denne feilen har ikke vært her på to år. stengt, her svarte du brukeren uhøflig, her er noe annet - jeg tar det ikke ”. Det vil si at dette er ditt personlige prosjekt.

Neste, hva annet ville vært kult? Jeg vil gjerne se hvordan du gjorde teamarbeidet. Det vil si at du kommer til meg for et intervju og sier: «Gutta fra universitetet og jeg har sendt inn en god søknad. Jeg laget en database der, de laget en slags mobilapplikasjon, og det var også en fyr som jobbet der, en jentedesigner, en gutt med teknisk støtte. Vi var fem og vi gjorde et flott prosjekt." Vel, jeg ser hva som egentlig er prosjektet ditt, jeg sier: "Hva er ditt?" Jeg ser på koden igjen og forstår at du vet hvordan du jobber i team med mennesker.

En programmerer er ikke den som sitter alene (sånn indie) i garasjen, et sted med lysene av, ikke snakker med noen, får skjegg og skriver. Likevel er det en slags interaksjon med mennesker. Med en sjef, for eksempel, som noen ganger kan banne til deg (sjefer, de er så, ikke alltid snille). Og jeg ser at du vet hvordan du jobber med mennesker og det gjør meg glad hvis du har et godt team av noe slag. Selv om det ikke er bra, er det bedre enn å ikke ha det.

Hva annet ville jeg personlig likt? Hvis du viste deg selv i store prosjekter. For eksempel, du har forpliktet noe til Linux-kjernen, hvis du driver med systemprogrammering, har du fikset en feil. Det vil si at de viste at du kan lese andres kode og er i stand til å gjøre noen endringer i den. Jeg ser: "Å, du fant ut noe komplisert og fikset noen feil!" Og jeg begynner å bli veldig glad for det. Fordi jeg har … vel, jeg vet ikke… programmereren min sluttet fordi konkurrenter tilbød ham en høyere lønn, og jeg trenger snarest å holde kjeft for noen – deg. Jeg ser at du bare skrev fra bunnen av, men du vet ikke hvordan du leser og redigerer andres kode, og jeg blir lei meg.

Og til slutt, avhengig av den spesifikke stillingen, er det forskjellige andre ting. Hvis du er jobbanalytiker, vil jeg gjerne at du gjør dataanalyseoppgaver på Kaggle. Hvis du søker på noen algoritmiske ting, vil jeg gjerne at du gjør det sportsprogrammering vi gjorde noen algoritmer. Og til slutt, hvis du har tenkt på yrket, les hvordan intervjuene holdes, du har møtt at noen der uttrykker stor misnøye: «Jeg kom, og de spør meg hva hobbyen min er. Jeg sitter som en ugle og svarer ikke, fordi jeg ikke har noen hobby, ”- og de tror at HR gjør dette. Faktisk prøver de å finne ut hvor vennlig og passende du er. Hvis du er uvennlig og utilstrekkelig, så uansett hvor geni og arbeidsnarkoman du er, en tøff spesialist med stor kunnskap, vil det være vanskelig for teamet å samarbeide med deg, og du vil ikke trekke ut prosjektet alene. I tillegg, selv om du strekker deg, kan du forestille deg hvilken belastning for selskapet. Og at du kommer i morgen og sier: «Øk lønnen min 10 ganger, ellers forlater jeg deg». Forståelig nok ønsker ikke bedrifter å komme i denne situasjonen. Derfor er oppdragelsen av tilstrekkelighet og velvilje hos en selv like viktig (minst) som utvikling av en slags faglig kompetanse.

For å oppsummere, hva kan du si? Hvilke språk er gode og hvilke er dårlige? Vel, innen en gruppe språk, for eksempel mellom Ruby, Python og PHP, hvilket skal du velge? Selvfølgelig er det riktige svaret Python, men faktisk er forskjellen mellom dem i antall tillatte feil, i mengden av noe annet - 5%, vel, kanskje 10%. Det vil si hvis du allerede har ferdig prosjekt er skrevet i PHP, så vil ingen ved sitt rette sinn si: "La oss omskrive alt i Python." De vil si: "La oss ansette flere PHP-utviklere og fortsette å skrive i PHP." Flott, det er ikke et dårlig valg. Det er klart at hvis du plutselig begynner å skrive et prosjekt, så kan det være lurt å velge Python nå. Selv om det også kommer an på. Kanskje du har en haug med billige PHP-utviklere på markedet, men Python-utviklere er dyre, og du tenker: "Ja, teknologien er kulere, men jeg skal spare penger på ferdige utviklere." Og det er alt, flott, du kommer allerede og jobber der.
Hvordan velger jeg mellom Java og C++? Ja, det samme skjer. Jeg tror at når du bestemmer deg for hvilket språk du skal starte et nytt stort prosjekt på, vil du få kunnskap innen ditt fagfelt og være i stand til å ta det riktige valget. Akkurat nå trenger du ikke ta det valget ennå, og derfor anbefaler jeg deg å gjøre det du liker.

Grunnleggende, som jeg allerede sa, det aller, aller grunnleggende innen programmering (hva er en funksjon, hva er hvis, for, arrays, noe annet) kan læres mer eller mindre på alle språk. For eksempel i C ++, fordi det ser ut som mange ting, og detaljene i det (på dette nivået) er minst av alt, og bokstavene er minst unødvendige å skrive. Vel, når du lærer noen komplekse arkitektoniske ting, lær og bekymre deg for mye om dette. Det vil si at hovedsaken er - prøv, se etter det du liker, og når du innser at klokken allerede er 4 om morgenen, og du sitter for moro skyld og skriver fordi du liker det - er det sannsynligvis i dette øyeblikket at du har funnet din...

Av programmerer William W. Wold

De siste seks månedene har jeg jobbet med å lage et programmeringsspråk (PL) kalt Pinecone. Jeg ville ikke våget å kalle det komplett, men det er allerede mulig å bruke det – det inneholder nok elementer til dette, som variabler, funksjoner og brukerdefinerte datastrukturer. Hvis du vil gjøre deg kjent med den før du leser den, 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 hadde jeg ingen anelse om hva jeg gjorde og har fortsatt ingen anelse. Jeg har aldri målrettet studert prinsippene for å lage et språk - jeg leste bare noe materiale på nettet, og selv i dem fant jeg ikke nesten noe nyttig for meg selv.

Jeg skrev imidlertid et helt nytt språk. Og det fungerer. Jeg antar at jeg gjør noe riktig.

I denne artikkelen skal jeg prøve å vise deg hvordan Pinecone (og andre programmeringsspråk) gjør kildekoden til det mange anser som magi. Jeg vil også være oppmerksom på situasjoner der jeg måtte søke kompromisser, og forklare hvorfor jeg tok de avgjørelsene jeg tok.

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

De første trinnene

"Og hvor begynner du?" er et spørsmål som andre utviklere ofte stiller når de finner ut at jeg skriver mitt eget språk. I denne delen skal jeg prøve å 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 den ene metoden mer egnet enn den andre, og valget av paradigme i de tidlige stadiene avgjør den videre utformingen. I en generell forstand er tolkning fleksibel, og kompilering gir høy produktivitet, men dette er bare tipset av et ekstremt komplekst emne.

Jeg ønsket å lage et enkelt, men likevel presterende språk, som det ikke er mange av, så jeg bestemte meg fra begynnelsen for å gjøre Pinecone kompilerbar. Likevel har Pinecone også en tolk - ved første lansering var det bare mulig med dens hjelp, senere vil jeg forklare hvorfor.

Ca. overs. Det har vi forresten kort anmeldelse er en flott øvelse for alle som lærer Python.

Språkvalg

Et slags meta-trinn: et programmeringsspråk er i seg selv 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 rådene gis slik:

  • tolket PL sterkt anbefaltskrive på kompilert språk (C, C ++, Swift). Ellers vil ytelsestapet snøballe mens metatolken tolker tolken din;
  • kompilerte PL kan skrive på tolket språk (Python, JS). Kompileringstiden vil øke, men ikke programkjøringstiden.

Arkitektur design

Strukturen til et programmeringsspråk har flere stadier fra kildekoden til den kjørbare filen, hvor dataene er formatert på en bestemt måte, samt funksjoner for å flytte mellom disse stadiene. La oss snakke om dette mer detaljert.

Leksisk analysator / lexer

Linjen med kildekode går gjennom lexeren og blir en liste over tokens.

Det første trinnet i de fleste programmeringsspråk er leksikalsk analyse. Enkelt sagt er det en oppdeling av tekst i tokens, det vil si språkenheter: variabler, funksjonsnavn (identifikatorer), operatorer, tall. Ved å gi lexeren en streng med kildekoden som input, vil vi få en liste over alle tokens som den inneholder ved utgangen.

Appellerer til kildekode vil ikke lenger skje i de neste stadiene, så lexeren må returnere all informasjonen de trenger.

Flex

Da jeg lagde et språk, var det første jeg gjorde å skrive en lexer. Senere utforsket jeg verktøy som kunne gjøre leksikalsk analyse enklere og redusere feil.

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

Mitt valg

Jeg bestemte meg for å forlate analysatoren jeg skrev. Til slutt så jeg ingen spesielle fordeler med Flex, og å bruke den ville bare skape ytterligere avhengigheter som kompliserer byggeprosessen. I tillegg gir valget mitt mer fleksibilitet – for eksempel kan du legge til en operatør i 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. Det vil forvandle seg kildetekst, det vil si en liste over tokens (som tar hensyn til parenteser og operasjonsrekkefølgen) i et abstrakt syntakstre som lar deg strukturelt representere reglene for språket som opprettes. Selve prosessen kan kalles enkel, men med økningen i antall språkkonstruksjoner blir den mye mer komplisert.

Bison

I dette trinnet tenkte jeg også å bruke et tredjepartsbibliotek, og vurderte Bison for å generere parseren. Det ligner mye på Flex - tilpasset fil med syntaksregler er strukturert ved hjelp av et C-program. Men igjen ga jeg opp automatiseringen.

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. Det er en annen historie med parseren: nå er lengden på koden for den 750 linjer, og dette er allerede det tredje forsøket (de to første var bare forferdelige).

Imidlertid bestemte jeg meg for å gjøre parseren selv. Her er hovedårsakene:

  • minimere kontekstbytte;
  • forenkling av montering;
  • ønske om å takle oppgaven på egenhånd.

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

Jeg vil ikke anbefale å bruke leksikalske og parsergeneratorer eller andre såkalte "kompilatorkompilatorer". Å skrive en lexer og parser tar ikke lang tid, og bruk av en generator vil binde deg fast til den videre arbeid(som betyr noe når kompilatoren porteres til en ny plattform). I tillegg er generatorer kjent for å produsere irrelevante feilmeldinger.

Abstrakt semantisk graf

Flytte fra et syntakstre til en semantisk graf

I denne delen har jeg implementert en struktur som iboende er nærmest «mellomrepresentasjonen» i LLVM. Det er et lite men viktig forskjell mellom et abstrakt syntakstre (AST) og en abstrakt semantisk graf (ASG).

ASG vs ASD

Grovt sett er en semantisk graf et syntakstre med en kontekst. Det vil si at den inneholder informasjon som hvilken type funksjonen returnerer eller hvor 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, blir det en ganske enkel oppgave å starte programmet. Hver node inneholder implementeringen av en funksjon som mottar noen data som en inngang, gjør det som er programmert (inkludert mulig utfordring hjelpefunksjoner), og returnerer resultatet. Dette er tolken på jobb.

Kompileringsalternativer

Du spør sikkert hvor tolken kom fra hvis 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 på dette trinnet.

Skriv din egen kompilator

Først likte jeg denne ideen - jeg elsker å gjøre ting selv, og dessuten har jeg 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 investeringen.

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 bestemmer utseendet til programmet og handlingene som eksekveren (datamaskinen) vil utføre under dens kontroll.

Et programmeringsspråk på høyt nivå er et programmeringsspråk designet for hastighet og brukervennlighet for 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å.

Programmeringsspråk på lavt nivå (programmeringsspråk på lavt nivå) - et programmeringsspråk nær programmering direkte i maskinkoder til den brukte ekte eller virtuelle (for eksempel Java, Microsoft .NET) prosessor. En mnemonisk notasjon brukes vanligvis for å betegne maskininstruksjoner. Dette lar deg huske kommandoer ikke i form av en sekvens av binære nuller og enere, men i form av meningsfulle forkortelser av ord på det menneskelige språket (vanligvis engelsk).

PROGRAMMERINGSSPRÅK PÅ LAVT NIVÅ

De første datamaskinene måtte programmere med binære maskinkoder. Imidlertid er programmering på denne måten en ganske møysommelig og kompleks oppgave. For å forenkle denne oppgaven begynte programmeringsspråk på lavt nivå å dukke opp, noe som gjorde det mulig å sette maskininstruksjoner i en mer lesbar form. For å konvertere dem til binære, spesielle programmer- oversettere.

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

Oversetterne er delt inn i:

    kompilatorer - gjør programteksten om 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 et program til maskinkode, utfør den og gå videre til neste del. I dette tilfellet brukes tolken hver gang programmet kjøres.

Et eksempel på et lavnivåspråk er montering. Språk på lavt nivå er fokusert på en bestemt type prosessor og tar hensyn til dens særegenheter, derfor må det omskrives nesten fullstendig for å portere et program på assemblerspråk til en annen maskinvareplattform. Det er 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 team. Men spesialiserte prosessorer for andre enheter, for eksempel skjermkort, telefoner, inneholder betydelige forskjeller.

Fordeler

Språk på lavt nivå brukes til å lage effektive og kompakte programmer ettersom utvikleren får tilgang til alle egenskapene til prosessoren.

ulemper

    En programmerer som arbeider med lavnivåspråk må være høyt kvalifisert og ha god forståelse for mikroprosessorsystemet som programmet lages for. Så hvis et program er laget for en datamaskin, må du kjenne strukturen til datamaskinen og spesielt enheten og funksjonene 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 som regel til å skrive små systemprogrammer, enhetsdrivere, moduler for grensesnitt med ikke-standardutstyr, programmering av spesialiserte mikroprosessorer, når de viktigste kravene er kompakthet, hastighet og muligheten til direkte tilgang til maskinvare ressurser.

Assembler 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. Den første språkoversetteren på høyt nivå i verden er PP (Programming Program), aka PP-1, vellykket testet i 1954. PP-2 oversetter (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-datamaskiner inneholdt allerede en linker av moduler. Imidlertid begynte den utbredte bruken av høynivåspråk med fremveksten 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 lettere å løse komplekse programoppgaver men også for å forenkle programvareportering. Bruken av en rekke oversettere og tolker gjør at programmer skrevet på høynivåspråk kan kommunisere med ulike operativsystemer og maskinvare, mens kildekoden deres forblir ideelt sett uendret.

Denne typen isolasjon av høynivåspråk fra maskinvareimplementeringen av en datamaskin har, i tillegg til mange fordeler, også ulemper. Spesielt tillater det ikke å lage enkle og presise instruksjoner for utstyret som brukes. Programmer skrevet på høynivåspråk er lettere for programmereren å forstå, men mindre effektive enn deres kolleger skrevet på 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) i 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å har evnen til å jobbe med komplekse datastrukturer. De fleste av dem har integrert støtte for strengtyper, objekter, operasjoner fil I/O og så videre. Ulempen med språk på høyt nivå er den større størrelsen på programmer sammenlignet med programmer på språk på lavt nivå. Derfor brukes hovedsakelig språk på høyt nivå for utvikling programvare datamaskiner og enheter som har mye 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 i form av matematiske formler, konseptet med datatype og strukturell transformasjonsteoremet.

Et program på et imperativt språk er bygget opp fra funksjoner (subrutiner). Monteringsspråkprogrammer kan også bestå av subrutiner, og dette er ikke noe nytt, men språk på høyt nivå lar deg ikke tenke på slike problemer som samtaleorganisering, overføring av innledende data og retur av resultater. Funksjonsbeskrivelsen består av et navn, en liste over parametere (initielle data), typen resultat og handlingene som fører til mottak av 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, dens innledende data består av ett reelt tall, resultatet er også et reelt tall oppnådd ved å summere opp et segment av en kjent uendelig rekke (eller utføre fsin-kommandoen til den matematiske koprosessoren).

Settet med handlinger som kan utføres inne i en funksjon er svært begrenset. Den består av å beregne formeluttrykk, kall til andre funksjoner (som ikke er en separat handling - et funksjonskall er ofte inkludert i et uttrykk), tilordninger, forgreninger (en gruppe handlinger som utføres kun når en bestemt betingelse er sann) og loops (en gruppe handlinger utført flere ganger, antall repetisjoner avhenger av en eller annen tilstand). Handlinger kan nestes i hverandre. Det kan virke som om settet med grener og løkker er for lite, men det er det ikke. 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 strukturerte betingede blokker - funksjonelle blokker, grener og løkker med ende. . Denne uttalelsen ble formulert i papiret av Corrado Bohm og Giuseppe Jacopini "Flowdiagrams, turing mashines and languages ​​with only to formation rules" (Communications of ACM, Volume 9 / Number 5 / May, 1965).

Hvis du trenger å lagre mellomresultater et sted for å utføre de nødvendige handlingene, plasseres spesielle beskrivelser som inneholder variabelnavn og eventuelt annen informasjon inne i funksjonen. Adressene til RAM-cellene vil bli tildelt dem automatisk. Noen språk inneholder også konstant- og typedefinisjoner innenfor funksjoner. 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, som bestemmer mengden minne som kreves for å plassere den og settet med operasjoner den kan delta i. Men dette er ikke nødvendigvis tilfelle, det er språk der typen variabel ikke er spesifisert og kan endres under kjøringen av programmet.

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

    naturlige og hele tall i forskjellige størrelser;

    reelle tall;

    symboler - bokstaver, tall, tegn på aritmetiske handlinger, etc .;

    tegnstrenger;

    boolske verdier;

    pekere

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

I C-språket, for eksempel, er symboler, strenger og booleaner udefinerte. Char-typen er faktisk et kort heltall og kan være aritmetisk.

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

På noen språk (for eksempel i C ++) kan operatorer defineres for typene som opprettes, noe som gjør det mulig å 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 det er mulig å lage:

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

    oppregningstyper (ved å telle opp mulige verdier);

    sett typer

Variabler av typesett kan brukes til å lagre informasjon om et sett med egenskaper for enkelte objekter. Noe slikt kan gjøres ved å bruke heltallsvariabler, hvis biter er satt til å indikere tilstedeværelsen av de tilsvarende egenskapene. Angivelig er bruken av sett mer robust mot programmeringsfeil.

Programmeringsspråk

Programmeringsspråk- et formelt skiltsystem for opptak av dataprogrammer. Programmeringsspråket definerer et sett med leksikalske, syntaktiske og semantiske regler som definerer utseendet til programmet og handlingene som eksekveren (datamaskinen) vil utføre under dens kontroll.

  • Funksjon: et programmeringsspråk er ment for å skrive dataprogrammer som brukes til å sende instruksjoner til en datamaskin for å utføre en eller annen databehandlingsprosess og organisere administrasjonen av individuelle enheter.
  • Oppgave: et programmeringsspråk skiller seg fra naturlige språk ved at det er designet for å overføre kommandoer og data fra person til datamaskin, mens naturlige språk brukes til å kommunisere mellom mennesker. Det er mulig å generalisere definisjonen av "programmeringsspråk" - det er en måte å overføre kommandoer, ordre, klar veiledning til handling på; mens menneskelige språk også tjener til å utveksle informasjon.
  • Henrettelse: et programmeringsspråk kan bruke spesielle konstruksjoner for å definere og manipulere datastrukturer og kontrollere beregningsprosessen.

Standardisering av programmeringsspråk

Et programmeringsspråk kan representeres som et sett med spesifikasjoner som definerer dets syntaks og semantikk.

Internasjonale standarder er laget for mange av de utbredte programmeringsspråkene. Spesifikke organisasjoner oppdaterer og publiserer jevnlig spesifikasjoner og formelle definisjoner av det relevante språket. Innenfor rammen av slike komiteer fortsetter utviklingen og moderniseringen av programmeringsspråk, og spørsmål om å utvide eller støtte eksisterende og nye språkkonstruksjoner tas opp.

Datatyper

Moderne digitale datamaskiner er vanligvis binære og data lagres i binær (binær) kode (selv om implementeringer i andre tallsystemer også er mulig). Disse dataene gjenspeiler vanligvis informasjon fra den virkelige verden (navn, bankkontoer, målinger osv.) som representerer konsepter på høyt nivå.

Det spesielle systemet som dataene er organisert etter i programmet er type system programmeringsspråk; utvikling og studie av typesystemer er kjent som typeteori. Språk kan klassifiseres som systemer statisk skrevet og språk med dynamisk skriving.

Statisk skrivede språk kan deles videre inn i språk med obligatorisk erklæring der hver variabel- og funksjonsdeklarasjon har en obligatorisk typedeklarasjon, og språk med antatte typer... Noen ganger kalles dynamisk skrevet språk latent skrevet.

Datastrukturer

Typesystemer på høynivåspråk tillater definisjon av komplekse, sammensatte typer, såkalte datastrukturer. Typisk er strukturelle datatyper dannet som et kartesisk produkt av base (atomare) typer og tidligere definerte kompositttyper.

Grunnleggende datastrukturer (lister, køer, hash-tabeller, binære trær og par) er ofte representert av spesielle syntaktiske konstruksjoner i høynivåspråk. Slike data struktureres automatisk.

Semantikk av programmeringsspråk

Det er flere tilnærminger til å definere semantikken til programmeringsspråk.

De mest utbredte variantene av følgende tre: operasjonell, derivert (aksiomatisk) og denotasjon (matematisk).

  • Når man beskriver semantikk innenfor opererer tilnærming, blir utførelsen av konstruksjoner av et programmeringsspråk vanligvis tolket ved hjelp av en imaginær (abstrakt) datamaskin.
  • Derivat semantikk beskriver konsekvensene av å utføre språkkonstruksjoner ved å bruke logikkens språk og spesifisere pre- og postbetingelser.
  • Denasjonale semantikk opererer med begreper som er typiske for matematikk - sett, korrespondanser, samt dommer, utsagn, etc.

Programmeringsparadigmet

Programmeringsspråket er bygget i samsvar med ett eller annet basismodell databehandlings- og programmeringsparadigme.

Til tross for at de fleste språk er fokusert på den imperative beregningsmodellen spesifisert av von Neumann-dataarkitekturen, er det andre tilnærminger. Vi kan nevne språk med en stablet beregningsmodell (Fort, Factor, PostScript, etc.), samt funksjonell (Lisp, Haskell, etc.) og logisk programmering (Prolog) og REFAL-språket, basert på beregningen modell introdusert av den sovjetiske matematikeren A A. Markov Jr.

For tiden utvikles også problemorienterte, deklarative og visuelle programmeringsspråk aktivt.

Måter å implementere språk

Programmeringsspråk kan implementeres som kompilert og tolket.

Et program på et kompilert språk som bruker en kompilator (spesialprogram) konverteres (kompileres) til maskinkode (et sett med instruksjoner) for av denne typen prosessor og deretter satt sammen til en kjørbar modul, som kan startes for kjøring som et eget program. Med andre ord, kompilatoren oversetter kildekoden til programmet fra et høynivå programmeringsspråk til binære koder prosessorinstruksjoner.

Hvis programmet er skrevet på et tolket språk, utfører (tolker) tolken kildeteksten direkte uten foreløpig oversettelse. I dette tilfellet forblir programmet på originalspråket og kan ikke startes uten tolk. En dataprosessor, i denne forbindelse, kan kalles en tolk for maskinkode.

Inndelingen i kompilerte og tolkede språk er betinget. Så for ethvert tradisjonelt kompilert språk, for eksempel Pascal, kan du skrive en tolk. I tillegg utfører de fleste moderne "rene" tolker ikke direkte språkkonstruksjoner, men kompilerer dem til en eller annen mellomrepresentasjon på høyt nivå (for eksempel med variabel dereferensing og makroutvidelse).

Du kan lage en kompilator for et hvilket som helst tolket språk - for eksempel kan et eget tolket Lisp-språk kompileres uten noen begrensninger. Koden opprettet under kjøring kan også kompileres dynamisk under kjøring.

Som regel kjører kompilerte programmer raskere og krever ikke tilleggsprogrammer, siden de allerede er oversatt til maskinspråk... Samtidig, hver gang programteksten endres, må den kompileres på nytt, noe som bremser utviklingsprosessen. I tillegg kan et kompilert program bare kjøre på samme type datamaskiner og, som regel, under det samme operativsystemet som kompilatoren ble designet for. For å lage en kjørbar fil for en annen type maskin, kreves en ny kompilering.

Tolkede språk har noen spesifikke tilleggsfunksjoner (se ovenfor), i tillegg kan programmer i dem startes umiddelbart etter modifisering, noe som gjør utviklingen enklere. Et tolket språkprogram kan ofte kjøres på forskjellige typer maskiner og operativsystemer uten ekstra innsats.

Imidlertid er tolkede programmer merkbart tregere å kjøre enn kompilerte programmer; dessuten kan de ikke kjøres uten et tolkeprogram.

På en måte tillater denne tilnærmingen å bruke fordelene til både tolker og kompilatorer. Det skal nevnes at det finnes språk som har både en tolk og en kompilator (Forth).

Symboler brukt

Moderne programmeringsspråk er designet for å bruke ASCII, det vil si tilgjengeligheten til alle grafikk ASCII-tegn er en nødvendig og tilstrekkelig betingelse for å skrive noen språkkonstruksjoner. Ledere ASCII-tegn brukes i begrenset grad: kun vognretur CR, linjeskift LF og horisontal tab HT tillates (noen ganger også vertikal tabulator VT og overgang til neste side FF).

Tidlige språk, som dateres tilbake til 6-biters tegnæra, brukte et mer begrenset sett. Fortran-alfabetet inneholder for eksempel 49 tegn (inkludert mellomrom): A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / (). , $ ":

Et bemerkelsesverdig unntak er APL-språket, som bruker mange spesialtegn.

Bruken av ikke-ASCII-tegn (som KOI8-R-tegn eller Unicode-tegn) er implementeringsavhengig: noen ganger er de bare tillatt i kommentarer og tegn-/strengkonstanter, og noen ganger er de bare tillatt i identifikatorer. I USSR var det språk der alle søkeord ble skrevet med russiske bokstaver, men slike språk fikk ikke mye popularitet (unntaket er 1C: Enterprise innebygd programmeringsspråk).

Utvidelsen av karaktersettet er begrenset av det faktum at mange programvareutviklingsprosjekter er internasjonale. Det ville være veldig vanskelig å jobbe med en kode der navnene på noen variabler er skrevet med russiske bokstaver, andre på arabisk og atter andre med kinesiske tegn. Samtidig, for å jobbe med tekstdata, støtter programmeringsspråk av den nye generasjonen (Delphi 2006,, Java) Unicode.

Klasser av programmeringsspråk

se også

Notater (rediger)

Litteratur

  • Hal Abelson, Gerald Jay Sussman. Struktur og tolkning av dataprogrammer
  • Robert W. Sebesta. Grunnleggende programmeringsspråk = Concepts of Programming Languages ​​/ Per. fra engelsk - 5. utg. - M .: Williams, 2001 .-- 672 s. - 5000 eksemplarer. - ISBN 5-8459-0192-8 (russisk), ISBN 0-201-75295-6 (engelsk)
  • Wolfenhagen V.E. Konstruksjoner av programmeringsspråk. Metoder for beskrivelse. - M .: Center YurInfoR, 2001 .-- 276 s. - ISBN 5-89158-079-9
  • Parondzhanov V.D. Hvordan forbedre sinnets arbeid. Algoritmer uten programmerere - det er veldig enkelt! - M .: Delo, 2001 .-- 360 s. - ISBN 5-7749-0211-0
  • F. Biancuzzi, C. Warden. Pionerer innen programmering. Samtaler med skaperne av de mest populære programmeringsspråkene. - SPb. : Symbol-Plus, 2010 .-- 608 s. - ISBN 978-5-93286-170-7

Lenker

  • Språklisten (engelsk) - mer enn 2500 språk med en kort beskrivelse
  • Computer Languages ​​​​History (engelsk) - historie med programmeringsspråk (fra 1954 til mai 2004) (inneholder et regelmessig oppdatert diagram)
  • Eksempler - programmeringseksempler på 162 språk
  • Programmeringsspråk popularitet - 2004 studie av populariteten til programmeringsspråk
  • 10 programmeringsspråk å lære (2006)
  • Programming Community Index (eng.) - jevnlig oppdatert vurdering av programmeringsspråkenes popularitet
  • Dataspråkshootout-benchmarks - Sammenligning av programmeringsspråk etter effektivitet
  • Programmeringsspråk som er elsket (eng.) - sammenligning av programmeringsspråk for "kjærlighet" og "hat" til dem

Wikimedia Foundation. 2010.

Maskinen forstår ikke menneskelig språk. Vi snakker selvfølgelig ikke om Siri og andre stemmegjenkjennere – vi snakker om å lage ny programvare. For å lage en kalkulator må maskinen stille inn en oppgave på samme måte som arbeidslederen forklarer arbeiderne hvordan de skal legge murstein. Men "Vasya, ept, vel, det burde være jevnere!" må beskrives på et programmeringsspråk. Hvor kom disse språkene fra?

Utgangspunktet moderne datamaskin- Babbages analytiske maskin, men språk ble oppfunnet tidligere: på 1800-tallet ble det mekaniske pianoet og vevstolen oppfunnet, som ingeniører beskrev arbeidslogikken for. Dette settet med instruksjoner er prototypen på det programmerere skriver i i dag.

På midten av 1900-tallet dukker Turing-maskinen opp, deretter de første datamaskinene og de første moderne språk Plankalkül programmering. Det første spranget i utvikling skjedde da militæret trakk oppmerksomheten til datamaskiner - DARPA og andre som dem begynte å investere aktivt i den unge industrien. Den andre kom med spredningen av Internett - jo dypere folk stuper inn i den digitale æraen, jo mer etterspurt er hovedskaperne av miljøet i denne epoken - programmerere. Og flere og flere ønsker å bli med dem.

Ønsket er rimelig og forståelig, men det første spørsmålet i hodet mitt blir ofte en uoverkommelig barriere – med hvilket språk skal man begynne å lære programmering? Frykten for å ta feil valg er basert på frykten for å kaste bort tid. Som et resultat har en nybegynner programmerer lett etter sitt "eget" språk i flere år, uten å gjøre noen fremskritt mot det kjære målet. Så hva pokker velger du språk?

Kriterier for valg av første programmeringsspråk

Valget av språk avhenger av oppgavene som programmereren ønsker å løse. For Internett-prosjekter er Python populær, som brukes i deres Google-prosjekter og Facebook, for mobilapplikasjoner for Android bestevenn- Java, og for iOS - Swift.

Det sanne problemet med valg er mangel på spesifikk oppgave... Dette er normalt, for du kan bare forstå hva du vil gjøre når du er inne i miljøet. Derfor anbefaler eksperter å ta som førstespråk det som kan brukes til å løse det bredeste spekteret av problemer.

Selvfølgelig er høyt spesialiserte språk bedre til å løse problemene de er skjerpet for, men dette er neste steg. Nybegynneren trenger fortsatt valgfrihet.

I tillegg til universalitet, det er flere kriterier:

  • Enkelhet– Å snuble over kompleks syntaks og bli sittende fast i jungelen av uleselig kode er ikke en hyggelig start på å lære.
  • Popularitet- Språket bør oppdateres ofte, ha et stort fellesskap av utviklere, være etterspurt i store selskaper... Et annet pluss er at jo mer populært språket er, jo lettere er det å finne svaret på arbeidsspørsmålet som har dukket opp.

Disse tre beskrivelsene passer best Python-språk, C #, Java og Ruby.

Utviklet på 80-tallet av den nederlandske programmereren Guido van Rossum. Store teknologiselskaper jobber med Python: Yandex, Google, Facebook og YouTube. Dette er det såkalte skriptspråket – det brukes til å skrive hva programmet har under panseret. Den brukes til webapplikasjoner, spillutvikling, serverprogramvare ...

Enkelhet Popularitet Allsidighet

Koden er lett å lese og har en oversiktlig struktur. Standardverktøy er nok til å begynne å lære.

Rangert som nr. 1 i elementær programmeringsutdanning ved amerikanske universiteter.

Oppdateres jevnlig - hvert 2,5 år. Det er inkludert i de fem mest populære språkene ifølge analyseselskapet TIOBE Software for januar 2016.

Nesten alt er skrevet i Python: systemadministrasjonsskript, nettsteder, maskinlæringssystemer, spill.

Språket ble utviklet på slutten av 90-tallet basert på C++ og Java. Mest brukt til store bedriftsprosjekter, men ikke bare begrenset til dem. For eksempel er skript i Unity-spillmotoren skrevet i C #.

Enkelhet Popularitet Allsidighet

Strukturelt nær C ++ og Java - syntaks (struktur programkode) er vanskeligere enn Python og Ruby, men det vil ta mindre tid å lære relaterte språk. Bibliotekets grensesnitt passer godt med designmønstre, noe som gjør det enkelt å lære.

Den siste oppdateringen var i 2015.

C # er skrevet under Windows telefon, iOS og Android. Et stort nummer av dokumentasjon, men det er ikke mange biblioteker med gratis lisens - dette betyr at for opplæring kan en programmerer bruke andres kode, men for bruk i kommersielt produkt du må betale.

Språket ble oppfunnet av programmerere fra Microsoft for å utvikle Windows-applikasjoner. Til tross for dette brukes den i andre systemer også. Fungerer også på innebygde, skrivebords- og serverplattformer.


Rubin

Laget av en japansk utvikler påvirket av Perl-språket. Lansert i 1995. Skrevet i Ruby er Shopify, Github, Groupon, Gule sider, Twitter og Slideshare. Det blir stadig mer populært, men det er mer vanlig i startups enn i store selskaper. Bra for å lage et enkelt internettprosjekt.

Enkelhet Popularitet Allsidighet

Som Python er koden lett å lese. Strukturen er også identisk med Python. Sammenlignet med andre språk er valget av standardbibliotek dårligere - du må bruke tid på å søke.

Et stort og lojalt utviklerfellesskap - avrunder de ti mest populære språkene ifølge TIOBE Software. Mange bibliotek er fritt tilgjengelig.

Den minst allsidige av de fire - mest egnet for webutvikling. På den annen side, inne i Internett-prosjekter kan du gjøre veldig forskjellige og veldig kule ting med det.


Java

Den første versjonen av språket ble utgitt i mai 1995. Java brukes av Amazon, eBay, LinkedIn og Yahoo!

Enkelhet Popularitet Allsidighet

Som nevnt tidligere har Java og C # en veldig lik syntaks - du lærte den ene, du kjenner nesten den andre. Men som i det første tilfellet er syntaksen mer kompleks enn for Ruby og Python.

Det er 3 milliarder Android-smarttelefoner i verden, noe som betyr at Java vil være etterspurt i lang tid fremover. Først mest populære av TIOBE Software.

Oftest brukt til bedriftsutvikling og Android-applikasjoner.


Oppsummering av forberedelsene

Det er vanskelig å trekke en konklusjon. På den ene siden lokker muligheten til å slå to fluer i en smekk og ta Java eller C #, men Python lokker med sin allsidighet, og Ruby - med sin enkelhet.

Vi nølte og gikk for å snakke med erfarne utviklere - de anbefaler deg fortsatt å bli på Python. Her er hva Grigory Petrov, profesjonell utvikler og evangelist av VoxImplant, sier:

"Språk Python programmering ofte referert til som "kjørbar pseudokode" fordi språkets syntaks og standardbiblioteker legger vekt på lesbarhet og forståelighet. Legg til dette det bredeste utvalget av utviklingsverktøy, biblioteker, opplæringsmateriell – og vi får et av beste språk programmering for nybegynnere".

Produksjon: mens det ikke er klare oppgaver og klare mål, men det er bare et ønske om å kode, er det verdt å stoppe ved Python - det er enkelt, populært og universelt. Nikita Sobolev, en programmeringslærer for nybegynnere ved #tceh, anser også valget av dette språket som optimalt for en nybegynner - utdanningsprogrammet viste seg å være mer komplisert og lengre enn i Ruby-kurset, men friheten i å velge retning er verdt den.