Naha Go téh Bad pikeun Unsmart Programmer

Artikel ieu ditulis salaku respon kana diterbitkeun saméméhna artikel antipodean.

Naha Go téh Bad pikeun Unsmart Programmer

Sapanjang dua taun katukang kuring parantos nganggo Go pikeun nerapkeun server RADIUS khusus sareng sistem tagihan anu dikembangkeun. Sapanjang jalan, abdi nuju diajar intricacies tina basa sorangan. Program sorangan saderhana pisan sareng sanés tujuan tulisan ieu, tapi pangalaman ngagunakeun Go sorangan pantes sababaraha kecap pikeun ngabelaana. Go janten basa anu beuki mainstream pikeun kode anu serius sareng skalabel. Basa ieu dijieun ku Google, dimana eta aktip dipake. Bottom line, kuring jujur ​​nyangka yén desain basa Go goréng pikeun programer UNintelligent.

Dirancang pikeun programer lemah?

Lemah nyarita masalah. Obrolan kuat ngeunaan ide sareng impian ...

Go gampang pisan diajar, janten gampang anjeun tiasa maca kodeu sareng ampir teu aya latihan. Fitur basa ieu dianggo di seueur perusahaan global nalika kodeu dibaca sareng spesialis non-inti (manajer, konsumén, jsb.). Ieu cocog pisan pikeun metodologi sapertos Pangembangan Didorong Desain.
Malah programer novice mimiti ngahasilkeun kode cukup santun sanggeus hiji atawa dua minggu. Buku anu kuring diajar nyaéta "Go Programming" (ku Mark Summerfield). Bukuna sae pisan, keuna kana seueur nuansa basa. Saatos basa anu teu perlu rumit sapertos Java, PHP, kurangna sihir nyegerkeun. Tapi sooner atanapi engké, loba programer kawates boga gagasan ngagunakeun métode heubeul dina widang anyar. Ieu bener diperlukeun?

Rob Pike (ideologi utama basa) nyiptakeun basa Go salaku basa industri anu gampang kaharti sareng efektif dianggo. Basa ieu dirarancang pikeun produktivitas maksimal dina tim ageung sareng teu aya ragu ngeunaan éta. Seueur programer novice ngawadul yén aya seueur fitur anu aranjeunna leungit. Kahayang pikeun kesederhanaan ieu mangrupikeun kaputusan sadar ku désainer basa, sareng pikeun ngartos sapinuhna naha éta diperyogikeun, urang kedah ngartos motivasi para pamekar sareng naon anu aranjeunna cobian ngahontal di Go.

Ku kituna naha ieu dijieun jadi basajan? Ieu sababaraha kutipan ti Rob Pike:

Titik konci di dieu nyaéta yén programer urang sanés panalungtik. Aranjeunna, sakumaha aturan, rada ngora, datang ka kami sanggeus diajar, sugan maranéhna diajar Java, atawa C / C ++, atawa Python. Aranjeunna henteu tiasa ngartos basa anu saé, tapi dina waktos anu sami kami hoyong aranjeunna nyiptakeun parangkat lunak anu saé. Éta sababna basana kedah gampang kaharti sareng diajar.

Anjeunna kedah wawuh, kasarna nyarios sami sareng C. Programer anu damel di Google ngamimitian karirna awal sareng biasana akrab sareng basa prosedural, khususna kulawarga C. Sarat pikeun produktivitas gancang dina basa pamrograman énggal hartosna yén basa éta henteu kedah radikal teuing.

Kecap wijaksana, henteu?

Artefak Kesederhanaan

Kesederhanaan mangrupikeun kaayaan anu dipikabutuh pikeun kageulisan. Lev Tolstoy.

Ngajaga saderhana mangrupikeun salah sahiji tujuan anu paling penting dina desain naon waé. Sakumaha anjeun terang, proyék anu sampurna sanés mangrupikeun proyék dimana teu aya anu kedah ditambihkeun, tapi hiji anu teu aya anu ngahapus. Loba jalma yakin yén pikeun ngajawab (atawa malah express) masalah kompléks, alat kompléks diperlukeun. Sanajan kitu, éta henteu. Hayu urang nyandak basa PERL contona. Idéolog basa percaya yén programmer kudu boga sahanteuna tilu cara pikeun ngajawab hiji masalah. Para ideolog basa Go nyandak jalan anu béda; aranjeunna mutuskeun yén hiji jalan, tapi anu saé pisan, cekap pikeun ngahontal tujuan. Pendekatan ieu ngagaduhan pondasi anu serius: hiji-hijina jalan anu langkung gampil diajar sareng langkung sesah hilap.

