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

Садржај обрисан Садржај додат
Нема описа измене
Нема описа измене
Ред 3:
|назив = Гоу
|слика = [[Датотека:Go gopher mascot bw.png|200px]]
|натпис уз слику = Маскота језика је амерички глодар рупар ({{јез-енг|gopher}}), а аутор је Рене Френч.
|натпис уз слику =
|оригинални назив = {{јез-енгл|Go}}
|изговор на српском = гоу
|модел = [[Императивно програмирање|императивни]], [[Конкурентно програмирање|конкурентни]]
|настанак = {{start date and age|2009|11|10}}
|аутори = -{[[Google Inc.]]}-, доприносиоци из заједнице [[отворени код|отвореног кода]]
|дизајнери = Роберт Грисемер<br>Роб Пајк<br>[[Кен Томпсон]]
|актуелна верзија = 1.6
|датум актуелне верзије = 17{{start фебруарdate and age|2016|02|17}}
|типови = статички, номинални, структурни
|имплементације = -{gc}- (главна имплементација), -{gccgo}- (у оквиру [[ГНУ]] колекције компилатора), -{gopherjs}- (преводи Гоу програме у [[JavaScript]])
|дијалекти =
|утицаји = [[Alef (програмски језик)|Alef]], [[APL (програмски језик)|APL]], [[C (програмски језик)|C]], [[Комуницирајући секвенцијални процеси|CSP]], [[Limbo (програмски језик)|Limbo]], [[Modula-2]], [[Newsqueak]], [[Oberon]], [[Паскал|Паскал (програмски језик)|Паскал]], [[Пајтон (програмски језик)|Пајтон]], [[Smalltalk]]
|утицао на =
|оперативни системи = [[Линукс]], [[OS X|Mac OS X]], [[Мајкрософт виндоус]], [[OpenBSD]], [[FreeBSD]], [[NetBSD]], [[Plan 9]], [[Solaris]]
Ред 182:
 
Сваки пакет је дефинисан са два податка: својом путањом (нпр. <code>"compress/bzip2"</code> или <code>"golang.org/x/net/html"</code>) и својим именом (нпр. <code>bzip2</code> или <code>html</code>). Путања пакета је ниска, па може имати било какав садржај; пакети које корисници објављују на интернету садрже [[URL|адресу]] са које пакет може бити преузет, чиме је олакшано управљање пакетима. Позив на други пакет увек садржи и име тог пакета, а да би нека вредност из пакета била видљива, њено мора почињати великим словом (нпр. функција <code>Printf</code> из пакета <code>fmt</code> је видљива у свим другим пакетима који позивају тај пакет, док је функција <code>printf</code> видљива само у оквиру <code>fmt</code> пакета).
 
 
 
=== Конкурентно програмирање ===
 
Језик поседује уграђене функционалности, као и скуп библиотека, који помажу писање конкурентних програма. Овде се конкурентност не односи само на паралелно извршавање програма, већ и на асинхронију: пуштање спорих операција као што је читање података са мреже или из базе података док програм извршава друге послове.
 
Главна структура за формирање конкурентних процеса је ''горутина'' ({{јез-енг|goroutine}}, игра речи са [[корутина]]), која представља лаган процес. Када се приликом позива функције испред имена функције нађе кључна реч <code>go</code>, та функција се позива у оквиру нове горутине. Спецификација језика не садржи начин имплементације горутина, а трентутне имплементације користе [[системске нит (програмирање)|нити]], слично као код језика [[Ерланг (програмски језик)|Ерланг)]].
 
