Kungani i-Go ingalungile kubahleli bezinhlelo ze-Unsmart

I-athikili yabhalwa njengempendulo eshicilelwe ngaphambilini i-antipodean article.

Kungani i-Go ingalungile kubahleli bezinhlelo ze-Unsmart

Eminyakeni emibili nangaphezulu edlule bengisebenzisa i-Go ukuze ngisebenzise iseva ye-RADIUS ekhethekile enohlelo lokukhokha oluthuthukisiwe. Endleleni, ngifunda ubunkimbinkimbi bolimi ngokwalo. Izinhlelo ngokwazo zilula kakhulu futhi aziyona inhloso yalesi sihloko, kodwa isipiliyoni sokusebenzisa i-Go ngokwayo sifanele amagama ambalwa ekuzivikeleni kwayo. I-Go isiba ulimi oluvamile olukhulayo lwekhodi ebucayi, ehlanjululwayo. Ulimi lwakhiwe yi-Google, lapho lusetshenziswa khona. Ngezansi, ngicabanga ngokweqiniso ukuthi idizayini yolimi lwe-Go ayilungile kubahleli bezinhlelo Abahlakaniphile.

Idizayinelwe abahleli bezinhlelo ababuthakathaka?

Ababuthakathaka bakhuluma ngezinkinga. Inkulumo eqinile mayelana nemibono namaphupho...

I-Go kulula kakhulu ukuyifunda, kulula kangangokuthi ungakwazi ukufunda ikhodi ngaphandle kokuqeqeshwa nhlobo. Lesi sici solimi sisetshenziswa ezinkampanini eziningi zomhlaba lapho ikhodi ifundwa kanye nochwepheshe abangabalulekile (abaphathi, amakhasimende, njll.). Lokhu kulula kakhulu ezindleleni ezifana ne-Design Driven Development.
Ngisho nabahleli bama-novice baqala ukukhiqiza ikhodi ehloniphekile ngemva kwesonto noma amabili. Incwadi engifunde kuyo ithi β€œGo Programming” (kaMark Summerfield). Le ncwadi inhle kakhulu, ithinta izici eziningi zolimi. Ngemuva kwezilimi eziyinkimbinkimbi ngokungadingekile njengeJava, PHP, ukuntuleka komlingo kuyaqabula. Kodwa ngokushesha noma kamuva, abahleli abaningi abanomkhawulo banombono wokusebenzisa izindlela ezindala emkhakheni omusha. Ingabe lokhu kuyadingeka ngempela?

U-Rob Pike (umcabango oyinhloko wolimi) udale ulimi lwesi-Go njengolimi lwezimboni okulula ukuluqonda nolusebenza ngempumelelo. Ulimi lwenzelwe ukukhiqiza okuphezulu emaqenjini amakhulu futhi akukho kungabaza ngalo. Abahleli abaningi bezinhlelo abasafufusa bakhala ngokuthi ziningi izici abashoda ngazo. Lesi sifiso sokwenza izinto zibe lula kwaba yisinqumo esihlakaniphile sabaklami bolimi, futhi ukuze siqonde ngokugcwele ukuthi kungani sasidingeka, kufanele siqonde ukugqugquzelwa konjiniyela kanye nalokho ababezama ukukufeza ku-Go.

Pho kungani yenziwa yalula kangaka? Nazi izingcaphuno ezimbalwa ezivela ku-Rob Pike:

Iphuzu elibalulekile lapha ukuthi abahleli bezinhlelo akubona abacwaningi. Njengomthetho, bancane kakhulu, beza kithi ngemva kokufunda, mhlawumbe bafunde i-Java, noma i-C / C ++, noma i-Python. Abakwazi ukuqonda ulimi olukhulu, kodwa ngesikhathi esifanayo sifuna ukuthi bakhe isofthiwe enhle. Yingakho ulimi kufanele kube lula ukuluqonda nokufunda.

Kufanele ajwayele, acishe afane noC. Abahleli bezinhlelo abasebenza kwa-Google baqala imisebenzi yabo kusenesikhathi futhi bajwayelene kakhulu nezilimi zenqubo, ikakhulukazi umndeni wakwa-C. Isidingo sokukhiqiza okusheshayo olimini olusha lokuhlela sisho ukuthi ulimi akumele lube lukhuni kakhulu.

Amazwi ahlakaniphile, akunjalo?

Izinto Zobuciko Ezilula

Ukulula kuyisimo esidingekayo sobuhle. Lev Tolstoy.

