Nega Go ni o'rganishingiz kerak?

Rasm: http://kirael-art.deviantart.com/art/Go-lang-Mascot-458285682
"Borish kelajakning server tili bo'ladi." (Tobias Lütke, Shopify.)

So'nggi ikki yil ichida yangi dasturlash tili paydo bo'ldi: Go yoki GoLang. Hech narsa ishlab chiqaruvchini yangi dasturlash tilidan aqldan ozdirmaydi, to'g'rimi? Shunday qilib, men 4-5 oy oldin Go-ni o'rganishni boshladim va bu erda sizga nima uchun bu yangi tilni ham o'rganishingiz kerakligi haqida aytmoqchiman.

Men ushbu maqolada qanday qilib "Salom Dunyo!" Deb yozishingiz mumkinligini sizga o'rgatmoqchi emasman. Buning uchun Internetda ko'plab boshqa maqolalar mavjud. Men kompyuterning dasturiy ta'minotining hozirgi bosqichini tushuntirmoqdaman va nega bizga Go kabi yangi til kerak? Agar biron-bir muammo bo'lmasa, bizga echim kerak emas, to'g'rimi?

Uskuna cheklovlari:

Mur qonuni muvaffaqiyatsiz.

Pentium 4 protsessori soatiga 3,0 gigagertsli tezlikni 2004 yilda Intel tomonidan taqdim etilgan. Bugungi kunda mening Mackbook Pro 2016-da soatiga 2,9 GGts tezligi bor. Shunday qilib, deyarli o'n yil ichida xom ashyoni qayta ishlash quvvatida unchalik ko'p foyda bo'lmaydi. Quyidagi jadvalda ishlov berish quvvatini vaqt bilan oshirishni taqqoslashni ko'rishingiz mumkin.

Yuqoridagi jadvaldan ko'rinib turibdiki, bitta ipli ishlash va protsessor chastotasi deyarli o'n yil davomida barqaror bo'lib qoldi. Agar siz ko'proq tranzistor qo'shish muammoning echimi deb o'ylasangiz, unda siz adashyapsiz. Buning sababi shundaki, kichikroq miqyosda ba'zi kvant xususiyatlari paydo bo'la boshlaydi (tunnel singari) va ko'proq tranzistorlarni qo'yish qimmatga tushadi (nima uchun?) Va har bir dollarga qo'shishingiz mumkin bo'lgan tranzistorlar soni pasayadi.

Shunday qilib, yuqoridagi muammoni hal qilish uchun,

  • Ishlab chiqaruvchilar protsessorga tobora ko'proq yadro qo'shishni boshladilar. Hozir bizda to'rt yadroli va okta yadroli protsessorlar mavjud.
  • Shuningdek, biz giper-ipni ham joriy qildik.
  • Ishlash samaradorligini oshirish uchun protsessorga ko'proq kesh qo'shildi.

Ammo yuqoridagi echimlarning ham o'z cheklovlari bor. Ishlov berishni oshirish uchun protsessorga tobora ko'proq keshni qo'sha olmaymiz, chunki kesh jismoniy cheklovlarga ega: kesh qanchalik katta bo'lsa, unchalik sekin bo'lmaydi. Protsessorga ko'proq yadro qo'shish uning narxiga ham olib keladi. Bundan tashqari, bu cheksiz miqyosda kengaytira olmaydi. Ushbu ko'p yadroli protsessorlar bir vaqtning o'zida bir nechta iplarni ishlatishi mumkin va bu rasmga mos keladi. Keyinroq muhokama qilamiz.

Shunday qilib, agar biz apparat yaxshilanishlariga ishona olmasak, ishlashning samaradorligini oshirish uchun yanada samarali dasturiy ta'minot bor. Afsuski, zamonaviy dasturlash tili unchalik samarali emas.

"Zamonaviy protsessorlar bu nitro yoqilg'isiga o'xshash kulgili mashinalardir, ular chorak milni bosib o'tadilar. Afsuski, zamonaviy dasturlash tillari Monte-Karloga o'xshaydi, ular burilish va burilishlarga to'la ”(Devid Ungar)

Go goroutines bor !!

Yuqorida muhokama qilganimizdek, apparat ishlab chiqaruvchilari ishlashni oshirish uchun protsessorlarga tobora ko'proq yadro qo'shmoqdalar. Barcha ma'lumotlar markazlari ushbu protsessorlarda ishlaydi va kelgusi yillarda yadro sonining ko'payishini kutishimiz kerak. Bundan tashqari, bugungi kunda ma'lumotlar bazalariga ulanish, xabarlarni navbatga qo'yish va keshlarni saqlash uchun bir nechta mikro xizmatlardan foydalanadigan ilovalar. Shunday qilib, biz ishlab chiqadigan dasturiy ta'minot va dasturlash tillari bir vaqtning o'zida osonlikcha qo'llab-quvvatlanishi kerak va yadrolarning ko'payishi bilan ular kengaytirilishi kerak.

