Gå (sprog)

Logo.
Dato for første version 10. november 2009
Paradigme Kompileret sprog , samtidig , bydende nødvendigt og struktureret programmering
Forfatter Robert Griesemer  (i)
Rob Pike
Ken Thompson
Sidste version 1.16.5 (3. juni 2021)
Udviklingsversion 1,16 beta1 (17. december 2020)
Indtastning Stærk , statisk , strukturel
Påvirket af C
Python
Oberon-2 ( en )
Limbo
Aktiv Oberon ( en )
Kommunikation af sekventielle processer
Pascal
Oberon
Smalltalk
Newsqueak ( en )
Modula-2
Alef
APL
BCPL
Modula ( en )
Occam
Operativ system Windows , GNU / Linux , Mac OS X , FreeBSD , OpenBSD , DragonflyBSD , Solaris , Plan 9
Licens BSD-licens , patenteret
Internet side golang.org
Filudvidelse

Go er et kompileret og samtidig programmeringssprog inspireret af C og Pascal . Dette sprog blev udviklet af Google fra et indledende koncept af Robert Griesemer , Rob Pike og Ken Thompson . Go har to implementeringer: den første bruger gc , Go- compileren ; den anden bruger gccgo , "  frontend  " GCC skrevet i C ++ . Go er skrevet i C ved hjælp af yacc og GNU Bison til parsing op til version 1.4, og i Go selv til efterfølgende versioner (1.5).

Et Go-mål gives af Rob Pike, en af ​​dets tre skabere, der siger om uerfarne udviklere:

”De kan ikke forstå strålende sprog, men vi ønsker at få dem til at lave gode programmer. Således skal det sprog, vi giver dem, være let at forstå og let at bruge  ”

Go ønsker at lette og fremskynde programmering i stor skala: På grund af sin enkelhed er det derfor tænkeligt at bruge den også til at skrive applikationer, scripts eller store systemer. Denne enkelhed er også nødvendig for at sikre vedligeholdelse og udvikling af programmer gennem flere generationer af udviklere.

Mens det også er målrettet mod eksekveringshastighed, der er vigtigt for systemprogrammering, betragter det multithreading som det mest robuste middel til at sikre denne hastighed på nuværende processorer, samtidig med at vedligeholdelse er let ved at adskille enkle opgaver, der udføres uafhængigt for at undgå at skabe "gasfabrikker". Dette design muliggør også skrivefri drift på multi-core arkitekturer ved straks at udnytte den tilsvarende effektforøgelse.

Hej verden  "

Her er et eksempel på et typisk Hello-verdensprogram skrevet i Go:

package main import "fmt" func main() { fmt.Printf("Hello, world\n") }

Egenskaber

Go-sproget blev oprettet til systemprogrammering og er siden blevet udvidet til applikationer, hvilket er det samme mål som C og især C ++. Det er et bydende og konkurrerende sprog . Dens kompileringshastighed (på grund af sin syntaks enkelhed) gør det undertiden brugt som et script-sprog.

Konkurrence

Go integrerer direkte, som Java , samtidig kodebehandling. Nøgleordet gotillader, at et funktionsopkald kører i konkurrence med den aktuelle goroutine . En goroutine , så navngivet ved fjern analogi med coroutines , er en tråd til udførelse, der overvåges af planlæggeren, der er inkluderet i runtime. Programmet drager derefter fordel af computerens topologi til bedst at udføre goroutinerne, ikke nødvendigvis i en ny tråd, men det er også muligt, at en gruppe goroutines multiplexes på en gruppe tråde.

For at kalde en funktion f , skriver vi f () . For at kalde det som en goroutine skriver vi simpelthen go f () , som ligner meget på call f- opgaven; af PL / I , et sprog der også styrer multitasking siden 1970.

Goroutines kommunikerer med hinanden ved at sende meddelelser , sende eller modtage meddelelser over kanaler.

Disse meddelelser synkroniserer goroutinerne med hinanden i overensstemmelse med CSP- modellen , der af forfatterne anses for at være mere intuitiv end den multitrådede model (med synkronisering af semaforer, der omfatter låse, en forestilling også introduceret af Dijkstra ).

Falske venner

I sprogets aktuelle tilstand (2018)