Ukuyigcina ilula ingenye yemigomo ebaluleke kakhulu kunoma yimuphi umklamo. Njengoba wazi, iphrojekthi ephelele ayiyona iphrojekthi lapho kungekho lutho olwengeza, kodwa lapho kungekho lutho olungasuswa. Abantu abaningi bakholelwa ukuthi ukuze kuxazululwe (noma ngisho nokuveza) izinkinga eziyinkimbinkimbi, ithuluzi eliyinkimbinkimbi liyadingeka. Nokho, akunjalo. Ake sithathe ulimi lwe-PERL njengesibonelo. Izazi zolimi zazikholelwa ukuthi umklami kufanele okungenani abe nezindlela ezintathu ezihlukene zokuxazulula inkinga eyodwa. Izazi zemibono yolimi lwesiGo zathatha indlela ehlukile; zanquma ukuthi indlela eyodwa, kodwa enhle ngempela, yanele ukufeza umgomo. Le ndlela inesisekelo esingathΓ­ sina: okuwukuphela kwendlela kulula ukufunda futhi kunzima ukuyikhohlwa.

Abafuduki abaningi bakhononda ngokuthi lolu limi alunazo izifinyezo ezinhle. Yebo, lokhu kuyiqiniso, kodwa lokhu kungenye yezinzuzo eziyinhloko zolimi. Ulimi luqukethe ubuncane bomlingo - ngakho alukho ulwazi olujulile oludingekayo ukuze ufunde uhlelo. Ngokuqondene ne-verbosity yekhodi, lokhu akuyona inkinga nhlobo. Uhlelo lwe-Golang olubhalwe kahle lufundeka mpo, lunesakhiwo esincane noma esingenalo nhlobo. Ngaphezu kwalokho, isivinini sokufunda uhlelo okungenani i-oda lobukhulu obukhulu kunejubane lokulubhala. Uma ubheka ukuthi yonke ikhodi inokufometha okufanayo (kwenziwe kusetshenziswa umyalo we-gofmt eyakhelwe ngaphakathi), khona-ke ukufunda imigqa embalwa eyengeziwe akuyona inkinga nhlobo.

Ayivezi kakhulu

Ubuciko abubekezeleli lapho inkululeko yabo ivinjelwe. Ukunemba akuwona umthwalo wakhe.

Ngenxa yesifiso sokwenza izinto zibe lula, i-Go ayinazo izinto zokwakha ngezinye izilimi ezithathwa njengento engokwemvelo ngabantu abayijwayele. Ekuqaleni kungase kuphazamise ngandlela-thile, kodwa-ke uyabona ukuthi uhlelo lulula kakhulu futhi alunambitheka kakhulu ukulufunda.

Isibonelo, insiza ye-console efunda i-stdin noma ifayela elisuka ku-agumenti yomugqa womyalo ingabukeka kanje:

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)
}

Isixazululo senkinga efanayo ku-D, nakuba sibukeka sisifishane, akulula ukusifunda

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);
    }
}

Isihogo sokukopisha

Umuntu uthwala isihogo ngaphakathi kuye. Martin Luther.

Abasaqalayo bahlale bekhala ngeGo mayelana nokushoda kwamajenerikhi. Ukuxazulula le nkinga, iningi labo lisebenzisa ukukopisha ikhodi okuqondile. Isibonelo, umsebenzi wokufingqa uhlu lwamanani aphelele, ochwepheshe abanjalo bakholelwa ukuthi ukusebenza akukwazi ukusetshenziswa nganoma iyiphi enye indlela ngaphandle kokunamathisela okukopisha kohlobo ngalunye lwedatha.

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))
}

Ulimi lunezindlela ezanele zokuqalisa lezi zakhiwo. Isibonelo, ukuhlela okuvamile kungaba kuhle.

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))
}

Futhi, nakuba ikhodi yethu iphenduke yaba yinde kunesimo sangaphambilini, isiye yaba yinto ejwayelekile. Ngakho-ke, ngeke kube nzima ngathi ukwenza yonke imisebenzi ye-arithmetic.

Abaningi bazothi uhlelo oluku-D lubukeka lufushane kakhulu, futhi bazobe beqinisile.

import std.stdio;
import std.algorithm;

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

Nokho, imfushane kuphela, kodwa ayilungile kakhulu, njengoba ukuqaliswa kwe-D kuyiziba ngokuphelele inkinga yokusingatha iphutha.

