Çima Go ji bo Bernamenûsên Bêaqil xerab e

Gotar wekî bersivek li ser nivîsek berê hatî weşandin hate nivîsandin gotara antipodean.

Çima Go ji bo Bernamenûsên Bêaqil xerab e

Di van du-zêde salên borî de min Go bikar tîne da ku serverek RADIUS ya pispor bi pergalek fatûreya pêşkeftî bicîh bîne. Di rê de, ez fêrî tevliheviyên ziman bi xwe dibim. Bername bixwe pir hêsan in û ne mebesta vê gotarê ne, lê ezmûna karanîna Go bixwe çend peyvan di berevaniya wê de heq dike. Go ji bo kodek ciddî, ​​berbelav dibe zimanek serdest. Ziman ji hêla Google ve hatî çêkirin, ku ew bi awayekî çalak tê bikaranîn. Rêzeya jêrîn, ez bi dilpakî difikirim ku sêwirana zimanê Go ji bo bernamenûsên neaqilmend xirab e.

Ji bo bernamenûsên qels hatine sêwirandin?

Kesên qels behsa pirsgirêkan dikin. Axaftina xurt li ser raman û xewnan ...

Fêrbûna Go pir hêsan e, ew qas hêsan e ku hûn dikarin kodê bêyî perwerdehiyê bixwînin. Dema ku kod bi pisporên ne-bingehîn (rêveber, xerîdar, hwd.) re tê xwendin, ev taybetmendiya ziman di gelek pargîdaniyên cîhanî de tê bikar anîn. Ev ji bo metodolojiyên mîna Pêşkeftina Pêşveçûn a Pêşkêşker pir hêsan e.
Tewra bernamenûsên nûjen jî piştî hefteyek an du hefte dest bi çêkirina kodek pir maqûl dikin. Pirtûka ku min jê xwendibû "Go Programming" (ji hêla Mark Summerfield) ye. Pirtûk pir baş e, gelek nuwazeyên zimên dişopîne. Piştî zimanên nehewce tevlîhev ên wekî Java, PHP, nebûna sêrbaz nûjen e. Lê zû an dereng, gelek bernamenûsên tixûbdar xwedî ramana karanîna rêbazên kevn di qadek nû de ne. Ma ev bi rastî hewce ye?

Rob Pike (îdeologê sereke yê ziman) zimanê Go wekî zimanek pîşesaziyê ku hêsan tê fam kirin û karanîna wê bi bandor e afirand. Ziman ji bo hilberîna herî zêde di tîmên mezin de hatî çêkirin û guman jê tune. Gelek bernamenûsên nûjen gilî dikin ku gelek taybetmendiyên ku ew winda ne hene. Ev daxwaza sadebûnê ji hêla sêwiranerên ziman ve biryarek hişmend bû, û ji bo ku em bi tevahî fêm bikin ka çima hewce bû, divê em motîvasyona pêşdebiran û ya ku ew hewl didin ku di Go de bi dest bixin fam bikin.

Ji ber vê yekê çima ew qas hêsan hate çêkirin? Li vir çend gotinên Rob Pike hene:

Li vir xala sereke ev e ku bernameçêkerên me ne lêkolîner in. Ew, bi gelemperî, pir ciwan in, piştî xwendinê têne cem me, dibe ku wan Java, an C/C++, an Python xwendin. Ew nikarin zimanek mezin fam bikin, lê di heman demê de em dixwazin ku ew nermalava baş çêbikin. Ji ber vê yekê jî divê ziman bi hêsanî were famkirin û fêrkirin.

Pêdivî ye ku ew nas be, bi gelemperî mîna C. Bernamesazên ku li Google dixebitin zû dest bi kariyera xwe dikin û bi piranî bi zimanên prosedurê, nemaze malbata C-yê nas dikin. Pêdiviya hilberîna bilez a di zimanek bernamesaziya nû de tê vê wateyê ku divê ziman ne pir radîkal be.

Gotinên biaqilane, ne wisa?

Artifacts of Simplicity

Ji bo bedewiyê sadebûn şertek pêwîst e. Lev Tolstoy.

