Chifukwa Chake Go Ndi Yoyipa Kwa Opanga Mapulogalamu A Unsmart

Nkhaniyi idalembedwa ngati yankho ku zomwe zidasindikizidwa kale nkhani ya antipodean.

Chifukwa Chake Go Ndi Yoyipa Kwa Opanga Mapulogalamu A Unsmart

Pazaka ziwiri kuphatikiza ziwiri zapitazi ndakhala ndikugwiritsa ntchito Go kukhazikitsa seva yapadera ya RADIUS yokhala ndi njira yolipirira yopangidwa. M’kupita kwa nthaŵi, ndikuphunzira zovuta za chinenerocho. Mapulogalamuwa ndi ophweka kwambiri ndipo si cholinga cha nkhaniyi, koma chidziwitso chogwiritsira ntchito Go palokha chimayenera mawu ochepa poteteza. Go ikukhala chilankhulo chodziwika bwino kwambiri, chosavuta komanso chosavuta. Chilankhulocho chinapangidwa ndi Google, kumene chimagwiritsidwa ntchito mwakhama. Pansi pake, ndikuganiza moona mtima kuti mapangidwe a chilankhulo cha Go ndi oyipa kwa opanga mapulogalamu a UNintelligent.

Zopangidwira opanga mapulogalamu ofooka?

Ofooka amalankhula za mavuto. Kulankhula mwamphamvu za malingaliro ndi maloto ...

Kupita ndikosavuta kuphunzira, kosavuta kotero kuti mutha kuwerenga ma code osaphunzitsidwa nkomwe. Mbali imeneyi ya chinenero imagwiritsidwa ntchito m'makampani ambiri apadziko lonse pamene code ikuwerengedwa pamodzi ndi akatswiri omwe si apakati (oyang'anira, makasitomala, etc.). Izi ndizosavuta kugwiritsa ntchito njira monga Design Driven Development.
Ngakhale opanga mapulogalamu a novice amayamba kupanga code yabwino pakatha sabata imodzi kapena ziwiri. Buku lomwe ndidaphunzirako ndi "Go Programming" (lolemba Mark Summerfield). Bukuli ndi labwino kwambiri, limakhudza mitundu yambiri ya chilankhulo. Pambuyo pa zilankhulo zovuta kwambiri monga Java, PHP, kusowa kwamatsenga kumatsitsimula. Koma posakhalitsa, ambiri opanga mapulogalamu ochepa amakhala ndi lingaliro la kugwiritsa ntchito njira zakale m'munda watsopano. Kodi izi ndizofunikiradi?

Rob Pike (katswiri wamkulu wa chilankhulo) adapanga chilankhulo cha Go ngati chilankhulo cha mafakitale chomwe ndi chosavuta kumva komanso chothandiza kugwiritsa ntchito. Chilankhulochi chapangidwa kuti chikhale chogwira ntchito kwambiri m'magulu akuluakulu ndipo palibe kukayikira za izo. Opanga mapulogalamu ambiri amadandaula kuti pali zinthu zambiri zomwe akusowa. Chikhumbo chosavuta ichi chinali chisankho chodziwika ndi okonza chinenerocho, ndipo kuti timvetse bwino chifukwa chake chinali kofunika, tiyenera kumvetsetsa zolimbikitsa za opanga ndi zomwe akuyesera kukwaniritsa mu Go.

Nanga n’cifukwa ciani linapangidwa kukhala losavuta? Nawa mawu angapo ochokera kwa Rob Pike:

Mfundo yofunika apa ndikuti opanga mapulogalamu athu si ofufuza. Iwo ali, monga lamulo, aang'ono kwambiri, amabwera kwa ife ataphunzira, mwinamwake anaphunzira Java, kapena C / C ++, kapena Python. Sangamvetse chinenero chachikulu, koma nthawi yomweyo tikufuna kuti apange mapulogalamu abwino. Ndicho chifukwa chake chinenerocho chiyenera kukhala chosavuta kumva ndi kuphunzira.

Ayenera kukhala wodziwika bwino, wofanana ndi C. Okonza mapulogalamu omwe amagwira ntchito ku Google amayamba ntchito zawo msanga ndipo nthawi zambiri amadziwa zilankhulo zamachitidwe, makamaka banja la C. Kufunika kopanga zinthu mwachangu m'chinenero chatsopano cha mapulogalamu kumatanthauza kuti chinenerocho chisakhale champhamvu kwambiri.