Sproget indeholder aspekter af Pascal og C, men vi udsætter os for en masse fejl, hvis vi øjeblikkeligt glemmer, at vi hverken er i Pascal eller i C. Så a:=balloker en variabel a ved at tildele den værdien og typen b, men hvis variablen er allerede tildelt, skal du bare skrive a=b. Ikke at forveksle med a==b(ligeværdighed). Udtrykket bag a ifhar ikke brug for parenteser, men det udtryk, der skal udføres, hvis testen består, skal være lukket i parentes. I sin nuværende tilstand tolererer ikke compileren, at en erklæret variabel ikke bruges, hvilket bestemt tilskynder til god praksis, men gør trial and error til fejlfinding af programmer meget smertefulde.

Objektsamlinger

Go kender skalartyper (heltal inteller int64, flyder float, strenge string), arrays indekseret af heltal, der starter ved 0, kort, der er samlinger af objekter, der er indekseret med nøgler (kaldet ordbøger , hashes eller associative arrays på andre sprog) og skiver, der er en dynamisk generalisering af arrays.

Det har let adgang til læse- og skrivefiler, hvad enten det er i linje- eller tegntilstand, eller ved at absorbere hele filen gennem os- og io- pakkerne .

Type system

Go har et system af statisk type , stærkt skrevet , strukturelt og sikkert , baseret på typen slutning med muligheden for at bruge en eksplicit typing.

For at give et eksempel er skrivning s := "Camélia", der erklærer, tildeler og initialiserer s, mulig og ikke tvinger skrivning var s string = "Camélia", som dog forbliver accepteret.

Kompatibilitet med sammensat type er baseret på egenskaber snarere end navn. Det vil sige, at to sammensatte typer vil være ækvivalente, hvis deres egenskaber er ækvivalente: samme navn for ejendommen og typeækvivalens. Dette er strukturel typning .

Dette har som konsekvens, at sproget ikke er objekt i klassisk forstand (hverken med klasser eller med prototype ), men designerne af sproget har dog taget et mere originalt valg af et statisk sprog. Det er muligt at definere grænseflader, der bærer metoder, der beskriver et objekts opførsel (det er også let muligt at blande flere grænseflader i en). Go-funktioner kan erklære at acceptere et argument fra denne grænseflade. Et objekt, der erklærer alle metoderne i denne grænseflade, med den samme signatur, kan sendes som et argument for denne metode. Typekontrol udføres statisk af compileren.

Det faktum, at Go ikke er et objekt i klassisk forstand, betyder at Go ikke har nogen arv af typen og ingen underklasse. Dette gør det muligt at omgå de problemer, der er forbundet med disse systemer, såsom flere arv på sprog, der tillader det (f.eks. I C ++ ) eller simpel arv ( f.eks. I Java ). Med egenskabsbaseret typeækvivalens har Go ikke brug for arv af typen. Underklassering efterlignes af "type boarding". Dette gør det let at blande to uafhængigt designede kodebaser uden at skulle dele almindelige typer.

Synligheden af ​​strukturer, attributter, variabler, konstanter, metoder, typer på øverste niveau og funktioner uden for deres deklarationspakke er defineret ved tilfældet med det første tegn i deres identifikatorer .

Runer

Go fungerer i Unicode både til dets kildekode og til behandling af strenge. Dens litteratur dog opgiver de udtryk kodepunkter for forkortelse af runer . Procedurer gør det muligt at omdanne karakterrepræsentationer til runer (enhver rune, der har en fast størrelse) og transformere ved hjælp af standardprocedurer en række Unicode-tegn til runer i en matrix (en rune pr. Element) såvel som omvendt uden at skulle jonglere repræsentationer med variabel længde eller bekymring for, om maskinen er lille-endian eller big-endian . Portabilitet er derfor sikret.

At tale om runer undgår de uklarheder, der ville være til stede med karakter eller byte . For at udforske en kæde bruger vi enten kædefunktioner direkte, eller så gennemsøger vi den fra rune til rune.

Kapitaliseringen af ​​nationale tegn (for eksempel "è" ⇒ "È") sker simpelthen ved unicode.ToUpper(r rune) rune. Runerne giver dig mulighed for at specificere i enhver Unicode, Thai, kinesisk, græsk karakter, inklusive APL- sprog - og også ethvert humørikon, der findes der.

Forskellige

I Go håndteres hukommelsesstyring af en affaldssamler .

Der er ingen generisk programmering endnu, selvom sprogets designere tænker over det. Der er ingen metodeoverbelastning eller pegearitmetik . Endelig er der ingen påstande eller undtagelser . At erstatte disse to, GB tilbyder nøgleord defer, panicog recoversom tilvejebringer mekanismer svarende til undtagelse sprog håndteringssystemer såsom C ++ og Java (nøgleord try, catch, finallyog throw).