Empilweni yangempela, njengoba ubunkimbinkimbi be-logic bukhula, igebe liyancipha ngokushesha. Igebe livaleka ngokushesha okukhulu uma udinga ukwenza isenzo esingeke senziwa kusetshenziswa izisebenzisi ezijwayelekile zolimi.

Mayelana nokugcinwa, ukunwebeka, kanye nokufundeka, ngokubona kwami, ulimi lwe-Go luyawina, nakuba lulahlekelwa ku-verbosity.

Ukuhlelwa okuvamile kwezinye izimo kusinika izinzuzo ezingenakuphikwa. Lokhu kuboniswa ngokucacile ngephakheji yokuhlunga. Ngakho, ukuze sihlele noma yiluphi uhlu, sidinga nje ukusebenzisa isixhumi esibonakalayo sohlobo.

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)
}

Uma uthatha noma iyiphi iphrojekthi yomthombo ovulekile bese usebenzisa umyalo we-grep β€œinterface{}” -R, uzobona ukuthi kusetshenziswa kangaki izixhumanisi ezididayo. Amaqabane asondelene nawo azosho ngokushesha ukuthi konke lokhu kungenxa yokushoda kwamajenerikhi. Nokho, lokhu akunjalo ngaso sonke isikhathi. Ake sithathe i-DELPHI njengesibonelo. Ngaphandle kokuba khona kwalawa majenerikhi afanayo, aqukethe uhlobo olukhethekile lwe-VARIANT yokusebenza enezinhlobo zedatha engafanele. Ulimi lwesiGo lwenza okufanayo.

Kusukela kunganono kuya ondlunkulu

Futhi i-straitjacket kufanele ilingane nobukhulu bohlanya. UStanislav Lec.

Abalandeli abaningi abeqisayo bangase bathi i-Go inenye indlela yokwakha amajenerikhi - i-reflection. Futhi bazobe belungile ... kodwa ezimweni ezingavamile kuphela.

U-Rob Pike uyasixwayisa:

Leli ithuluzi elinamandla okufanele lisetshenziswe ngokuqapha. Kufanele kugwenywe ngaphandle uma kunesidingo.

I-Wikipedia isitshela lokhu okulandelayo:

Ukucabangisisa kusho inqubo lapho uhlelo lungaqapha futhi luguqule ukwakheka kwalo nokuziphatha ngesikhathi sokwenza. I-paradigm yokuhlela engaphansi kwayo ibizwa ngokuthi i-reflesive programming. Lolu uhlobo lwe-metaprogramming.

Nokho, njengoba wazi, kufanele ukhokhele yonke into. Kulokhu kuba:

  • ubunzima ekubhaleni izinhlelo
  • isivinini sokwenza uhlelo

Ngakho-ke, ukucabangela kufanele kusetshenziswe ngokuqapha, njengesikhali esisezingeni elikhulu. Ukusebenzisa ukucabanga ngokungacabangi kuholela ezinhlelweni ezingafundeki, amaphutha aqhubekayo kanye nesivinini esiphansi. Into nje yokuthi umhleli we-snob akwazi ukukhombisa ikhodi yakhe phambi kwabanye ozakwabo, abahlakaniphile nabanesizotha.

Imithwalo yamasiko evela e-Xi? Cha, ngenani lezilimi!

Ngokuhambisana nale nhlanhla, izikweletu nazo zishiyelwa izindlalifa.

Naphezu kweqiniso lokuthi abaningi bakholelwa ukuthi ulimi lusekelwe ngokuphelele ku-C heritage, akunjalo. Ulimi luhlanganisa izici eziningi zezilimi ezinhle kakhulu zokuhlela.

I-syntax

Okokuqala nje, i-syntax yezakhiwo zohlelo lusekelwe ku-syntax yolimi C. Nokho, ulimi lwase-DELPI nalo lwaba nethonya elikhulu. Ngakho-ke, sibona ukuthi ama-parentheses angenalutho, anciphisa kakhulu ukufunda kohlelo, asuswe ngokuphelele. Ulimi futhi luqukethe igama elithi β€œ:="” elihambisana nolimi lwesi-DELPHI. Umqondo wamaphakheji ubolekwe ezilimini ezifana ne-ADA. Isimemezelo samabhizinisi angasetshenzisiwe sibolekwe olimini lwe-PROLOG.

Ama-Semantics

Amaphakheji asekelwe ku-semantics yolimi lwe-DELPHI. Iphakheji ngayinye ihlanganisa idatha nekhodi futhi iqukethe izinhlangano ezizimele nezikahulumeni. Lokhu kukuvumela ukuthi wehlise isixhumi esibonakalayo sephakheji sibe esincane.