Mawu anzeru, sichoncho?

Zojambula Zosavuta

Kuphweka ndi chikhalidwe chofunikira pa kukongola. Lev Tolstoy.

Kuzisunga mophweka ndi chimodzi mwa zolinga zofunika kwambiri pakupanga kulikonse. Monga mukudziwa, pulojekiti yabwino si ntchito yomwe palibe chowonjezera, koma chomwe palibe chochotsa. Anthu ambiri amakhulupirira kuti pofuna kuthetsa (kapena kufotokoza) mavuto ovuta, chida chovuta chikufunika. Komabe, sizili choncho. Tiyeni titenge chilankhulo cha PERL mwachitsanzo. Akatswiri a zinenero ankakhulupirira kuti wokonza mapulogalamu ayenera kukhala ndi njira zosachepera zitatu zothetsera vuto limodzi. Akatswiri a chinenero cha Go anatsatira njira ina, anaganiza kuti njira imodzi, koma yabwino kwenikweni, inali yokwanira kukwaniritsa cholingacho. Njirayi ili ndi maziko aakulu: njira yokhayo ndiyosavuta kuphunzira komanso yovuta kuiwala.

Anthu ambiri osamukira m’mayiko ena amadandaula kuti chinenerocho chilibe mawu osavuta kumva. Inde, izi ndi zoona, koma ichi ndi chimodzi mwa ubwino waukulu wa chinenero. Chilankhulocho chili ndi matsenga ochepa - kotero palibe chidziwitso chakuya chomwe chimafunika kuti muwerenge pulogalamuyi. Ponena za verbosity ya code, ili si vuto konse. Pulogalamu ya Golang yolembedwa bwino imawerengedwa molunjika, yokhala ndi dongosolo lochepa kapena lopanda. Kuonjezera apo, kuthamanga kwa kuwerenga pulogalamu ndi chiwerengero cha kukula kwakukulu kuposa kuthamanga kwa kulemba. Ngati mukuwona kuti ma code onse ali ndi mawonekedwe ofanana (opangidwa pogwiritsa ntchito lamulo lokhazikika la gofmt), ndiye kuti kuwerenga mizere yowonjezereka sikuli vuto konse.

Osafotokoza kwambiri

Zojambulajambula sizilekerera pamene ufulu wake uli woletsedwa. Kulondola si udindo wake.

Chifukwa chofuna kuphweka, Go imasowa zopanga zomwe m'zilankhulo zina zimawonedwa ngati zachilengedwe ndi anthu omwe adazolowera. Poyamba zingakhale zovuta, koma muwona kuti pulogalamuyo ndiyosavuta komanso yosavuta kuwerenga.

Mwachitsanzo, chida chothandizira chomwe chimawerenga stdin kapena fayilo kuchokera pamakangano a mzere wamalamulo chimawoneka chonchi:

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

Yankho la vuto lomwelo mu D, ngakhale likuwoneka lalifupi, silosavuta kuwerenga

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

Gahena kukopera

Munthu amanyamula gehena mkati mwake. Martin Luther.

Oyamba kudandaula nthawi zonse za Go ponena za kusowa kwa ma generic. Kuti athetse vutoli, ambiri a iwo amagwiritsa ntchito kukopera code mwachindunji. Mwachitsanzo, ntchito yofotokozera mwachidule mndandanda wazinthu zonse, akatswiri omwe angakhale akatswiri amakhulupirira kuti ntchitoyi siingathe kuchitidwa mwanjira ina iliyonse kusiyana ndi kusindikiza kosavuta pamtundu uliwonse wa deta.

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

Chilankhulocho chili ndi njira zokwanira zogwiritsira ntchito zomangamanga zoterezi. Mwachitsanzo, kupanga generic kungakhale kwabwino.

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

Ndipo, ngakhale code yathu idakhala yayitali kuposa momwe idalili kale, idakhala yodziwika bwino. Choncho, sizidzakhala zovuta kuti tigwiritse ntchito masamu onse.

Ambiri anganene kuti pulogalamu ya D ikuwoneka yayifupi kwambiri, ndipo idzakhala yolondola.

import std.stdio;
import std.algorithm;

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

Komabe, ndizofupikitsa, koma sizolondola, popeza kukhazikitsa kwa D kumanyalanyaza kwathunthu vuto la kukonza zolakwika.