Seueur migran ngawadul yén basa éta henteu ngandung abstraksi anu elegan. Leres, ieu leres, tapi ieu mangrupikeun salah sahiji kaunggulan utama basa. Basa ngandung minimum magic - jadi euweuh pangaweruh jero diperlukeun pikeun maca program. Sedengkeun pikeun verbosity kode, ieu teu masalah pisan. Program Golang anu ditulisna saé dibaca sacara vertikal, kalayan sakedik atanapi henteu aya strukturna. Sajaba ti éta, laju maca hiji program sahenteuna urutan gedena leuwih gede ti laju nulis eta. Lamun nganggap yén sakabéh kode ngabogaan pormat seragam (dipigawe maké diwangun-di paréntah gofmt), lajeng maca sababaraha garis tambahan teu masalah pisan.

Teu pisan ekspresif

Seni henteu toléran nalika kabébasan diwatesan. Akurasi sanés tanggung jawabna.

Kusabab kahayang pikeun kesederhanaan, Go lacks constructs yén dina basa séjén dianggap hal lumrah ku jalma biasa aranjeunna. Mimitina sigana rada teu pikaresepeun, tapi teras anjeun perhatikeun yén program éta langkung gampang dibaca sareng langkung jelas.

Salaku conto, utilitas konsol anu maca stdin atanapi file tina argumen baris paréntah bakal katingali sapertos kieu:

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

Solusi pikeun masalah anu sami dina D, sanaos katingalina langkung pondok, henteu langkung gampang dibaca

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

Naraka niron

Manusa mawa naraka dina dirina. Martin Luther.

Beginners terus ngawadul ngeunaan Go dina watesan kurangna generics. Pikeun ngabéréskeun masalah ieu, kalolobaanana nganggo salinan kode langsung. Contona, hiji fungsi pikeun nyimpulkeun daptar integer, sapertos bakal professional yakin yén fungsionalitas teu bisa dilaksanakeun dina sagala cara lian ti ku copy-paste basajan pikeun tiap tipe data.

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

Basa boga sarana anu cukup pikeun ngalaksanakeun konstruksi sapertos kitu. Contona, programming generik bakal rupa.

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

Sareng, sanaos kode kami tétéla langkung lami tibatan kasus sateuacana, éta parantos digeneralisasi. Ku alatan éta, éta moal hésé pikeun urang pikeun nerapkeun sagala operasi arithmetic.

Seueur anu bakal nyarios yén program dina D sigana langkung pondok, sareng aranjeunna leres.

import std.stdio;
import std.algorithm;

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

Sanajan kitu, éta ngan pondok, tapi teu leuwih bener, saprak palaksanaan D lengkep malire masalah penanganan kasalahan.

Dina kahirupan nyata, salaku pajeulitna logika naek, gap narrows gancang. Gap nutup langkung gancang nalika anjeun kedah ngalakukeun tindakan anu henteu tiasa dilakukeun nganggo operator basa standar.

Dina hal maintainability, extensibility, sarta readability, dina pamanggih kuring, Go basa meunang, sanajan leungit dina verbosity.

Pemrograman umum dina sababaraha kasus masihan kami kauntungan anu teu tiasa ditolak. Ieu jelas digambarkeun ku pakét sortir. Janten, pikeun nyortir daptar naon waé, urang ngan ukur kedah nerapkeun antarmuka 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)
}

Upami anjeun nyandak proyék open source sareng ngajalankeun paréntah grep "interface{}" -R, anjeun bakal ningali sabaraha sering antarmuka anu matak ngabingungkeun. Comrades nutup-dipikiran bakal geuwat nyebutkeun yén sakabéh ieu alatan kurangna generics. Sanajan kitu, ieu teu salawasna kasus. Hayu urang nyandak DELPHI sabagé conto. Sanaos ayana generik anu sami, éta ngandung jinis VARIANT khusus pikeun operasi kalayan jinis data anu sawenang. Basa Go ngalakukeun hal anu sami.

Tina mariem nepi ka manuk pipit

Jeung straitjacket kudu pas ukuran madness nu. Stanislav Lec.

Seueur fans ekstrim tiasa ngaku yén Go gaduh mékanisme sanés pikeun nyiptakeun generik - refleksi. Jeung maranéhna bakal bener ... tapi ngan dina kasus langka.

Rob Pike ngingetkeun kami:

Ieu mangrupikeun alat anu kuat anu kedah dianggo kalayan ati-ati. Ieu kudu dihindari iwal mun mastikeun diperlukeun.

Wikipedia ngabejaan urang kieu:

Refleksi nujul kana prosés nalika program tiasa ngawas sareng ngarobih struktur sareng paripolah sorangan salami palaksanaan. Paradigma pemrograman anu didasarkeun kana réfléksi disebut program réfléktif. Ieu mangrupikeun jinis metaprogramming.

Nanging, sakumaha anu anjeun terang, anjeun kedah mayar sadayana. Dina hal ieu nyaéta:

  • kasusah dina nulis program
  • speed palaksanaan program

Ku alatan éta, réfléksi kudu dipaké kalawan caution, kawas pakarang badag-haliber. Pamakéan réfléksi anu teu dipikiran nyababkeun program anu teu kabaca, kasalahan konstan sareng kecepatan rendah. Ngan hal pikeun programmer snob bisa pamer kode na di hareup batur, kolega leuwih pragmatis tur modest.

Bagasi budaya ti Xi? Henteu, tina sababaraha basa!

Marengan rejeki, hutang ogé ditinggalkeun ka ahli waris.

Najan kanyataan yén loba yakin yén basa sagemblengna dumasar kana warisan C, ieu teu masalahna. Basa ieu kalebet seueur aspék basa pamrograman anu pangsaéna.

sintaksis

Anu mimiti, sintaksis struktur gramatikal dumasar kana sintaksis basa C. Nanging, basa DELPHI ogé ngagaduhan pangaruh anu signifikan. Ku kituna, urang nempo yén kurung kaleuleuwihan, nu greatly ngurangan readability program, geus sagemblengna dipiceun. Basa éta ogé ngandung operator ": =" anu aya dina basa DELPHI. Konsep bungkusan dipinjam tina basa sapertos ADA. Déklarasi éntitas anu henteu dianggo diinjeum tina basa PROLOG.

Semantik

Bungkusan dumasar kana semantik basa DELPHI. Unggal pakét encapsulates data jeung kode sarta ngandung éntitas swasta jeung publik. Ieu ngamungkinkeun anjeun pikeun ngirangan antarmuka pakét ka minimum.

Operasi palaksanaan ku metode delegasi diinjeum tina basa DELPHI.

Nyusun

Éta henteu tanpa alesan yén aya lulucon: Go dikembangkeun nalika program C disusun. Salah sahiji kaunggulan basa nyaéta kompilasi ultra-gancang na. Gagasan ieu diinjeum tina basa DELPHI. Unggal pakét Go pakait sareng modul DELPHI. Bungkusan ieu dikompilasi deui ngan upami diperyogikeun. Ku alatan éta, sanggeus édit salajengna, anjeun teu kudu compile sakabéh program, tapi recompile ukur bungkusan robah na bungkusan nu gumantung kana bungkusan robah ieu (malah lajeng, ngan lamun interfaces pakét geus robah).

Konstruksi tingkat luhur

Basa éta ngandung seueur konstruksi tingkat luhur anu henteu aya hubunganana sareng basa tingkat rendah sapertos C.

  • Senar
  • méja Hash
  • keureutan
  • Ngetik bebek diinjeum tina basa sapertos RUBY (anu, hanjakalna, seueur anu henteu ngartos atanapi nganggo maksimal).

manajemén memori