Umsebenzi wokuqalisa ngendlela yokuthumela ubolekwe olimini lwe-DELPHI.

Ukuhlanganiswa

Akukhona ngaphandle kwesizathu ukuthi kukhona ihlaya: I-Go yathuthukiswa ngenkathi kuhlanganiswa uhlelo lwe-C. Enye yamandla olimi ukuhlanganiswa kwalo okushesha kakhulu. Umbono waboleka olimini lwe-DELPHI. Iphakheji ngayinye ye-Go ihambisana nemojula ye-DELPI. Lawa maphakheji ahlanganiswa kuphela uma kunesidingo ngempela. Ngakho-ke, ngemva kokuhlela okulandelayo, awudingi ukuhlanganisa lonke uhlelo, kodwa kunalokho hlanganisa kuphela amaphakheji ashintshiwe namaphakheji ancike kulawa maphakheji ashintshiwe (futhi noma kunjalo, kuphela uma i-interface yephakheji ishintshile).

Izakhiwo ezisezingeni eliphezulu

Ulimi luqukethe izinto eziningi zokwakha ezisezingeni eliphakeme ezingahlobene nangayiphi indlela nezilimi ezisezingeni eliphansi njengo-C.

  • Izintambo
  • Amatafula we-Hashi
  • Izingcezu
  • Ukuthayipha kwedada kubolekwa ezilimini ezifana ne-RUBY (okuthe, ngeshwa, abaningi abayiqondi noma bayisebenzise ngokugcwele).

Ukuphathwa kwenkumbulo