Mu moyo weniweni, pamene zovuta za logic zikuwonjezeka, kusiyana kumachepa mofulumira. Kusiyanaku kumatseka mwachangu kwambiri mukafuna kuchita chinthu chomwe sichingachitike pogwiritsa ntchito chilankhulo chokhazikika.

Pankhani ya kusungika, kukulitsa, komanso kuwerengeka, m'malingaliro anga, chilankhulo cha Go chimapambana, ngakhale chimataya mawu.

Mapologalamu okhazikika nthawi zina amatipatsa mapindu osatsutsika. Izi zikuwonetsedwa bwino ndi phukusi lamtundu. Kotero, kuti tisankhe mndandanda uliwonse, timangofunika kukhazikitsa mawonekedwe a sort.Interface.

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

Ngati mutenga pulojekiti iliyonse yotseguka ndikuyendetsa grep "interface{}" -R lamulo, muwona momwe mawonekedwe osokoneza amagwiritsidwira ntchito. Anzake amtima wapamtima nthawi yomweyo anena kuti zonsezi ndi chifukwa cha kusowa kwa ma generic. Komabe, sizili choncho nthawi zonse. Tiyeni titengere chitsanzo cha Delphi. Ngakhale kukhalapo kwa ma generic omwewo, ili ndi mtundu wapadera wa VARIANT wamachitidwe omwe ali ndi mitundu ya data yosasinthika. Chinenero cha Go chimachita chimodzimodzi.

Kuyambira kanoni mpaka mpheta

Ndipo straitjacket iyenera kufanana ndi kukula kwa misala. Stanislav Lec.

Ambiri okonda kwambiri anganene kuti Go ili ndi njira ina yopangira ma generic - kuwonetsera. Ndipo iwo adzakhala olondola ... koma muzochitika zosawerengeka.

Rob Pike akutichenjeza kuti:

Ichi ndi chida champhamvu chomwe chiyenera kugwiritsidwa ntchito mosamala. Iyenera kupeŵedwa pokhapokha ngati pakufunika kutero.

Wikipedia imatiuza izi:

Kulingalira kumatanthauza njira yomwe pulogalamu imatha kuyang'anira ndikusintha momwe ikugwiritsidwira ntchito. Paradigm yowonetsera yomwe ili pansi pake imatchedwa reflective programming. Uwu ndi mtundu wa metaprogramming.

Komabe, monga mukudziwa, muyenera kulipira chilichonse. Pankhaniyi ndi:

  • zovuta kulemba mapulogalamu
  • liwiro la pulogalamu

Chifukwa chake, kusinkhasinkha kuyenera kugwiritsidwa ntchito mosamala, ngati chida champhamvu chachikulu. Kugwiritsa ntchito mosaganizira mozama kumabweretsa mapulogalamu osawerengeka, zolakwika nthawi zonse komanso liwiro lotsika. Chinthu chokha choti wopanga mapulogalamu azitha kuwonetsa ma code ake pamaso pa anzake ena, anzeru komanso odzichepetsa.

Katundu wachikhalidwe wochokera ku Xi? Ayi, kuchokera m'zinenero zingapo!

Pamodzi ndi chumacho, ngongole zimasiyidwanso kwa olowa nyumba.

Ngakhale kuti ambiri amakhulupirira kuti chinenerocho chimachokera ku C cholowa, izi sizili choncho. Chilankhulochi chimaphatikizapo mbali zambiri za zilankhulo zabwino kwambiri zamapulogalamu.

malembedwe

Choyamba, kalembedwe ka galamala ndi kalembedwe ka C. Komabe, chinenero cha DELPHI chinalinso ndi mphamvu yaikulu. Chifukwa chake, tikuwona kuti mabatani owonjezera, omwe amachepetsa kwambiri kuwerenga kwa pulogalamuyi, achotsedwa kwathunthu. Chilankhulochi chilinso ndi mawu akuti ":=" omwe ali muchilankhulo cha DELPHI. Lingaliro la phukusi limabwerekedwa ku zilankhulo monga ADA. Kulengeza kwa mabungwe osagwiritsidwa ntchito kumabwerekedwa ku chilankhulo cha PROLOG.

Semantics