Ammo, zamonaviy dasturlash tillarining aksariyati (Java, Python va boshqalar) 90-yillarning yagona tishli muhitidan olingan. Ushbu dasturlash tillarining aksariyati ko'p tarmoqli dasturlarni qo'llab-quvvatlaydi. Ammo haqiqiy muammo ketma-ket ijro etish, ipni qulflash, poyga shartlari va to'siqlar. Ushbu narsalar ushbu tillarda ko'p tarmoqli dastur yaratishni qiyinlashtiradi.

Misol uchun, Java-da yangi ipni yaratish xotiradan samarali emas. Har bir ip taxminan 1MB hajmdagi xotira to'plamini iste'mol qiladi va oxir-oqibat minglab iplarni yigirishni boshlasangiz, ular uyaga juda katta bosim o'tkazadi va xotira yo'qligi sababli yopilishiga olib keladi. Bundan tashqari, agar siz ikki yoki undan ortiq iplar o'rtasida aloqa o'rnatmoqchi bo'lsangiz, bu juda qiyin.

Boshqa tomondan, Go ko'p yadroli protsessorlar mavjud bo'lganda, 2009 yilda chiqarildi. Shuning uchun Go yodda tutish bilan qurilgan. Go iplar o'rniga goroutinesga ega. Ular uyumdan deyarli 2KB xotirani iste'mol qiladilar. Shunday qilib, istalgan vaqtda millionlab gorutinlarni aylantirishingiz mumkin.

Goroutines qanday ishlaydi? Referans: http://golangtutorials.blogspot.in/2011/06/goroutines.html

Boshqa imtiyozlar:

  • Goroutinlarda o'sadigan segmentli staklar mavjud. Bu shuni anglatadiki, ular faqat kerak bo'lganda ko'proq xotiradan foydalanadilar.
  • Goroutines-da, iplarga qaraganda tezroq boshlash vaqti bor.
  • Goroutines o'zlari (kanallar) o'rtasida xavfsiz aloqa qilish uchun o'rnatilgan ibtidoiy vositalar bilan birga keladi.
  • Goroutines ma'lumotlar tuzilmalarini almashishda mutekslarni blokirovka qilishdan qochishga imkon beradi.
  • Shuningdek, goroutinlar va OS iplarida 1: 1 xaritalash bo'lmaydi. Bitta gorutin bir nechta iplarda ishlaydi. Goroutinlar oz sonli OS iplariga ko'paytiriladi.
Ko'rishingiz mumkinki, Rob Pikening ajoyib nutqining bir xilligi bu haqida chuqurroq tushunish uchun parallelizm emas.

Yuqoridagi fikrlarning barchasi, Java, C va C ++ singari parallelliklarni boshqarish uchun juda kuchli va Erang singari go'zal va ravshan kodni bajarishda.

Go ikkala dunyoning ham yaxshiligini oladi. Bir vaqtning o'zida yozish oson va bir vaqtning o'zida boshqarish uchun samarali

Go to'g'ridan-to'g'ri asosiy qurilmalarda ishlaydi.

Java, Python kabi boshqa zamonaviy yuqori darajadagi tillarga nisbatan C, C ++ dan foydalanishning eng muhim afzalliklaridan biri bu ularning ishlashidir. C / C ++ kompilyatsiya qilingan va talqin qilinmaganligi sababli.

Protsessorlar ikkilikni tushunishadi. Odatda, siz o'zingizning loyihangizni tuzayotganda Java yoki boshqa JVM asosidagi tillardan foydalangan holda dastur yaratsangiz, u odam o'qishi mumkin bo'lgan kodni JVM yoki boshqa OT asosida ishlaydigan boshqa virtual mashinalar tushunishi mumkin bo'lgan bayt-kodga jamlaydi. Bajarish paytida VM ushbu baytekodlarni sharhlaydi va ularni protsessorlar tushunishi mumkin bo'lgan ikkiliklarga aylantiradi.

VM asosidagi tillar uchun bajariladigan amallar

Boshqa tomondan, C / C ++ VM-larda ishlamaydi va bu ijro siklidan bir qadamni olib tashlaydi va ish faoliyatini oshiradi. U to'g'ridan-to'g'ri odamni o'qiydigan kodni ikkiliklarga tuzadi.

Ammo bu tillarda o'zgaruvchini bo'shatish va ajratish katta azobdir. Aksariyat dasturlash tillari ob'ektlarni taqsimlash va axlat yig'ish yoki ma'lumotnomalarni hisoblash algoritmlaridan foydalanib olib tashlash bilan shug'ullanadi.

Go ikkala dunyoning eng yaxshisini olib keladi. C / C ++ kabi pastki darajadagi tillar singari, Go - kompilyatsiya qilingan til. Demak, ishlash darajasi quyi darajadagi tillarga yaqinroq. Shuningdek, ob'ektni ajratish va olib tashlash uchun axlat yig'ish usulidan foydalaniladi. Shunday qilib, endi malloc () va bepul () so'zlari yo'q !!! Salqin !!!

Go-da yozilgan kodni saqlash juda oson.

Sizga bitta narsani aytay. Go, boshqa tillar singari aqldan dasturlash sintaksisiga ega emas. U juda toza va toza sintaksisga ega.

