Пређи на садржај

Go (програмски језик) — разлика између измена

С Википедије, слободне енциклопедије
Садржај обрисан Садржај додат
Autobot (разговор | доприноси)
м Dodavanje datuma u šablone za održavanje i/ili sredjivanje referenci
++ референце
Ред 28: Ред 28:
== Историја ==
== Историја ==


Језик је настао као експеримент тројице Гуглових запослених—Роберт Грисемер, Роб Пајк и Кен Томпсон. Идеја је била да се дизајнира нови језик за системско програмирање који би решио главне проблеме постојећих језика у тој групи а притом задржао њихове позитивне особине. Нови језик би имао следеће особине:
Језик је настао као експеримент тројице Гуглових запослених—Роберт Грисемер, Роб Пајк и Кен Томпсон. Идеја је била да се дизајнира нови језик за системско програмирање који би решио главне проблеме постојећих језика у тој групи а притом задржао њихове позитивне особине.<ref>{{cite web |url=http://www.stanford.edu/class/ee380/Abstracts/100428.html |title=Another Go at Language Design |last=Пајк |first=Роб |date=28 April 2010 |work=Stanford EE Computer Systems Colloquium |publisher=[[Stanford University]]}} [https://www.youtube.com/watch?v=7VcArS4Wpqk Видео снимак доступан].</ref> Нови језик би имао следеће особине:


* био би [[статичка компилација|статички компилиран]] и могао би да се се користи за велике системе (као [[Java]] и [[C++]]),
* био би [[статичка компилација|статички компилиран]] и могао би да се се користи за велике системе (као [[Java]] и [[C++]]),
Ред 35: Ред 35:
* подржавао би програмирање у мрежи и вишеструко процесирање <!-- овде проверити да ли је добар превод -->
* подржавао би програмирање у мрежи и вишеструко процесирање <!-- овде проверити да ли је добар превод -->


У интервјуима, сва тројица дизајнера су изразила да нису љубитељи сложености [[C++]]-а, и да је то била главна мотивација за дизајнирање новог језика.
У интервјуима, сва тројица дизајнера су изразила да нису љубитељи сложености [[C++]]-а, и да је то била главна мотивација за дизајнирање новог језика.<ref>{{cite web|url=http://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480|title=Dr. Dobb's: Interview with Ken Thompson|author=Ендрју Бинсток|date=18-05-2011|accessdate=10 април 2016}}</ref><ref>{{cite web|url=http://commandcenter.blogspot.mx/2012/06/less-is-exponentially-more.html|title=Less is exponentially more |year=2012 |last=Пајк |first=Роб}}</ref><ref>{{cite web|url=https://sourcegraph.com/blog/live/gophercon2015/123645585015|title=The Evolution of Go |year=2015 |author=Роберт Грисемер}}</ref>



== Дизајн језика ==
== Дизајн језика ==
Ред 43: Ред 44:
Кратак преглед особина које карактеришу Гоу:
Кратак преглед особина које карактеришу Гоу:


* Синтакса и окружење које прихвата идеје које се чешће срећу у [[динамички програмски језик|динамичким језицима]].
* Синтакса и окружење које прихвата идеје које се чешће срећу у [[динамички програмски језик|динамичким језицима]].<ref name=go_video_2009>{{cite web|last=Пајк|first=Роб|title=The Go Programming Language|url=http://www.youtube.com/watch?v=rKnDgT73v8s&feature=related|publisher=YouTube|accessdate=10 април 2016}}</ref>
** Опциона скраћена декларација и иницијализација променљивих кроз локално закључивање типова података ({{јез-енг|local type inference}}; <code>i := 0</code> уместо <code>int i = 0;</code>).
** Опциона скраћена декларација и иницијализација променљивих кроз локално закључивање типова података ({{јез-енг|local type inference}}; <code>i := 0</code> уместо <code>int i = 0;</code>).
** Брза компилација програма у извршну датотеку.
** Брза компилација програма у извршну датотеку.<ref name="techtalk-compiling">{{cite video |people= Роб Пајк |date= 10 новембар 2009 |title= The Go Programming Language |url= http://www.youtube.com/watch?v=rKnDgT73v8s#t=8m53 |format= flv |medium= Техничка презентација |publisher= Гугл |time= 8:53}}</ref>
** Једноставно управљање пакетима (<code>go get</code>), као и једноставна и читљива документација пакета на интернету.
** Једноставно управљање пакетима (<code>go get</code>)<ref>[http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies Download and install packages and dependencies - go - The Go Programming Language]; видети [http://godoc.org godoc.org] за адресе и документацију појединих пакета</ref>, као и једноставна и читљива документација пакета на интернету<ref>{{cite web|url=http://godoc.org|title=GoDoc|work=godoc.org}}</ref>.
* Јединствени приступи проблемима:
* Јединствени приступи проблемима:
** Уграђене функционалности за конкурентно програмирање: лаки процеси (корутине - -{goroutines}-), канали за ток података између процеса, и <code>select</code> кључна реч за управљање каналима.
** Уграђене функционалности за конкурентно програмирање: лаки процеси (корутине - -{goroutines}-), канали за ток података између процеса, и <code>select</code> кључна реч за управљање каналима.
** Систем интерфејса и уграђивања типова уместо уместо виртуалног и невиртуалног наслеђивања.
** Систем интерфејса и уграђивања типова уместо уместо виртуалног и невиртуалног наслеђивања.
** Скуп алата који производи статички линковане извршне датотеке које не зависе од спољашњих библиотека.
** Скуп алата који производи статички линковане извршне датотеке које не зависе од спољашњих библиотека.
* Тежња ка једноставности језика - спецификација је довољно кратка да програмери могу целу да је запамте. Ово је могуће захваљујући избацивању функционалности које се често срећу у другим језицима.
* Тежња ка једноставности језика - спецификација је довољно кратка да програмери могу целу да је запамте. Ово је могуће захваљујући избацивању функционалности које се често срећу у другим језицима.<ref>Роб Пајк на [[подкаст]]у ''[http://5by5.tv/changelog/100 The Changelog]''</ref>
* Изворне датотеке са кодом су увек кодиране као [[UTF-8]], што омогућује локализовање коментара и документације, али и имена типова, функција, променљивих и константи.
* Изворне датотеке са кодом су увек кодиране као [[UTF-8]], што омогућује локализовање коментара и документације, али и имена типова, функција, променљивих и константи.


Ред 79: Ред 80:
=== Типови података ===
=== Типови података ===


Гоу има одређен број уграђених типова података, укључујући [[Булов тип података]], нумеричке типове (<code>byte</code>, <code>rune</code>, <code>int</code>, <code>float</code>, <code>complex</code>), и [[ниска|ниске]]. Ниске су непроменљиве, а помоћу уграђених оператора и кључних речи могуће је спајање, поређење и кодирање из и у [[UTF-8]]. Сложени типови ({{јез-енг|record type}}) се могу дефинисати уз помоћ кључне речи <code>struct</code>.
Гоу има одређен број уграђених типова података, укључујући [[Булов тип података]], нумеричке типове (<code>byte</code>, <code>rune</code>, <code>int</code>, <code>float</code>, <code>complex</code>), и [[ниска|ниске]]. Ниске су непроменљиве, а помоћу уграђених оператора и кључних речи могуће је спајање, поређење и кодирање из и у [[UTF-8]]<ref>Роб Пајк, [http://blog.golang.org/strings Strings, bytes, runes and characters in Go], 23 октобар 2013</ref>. Сложени типови ({{јез-енг|record type}}) се могу дефинисати уз помоћ кључне речи <code>struct</code>.


Типом податка <code>T</code> и бројем елемената <code>n</code> се дефинише '''[[Низ (структура података)|низ]]''' означен са <code>[n]T</code>; пошто је број елемената део типа податка, низови којима су типови елемената исти али им је број елемената различит, су различитог типа.
Типом податка <code>T</code> и бројем елемената <code>n</code> се дефинише '''[[Низ (структура података)|низ]]''' означен са <code>[n]T</code>; пошто је број елемената део типа податка, низови којима су типови елемената исти али им је број елемената различит, су различитог типа.


[[Динамички низ]]ови се зову '''одсечци''' {{јез-енг|slice}}; за тип податка <code>T</code>, одсечак се означава са <code>[]T</code>. Ови низови имају дужину и капацитет којим се означава када треба заузети нови део меморије за проширење одсечка. Неколико одсечака може да дели одређени меморијски простор.
[[Динамички низ]]ови се зову '''одсечци''' {{јез-енг|slice}}; за тип податка <code>T</code>, одсечак се означава са <code>[]T</code>. Ови низови имају дужину и капацитет којим се означава када треба заузети нови део меморије за проширење одсечка. Неколико одсечака може да дели одређени меморијски простор.<ref>Ендрју Џиренд, [http://blog.golang.org/go-slices-usage-and-internals Go Slices: usage and internals]</ref><ref>Гоу Аутори, [http://golang.org/doc/effective_go.html#slices Effective Go: Slices]</ref>


За пар типова података <code>K, V</code>, тип <code>map[K]V</code> означава тип '''мапе''' ([[хеш табела]]) која мапира кључеве типа <code>K</code> на вредности типа <code>V</code>. Хеш табеле су уграђене у језик, имају посебну синтаксу, и над њима се операције врше уграђеним функцијама.
За пар типова података <code>K, V</code>, тип <code>map[K]V</code> означава тип '''мапе''' ([[хеш табела]]) која мапира кључеве типа <code>K</code> на вредности типа <code>V</code>. Хеш табеле су уграђене у језик, имају посебну синтаксу, и над њима се операције врше уграђеним функцијама.
Ред 99: Ред 100:
</syntaxhighlight>
</syntaxhighlight>


Са овом дефиницијом типа <code>ipv4addr(x)</code> интерпретира <code>uint32</code> вредност у ИП адресу. Просто додељивање вредности <code>x</code> променљивој чији је тип <code>ipv4addr</code> није могуће јер, иако имају исту структуру у меморији, нису исти типови.
Са овом дефиницијом типа <code>ipv4addr(x)</code> интерпретира <code>uint32</code> вредност у ИП адресу. Просто додељивање вредности <code>x</code> променљивој чији је тип <code>ipv4addr</code> није могуће јер, иако имају исту структуру у меморији, нису исти типови.<ref>{{cite web|url=http://golang.org/ref/spec#Calls|title=The Go Programming Language Specification|work=golang.org}}</ref>


Константни изрази могу имати или немати типове; ако немају тип податка, он им се додељује када се њихова вредност додели некој променљивој, под условом да је конверзија могућа током компилације.
Константни изрази могу имати или немати типове; ако немају тип податка, он им се додељује када се њихова вредност додели некој променљивој, под условом да је конверзија могућа током компилације.

Верзија на датум 10. април 2016. у 11:43

Гоу
Маскота језика је амерички глодар рупар (енгл. gopher), а аутор је Рене Френч.[1]
Оригинални називенгл. Go
Изговара сегоу
Моделимперативни, конкурентни
Појавио се10. новембар 2009.; пре 14 година (2009-11-10)
Аутор(и)Google Inc., доприносиоци из заједнице отвореног кода
Дизајнер(и)Роберт Грисемер
Роб Пајк
Кен Томпсон
Актуелна верзија1.6[2]
Датум актуелне верзије17. фебруар 2016.; пре 8 година (2016-02-17)
Систем типовастатички, номинални, структурни
Имплементацијеgc (главна имплементација), gccgo (у оквиру ГНУ колекције компилатора), gopherjs (преводи Гоу програме у JavaScript)
УтицајиAlef, APL[3], C, CSP, Limbo, Modula-2, Newsqueak, Oberon, Паскал[4], Пајтон, Smalltalk[5]
Оперативни системиЛинукс, Mac OS X, Мајкрософт виндоус, OpenBSD[6], FreeBSD, NetBSD, Plan 9, Solaris
ЛиценцаМодификована BSD лиценца[7] + патент[8]
Веб-сајтhttp://golang.org/
Документацијаhttp://golang.org/doc/

Гоу (енгл. Go) је програмски језик отвореног кода настао у Гуглу 2007. године. Језик су осмислили Роберт Грисемер, Роб Пајк и Кен Томпсон[4], а намењен је првенствено системском програмирању. Ослањајући се на традицију језика C и Паскал, језик је компилиран, са статичким типовима података, ограниченим структурним типовима, садржи аутоматско управљање меморијом и функционалности за конкурентно програмирање инспирисане комуницирајућим секвенцијалним процесима.

Почетак рада на језику је септембар 2007. године. Званично је промовисан новембра 2009. године под модификованом BSD лиценцом. Данас се користи за мрежне програме, најпре у оквиру Гуглових система[9], али и у другим компанијама. Постоје две главне имплементације језика: gc, који је главна имплементација коју је развио Гугл и gccgo из ГНУ колекције компајлера. До верзије 1.5, gc имплементација је била написана у мешавини C, асемблер и Гоу кода, а од верзије 1.5, C код је преведен у Гоу.[10]

Историја

Језик је настао као експеримент тројице Гуглових запослених—Роберт Грисемер, Роб Пајк и Кен Томпсон. Идеја је била да се дизајнира нови језик за системско програмирање који би решио главне проблеме постојећих језика у тој групи а притом задржао њихове позитивне особине.[11] Нови језик би имао следеће особине:

  • био би статички компилиран и могао би да се се користи за велике системе (као Java и C++),
  • програмирање би било продуктивно а програми читљиви, без превише обавезних кључних речи и понављања (као код динамичких језика),
  • не би захтевао компликоване алате, већ би их добро подржао
  • подржавао би програмирање у мрежи и вишеструко процесирање

У интервјуима, сва тројица дизајнера су изразила да нису љубитељи сложености C++-а, и да је то била главна мотивација за дизајнирање новог језика.[12][13][14]


Дизајн језика

Највећи утицај на дизајн језика су језици из породице C и Паскал. Они се од ових језика разликују по додацима који побољшавају концизност, једноставност и безбедност програма.

Кратак преглед особина које карактеришу Гоу:

  • Синтакса и окружење које прихвата идеје које се чешће срећу у динамичким језицима.[15]
    • Опциона скраћена декларација и иницијализација променљивих кроз локално закључивање типова података (енгл. local type inference; i := 0 уместо int i = 0;).
    • Брза компилација програма у извршну датотеку.[16]
    • Једноставно управљање пакетима (go get)[17], као и једноставна и читљива документација пакета на интернету[18].
  • Јединствени приступи проблемима:
    • Уграђене функционалности за конкурентно програмирање: лаки процеси (корутине - goroutines), канали за ток података између процеса, и select кључна реч за управљање каналима.
    • Систем интерфејса и уграђивања типова уместо уместо виртуалног и невиртуалног наслеђивања.
    • Скуп алата који производи статички линковане извршне датотеке које не зависе од спољашњих библиотека.
  • Тежња ка једноставности језика - спецификација је довољно кратка да програмери могу целу да је запамте. Ово је могуће захваљујући избацивању функционалности које се често срећу у другим језицима.[19]
  • Изворне датотеке са кодом су увек кодиране као UTF-8, што омогућује локализовање коментара и документације, али и имена типова, функција, променљивих и константи.

Гоу је често мета следећих критика:

  • Недостатак генеричких типова доводи до дупликације кода. Може се симулирати уз помоћ метапрограмирања и рефлексије, али се тада губи на перформансама и провери тачности типова. Стандардна библиотека из тог разлога не нуди генеричке алгоритме.
  • Нема могућности проширивања језика (на пример, кроз додавање оператора за корисничке типове), па одређени задаци захтевају више кода.
  • Једноставан систем типова који није базиран на Хиндли-Милнер систему смањује безбедност и једноставност програма.
  • Аутоматско управљање меморијом узрокује паузе у раду програма, па то умањује могућност примене у системским програмима, у поређењу са језицима у којима се ручно управља меморијом.

Дизајнери језика тврде да су ови недостаци важни за успех језика, и детаљно објашњавају зашто су одређене одлуке донешене. Упркос томе, отворени су за додавање могућности за генеричко програмирање у будућности, као и по питању побољшања у областима генерације кода и смањења трајања паузе приликом аутоматског чишћења меморије.

Синтакса

Синтакса је најсличнија језицима из C породице језика, али је знатно измењена како би програми били концизнији и читљивији, као и да би подржала нове додатке језику.

Постоји комбиновани оператор за декларацију и иницијализацију променљивих; уз помоћ овог оператора могуће је написати i := 3 или s := "tekst" без прецизирања типова података. Ово је супротно од декларације и иницијализације у C-у: int i = 3; и const char * s = "tekst";.

Искази се завршавају са симболом тачка-зарез, али се он не мора наћи у изворном коду на местима где се завршава ред. Алат go fmt из основне дистрибуције избацује овај симбол са места на којима је сувишан.

Функције могу враћати више вредности, па је шаблон враћања пара result, error главни метод индикације постојања грешке настале током позива дате функције. Сличан шаблон се примењује за приступ мапама и за локално проверавање типа податка, са тим што је тада пар који се враћа result, bool, где други параметар указује на тачност операције.

Гоу такође додаје синтаксу за иницијализацију параметара у struct типу по имену, као и за иницијализацију мапа и низова.

Као замену за C-ове for, while и do/while петље, Гоу уводи комбиновану for петљу која заједно са range изразом омогућује једноставну итерацију низова, одсечака, мапа, канала, и ниски.

Типови података

Гоу има одређен број уграђених типова података, укључујући Булов тип података, нумеричке типове (byte, rune, int, float, complex), и ниске. Ниске су непроменљиве, а помоћу уграђених оператора и кључних речи могуће је спајање, поређење и кодирање из и у UTF-8[20]. Сложени типови (енгл. record type) се могу дефинисати уз помоћ кључне речи struct.

Типом податка T и бројем елемената n се дефинише низ означен са [n]T; пошто је број елемената део типа податка, низови којима су типови елемената исти али им је број елемената различит, су различитог типа.

Динамички низови се зову одсечци енгл. slice; за тип податка T, одсечак се означава са []T. Ови низови имају дужину и капацитет којим се означава када треба заузети нови део меморије за проширење одсечка. Неколико одсечака може да дели одређени меморијски простор.[21][22]

За пар типова података K, V, тип map[K]V означава тип мапе (хеш табела) која мапира кључеве типа K на вредности типа V. Хеш табеле су уграђене у језик, имају посебну синтаксу, и над њима се операције врше уграђеним функцијама.

Канали (енгл. channel) за комуникацију између конкурентских процеса такође имају своју синтаксу. За тип податка T, тип канала се означава са chan T. Језик поседује и скуп уграђених операција којима се вредности могу примати и слати преко канала.

Показивачи постоје за све типове података; за тип податка T, показивач се означава са *T. За разлику од C-а, нема показивачке аритметике, осим кроз тип Pointer из пакета unsafe у стандардној библиотеци.

Поред подршке за интерфејсе, систем типова је номиналан (тј. заснива се на експлицитном именовању типова података). Кључна реч type ствара нови тип податка, који се разликује од осталих типова података који могу имати исти распоред у меморији (а у случају struct типа, и исти редослед поља). Неке конверзије између типова су уграђене, а додавање новог типа се могу дефинисати додатне конверзије. Конверзије између типова су увек експлицитне.

На пример, помоћу кључне речи type се може дефинисати тип за IPv4 адресе, које су 32-битни цели бројеви без предзнака:

type ipv4addr uint32

Са овом дефиницијом типа ipv4addr(x) интерпретира uint32 вредност у ИП адресу. Просто додељивање вредности x променљивој чији је тип ipv4addr није могуће јер, иако имају исту структуру у меморији, нису исти типови.[23]

Константни изрази могу имати или немати типове; ако немају тип податка, он им се додељује када се њихова вредност додели некој променљивој, под условом да је конверзија могућа током компилације.

Функције такође имају типове. Могу да прихватају ниједан или више аргумената и да врате ниједну или више вредности; све ове вредности имају своје типове, а заједно они одређују потпис, односно тип функције. На пример, func(string, int32) (bool, error) је тип функције која као аргументе прима текст и 32-битни број са предзнаком (редом, string и int32), а враћа бул и грешку (редом, bool и error).

Сваки именовани тип може имати сет метода који је са њим повезан. Претходни пример се може проширити тако да има методе којим се врши штампање у читљивом формату, проверава да ли се налази у одређеном опсегу и слично, зависно од функционалности коју тип треба да има. Типу се метода додаје тако што се између кључне речи func и имена функције дода прималац (енгл. receiver), који се састоји од имена које представља референцу (слично речима this и self у језицима као што су Јава и Пајтон) и типа на који се метода односи.

// Is this the zero broadcast address 255.255.255.255?
func (addr ipv4addr) ZeroBroadcast() bool {
    return addr == 0xFFFFFFFF
}

Због номиналног система типова, ова метода је додата типу ipv4addr, али не и типу uint32.

Иако за њихово дефинисање и позивање постоји посебна синтакса, методе немају засебан тип. Сама синтакса је заправо "синтаксни шећер" (енгл. syntactic sugar), па ако је x променљива којој је додељена вредност чији је тип горепоменути ipv4addr, следеће две линије имају исто значење:

x.ZeroBroadcast()
ZeroBroadcast(x)

Интерфејси

Гоу поседује две особине којима замењује систем наслеђивања из класичног објектно-оријентисаног програмирања. Прво је уграђивање, које представља форму композиције или делегације. Други део су интерфејси, који омогућују полиморфизам у току извршавања програма.

Протоколи омогућују ограничен облик структурних типова података у оквиру номиналног система типова података. Сваки тип података над којим су дефинисане све методе из интерфејса имплицитно задовољава тај интерфејс. Сам систем интерфејса заснован је на систему протокола из језика Smalltalk. Интерфејс групише типове података у скуп, тако што сам представља листу метода које ти типови морају садрже. Типови који задовољавају одређени интерфејс не морају експлицитно то да нагласе, већ се та провера врши током компилације програма.

Типови Квадрат и Круг се могу груписати помоћу интерфејса Облик који од својих типова захтева да садрже методе Обим и Површина.

import "math"

type Облик interface {
    Обим() float64
    Површина() float64
}

type Квадрат struct {
    страница float64
}
func (кв Квадрат) Обим() float64 {
    return 4 * кв.страница
}
func (кв Квадрат) Површина() float64 {
    return кв.страница * кв.страница
}

type Круг struct {
    полупречник float64
}
func (к Круг) Обим() float64 {
    return math.Pi * к.полупречник * 2
}
func (к Круг) Површина() float64 {
    return math.Pi * math.Pow(к.полупречник, 2)
}

Сада се може дефинисати функција СабериПовршине која тражи два аргумента који задовољавају интерфејс Облик и сабира њихове површине:

func СабериПовршине(о1, о2 Облик) float64 {
    return о1.Површина() + о2.Површина()
}

СабериПовршине(Круг{4}, Квадрат{2.7})

Пошто је задовољење интерфејса имплицитно, додавање нових типова (нпр. Троугао или Трапез) се своди на дефинисање структуре типа и имплементације одређених метода, а то се може извршити и у оквиру другог пакета.

Стандардна библиотека језика користи интерфејсе у оквиру неколико библиотека. Један од примера је Stringer интерфејс из пакета fmt, који захтева методу String() string; задовољењем овог интерфејса, сваки тип може да одреди како ће његова вредност изгледати приликом штампе. Други пример су интерфејси Reader и Writer, којима се дефинише протокол за улаз и излаз података помоћу метода Read и Write, а користи код пакета за рад са датотекама, мрежним сокетима, стандардним улазом и излазом, баферима бајтова, токовима, , и слично.

Празан интерфејс (interface{}) представља важан случај у оквиру система типова, јер се односи на било који тип податка. Сличан је типу Object у језицима Јава и C#; разликује се од њих по томе што је то интерфејс који задовољавају сви типови укључујући и уграђене као што је int, док Object може држати само инстанце објеката јер представља надтип (енгл. supertype). Податак који је сачуван под типом interface{} се не може користити као аргумент при позиву функција или са уграђеним операторима без конверзије у конкретан тип помоћу наговештавања типа (енгл. type assertion), гранања по типу (енгл. type switch), или испитивањем рефлексијом уз помоћ reflect пакета. Зато што може да држи било који тип податка, interface{} представља један од начина за имплементацију генеричких алгоритама.

Систем пакета

Сваки пакет је дефинисан са два податка: својом путањом (нпр. "compress/bzip2" или "golang.org/x/net/html") и својим именом (нпр. bzip2 или html). Путања пакета је ниска, па може имати било какав садржај; пакети које корисници објављују на интернету садрже адресу са које пакет може бити преузет, чиме је олакшано управљање пакетима. Позив на други пакет увек садржи и име тог пакета, а да би нека вредност из пакета била видљива, њено мора почињати великим словом (нпр. функција Printf из пакета fmt је видљива у свим другим пакетима који позивају тај пакет, док је функција printf видљива само у оквиру fmt пакета).

Конкурентно програмирање

Језик поседује уграђене функционалности, као и скуп библиотека, који помажу писање конкурентних програма. Овде се конкурентност не односи само на паралелно извршавање програма, већ и на асинхронију: пуштање спорих операција као што је читање података са мреже или из базе података док програм извршава друге послове.

Главна структура за формирање конкурентних процеса је горутина (енгл. goroutine, игра речи са корутина), која представља лаган процес. Када се приликом позива функције испред имена функције нађе кључна реч go, та функција се позива у оквиру нове горутине. Спецификација језика не садржи начин имплементације горутина, а трентутне имплементације користе нити, слично као код језика Ерланг).

Иако стандардна библиотека садржи пакете са класичним структурама за контролу конкурентних процеса, идиоматски начин контроле укључује канале (енгл. channels), који омогућавају размену вредности између горутина. Канали имају своје типове података, па се канал типа chan T може користити само за слање вредности типа T. Операције над каналима користе посебну синтаксу; <-ch је израз који блокира тренутну горутину док не стигне вредност са канала ch, док ch <- x шаље вредност x преко канала ch (при чему може доћи до блокирања док друга горутина не прими ту вредност). Уграђена структура за гранање select (слична структури switch) омогућује имплементирање комуникације без блокирања преко више канала. Гоу има модел меморије који описује начин употребе канала и горутина за безбедно дељење меморије.

Тиме што поседује канале, Гоу се разликује од језика који користе модел учесника (енгл. actor model) као што је Ерланг, где се поруке шаљу директно учесницима (који одговарају горутинама). Модел учесника се може симулирати при чему се уводи коресподенција између горутина и канала, иако језик дозвољава да више горутина дели један канал, или да једна горутина прихвата и шаље вредности на више канала.

Структурна правила за конкурентност су изведене из Тони Хоровог модела комуницирајућих секвенцијалних процеса. За разлику од претходних језика који користе овај модел, као што су occam и Лимбо, Гоу не поседује механизме за безбедну и провериву конкурентност. Све горутине деле адресни простор, па се променљиви објекти и показивачи могу делити између горутина.

Изостављене особине

Гоу намерно изоставља одређене особине присутне у другим језицима, укључујући наслеђивање, генеричко програмирање, асертивност, аритметику са показивачима, и имплицитне конверзије између типова. Од ових особина, аутори језика су изразили отвореност ка додавању могућности за генеричко програмирање, а бранили су одлуке против додавања осталих особина. Уместо наслеђивања, препоручују коришћење интерфејса за динамичко позивање и композицију типова за поновно коришћење кода.

Што се тиче генеричког програмирања, неке од уграђених функција јесу генеричке (нпр. make/new, append), али се третирају као посебни случајеви; Роб Пајк сматра да је ово слабост језика и да постоји могућност промене. Тим који у оквиру Гугла развија језик је у једном тренутку направио компилатор за експериментални дијалекат језика који има генеричке типове, али га нису пустили у јавност.

Након што су испрва изузеци изостављени из језика, додат је panic/recover механизам, који се користи за грешке од којих систем не може да се опорави и које заустављају цео програм, или као пречицу за пропагирање грешака у оквиру пакета (не и између пакета; тада се користи пар result, error који је стандардан начин сигнализирања грешке).

Правила и стил

  • Форматирање програма, укључујући индентацију, размаке, положаје заграда и други детаљи визуелног дела кода су стандардизовани уз помоћ алатке gofmt; програм golint врши додатне стилске провере кода.
  • Алати и пакети из стандардне библиотеке сугеришу стандардан начин приступа различитим проблеимима као што су документација (godoc), тестирање (go test), компилација програма (go build),управљање пакетима (go get) итд.
  • Компилатор уводи стриктно поштовање правила која у другим језицима постоје само у облику препорука. Неки од примера укључују забрану кружних зависности (два пакета не могу зависити један од другог), забрану неискориштених пакета и променљивих, и недостатак имплицитних конверзија типова.
  • Изостављање неких од особина, као што је map функција из функционалних језика и try/catch/finally структура из објектних језика захтева стил програмирања који је експлцитан, конкретан и императиван.

Алати

Стандардна Гоу дистрибуција садржи следеће алате:

  • go build, који компилира изворни код у извршне датотеке
  • go run, који покреће програм без компилације, као скрипту
  • go test, који покреће систем за тестирање и мерење перформанси програма
  • go fmt, који форматира датотеке са изворним кодом сходно договореним правилима
  • go get, који служи за управљање спољашњим пакетима помоћу различитих система контроле верзија
  • go vet, који проналази грешке помоћу статичке анализе програма
  • godoc, који приказује документацију пакета у командној линији или веб читачу
  • gorename, који служи за безбедно преименовање типова, функција и променљивих
  • go generate, који служи за покретање генеришућих програма као што је Yacc

Поред ових алата, корисници су допринели пишући своје програме који допуњују овај скуп алата. Неки од примера су goimports који проверава које пакете програм користи или не користи, па их додаје или брише са списка, gocode, који у оквиру различитих уређивача текста нуди информације о доступним типовима и функцијама, и golint, који указује на честе грешке у програмима и на недостатак документације.

Писање пакета је знатно олакшано постојањем go пакета у стандардној библиотеци, који нуди различите механизме за управљање и анализу датотека са изворним кодом.

Примери

Здраво свете

Следећи Гоу програм исписује „Здраво свете!":

package main

import "fmt"

func main() {
    fmt.Println("Здраво свете!")
}

Конкурентан пример

Следећи програм показује употребу конкурентних особина за писање асинхроних програма. Програм покреће две горутне: једна чека да корисник упише неки текст, а друга шаље сигнал након пет секунди. select гранање чека да било која од горутина достави поруку функцији main, и извршава се зависно од прве вредности која је стигла (пример адаптиран из књиге Давида Чизнала).[24]

package main

import (
    "fmt"
    "time"
)

func readword(ch chan string) {
    fmt.Println("Упиши реч и притисни Enter.")
    var word string
    fmt.Scanf("%s", &word)
    ch <- word
}

func timeout(t chan bool) {
    time.Sleep(5 * time.Second)
    t <- true
}

func main() {
    t := make(chan bool)
    go timeout(t)

    ch := make(chan string)
    go readword(ch)

    select {
    case word := <-ch:
        fmt.Println("Примио", word)
    case <-t:
        fmt.Println("Истекло време.")
    }
}

Референце

  1. ^ „FAQ — The Go Programming Language”. Golang.org. Приступљено 10. април 2016. 
  2. ^ Џиренд, Ендрју (17. 02. 2016). „Go 1.6 is released”. The Go Blog. Приступљено 10. април 2016. 
  3. ^ Пајк, Роб (24. 04. 2014). „Hello Gophers”. Приступљено 10. април 2016. 
  4. ^ а б „Language Design FAQ”. golang.org. 16. 01. 2010. Приступљено 10. април 2016. 
  5. ^ „The Evolution of Go”. Приступљено 10. април 2016. 
  6. ^ „lang/go: go-1.5 – Go programming language”. OpenBSD ports. 23. 12. 2014. Приступљено 10. април 2016. 
  7. ^ „Text file LICENSE”. The Go Programming Language. Google. Приступљено 10. април 2016. 
  8. ^ „Additional IP Rights Grant”. The Go Programming Language. Google. Приступљено 10. април 2016. 
  9. ^ „Go FAQ: Is Google using Go internally?”. Приступљено 10. април 2016. 
  10. ^ „Go 1.5 Release Notes”. Приступљено 10. април 2016. „The compiler and runtime are now implemented in Go and assembler, without C. 
  11. ^ Пајк, Роб (28. 4. 2010). „Another Go at Language Design”. Stanford EE Computer Systems Colloquium. Stanford University.  Видео снимак доступан.
  12. ^ Ендрју Бинсток (18-05-2011). „Dr. Dobb's: Interview with Ken Thompson”. Приступљено 10 април 2016.  Проверите вредност парамет(а)ра за датум: |access-date=, |date= (помоћ)
  13. ^ Пајк, Роб (2012). „Less is exponentially more”. 
  14. ^ Роберт Грисемер (2015). „The Evolution of Go”. 
  15. ^ Пајк, Роб. „The Go Programming Language”. YouTube. Приступљено 10 април 2016.  Проверите вредност парамет(а)ра за датум: |access-date= (помоћ)
  16. ^ Роб Пајк (10 новембар 2009). The Go Programming Language (flv) (Техничка презентација). Гугл. Корисна информација се налази на: 8:53.  Проверите вредност парамет(а)ра за датум: |date= (помоћ)
  17. ^ Download and install packages and dependencies - go - The Go Programming Language; видети godoc.org за адресе и документацију појединих пакета
  18. ^ „GoDoc”. godoc.org. 
  19. ^ Роб Пајк на подкасту The Changelog
  20. ^ Роб Пајк, Strings, bytes, runes and characters in Go, 23 октобар 2013
  21. ^ Ендрју Џиренд, Go Slices: usage and internals
  22. ^ Гоу Аутори, Effective Go: Slices
  23. ^ „The Go Programming Language Specification”. golang.org. 
  24. ^ Chisnall 2012, стр. 152.

Литература

Спољашње везе