Go kan interface med C / C ++ - biblioteker, tredjepartsudviklere, der allerede har udviklet bindinger til SDL og MySQL .

Go definerer et standard kodeformat (med hensyn til fordybninger og præsentation af kontrolstrukturer) og giver et værktøj til at anvende det (go fmt).

Go tilbyder også et kodebaseret dokumentationssystem og testramme.

Kompileringsenheden for go er den pakke, der er repræsenteret i standardimplementeringen af ​​en mappe og filerne direkte indeholdt i den mappe.

Importen af ​​en pakke udføres ved hjælp af dens importsti og kan enten specificere et standardbibliotek eller også tredjepartspakker installeret i eksterne kildelager (understøttes i øjeblikket: lager under svn , git , mercurial og basar ).

Eksperimentelle udvidelser

Selvom Go oprindeligt er beregnet til at producere robuste systemapplikationer og ikke brugerprogrammer, udvikles links til OpenGL eksperimentelt.

Biblioteker

Ligesom C kræver Go, at du angiver, hvilke biblioteker du vil bruge. I modsætning til C betragter det fejl ved kompilering, hvis dette bibliotek ikke bruges. Go-kompilatoren indeholder faktisk ingen advarselsmeddelelser fra designernes valg: "Det er ikke vigtigt at angive, hvad det ikke ville være nødvendigt at rette".

Hovedbiblioteker:

  • fmt giver 19 I / O-formateringsfunktioner inklusive Println , Print og Printf  ;
  • io leverer selv input-output-procedurer, herunder ReadFull , Seek , WriteString ...
  • matematik giver et sæt matematiske funktioner, såsom Min , Max , Sqrt , Log ...
  • os grænseflader systemet, for eksempel for at åbne og lukke filer, herunder OpenFile , ReadAt ...
  • strings giver omkring halvtreds funktioner, der beskæftiger sig med karakterstrenge;
  • time giver værktøjer til måling af udførelsestider, inklusive time.Now og time.Since () .

Biblioteker er undertiden uafhængige, nogle gange afhængige. Der er også flere måder at gøre lignende ting på. For eksempel kan du læse en fil ved at bruge ioutil.ReadAll , file.Read () eller bufio.NewScanner () .

Vi får listen over biblioteker fra kommandolinjen ved go list all.

Prøveprogram

Go tillader rekursivt opkald af programmer, som nogle gange kan gøre dem mere læsbare uden overdreven tab af hastighed:

package main import "fmt" import "time" var s [61]int func fib(n int) int { if n < 3 { return 1 } if s[n] != 0 { return s[n] } s[n] = fib(n-1) + fib(n-2) return s[n] } func main() { var i int t0 := time.Now() for i = 1; i <= 60; i++ { fmt.Printf("fib(%d) = %-15d\t", i, fib(i)) } println() println("Durée :", time.Since(t0).Seconds()) }

Dette program er formateret på den normale måde at gå af gofmt- værktøjet med optionerne -s (forenkle koden hvis det er muligt) og -w (skriv den ændrede kode på plads ). Dette værktøj justerer dybdeniveauerne i programmet, hvilket gør vedligeholdelse lettere, især hvis flere udviklere har brug for at vedligeholde den samme kode. Bemærk, at det ikke justerer åbnings- og lukningsbøjlerne lodret, idet de fleste nuværende redaktører (2018) er ansvarlige for visuelt at signalere kampene i redigeringstilstand.

Avancerede muligheder, forældet syntaks, læsbarhed sammenlignet med C

Go's syntaktiske valg er ikke enstemmigt. Hvis sproget hævder at være forenklet i sin skrivning, kritiserer nogle det for at have for indflydelsesrige og dogmatiske skævheder i denne henseende ved at kvalificere dets syntaks som forvirrende og dets kompilator af tvivlsom stivhed og citerer bl.a.

  • omfanget af de variabler, der kontrolleres af tilstedeværelsen eller fraværet af et stort bogstav
  • fraværet af en ternær operatør  ;
  • mangel på syntaktiske sukkerarter  ;
  • afslag på kompilering, hvis der er ubrugte variabler
  • håndtering af fejl og især de gentagne forhold, der er forbundet med deres verifikation
  • inkonsekvensen af ​​nogle sprog- API'er såsom kanaler .