Google-dagi Go dizaynerlari tilni yaratishda buni e'tiborga olishgan. Google-da juda katta kod bazasi mavjud va minglab ishlab chiquvchilar xuddi shu kod bazasida ishlayotganligi sababli, kod boshqa dasturchilar uchun tushunish uchun sodda bo'lishi kerak va kodning bitta segmenti kodning boshqa segmentiga minimal ta'sir ko'rsatishi kerak. Bu kodni osongina saqlashga va o'zgartirishni osonlashtiradi.

Qasddan borish zamonaviy OOP tillarining ko'plab xususiyatlarini o'chirib tashlaydi.

  • Sinflar yo'q. Hamma narsa faqat paketlarga bo'linadi. Go faqat darslar o'rniga bor.
  • Merosni qo'llab-quvvatlamaydi. Bu kodni o'zgartirishni osonlashtiradi. Java / Python kabi boshqa tillarda, agar ABC sinfi XYZ sinfini meros qilib olsa va XYZ sinfiga ba'zi o'zgarishlar kiritsangiz, bu XYZ ni meros qilib olgan boshqa sinflarda ba'zi nojo'ya ta'sirlarni keltirib chiqarishi mumkin. Merosni olib tashlab, Go kodni tushunishni ham osonlashtiradi (chunki kodni ko'rib chiqayotganda qarashning eng zo'r klassi yo'q).
  • Quruvchilar yo'q.
  • Izohlar yo‘q.
  • Generallar yo'q.
  • Istisnolar yo'q.

Yuqoridagi o'zgarishlar Go tilini boshqa tillardan juda farq qiladi va Go tilidagi dasturlashni boshqalardan farq qiladi. Sizga yuqoridagi ba'zi fikrlar yoqmasligi mumkin. Ammo, yuqoridagi xususiyatlarsiz dasturingizni kodlay olmasligingiz kabi emas. Faqat 2-3 satr yozish kerak. Ammo ijobiy tomoni shundaki, u sizning kodingizni tozalaydi va kodingizga yanada aniqlik qo'shadi.

Kodni o'qish va boshqalar, samaradorlik.

Yuqoridagi grafikada Go kodi C / C ++ kabi samaraliroq bo'lib, kod sintaksisi Ruby, Python va boshqa tillar singari sodda saqlanadi. Bu ham odamlar, ham protsessorlar uchun g'alaba qozonadigan holat !!!

Swift kabi boshqa yangi tillardan farqli o'laroq, Go sintaksisi juda barqaror. Ushbu ommaviy nashriyot 1.0-dan beri 2012-yilda boshlanganidan beri bir xil bo'lib qoldi.

Go Google tomonidan qo'llab-quvvatlanadi.

  • Bilaman, bu to'g'ridan-to'g'ri texnik ustunlik emas. Ammo, Go Google tomonidan ishlab chiqilgan va qo'llab-quvvatlangan. Google dunyodagi eng katta bulutli infratuzilmalardan biriga ega va u juda katta miqyosda. Go Google tomonidan ularning miqyosi va samaradorligini qo'llab-quvvatlash muammolarini hal qilish uchun ishlab chiqilgan. O'zingizning serverlaringizni yaratishda siz duch keladigan muammolar.
  • Bundan tashqari, Adobe, BBC, IBM, Intel va hatto Medium kabi ba'zi yirik kompaniyalar ham foydalanadilar (Manba: https://github.com/golang/go/wiki/GoUsers)

Xulosa:

  • Go boshqa ob'ektga yo'naltirilgan tillardan juda farq qilsa ham, baribir o'sha hayvondir. Go sizga C / C ++ kabi yuqori unumdorlikni, Java kabi juda samarali va bir vaqtning o'zida ishlashni va Python / Perl kabi kodlarni yoqtirishni ta'minlaydi.
  • Agar siz Go ni o'rganishni rejalashtirmoqchi bo'lsangiz, men aytamanki, apparat cheklovi bizga, dasturiy ta'minot ishlab chiqaruvchilari juda samarali kodni yozishga majbur qiladi. Tuzuvchi dasturiy ta'minotni tushunishi va dasturini shunga mos ravishda optimallashtirishi kerak. Optimallashtirilgan dasturiy ta'minot arzonroq va sekinroq qurilmalarda (IOT qurilmalari singari) ishlaydi va umuman foydalanuvchi tajribasiga yaxshiroq ta'sir qiladi.

~ Agar siz maqolani yoqtirgan bo'lsangiz, ko'proq odamlar uni ko'rishlari uchun quyidagi ni bosing! Bundan tashqari, siz O'rta yoki Mening blogim orqali meni kuzatib borishingiz mumkin, shuning uchun siz Go !! ~ da bo'lajak maqolalar haqida yangiliklar olasiz

Kreditlar:

  • GoLang yoki Edoardo Paolo Scalafiotti firmasining kelajagi
  • Go serverida keyingi serveringizni dasturlang
  • Moslik Rob Pike tomonidan parallel emas
  • Nega borasiz?