Иако стандардна библиотека садржи пакете са класичним структурама за контролу конкурентних процеса, идиоматски начин контроле укључује ''канале'' ({{јез-енг|channels}}), који омогућавају размену вредности између горутина. Канали имају своје типове података, па се канал типа <code>chan T</code> може користити само за слање вредности типа <code>T</code>. Операције над каналима користе посебну синтаксу; <code><-ch</code> је израз који блокира тренутну горутину док не стигне вредност са канала <code>ch</code>, док <code>ch <- x</code> шаље вредност <code>x</code> преко канала <code>ch</code> (при чему може доћи до блокирања док друга горутина не прими ту вредност). Уграђена структура за гранање <code>select</code> (слична структури <code>switch</code>) омогућује имплементирање комуникације без блокирања преко више канала. Гоу има модел меморије који описује начин употребе канала и горутина за безбедно дељење меморије.
 
Тиме што поседује канале, Гоу се разликује од језика који користе [[модел учесника]] ({{јез-енг|actor model}}) као што је Ерланг, где се поруке шаљу директно учесницима (који одговарају горутинама). Модел учесника се може симулирати при чему се уводи коресподенција између горутина и канала, иако језик дозвољава да више горутина дели један канал, или да једна горутина прихвата и шаље вредности на више канала.
 
Структурна правила за конкурентност су изведене из [[Тони Хор]]овог модела [[комуницирајући секвенцијални процеси|комуницирајућих секвенцијалних процеса]]. За разлику од претходних језика који користе овај модел, као што су [[occam (програмски језик)|occam]] и [[Лимбо (програмски језик)|Лимбо]], Гоу не поседује механизме за безбедну и провериву конкурентност. Све горутине деле адресни простор, па се променљиви објекти и показивачи могу делити између горутина.
 
=== Изостављене особине ===
 
Гоу намерно изоставља одређене особине присутне у другим језицима, укључујући наслеђивање, генеричко програмирање, асертивност, аритметику са показивачима, и имплицитне конверзије између типова. Од ових особина, аутори језика су изразили отвореност ка додавању могућности за генеричко програмирање, а бранили су одлуке против додавања осталих особина. Уместо наслеђивања, препоручују коришћење интерфејса за динамичко позивање и композицију типова за поновно коришћење кода.
 
Што се тиче генеричког програмирања, неке од уграђених функција јесу генеричке (нпр. <code>make</code>/<code>new</code>, <code>append</code>), али се третирају као посебни случајеви; Роб Пајк сматра да је ово слабост језика и да постоји могућност промене. Тим који у оквиру [[Гугл]]а развија језик је у једном тренутку направио компилатор за експериментални дијалекат језика који има генеричке типове, али га нису пустили у јавност.
 
Након што су испрва [[изузетак (програмирање)|изузеци]] изостављени из језика, додат је <code>panic</code>/<code>recover</code> механизам, који се користи за грешке од којих систем не може да се опорави и које заустављају цео програм, или као пречицу за пропагирање грешака у оквиру пакета (не и између пакета; тада се користи пар <code>result, error</code> који је стандардан начин сигнализирања грешке).
 
== Правила и стил ==
Линија 191 ⟶ 209:
* Форматирање програма, укључујући индентацију, размаке, положаје заграда и други детаљи визуелног дела кода су стандардизовани уз помоћ алатке <code>gofmt</code>; програм <code>golint</code> врши додатне стилске провере кода.
* Алати и пакети из стандардне библиотеке сугеришу стандардан начин приступа различитим проблеимима као што су документација (<code>godoc</code>), тестирање (<code>go test</code>), компилација програма (<code>go build</code>),управљање пакетима (<code>go get</code>) итд.
* КомпајлерКомпилатор уводи стриктно поштовање правила која у другим језицима постоје само у облику препорука. Неки од примера укључују забрану кружних зависности (два пакета не могу зависити један од другог), забрану неискориштених пакета и променљивих, и недостатак имплицитних конверзија типова.
* Изостављање неких од особина, као што је <code>map</code> функција из функционалних језика и <code>try</code>/<code>catch</code>/<code>finally</code> структура из објектних језика захтева стил програмирања који је експлцитан, конкретан и императиван.
 
Линија 243 ⟶ 261:
 
[[Категорија:Програмски језици]]
[[Категорија:Гугл]]