Sade girtina wê di her sêwiranê de yek ji armancên herî girîng e. Wekî ku hûn dizanin, projeyek bêkêmasî ne projeyek e ku tiştek lê zêde bike tune ye, lê ew projeyek ku tiştek jê were rakirin tune ye. Gelek kes bawer dikin ku ji bo çareserkirina (an jî tewra) pirsgirêkên tevlihev, amûrek tevlihev hewce ye. Lêbelê, ew ne. Werin em wek nimûne zimanê PERL bigirin. Îdeologên zimanî di wê baweriyê de bûn ku bernamenûs divê herî kêm sê awayên cûda hebin ku pirsgirêkek çareser bike. Îdeologên zimanê Go rêyek din girtin; wan biryar da ku yek rê, lê bi rastî jî baş, bes e ku bigihîje armancê. Ev nêzîkatî xwedî bingehek ciddî ye: riya yekane hînbûna hêsantir û jibîrkirina dijwartir e.

Gelek koçber gazinan dikin ku ziman tê de abstraksyonên xweşik nînin. Erê, ev rast e, lê ev yek ji avantajên sereke yên ziman e. Ziman herî kêm sêrbaz dihewîne - ji ber vê yekê ji bo xwendina bernameyê zanînek kûr hewce nake. Ji bo lêkera kodê, ev qet ne pirsgirêk e. Bernameyek Golang-ê ya xweş-nivîskî bi rengek vertîkal, bi hindik an bê avahî dixwîne. Bi ser de, leza xwendina bernameyekê bi kêmanî rêzek ji leza nivîsandina wê mezintir e. Ger hûn difikirin ku hemî kod xwedan formatek yekgirtî ye (bi karanîna fermana gofmt-ya çêkirî hatî çêkirin), wê hingê xwendina çend rêzikên zêde qet ne pirsgirêk e.

Ne pir diyarker

Huner dema ku azadiya wê tê astengkirin tehemûl nake. Rastbûn ne berpirsiyariya wî ye.

Ji ber xwestina sadebûnê, Go kêmasiya avahiyên ku di zimanên din de ji hêla mirovên ku bi wan re fêr bûne wekî tiştek xwezayî têne hesibandin. Di destpêkê de dibe ku ew hinekî nerehet be, lê dûv re hûn pê dihesin ku xwendina bernameyê pir hêsantir û zelaltir e.

Mînakî, amûrek konsolê ku stdin an pelek ji argumanên rêza fermanê dixwîne dê bi vî rengî xuya bike:

package main

import (
    "bufio"
    "flag"
    "fmt"
    "log"
    "os"
)

func main() {

    flag.Parse()

    scanner := newScanner(flag.Args())

    var text string
    for scanner.Scan() {
        text += scanner.Text()
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }

    fmt.Println(text)
}

func newScanner(flags []string) *bufio.Scanner {
    if len(flags) == 0 {
        return bufio.NewScanner(os.Stdin)
    }

    file, err := os.Open(flags[0])

    if err != nil {
        log.Fatal(err)
    }

    return bufio.NewScanner(file)
}

Çareseriya heman pirsgirêkê di D-yê de, her çend ew hinekî kurttir xuya dike jî, xwendin ne hêsantir e

import std.stdio, std.array, std.conv;

void main(string[] args)
{
    try
    {
        auto source = args.length > 1 ? File(args[1], "r") : stdin;
        auto text   = source.byLine.join.to!(string);

        writeln(text);
    }
    catch (Exception ex)
    {
        writeln(ex.msg);
    }
}

Dojeha kopîkirinê

Mirov dojehê di nava xwe de hildigire. Martin Luther.

Destpêkir di warê nebûna generîkê de bi domdarî ji Go gilî dikin. Ji bo çareserkirina vê pirsgirêkê, piraniya wan kopîkirina kodê rasterast bikar tînin. Mînakî, fonksiyonek ji bo berhevkirina navnîşek jimaran, pisporên weha bawer dikin ku fonksiyon ji bilî kopî-paskirina hêsan a ji bo her celeb daneyê bi rengek din nayê sepandin.

package main

import "fmt"