Maphukusiwo adatengera semantics ya chilankhulo cha DELPHI. Phukusi lililonse limaphatikiza deta ndi code ndipo lili ndi mabungwe apadera komanso aboma. Izi zimakuthandizani kuti muchepetse mawonekedwe a phukusi kukhala osachepera.

Njira yoyendetsera ntchito mwa kutumiza adabwereka ku chilankhulo cha DELPHI.

Kuphatikiza

Palibe chifukwa chokhalira nthabwala: Go idapangidwa pomwe pulogalamu ya C ikupangidwa. Chimodzi mwa mphamvu za chinenerocho ndi kuphatikiza kwake kofulumira kwambiri. Lingalirolo linabwerekedwa ku chinenero cha DELPHI. Phukusi lililonse la Go limafanana ndi gawo la DELPI. Phukusili limapangidwanso pokhapokha ngati kuli kofunikira. Chifukwa chake, mukangosinthanso, simuyenera kupanga pulogalamu yonseyo, koma phatikizani maphukusi ndi mapaketi omwe asinthidwa omwe amadalira ma phukusi osinthidwawa (ndipo ngakhale pamenepo, pokhapokha ngati zolumikizira zasintha).

Zomanga zapamwamba

Chilankhulochi chili ndi zolemba zambiri zapamwamba zomwe sizikugwirizana konse ndi zilankhulo zotsika ngati C.

  • Zingwe
  • Matebulo a hashi
  • Magawo
  • Kulemba bakha kumabwerekedwa kuzilankhulo monga RUBY (zomwe, mwatsoka, ambiri samamvetsetsa kapena kugwiritsa ntchito mokwanira).

Kusamalira kukumbukira