Ukuphathwa kwememori ngokuvamile kufanelwe isihloko esihlukile. Uma ezilimini ezifana ne-C++, ukulawula kushiywe ngokuphelele kumthuthukisi, bese kuthi ezilimini zakamuva ezifana ne-DELPHI, imodeli yokubala ireferensi isetshenziswe. Ngale ndlela, izinkomba zomjikelezo azizange zivunyelwe, njengoba amaqoqo ezintandane akhiwa, bese i-Go ikwazi ukuthola okwakhelwe ngaphakathi kwamaqoqo anjalo (njenge-C#). Ngaphezu kwalokho, umqoqi kadoti usebenza kahle kakhulu kunokusebenzisa okuningi okwaziwayo manje futhi usengavele usetshenziselwe imisebenzi eminingi yesikhathi sangempela. Ulimi ngokwalo lubona izimo lapho inani lokugcina okuguquguqukayo linganikezwa kusitaki. Lokhu kunciphisa umthwalo kumphathi wememori futhi kwandisa isivinini sohlelo.

Concurrency kanye Concurrency

Ukufana nokuncintisana kolimi kungaphezu kokunconywa. Alukho ulimi olusezingeni eliphansi olungaqhudelana nokude ne-Go. Ukuze sibe nobulungisa, kufanele kuqashelwe ukuthi imodeli ayizange isungulwe abalobi bolimi, kodwa yayibolekwe nje ngolimi oluhle lwe-ADA. Ulimi luyakwazi ukucubungula izigidi zoxhumano oluhambisanayo lisebenzisa wonke ama-CPU, kuyilapho lunohlelo lobukhulu bezinkinga eziyinkimbinkimbi nezimo ezimisiwe nezimo zohlanga ezivamile kumakhodi anemicu eminingi.

Izinzuzo ezengeziwe

Uma kunenzuzo, wonke umuntu uzozidela.

Ulimi futhi lusihlinzeka ngenani lezinzuzo ezingangabazeki:

  • Ifayela elilodwa elisebenzisekayo ngemva kokwakha iphrojekthi lenza kube lula kakhulu ukuthunyelwa kwezicelo.
  • Ukuthayipha okungaguquki kanye nencazelo yohlobo kunganciphisa kakhulu inani lamaphutha kukhodi yakho, ngisho nangaphandle kokuhlolwa kokubhala. Ngiyazi abanye abahleli bezinhlelo abenza ngaphandle kokubhala izivivinyo futhi ikhwalithi yekhodi yabo ayihlupheki kakhulu.
  • Ukuhlanganiswa okulula kakhulu nokuphatheka okuhle kakhulu komtapo wolwazi ojwayelekile, okwenza kube lula kakhulu ukuthuthukiswa kwezinhlelo zokusebenza ze-cross-platform.
  • Izengezo ezivamile ze-RE2 ziphephile ngochungechunge futhi zinezikhathi zokwenziwa ezibikezelwayo.
  • Umtapo wolwazi onamandla ovumela amaphrojekthi amaningi ukuthi enze ngaphandle kwezinhlaka zezinkampani zangaphandle.
  • Ulimi lunamandla ngokwanele ukuthi lugxile enkingeni kunokuba luyixazulule, kodwa lusezingeni eliphansi ngokwanele ukuthi inkinga ingaxazululeka ngendlela efanele.
  • Isistimu ye-Go eco kakade iqukethe amathuluzi athuthukisiwe aphuma ebhokisini azo zonke izikhathi: izivivinyo, imibhalo, ukuphathwa kwephakheji, ama-linter anamandla, ukukhiqizwa kwekhodi, umtshina wemibandela yomjaho, njll.
  • Inguqulo ye-Go 1.11 yethule ukuphathwa kokuncika kwe-semantic eyakhelwe ngaphakathi, eyakhelwe phezu kokusingathwa kwe-VCS okudumile. Wonke amathuluzi akha i-Go ecosystem asebenzisa lawa masevisi ukuze alande, akhe, futhi afake amakhodi kuwo ngokuqubuka okukodwa. Futhi lokho kuhle. Ngokufika kwenguqulo 1.11, inkinga yokuguqulwa kwephakheji nayo yaxazululwa ngokuphelele.
  • Ngoba umqondo oyinhloko wolimi ukunciphisa umlingo, ulimi lukhuthaza onjiniyela ukuthi benze amaphutha ngokusobala. Futhi lokhu kulungile, ngoba uma kungenjalo, izovele ikhohlwe ngokuphathwa kwamaphutha ngokuphelele. Enye into ukuthi iningi lonjiniyela likuziba ngamabomu ukuphatha amaphutha, likhetha esikhundleni sokulicubungula ukuze livele lidlulisele iphutha phezulu.
  • Ulimi alusebenzisi indlela ye-OOP yakudala, njengoba kusimo salo esimsulwa abukho ubuqiniso ku-Go. Nokho, lokhu akuyona inkinga uma usebenzisa izixhumi ezibonakalayo. Ukungabikho kwe-OOP kunciphisa kakhulu umgoqo wokungena kwabaqalayo.

Ubulula ukuze kuzuze umphakathi

Kulula ukwenza inkimbinkimbi, kunzima ukuyenza ibe lula.

I-Go yenzelwe ukuthi ibe lula futhi iphumelele kulowo mgomo. Yayibhalelwe abahleli bezinhlelo abahlakaniphile abaqonda izinzuzo zokusebenza njengeqembu futhi abakhathele ukuhlukahluka okungapheli kwezilimi ezisezingeni lebhizinisi. Njengoba inesethi encane yezakhiwo ze-syntactic ku-arsenal yayo, cishe ayikho ngaphansi kwezinguquko ngokuhamba kwesikhathi, ngakho-ke onjiniyela banesikhathi esiningi esikhululelwe ukuthuthukiswa, hhayi sokufunda ngokungapheli ukuqanjwa kolimi.

Izinkampani nazo zithola izinzuzo eziningi: umgoqo wokungena ophansi uzivumela ukuthi zithole ngokushesha uchwepheshe, futhi ukungaguquki kolimi kuzivumela ukuthi zisebenzise ikhodi efanayo ngisho nangemva kweminyaka eyi-10.

isiphetho

Usayizi omkhulu wobuchopho awukaze wenze noma iyiphi indlovu iwine uMklomelo KaNobel.

Kulabo bahleli izinhlelo zabo siqu zabo zihamba phambili kunomoya weqembu, kanye namathiyori abathanda izinselelo zemfundo kanye "nokuzithuthukisa" okungapheli, lolu limi lubi ngempela, ngoba luwulimi lwezandla lwenhloso jikelele olungakuvumeli ukuthi uthole. injabulo yobuhle evela kumphumela womsebenzi wakho futhi uzibonise uchwepheshe phambi kozakwenu (inqobo nje uma sikala ubuhlakani ngalezi zindlela, hhayi nge-IQ). Njengazo zonke izinto ekuphileni, kuyindaba yezinto eziza kuqala ekuphileni komuntu. Njengazo zonke izinto ezintsha eziqanjiwe, ulimi seluvele luvela kude kusukela ekuphikeni kwendawo yonke kuya ekwamukelweni kwabantu abaningi. Ulimi luhlakaniphile ngobulula balo, futhi, njengoba wazi, yonke into ehlakaniphile ilula!

Source: www.habr.com

Engeza amazwana