func int64Sum(list []int64) (uint64) {
    var result int64 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int32Sum(list []int32) (uint64) {
    var result int32 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func main() {

    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

Ziman ji bo pêkanîna van avahîyan xwedî îmkanên têra xwe ye. Mînakî, bernameya gelemperî dê baş be.

package main

import "fmt"

func Eval32(list []int32, fn func(a, b int32)int32) int32 {
    var res int32
    for _, val := range list {
        res = fn(res, val)
    }
    return res
}

func int32Add(a, b int32) int32 {
    return a + b
}

func int32Sub(a, b int32) int32 {
    return a + b
}

func Eval64(list []int64, fn func(a, b int64)int64) int64 {
    var res int64
    for _, val := range list {
        res = fn(res, val)
    }
    return res
}

func int64Add(a, b int64) int64 {
    return a + b
}

func int64Sub(a, b int64) int64 {
    return a - b
}

func main() {

    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(Eval32(list32, int32Add))
    fmt.Println(Eval64(list64, int64Add))
    fmt.Println(Eval64(list64, int64Sub))
}

Û, her çend koda me ji doza berê hinekî dirêjtir bû jî, ew gelemperî bûye. Ji ber vê yekê, dê ji me re ne dijwar be ku em hemî operasyonên jimartinî pêk bînin.

Pir kes dê bibêjin ku bernameyek di D de pir kurttir xuya dike, û ew ê rast bin.

import std.stdio;
import std.algorithm;

void main(string[] args)
{
    [1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}

Lêbelê, ew tenê kurttir e, lê ne rasttir e, ji ber ku pêkanîna D bi tevahî pirsgirêka birêvebirina xeletiyê paşguh dike.

Di jiyana rast de, her ku tevliheviya mantiqê zêde dibe, ferq bi lez teng dibe. Dema ku hûn hewce ne ku çalakiyek ku bi karanîna operatorên zimanê standard nayê kirin pêk bînin, valahî hê zûtir diqede.

Di warê domdarbûn, berfirehbûn û xwendinê de, bi dîtina min, zimanê Go serdikeve, her çend ew di devkî de winda dike.

Bernamekirina gelemperî di hin rewşan de feydeyên nebawer dide me. Ev ji hêla pakêta cûrbecûr ve bi zelalî tê destnîşan kirin. Ji ber vê yekê, ji bo rêzkirina her navnîşê, em tenê hewce ne ku pêveka sort.Interface bicîh bikin.

import "sort"

type Names []string

func (ns Names) Len() int {
    return len(ns)
}

func (ns Names) Less(i, j int) bool {
    return ns[i] < ns[j]
}

func (ns Names) Swap(i, j int) {
    ns[i], ns[j] = ns[j], ns[i]
}

func main() {
    names := Names{"London", "Berlin", "Rim"}
    sort.Sort(names)
}

Ger hûn projeyek çavkaniyek vekirî bistînin û fermana grep "navdêr{}" -R bimeşînin, hûn ê bibînin ka çend caran navberên tevlihev têne bikar anîn. Hevalên nêzîk dê yekser bibêjin ku ev hemû ji ber nebûna generîk e. Lêbelê, ev her gav ne wusa ye. Werin em DELPHI wekî mînak bigirin. Tevî hebûna van heman generîkê, ew ji bo operasyonên bi celebên daneyên keyfî celebek VARIANT ya taybetî heye. Zimanê Go jî heman tiştî dike.

Ji topê heta çivîkan

Û tengas divê li gorî mezinahiya dînbûnê be. Stanislav Lec.

Dibe ku gelek temaşevanên ekstrem îdia bikin ku Go ji bo afirandina generîk mekanîzmayek din heye - refleks. Û ew ê rast bin ... lê tenê di rewşên kêm de.

Rob Pike me hişyar dike:

Ev amûrek hêzdar e ku divê bi hişyarî were bikar anîn. Pêdivî ye ku ji wê bê dûrxistin heya ku bi hişkî hewce nebe.

Wikipedia ji me re wiha dibêje:

Reflection pêvajoyek ku tê de bernameyek dikare di dema darvekirinê de struktur û tevgera xwe bişopîne û biguhezîne vedibêje. Paradîgmaya bernamekirinê ya ku di binê refleksê de ye, jê re bernameya refleksîf tê gotin. Ev celebek metaprogramkirinê ye.

Lêbelê, wekî ku hûn dizanin, divê hûn ji bo her tiştî bidin. Di vê rewşê de ev e:

  • zehmetiya nivîsandina bernameyan
  • leza pêkanîna bernameyê

Ji ber vê yekê, refleks divê bi hişyarî were bikar anîn, mîna çekek mezin. Bikaranîna nefikirî ya refleksê rê li ber bernameyên nexwendî, xeletiyên domdar û leza kêm vedike. Tiştê ku bernamenûsek snob karibe koda xwe li ber hevkarên din, pragmatîktir û nermtir nîşan bide.

bagajê çandî ji Xi? Na, ji çend zimanan!

Li gel bextê deyn jî ji mîratxweran re tê hiştin.

Digel ku gelek kes bawer dikin ku ziman bi tevahî li ser mîrateya C-yê ye, ev ne wusa ye. Ziman gelek aliyên çêtirîn zimanên bernamesaziyê vedihewîne.

syntax

Beriya her tiştî, hevoksaziya pêkhateyên rêzimanî li ser hevoksa zimanê C-yê ye. Lêbelê, zimanê DELPHI jî bandorek girîng bû. Bi vî rengî, em dibînin ku parantezên zêde, yên ku xwendina bernameyê pir kêm dike, bi tevahî hatine rakirin. Di ziman de operatora “:=” ya ku di zimanê DELPHI de ye jî heye. Têgîna pakêtan ji zimanên mîna ADA hatî deyn kirin. Daxuyaniya hebûnên ku nayên bikaranîn ji zimanê PROLOG-ê hatî wergirtin.

Semantîk

Pakêtan li ser semantîka zimanê DELPHI hatine çêkirin. Her pakêt dane û kodê vedihewîne û saziyên taybet û giştî vedihewîne. Ev dihêle hûn pêwendiya pakêtê ya herî kêm kêm bikin.

Operasyona pêkanîna bi rêbaza delegasyonê ji zimanê DELPHI hatiye wergirtin.

Berhevkirin

Ne bê sedem e ku henekek heye: Go dema ku bernameyek C hate berhev kirin hate pêşve xistin. Yek ji hêza zimên berhevkirina wî ya pir bilez e. Fikir ji zimanê DELPHI hatiye wergirtin. Her pakêtek Go bi modulek DELPHI re têkildar e. Van pakêtan tenê dema ku bi rastî hewce be ji nû ve têne berhev kirin. Ji ber vê yekê, piştî guherandina paşîn, hûn ne hewce ne ku hûn tevahî bernameyê berhev bikin, lê ji ber vê yekê tenê pakêtên guheztin û pakêtên ku bi van pakêtên guhezbar ve girêdayî ne ji nû ve berhev bikin (û tewra wê hingê jî, tenê heke navberên pakêtê hatine guhertin).

Avakirinên asta bilind

Ziman gelek avahiyên cihêreng ên asta bilind dihewîne ku bi tu awayî bi zimanên nizm ên mîna C re têkildar in.

  • Strings
  • Tabloyên haş
  • Slices
  • Tîpkirina duck ji zimanên mîna RUBY (ku, mixabin, gelek jê fam nakin an bi tevahî potansiyela xwe bikar tînin) hatî deyn kirin.

rêveberiya bîra

Rêvebiriya bîranînê bi gelemperî gotarek cûda heq dike. Ger di zimanên mîna C++ de, kontrol bi tevahî ji pêşdebir re were hiştin, wê hingê di zimanên paşîn ên mîna DELPHI de, modelek hejmartina referansê hate bikar anîn. Bi vê nêzîkatiyê re, referansên çerxîkî destûr nedan, ji ber ku komên sêwî ava bûn, wê hingê Go xwedan tespîtkirina komên weha (wek C#) çêkiriye. Wekî din, berhevkarê çopê ji piraniya pêkanînên ku niha têne zanîn bikêrtir e û jixwe dikare ji bo gelek karên rast-dem were bikar anîn. Ziman bixwe rewşên ku nirxek ji bo hilanîna guhêrbarek dikare li ser stakê were veqetandin nas dike. Ev barkirina li ser rêveberê bîranînê kêm dike û leza bernameyê zêde dike.

Hevdemî û Hevdemî

Paralelîzm û hevrikiya ziman ji pesindanê wêdetir e. Tu zimanek nizm nikare ji dûr ve jî bi Go re pêşbaziyê bike. Ji bo rast be, hêjayî gotinê ye ku model ji hêla nivîskarên ziman ve nehatiye îcadkirin, lê bi tenê ji zimanê kevn û baş ADA hatîye deyn kirin. Ziman karibe bi mîlyonan girêdanên paralel bi karanîna hemî CPU-yan ve bixebite, di heman demê de ku bi rêzek pirsgirêkên hindiktir ên bi kêşe û şertên nijadê re ku ji bo koda pir-tehlî tîpîk in, hebe.

feydeyên Additional

Ger bi fêde be dê her kes fedakar bibe.

Ziman di heman demê de çend feydeyên bê guman ji me re peyda dike:

  • Pelê yekane ya darvekirî piştî avakirina projeyê, bicîhkirina sepanan pir hêsan dike.
  • Tîpkirina statîk û encamnameya tîpê dikare bi girîngî hejmara xeletiyên di koda we de kêm bike, tewra bêyî ceribandinên nivîsandinê. Ez hin bernamenûsan nas dikim ku bi tevahî bêyî nivîsandina testan dikin û qalîteya koda wan pir zirarê nade.
  • Berhevkirina pir hêsan û veguheztina hêja ya pirtûkxaneya standard, ku pêşkeftina serîlêdanên cross-platformê pir hêsan dike.
  • Gotinên birêkûpêk ên RE2-ewle ne û demên darvekirinê yên pêşbînîkirî hene.
  • Pirtûkxaneyek standard a hêzdar ku destûrê dide piraniya projeyan ku bêyî çarçoveyên partiya sêyemîn bikin.
  • Ziman têra xwe bi hêz e ku li ser pirsgirêkê bisekine ne ku meriv wê çawa çareser bike, di heman demê de ew qas nizm e ku pirsgirêk bi bandor were çareser kirin.
  • Pergala Go eco jixwe ji bo her carê amûrên pêşkeftî yên li derveyî qutiyê vedihewîne: ceribandin, belgekirin, rêveberiya pakêtê, lingên hêzdar, hilberîna kodê, detektorê şert û mercên nijadê, hwd.
  • Go guhertoya 1.11-ê rêveberiya pêwendiya semantîkî ya çêkirî, ku li ser mêvandariya VCS-ya populer hatî çêkirin, destnîşan kir. Hemî amûrên ku ekosîstema Go pêk tînin van karûbaran bikar tînin da ku kodê ji wan bi yek gavê dakêşin, ava bikin û saz bikin. Û ev pir baş e. Bi hatina guhertoya 1.11 re, pirsgirêka guhertoya pakêtê jî bi tevahî hate çareser kirin.
  • Ji ber ku ramana bingehîn a ziman kêmkirina sêrbaziyê ye, ziman pêşdebiran teşwîq dike ku bi eşkereyî xeletiyan bikin. Û ev rast e, ji ber ku wekî din, ew ê bi tevahî rêgirtina xeletiyê ji bîr bike. Tiştek din ev e ku pir pêşdebiran bi qestî guhnedana xeletiyê didin, li şûna ku wan bişopînin tercîh dikin ku tenê xeletiyê ber bi jor ve bişînin.
  • Ziman metodolojiya OOP ya klasîk bicîh nayîne, ji ber ku di forma xweya paqij de di Go de virtual tune. Lêbelê, ev ne pirsgirêk e dema ku navbeynkaran bikar tînin. Nebûna OOP bi girîngî astengiya têketina ji bo destpêk kêm dike.

Sadebûn ji bo berjewendiya civakê

Tevlihevkirin hêsan e, hêsankirin dijwar e.

Go ji bo hêsan hatî çêkirin û ew di wê armancê de bi ser dikeve. Ew ji bo bernamenûsên jîr ên ku feydeyên xebata tîmê fam dikin û ji guhezbariya bêdawî ya zimanên di asta Enterprise de westiya ne, hate nivîsandin. Di cebilxaneya xwe de komek piçûktir a strukturên hevoksaziyê heye, ew di pratîkê de bi demê re nayê guhertin, ji ber vê yekê pêşdebiran ji bo pêşkeftinê gelek dem azad kirine, û ne ji bo xwendina bêdawî nûjeniyên ziman.

Pargîdanî di heman demê de gelek avantajan jî werdigirin: astengiyek têketinê ya kêm dihêle ku ew zû pisporek bibînin, û neguhêrbûna ziman dihêle ku ew jî piştî 10 salan heman kodê bikar bînin.

encamê

Mezinahiya mêjiyê mezin tu carî fîlan nekiriye xwediyê Xelata Nobelê.

Ji bo wan bernamenûsên ku egoya kesane pêşî li ruhê tîmê digire, û hem jî teorîsyenên ku ji dijwarîyên akademîk û "xwe-pêşkeftina" bêdawî hez dikin, ziman bi rastî xirab e, ji ber ku ew zimanek hunerî ya gelemperî ye ku nahêle hûn bigihîjin kêfa estetîkî ji encama xebata we tê û xwe li pêş hevalan xwe profesyonel nîşan bide (bi şertê ku em hişmendiyê bi van pîvanan bipîvin, ne bi IQ). Mîna her tiştî di jiyanê de, ew jî mijarek pêşîniyên kesane ye. Weke hemû nûbûnên hêja, ziman jî ji înkara gerdûnî heta qebûlkirina girseyî rêyeke dûr û dirêj derbas kiriye. Ziman di sadebûna xwe de jîr e, û, wekî hûn jî dizanin, her tiştê jêhatî hêsan e!

Source: www.habr.com

Add a comment