manajemén memori umumna pantes hiji artikel misah. Lamun dina basa kawas C ++, kontrol sagemblengna ditinggalkeun ka pamekar, lajeng dina basa engké kawas DELPHI, model cacah rujukan dipaké. Kalayan pendekatan ieu, rujukan siklik teu diwenangkeun, saprak klaster yatim kabentuk, lajeng Go geus diwangun-di deteksi klaster misalna (kawas C #). Salaku tambahan, kolektor sampah langkung éfisién tibatan palaksanaan anu paling dipikanyaho ayeuna sareng parantos tiasa dianggo pikeun seueur tugas sacara real-time. Basa sorangan ngakuan kaayaan nalika nilai pikeun nyimpen variabel bisa disadiakeun dina tumpukan. Ieu ngurangan beban dina manajer memori sarta ngaronjatkeun kagancangan program.

Concurrency jeung Concurrency

Paralelisme jeung daya saing basa téh teu dipuji. Taya basa tingkat low malah bisa jarak jauh bersaing jeung Go. Janten adil, éta sia noting yén modél teu invented by pangarang basa, tapi ngan injeuman tina basa ADA heubeul alus. Basa éta sanggup ngolah jutaan sambungan paralel ngagunakeun sakabéh CPUs, bari ngabogaan urutan gedena masalah kirang pajeulit jeung deadlocks jeung kaayaan lomba anu has pikeun kode multi-threaded.

kauntungan tambahan

Lamun nguntungkeun, dulur bakal jadi selfless.

Basa ogé nyayogikeun sababaraha kauntungan anu teu diragukeun:

  • Hiji file laksana tunggal sanggeus ngawangun proyék greatly simplifies panyebaran aplikasi.
  • Ketik statik sareng inferensi ngetik tiasa sacara signifikan ngirangan jumlah kasalahan dina kode anjeun, sanaos tanpa tés tulisan. Kuring nyaho sababaraha programer anu ngalakukeun tanpa nulis tés pisan jeung kualitas kode maranéhna teu sangsara nyata.
  • Saderhana pisan cross-kompilasi sareng portabilitas perpustakaan standar anu saé, anu nyederhanakeun pisan kana pamekaran aplikasi cross-platform.
  • Ungkapan biasa RE2 aman-aman sareng gaduh waktos palaksanaan anu tiasa diprediksi.
  • Perpustakaan standar anu kuat anu ngamungkinkeun kalolobaan proyék tiasa dilakukeun tanpa kerangka pihak katilu.
  • Basana cukup kuat pikeun fokus kana masalah tinimbang kumaha cara ngarengsekeunana, tapi tingkat handapna cukup pikeun masalahna tiasa direngsekeun sacara éfisién.
  • Sistem Go Eco parantos ngandung alat-alat anu dikembangkeun pikeun sadaya kaayaan: tés, dokuméntasi, manajemén pakét, linter anu kuat, generasi kode, detektor kaayaan balapan, jsb.
  • Versi Go 1.11 ngenalkeun manajemén kagumantungan semantik anu diwangun, diwangun dina luhureun hosting VCS anu populér. Sadaya alat anu ngawangun ékosistem Go nganggo jasa ieu pikeun ngaunduh, ngawangun, sareng masang kode ti aranjeunna dina hiji waktos. Sareng éta saé. Kalayan datangna versi 1.11, masalah sareng versi pakét ogé parantos direngsekeun.
  • Kusabab ide inti basa nyaéta pikeun ngirangan sihir, basa éta ngadorong pamekar pikeun ngalakukeun penanganan kasalahan sacara eksplisit. Sareng ieu leres, sabab upami henteu, éta ngan saukur bakal hilap ngeunaan penanganan kasalahan sadayana. Hal anu sanés nyaéta kalolobaan pamekar ngahaja teu malire penanganan kasalahan, langkung milih tibatan ngolahna ngan saukur neraskeun kasalahan ka luhur.
  • Basa éta henteu nerapkeun metodologi OOP klasik, sabab dina bentuk murnina henteu aya virtualitas di Go. Sanajan kitu, ieu teu jadi masalah lamun ngagunakeun interfaces. Henteuna OOP sacara signifikan ngirangan halangan pikeun asup pikeun pamula.

Kesederhanaan pikeun kapentingan masarakat

Gampang ngahesekeun, hese disederhanakeun.

Go dirancang pikeun saderhana sareng suksés dina tujuan éta. Ditulis pikeun programer pinter anu ngartos mangpaat gawé babarengan sareng bosen ku variabilitas basa tingkat perusahaan anu henteu terbatas. Ngabogaan sakumpulan struktur sintaksis anu kawilang leutik dina arsenalna, sacara praktis henteu tunduk kana parobihan kana waktosna, ku kituna pamekar gaduh seueur waktos dibébaskeun pikeun pangwangunan, sareng sanés pikeun ngulik inovasi basa anu endlessly.

Pausahaan ogé nampi sababaraha kaunggulan: panghalang éntri low ngamungkinkeun aranjeunna pikeun gancang manggihan spesialis, sarta immutability basa ngamungkinkeun aranjeunna ngagunakeun kodeu sarua sanajan sanggeus 10 taun.

kacindekan

Ukuran otak anu ageung henteu kantos ngajantenkeun gajah naon waé anu meunang Hadiah Nobel.

Pikeun programer anu ego pribadina diutamakeun tina sumanget tim, kitu ogé ahli téori anu resep tantangan akademik sareng "perbaikan diri" anu teu aya watesna, basana leres-leres goréng, sabab éta mangrupikeun basa artisanal tujuan umum anu henteu ngamungkinkeun anjeun pikeun meunangkeun. pelesir estetika tina hasil karya anjeun sarta némbongkeun diri profésional di hareup kolega (disadiakeun yén urang ngukur kecerdasan ku kriteria ieu, teu ku IQ). Sapertos sadayana dina kahirupan, éta mangrupikeun masalah prioritas pribadi. Kawas sakabeh inovasi worthwhile, basa geus datangna jauh ti panolakan universal pikeun ditampa massa. Basa éta akalna dina kesederhanaanna, sareng, sakumaha anjeun terang, sadayana akalna saderhana!

sumber: www.habr.com

Tambahkeun komentar