Programspråk, eller programmeringsspråk, är ett språk som en människa använder för att skapa datorprogram. Datorers grundspråk kallas maskinkod och består av ettor och nollor, som datorns centralprocessor (eller motsvarande enhet i kringutrustning) direkt kan tolka. Eftersom programmering på den nivån är svår och tidskrävande, och lätt leder till fel, har man tagit fram olika sorters programspråk, där man använder kodord för att beskriva vad datorn skall göra och som tillåter att text, siffror och räkneoperationer skrivs in ungefär som i kommunikation mellan människor. Ett skilt datorprogram används sedan för att översätta denna mer läsbara kod till maskinkod. Datorprogrammets källkod, som skrivits för hand, måste alltså i de flesta fall översättas till maskinkod innan programmet skall köras. För assembler (som ganska direkt motsvarar maskinkoden, men med kodord, variabelnamn och en del andra abstraktioner) görs översättningen med en assemblator. För högnivåspråk använder man en kompilator (en del kompilatorer skapar assemblerkod som ett mellansteg). Maskinkoden lagras sedan i en exekverbar binärfil. Vissa programspråk är inte avsedda att kompileras: ett interpreterat språk, tolkas (interpreteras) under själva exekveringen (när man "kör" programmet). Det finns även språk som kan kompileras allteftersom programmet körs, med hjälp av en JIT-kompilator, och språk som kompileras till en snabbtolkad bytekod. En del programspråk är konstruerade för att ganska noga följa datorernas typiska sätt att arbeta. Nyttan är framförallt att programmeraren då har bättre kontroll över den maskinkod som kommer att skapas då programmet kompileras. Sådana språk kallas för maskin- eller hårdvarunära språk eller lågnivåspråk, med assembler som typexemplet. Motsatsen är högnivåspråk. Den mesta källkoden skrivs med högnivåspråk. Man brukar även skilja mellan funktionella språk och objektorienterade språk. Ytterligare en uppdelning är mellan imperativa språk och deklarativa språk. Det har skapats ett otal programmeringsspråk. Här är en alfabetisk lista på en del av dem. 99 Bottles of Beer en lista på olika programspråk med exempel på hur koden ser ut. Webbjobb.io – Webbjobb 2014 i siffror Sammanställning över de populäraste programmeringsspråken som används i Sverige 2014.
Interpreterande programspråk kallas programspråk konstruerade för en interpreterande miljö. I en interpreterande miljö tolkas programkoden samtidigt som programmet körs, till skillnad mot en kompilerande miljö, där koden översätts i en separat process till maskinkod. Några interpreterande programspråk. Det finns kompilatorer för interpreterande språk, och det finns interpretatorer för kompilerade språk. Ett viktigt mellanting är när översättningen inte görs hela vägen utan till en maskinläsbar kod för interpretation i körningsögonblicket. ABC80 och ABC800 hade i sin BASIC-tolk en inbyggd omvandling av detta slag, och resultatet kunde sparas i så kallad BAC-kod, oläsbar för människor, men snabbt återanvändbar för basictolken, i och med att alla adresser för hopp och variabler var färdiguträknade i koden. Bland dagens programspråk är Java viktigt just i detta avseende, då Javakompilatorn i de flesta sammanhang inte översätter till färdig maskinkod, utan till bytekod, som är tänkt att kunna tolkas i flera olika miljöer ("plattformar") med olika processorer och operativsystem. Som programdelar i en webbsida (så kallade applets) kan alltså ett färdigt javaprogram köras på den dator som kopplar upp sig, bara stöd för Java applets finns på användardatorn (klienten).
Programmering handlar om att instruera en maskin eller del av en maskin, till exempel en mikrodator, dator, robot eller NC-maskin att utföra ett visst arbete. Personen som utför detta hantverk brukar ofta tituleras programmerare. Programmering är en del av det vidare begreppet programvaruutveckling eller mjukvaruutveckling som även innefattar aktiviteter som sammanställning av krav, mjukvarudesign och testning. När man programmerar skriver man ett program och man använder ett programspråk. Olika delar av ett program kan vara skrivet i olika programspråk. Maskinen förstår normalt inte programspråket direkt. Detta måste översättas till den maskinkod som maskinen är konstruerad att direkt förstå. Programmering direkt i maskinkod förekommer praktiskt taget inte alls eftersom det är för arbetskrävande. Olika typer av maskiner har helt olika uppsättningar instruktioner i sin maskinkod. Begrepp förknippade med programmering är bland annat slingor och uppställningar. Programmering kan ske på olika abstraktionsnivåer. Närmast hårdvaran, förutom maskinkod, ligger assemblerprogrammering där man använder ett assemblerspråk. Ett sådant språk har i det närmaste en direktöversättning till maskinkod, det vill säga de instruktioner man skriver motsvaras direkt av instruktioner i maskinkod, men använder en för människan mer läsbar form än maskinskodens ettor och nollor. Till exempel kan "SR 1,2" betyda "Subtrahera innehållet i register nummer 1 med innehållet i register nr 2". Assemblerspråket, som oftast också tillåter makro-instruktioner, måste översättas till maskinkod med hjälp av ett speciellt program: en assemblator eller något liknande. På nästa nivå kommer allmänna programspråk (engelska: general purpose computer languages) som till exempel C, Pascal och Java. I ett sådant språk motsvarar en sats eller instruktion normalt många instruktioner i maskinspråket. Till exempel kan satsen "saldo = tidigaresaldo - uttag, " motsvara maskininstruktioner för att hämta data från minnet till register, subtrahera innehållet i register och skriva tillbaka resultatet till minnet. Ett sådant program översätts, kompileras, till maskinkod av en kompilator eller interpreteras av en tolk. Ofta skiljer man också här mellan maskinnära språk som C och högnivåspråk där en större del av funktionaliteten beskrivs abstrakt. Högnivåspråk kan också användas som term för språk med högre abstraktionsnivå än assembler. Ytterligera en abstraktionsnivå uppnås när man inte längre direkt beskriver hur något ska utföras utan snarare vad som ska utföras. Detta förutsätter att man begränsat problemområdet på något sätt så att tolkaren eller kompilatorn kan använda färdiga dellösningar som sätts ihop till en totallösning för det aktuella problemet. Exempel på sådana språk är RPG för rapportgenerering. Också allmänna programspråk kan vara konstruerade för en viss uppgift, såsom PostScript för sidbeskrivning eller R för statistiska problem. Andra indelningar är de i språk som skall tolkas eller kompileras och enligt programmeringsparadigm (funktionell, procedurell, objektorienterad programmering eller liknande). Programmering kan också delas in efter vad programmet utför. Närmast hårdvaran kommer här styrning av hårdvarukomponenter genom mikroprogrammering, till exempel BIOS i en persondator eller drivrutiner för olika utrustningar. Nästa nivå är operativsystemet som fördelar och administrerar datorns resurser och gör datorn allmänt tillgänglig för människan genom ett användargränssnitt. Slutligen kommer nivån med alla olika användarprogram som ordbehandlare, webbläsare och datorspel. De första typerna av programmering görs av hårdvaruleverantörer, men operativsystem programmeras numera också av fristående programvaruleverantörer, som Microsoft, Apple Computer, Sun Microsystems, eller i distribuerade frivilligprojekt med öppen källkod. Huvudartikel: Strukturerad programmering. Huvudartikel: Objektorienterad programmering.
Skriptspråk är inom datavetenskap en benämning på "små" högnivåspråk inriktade på specialiserade uppgifter inom redan befintliga miljöer, i motsats till systemspråk, som används för programmering av tillämpningsprogram. Det finns ingen exakt avgränsning mellan systemspråk och skriptspråk, men skriptspråk är ofta interpreterande programspråk som använder dynamisk typning. Skriptspråkens källkod kallas skript och tolkas av en befintlig exekveringsmiljö, ofta tillgänglig för flera operativsystem, vilket gör skript portabla. Användningsområden för skriptning inkluderar systemanrop via skalprogram, automatisering av repetitiva uppgifter inom program, interaktion med andra programspråk, webbutveckling, definiering av spelmekanik samt grafiska användargränssnitt. Under 1970-talet dök det upp små, enkla programspråk för Unix som gjorde det enklare för användaren att starta flera program med ett enda kommando, ofta också med villkorssatser som tog hänsyn till omständigheterna. Ett av de första skriptspråken var Bourne. Ett annat språk som dök upp inom samma period var Awk, ett språk speciellt anpassat för att enkelt kunna söka i och analysera stora textmassor (exempelvis systemloggar) med reguljära uttryck. Den första versionen av Perl, som släpptes 1987, var starkt influerat av Awk och följdes snart av Tcl och Python. Sedan dess har språken utvecklats ständigt för att mer och mer likna fullfjädrade programspråk utom i vissa avgörande avseenden. Idag kan det mesta skrivas i ett skriptspråk som tidigare endast kunnat skrivas i C (programspråk), ALGOL eller liknande systemprogramspråk. Teoretiskt sett är systemprogramspråken C och C++ överlägsna skriptspråken när det gäller snabbhet och minneskrav för program, på grund av skriptspråkens interpreterade natur. Dock finns det en större varians i systemprogramspråkens prestanda beroende på skicklighetsnivån hos programmeraren. Stora, avancerade program brukar vara olämpliga att göra i skriptspråk, eftersom kraven på prestanda och effektiv minneshantering ökar. Eftersom skriptspråken är mer uttrycksfulla än systemprogramspråken och en sedan länge accepterad tumregel säger att en programmerares produktivitet mätt i antal kodrader är oberoende av programspråket, är skriptspråken teoretiskt sett överlägsna systemprogramspråken avseende utvecklingstid. Den högre abstraktionsnivån förhindrar också många buggar som annars är vanliga vid utveckling i systemprogramspråken, vilket än mer bidrar till en snabbare utveckling då testningen inte tar lika lång tid. Vid utveckling av stora program kan skriptspråkens dynamiska typning innebära att antalet buggar ökar om fler personer arbetar med samma program. Dynamisk typning innebär att en variabel kan användas till flera syften och missförstånd programmerare emellan kan lätt uppstå. Det är dessutom den typ av fel som kompileringen inte upptäcker utan som ses först vid test. Skript blir portabla genom användandet av en befintlig exekveringsmiljö, medan ett kommersiellt program vanligen levereras som en kompilerad exekverbar fil som är bunden till en viss datorarkitektur. Exempel på portabla systemprogramspråk finns, till exempel Java.
Högnivåspråk är en typ av programspråk. Det som kännetecknar ett högnivåspråk är att instruktionerna ligger på en relativt hög abstraktionsnivå. högnivåspråk är konstruerade att till sitt uttryck så långt som möjligt motsvara det sätt på vilket en programmeraren ser på det problemet som skall lösas, inte på det sätt datorns maskinvara skall hantera problemet. Högnivåspråk används dels som benämning på programspråk andra än maskinspråk och assembler, dels som benämning på programspråk med en relativt hög abstraktionsnivå, i detta fall till skillnad från maskinnära lågnivåspråk som C. Nackdelen med högnivåspråk (relativt assembler respektive mer maskinnära språk som C) är att programmeraren har svårare att precisera och kontrollera hur programmet i detalj skall uppföra sig. Detta kan innebära säkerhetsproblem i de fall programspråket inte hanterar konstruktionerna rätt eller resursslöseri då programmeraren inte förstår implikationerna av hur han eller hon använder olika konstruktioner (eller förhindras optimera). Ofta uppkommer motsvarande problem med mer maskinnära språk, då programmeraren gör misstag respektive koncentrerar sig på detaljer istället för på helheten. Lågnivåspråk anses ofta lätta att lära sig men svåra att bemästra då det krävs fler instruktioner än vad ett högnivåspråk kräver för att utföra samma moment. Fördelen med lågnivåspråk är att en erfaren programmerare kan skriva mer kompakta och resurssnåla program än vad som är möjligt med ett högnivåspråk. Fördelen med högnivåspråk är att det, tack vare den högre abstraktionsnivån, är lättare att skriva datorprogram (i synnerhet större sådana) samtidigt som mängden fel minskar och felsökningen och förbättring av programmen underlättas. Högnivåspråk avsedda också för systemprogrammering, såsom Modula-2 har i allmänhet konstruktioner som möjliggör användande av assembler för mindre kodblock, där man vill utnyttja sådana funktioner som inte stöds av kompilatorn eller som måste utföras på ett specifikt sätt. Den som har god förståelse för programspråket och kompilatorn kan också ofta få kompilatorn att generera önskad kod genom att justera hur han skriver programmet. Nuförtiden skrivs de flesta datorprogram med högnivåspråk. Exempel på programspråk är C++, C#, BASIC, Java och Pascal. Programmet skriver texten "Hello world!" på skärmen.
Ett datorprogram, även kallat dataprogram, är en serie instruktioner som styr en dator, och beskriver de operationer som datorn ska utföra, då programmet körs. Datorprogrammet kan utföra en liten specifik uppgift eller bilda en omfattande helhet, som en operativsystemkärna, en ordbehandlare eller en webbläsare. En samling datorprogram eller datorprogram i allmänhet kallas ofta programvara eller mjukvara. Ett datorprogram skrivs typiskt i ett människovänligt programspråk (till exempel Java, C++ eller Delphi) och kompileras eller tolkas sedan till maskinkod, som datorn förstår. Datorprogram kan delas in. Man kan också göra skillnad till exempel mellan serverprogram och program avsedda att användas direkt eller mellan program för normala bords- och serverdatorer och program för inbyggda system, till exempel för mobiltelefoner, bilar och tvättmaskiner. Maskinkoden är bunden till en viss typ av processor och övrig hårdvara, ofta också till ett visst operativsystem och de tjänster operativsystemet och olika programbibliotek erbjuder. I vissa fall kan man med olika trick skriva programmet så att olika maskinkod körs beroende på omgivningen. Källkoden, d.v.s. koden i den form den ursprungligen skrivs, kan däremot någorlunda lätt skrivas så att programmet går att kompilera för olika hårdvara och olika operativsystem. Då programmet skall användas i en ny miljö måste det i allmänhet anpassas för denna, men anpassningen är enkel om programmet skrivits portabelt. Genom att fri programvara alltid har sin källkod tillgänglig och dessutom delvis bygger på traditioner från GNU-projektet (som gärna gjorde programmen tillgängliga för alla Unix-varianter), går den relativt lätt att anpassa till varje hackares favoritmiljö och finns sålunda ofta tillgänglig på allt som det minsta liknar Unix (se Posix) och också till exempel för Windows. Proprietär programvara distribueras däremot för det mesta färdigkomplierad eller utan rätt att sprida modifierad kod, varför proprietära program är mer bundna till den eller de omgivningar som stöds av programleverantören. Det typiska datorprogrammet skrivs i ett eller flera programspråk, som sedan kompileras till maskinkod och länkas ihop med olika programbibliotek. Ett datorprogram kan också vara en lista av instruktioner i form av ett skript, som tolkas i realtid till maskinkod medan programmet körs. Denna senare typ av program är inte direkt bundna till en viss typ av processor eller speciell dator om bara den skript-tolk som instruktionerna skrivits för finns tillgänglig. Skriptspråken innehåller ofta också mycket funktionalitet som i många mer maskinnära programspråk måste kodas skilt, och förutom att man slipper anpassa koden till nya datorplattformar går därför skrivandet också ursprungligen snabbare. Tolkningen kräver dock resurser när programmet körs, varför ett färdigt kompilerat program kör snabbare. De tolkade språken är också beroende av att tolken finns tillgängligt då programmet skall köras. Som mellanting finns dels programspråk som kompileras strax innan de körs (till exempel perl) och programspråk som kompileras till en kompakt och snabbtolkad bytekod (som inte är avsedd att läsas av mänskor) så att de snabbare kan tolkas då de körs (till exempel java), dels program vars för effektiviteten kritiska delar är skrivna i maskinnära språk (till exempel C), medan skriptspråk eller andra högnivåspråk används för huvuddelen av programlogiken och sådana funktioner som väl stöds i dessa språk. Skillnaden mellan tolkade och kompilerade språk är numera oklar, då det finns normala kompilatorer för många språk ursprungligen konstruerade som skriptspråk. systemprogram, som utgör plattformen, såsom operativsystemets kärna, drivrutiner och centrala verktyg samt program som behövs för bootningen (på en PC BIOS och bootloader), och systemverktyg. enkla program skrivna av användaren själv, ofta i form av skript eller makron för olika tillämpningsprogram.