Sprog er blevet kritiseret for at have "en Ferrari-motor i en Ford T-krop".

På den anden side foreslår Go at forenkle syntaksen for C, bevidst opbevaret i C ++ for at sikre bagudkompatibilitet, for eksempel ved at fjerne de syntaktisk unødvendige parenteser bag ifog forog ved at foreslå en standard gennemgang i a switchosv. Disse ændringer kan give mere læsbare programmer.

Projekter, der bruger Go

Liste over bemærkelsesværdige gratis applikationer skrevet i Go:

  • Docker - Bygning, implementering og kørsel af applikationer i containere.
  • Go Ethereum  : En af de tre originale implementeringer (sammen med C ++ og Python) af Ethereum-protokollen.
  • Gogs - Forge på tværs af platforme baseret på Git.
  • Grafana - Værktøj til overvågning, analyse af metrics og oprettelse af dashboards.
  • Kubernetes - Containeriseret applikationsstyringssystem.
  • Hugo  : statisk generator af hjemmesiden .
  • Caddy  (en)  : Websideserver.
  • Syncthing  : Open source peer-to-peer- filsynkroniseringsapp tilgængelig til Windows, Mac, Linux, Android, Solaris, Darwin og BSD.
  • Terraform  : softwaremiljø “infrastruktur som kode” offentliggjort i open source af firmaet HashiCorp.
  • Rclone  : Hjælpeprogram til filsynkronisering i skyen eller i filsystemmontering.

Noter og referencer

  1. Release History  "
  2. "  https://twitter.com/golang/status/1339638551122685952  "
  3. (in) "  Gå på Plan9  " .
  4. (in) "  Tekstfil LICENS  " (adgang til 27. januar 2011 ) .
  5. (i) "  Yderligere tilskud til IP-rettigheder  " om golang (adgang til 30. juni 2017 ) .
  6. (da) https://techcrunch.com/2009/11/10/google-go-language/ .
  7. (in) "FAQ - The Go Programming Language" , golang.org , 6. oktober 2011.
  8. (i) "  Fra parallel til konkurrent  " .
  9. (in) [video] Rob Pike om samtidig programmeringYouTube .
  10. Denne forestilling blev introduceret i PL / I i 1970 ved at følge en subrutineopkald med ordet TASK .
  11. "  Ofte stillede spørgsmål (FAQ) - The Go Programming Language  " , på golang.org (adgang 15. juli 2019 )
  12. "  Ofte stillede spørgsmål (FAQ) - The Go Programming Language  " , på golang.org (adgang 15. juli 2019 )
  13. Se grænseflade til meddelelsesoverføring .
  14. (in) Rob Pike, "  Gå på Google  " (adgang til den 6. november 2012 ) .
  15. Unicode version 6.3 indeholder 210.000 tegnmuligheder, der er brug for mere end 21 bits, og det kan antages, at en rune indtager samme sted som en int32. Den oprindelige standard for Go var, at en rune tager så meget plads som en int16. Ingen kildekode måtte dog ændres .
  16. Gå sprogstrenge: runerne
  17. "  Udskyd, panik og genopret  "blog.golang.org ,4. august 2010.
  18. (da) https://github.com/go-gl .
  19. (i) "  Ti grunde til, at jeg ikke kan lide golang  "www.teamten.com ,26. juli 2016(adgang til 12. november 2020 )
  20. (i) "  My Thoughts on Go  "blog.goodstuff.im ,21. maj 2015(adgang til 12. november 2020 )
  21. (i) Cliff Berg , "  Den" go "sproget er noget rod  " , på Value-Driven IT ,25. december 2015(adgang til 12. november 2020 )
  22. (in) "  GB er et dårligt designet sprog  "aletheia.icu ,28. oktober 2015(adgang til 12. november 2020 )
  23. (i) Jesse Hallett, "  Ændringer, jeg ville gøre for at gå  "sitr.us ,20. marts 2017(adgang til 12. november 2020 )
  24. (in) "  Go-kanaler er dårlige, og du føler dig dårligt burde  "www.jtolio.com ,4. marts, 2019(adgang til 12. november 2020 )
  25. Gå sprog: en Ford T med en Ferrari-motor
  26. “  En C ++ -udvikler ser på Go (programmeringssprog), del 1: enkle funktioner  ” , på www.murrayc.com (adgang til 12. november 2020 )
  27. (in) "  Go Projects  "

Tillæg

eksterne links