Kuwongolera kukumbukira nthawi zambiri kumayenera kukhala ndi nkhani ina. Ngati m'zilankhulo monga C ++, kuwongolera kumasiyidwa kwa wopanga, ndiye kuti m'zilankhulo zamtsogolo monga DELPHI, njira yowerengera idagwiritsidwa ntchito. Ndi njira iyi, maumboni a cyclic sanaloledwe, popeza magulu a ana amasiye adapangidwa, ndiye kuti Go yakhazikitsanso masango otere (monga C #). Kuonjezera apo, zotayira zinyalala zimakhala zogwira mtima kwambiri kuposa zomwe zikudziwika panopa ndipo zimatha kugwiritsidwa ntchito pazinthu zambiri zenizeni. Chilankhulocho chimazindikira zochitika pamene mtengo wosungira zosinthika ukhoza kuperekedwa pa stack. Izi zimachepetsa katundu pa woyang'anira kukumbukira ndikuwonjezera liwiro la pulogalamuyo.

Concurrency ndi Concurrency

Kufanana ndi kupikisana kwa chilankhulo sikutamandidwa. Palibe chilankhulo chotsika chomwe chingapikisane ndi Go. Kunena zowona, ndikofunikira kudziwa kuti chitsanzocho sichinapangidwe ndi olemba chinenerocho, koma chinangobwerekedwa kuchokera ku chinenero chabwino cha ADA chakale. Chilankhulochi chimatha kukonza mamiliyoni a kulumikizana kofananira pogwiritsa ntchito ma CPU onse, kukhala ndi dongosolo lamavuto osavutikira kwambiri okhala ndi ma deadlocks ndi mipikisano yamitundu yomwe imakhala yofanana ndi ma code amitundu yambiri.

Zopindulitsa zina

Zikakhala zopindulitsa, aliyense adzakhala wopanda dyera.

Chinenero chimatipatsanso zabwino zambiri zosakayikitsa:

  • Fayilo imodzi yokha yomwe ingakwaniritsidwe mukamanga pulojekitiyi imathandizira kwambiri kutumiza ntchito.
  • Kulemba mosasunthika ndi kutanthauzira kwamtundu kumatha kuchepetsa kwambiri kuchuluka kwa zolakwika mu code yanu, ngakhale osalemba mayeso. Ndikudziwa ena opanga mapulogalamu omwe amachita popanda kulemba mayeso nkomwe ndipo mtundu wa code yawo suvutika kwambiri.
  • Kuphatikizika kosavuta kwambiri komanso kusuntha kwabwino kwa laibulale yokhazikika, yomwe imathandizira kwambiri chitukuko cha mapulogalamu amtundu uliwonse.
  • Mawu anthawi zonse a RE2 ndi otetezedwa ndi ulusi ndipo amakhala ndi nthawi yodziwikiratu.
  • Laibulale yamphamvu yomwe imalola kuti ma projekiti ambiri azichita popanda zipani zachitatu.
  • Chilankhulochi ndi champhamvu kwambiri moti chimatha kuganizira kwambiri vutolo m’malo mongoganizira mmene tingalithetsere, komabe n’chochepa kwambiri moti vutolo likhoza kuthetsedwa bwinobwino.
  • Go eco system ili kale ndi zida zopangidwa kuchokera m'bokosi nthawi zonse: mayeso, zolemba, kasamalidwe ka phukusi, ma linter amphamvu, kupanga ma code, chowunikira mipikisano, ndi zina zambiri.
  • Go version 1.11 inayambitsa kasamalidwe ka semantic wokhazikika, womangidwa pamwamba pa kuchititsa VCS kotchuka. Zida zonse zomwe zimapanga Go ecosystem zimagwiritsa ntchito mautumikiwa kutsitsa, kumanga, ndi kukhazikitsa ma code kuchokera kwa iwo nthawi imodzi. Ndipo ndizo zabwino. Ndikufika kwa mtundu 1.11, vuto lakusintha phukusi linathetsedwanso.
  • Chifukwa lingaliro lalikulu la chilankhulo ndikuchepetsa matsenga, chilankhulochi chimalimbikitsa opanga kuti achite zolakwika momveka bwino. Ndipo izi ndi zolondola, chifukwa apo ayi, zidzangoyiwala za kukonza zolakwika palimodzi. Chinanso ndikuti opanga ambiri amanyalanyaza mwadala kukonza zolakwika, ndikusankha m'malo mozikonza kuti angotumiza cholakwikacho m'mwamba.
  • Chilankhulochi sichigwiritsa ntchito njira yachikale ya OOP, chifukwa mu mawonekedwe ake oyera mulibe zenizeni mu Go. Komabe, izi siziri vuto mukamagwiritsa ntchito zolumikizira. Kusowa kwa OOP kumachepetsa kwambiri chotchinga cholowera kwa oyamba kumene.

Kuphweka kuti anthu apindule

Ndiosavuta kuphatikizira, ndizovuta kuti muchepetse.

Go idapangidwa kuti ikhale yosavuta ndipo imakwaniritsa cholinga chimenecho. Linalembedwera olemba mapulogalamu anzeru omwe amamvetsetsa ubwino wa ntchito yamagulu ndipo atopa ndi kusiyana kosatha kwa zilankhulo za Enterprise-level. Pokhala ndi zida zazing'ono zamapangidwe mu zida zake, sizingasinthe pakapita nthawi, kotero opanga amakhala ndi nthawi yochuluka yomasulidwa kuti apite patsogolo, osati kuphunzira kosatha chinenero.

Makampani amakhalanso ndi ubwino wambiri: chotchinga chochepa cholowera chimawathandiza kuti apeze katswiri mwamsanga, ndipo kusasinthika kwa chinenero kumawathandiza kugwiritsa ntchito code yomweyi ngakhale patapita zaka 10.

Pomaliza

Kukula kwakukulu kwaubongo sikunapangitse njovu iliyonse kukhala wopambana Mphotho ya Nobel.

Kwa omwe amapanga mapulogalamu omwe kudzikonda kwawo kumakhala patsogolo kuposa mzimu wamagulu, komanso akatswiri amalingaliro omwe amakonda zovuta zamaphunziro komanso "kudzitukumula" kosatha, chilankhulocho ndi choyipa kwambiri, chifukwa ndi chilankhulo chaukadaulo chomwe sichikulolani kuti mupeze. chisangalalo chokongola kuchokera ku zotsatira za ntchito yanu ndikudziwonetsa ngati akatswiri pamaso pa anzanu (ngati titha kuyeza luntha ndi izi, osati ndi IQ). Mofanana ndi chilichonse m’moyo, ndi nkhani ya zinthu zimene munthu amaika patsogolo. Mofanana ndi zopanga zonse zopindulitsa, chinenerocho chachokera kale kuchokera ku kukana kwapadziko lonse mpaka kuvomereza kwakukulu. Chilankhulochi ndi chanzeru mu kuphweka kwake, ndipo, monga mukudziwa, zonse zanzeru ndizosavuta!

Source: www.habr.com

Kuwonjezera ndemanga