UMEÅ UNIVERSITET Institutionen för datavetenskap
26 februari 2015
Seminarierapport
Programspråk 7.5p Google Go
Namn: E-mail:
Jonas Hedin
[email protected]
Mattias Scherer
[email protected]
Namn: E-mail:
Max Bågling
[email protected]
Mikael Karlsson
[email protected]
Namn: E-mail:
Erik Berggren Albin Råstander
[email protected] [email protected]
Handledare Thomas Johansson
Google Go
Innehåll
Innehåll 1 Bakgrund och historik 1.1 Historik . . . . . . . 1.2 Syfte . . . . . . . . . 1.3 Arv . . . . . . . . . 1.4 Sammanfattning . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
1 1 1 2 2
2 Uppbyggnad 2.1 Syntax . . . . . . . . . . . 2.2 Data . . . . . . . . . . . . 2.3 Concurrency . . . . . . . . 2.4 Konventioner . . . . . . . 2.5 Kontrollstrukturer . . . . 2.6 Hello world exempel i Go 2.7 Lite större exempel . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
2 2 2 3 3 3 3 4
språket passar till Simpelhet och kompilering . . . . . . . . . . . . . . . . . . . . . . Multi-processing . . . . . . . . . . . . . . . . . . . . . . . . . . . Användning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 5 5 6
3 Vad 3.1 3.2 3.3
. . . .
. . . .
4 Utvärdering 4.1 Utvecklingshastighet . . 4.2 Prestanda . . . . . . . . 4.3 Pålitlighet och säkerhet 4.4 Portabilitet . . . . . . . 4.5 Återanvändingsbarhet .
. . . . .
6 6 6 6 6 7
5 Inverkan 5.1 Läsbarhet och skrivbarhet . . . . . . . . . . . . . . . . . . . . . . 5.2 Inbyggda datatyper . . . . . . . . . . . . . . . . . . . . . . . . . .
7 7 8
6 Övriga källor
9
Seminarierapport
. . . . .
. . . . .
. . . . .
. . . . .
i
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
26 februari 2015
Google Go
1
1
Bakgrund och historik
Bakgrund och historik
1.1
Historik
21 september 2007 började Robert Griesemer, Rob Pike och Ken Thompson skissa sina mål för ett nytt programmeringspråk på en whiteboard[1]. Inom ett par dagar hade dessa mål lett vidare till en plan och en idé hur språket skulle se ut. Designarbetet fortsatte parallellt med andra uppgifter som ett deltidsarbete och i januari 2008 började Ken arbeta på en kompilator för att fortsätta utforska ideer. Kompilatorn producerade då C-kod som sin output och fortsatte så ända tills februari 2014 då man då övergick till en kompilator som producerar Go-kod. Vid mitten av 2008 hade språket växt till ett heltidsarbete och Ian Taylor och Russ Cox hjälpe till att förflytta språket och dess bibliotek från prototyp till verklighet. I november 2009 blev projektet open source och många personer från communityn har bidragit med idéer, diskussion och kod.
1.2
Syfte
Go skapades ur frustrationen med de existerande språken och utvecklingsmiljöerna. Programmering hade blivit för svårt, och valet av språk var en del av problemet. Du var tvungen att välja på effektiv kompilering, effektiv körning eller om språket var lätt att programmera i. Enligt utvecklarna gick det inte att få alla tre i samma språk. Programmerare som valde lätthet över säkerhet gick till språk såsom Python och Javascript istället för för C++ och Java. Inget nytt stort språk har kommit de senaste tio åren trots att kraven och syften med programmering har ändrats oerhört. Nedan har vi några av de problem som Go försöker lösa. • Datorers hastighet har ökat markant men mjukvaru-utvecklingens hastighet står still. • Att hantera beroenden är en stor del av utvecklingen idag men såsom andra språk är uppbyggda så blir kompileringen inte effektiv. • Det har växt ett stort motstånd mot klumpiga datatyper som i C och Java, man vill hellre ha dynamiskt typade variabler som i Python och Javascript. • Vissa koncept såsom garbage collection och parallella beräkningar är inte så välimplementerade i existerande språk. Go försöker kombinera enkelheten att programmera med ett interpreterat och dynamiskt typat språk med effektiviteten och säkerheten med ett statiskt typat och kompilerat språk. Det siktar även på att vara ett modernt språk med support för flertrådade program samt support för nätverksprogrammering. Slutligen ska det även vara snabbt, det ska inte ta mer än ett par sekunder att kompilera ett stort program. För att klara alla dessa krav så krävdes ett nytt språk, det räcker inte med att använda existerande bibliotek och verktyg.
Seminarierapport
1
26 februari 2015
Google Go
1.3
2
Uppbyggnad
Arv
Go ärver först och främst från C-familjen av programmeringsspråk (syntax), men har stora influenser av Pascal/Modula/Oberon-familjen (deklarationer,paket), och tar även lite idéer från språk som Newsqueak och Limbo (concurrency). Det är dock ett helt nytt språk, alla delar i språket är designade efter hur en programmerare programmerar.
1.4
Sammanfattning
Go utvecklades först för att lösa problem som uppstått i och med konstruktion av mjukvara till stora servrar. Det kanske låter som att Go bara används inom industrin men eftersom fokuset ligger vid enkelhet och tydlighet så kan Go vara ett språk som kan ses som kraftfullt och uttrycksfullt av många programmerare.
2
Uppbyggnad
Go liknar C men har många ändringar med mål att göra koden koncis, lättläst och säker. För att göra Go lätt har man inte: typarv, metod- eller operatoröverladdning, cirkulär beroenden bland paket, pekararitmetik, assertions (predikat) eller generisk programmering[2].
2.1
Syntax
Go förkortar C genom att deklarera en variabel i := 3 eller s := "Hello world" istället för säga att variabeln är av typen int eller string. Dock om man vill deklarera en variabel utan att initiera ett värde kan man skriva var i int där man definerar vilken datatyp variabeln är. Funktioner deklareras som t.ex. func Namn(a int, b string) (n int, err error) där första parantesen innehåller inparametrar och den andra är returvärden. Notera att man skriver variabelnamnet först och sen typen. Go använder semikolon som C fast de förekommer inte i källkoden utan det är lexical analyzer som automatisk sätter semikolon när den skannar genom att följa några regler. Men semikolon kan användas i for statement för att separera initialisering, tillstånd, och fortsättningselementet. En konsekvens av insättningsreglerna för semikolon så kan man inte börja med en måsvinge på ny rad för control statements (t ex. if, for, switch, eller select). Funktioner kan returnera flera värden. Ett konventionellt sätt är att returnera ett result, err par från en funktion så kan ett error indikeras till sin kallare. defer är ett statement som schemalägger en funktionskallelse som körs innan funktionen returnerar. Defer är bra att använda om man vill släppa en resurs oavsett vilken väg funktionen tar till return statement, t.ex. stänga en fil.
2.2
Data
new är en inbyggd metod i Go för att allokera minne och nolla det. new(T) allokerar ett nollat utrymme för en typ T och returnerar adressen. make är
Seminarierapport
2
26 februari 2015
Google Go
2
Uppbyggnad
en annan inbyggd funktion som initierar en datastruktur i minnet som inte är nollat. Slices är en datatyp som har en pekare till en array i minnet, samt innehåller den längd och kapacitet för minnesutrymmet.
2.3
Concurrency
Go erbjuder möjlighet för att skriva trådade program som delar tillstånd genom kommunikation. För att skriva trådade program i Go görs det endast med ett simpelt go-statement. go func() startar en s.k. goroutine som är en lightweightprocess. För att göra programmet synkroniserat finns det Channel types. chan type ger en typsäker, synkroniserad, buffrad kanal mellan goroutines. Med kanaler kan man skicka värden med ch