گو (زبان برنامه‌نویسی)

از ویکی‌پدیا، دانشنامهٔ آزاد
گو
طراحی شده توسطرابرت گریسیمر، راب پایک، کن تامپسون
توسعه‌دهندهگوگل
ظهوریافته در۱۰ نوامبر ۲۰۰۹؛ ۱۴ سال پیش (۲۰۰۹-10}})
انتشار پایدار
1.22.2[۱]
۳ آوریل ۲۰۲۴؛ ۲۰ روز پیش (۳ آوریل ۲۰۲۴-خطا: زمان نامعتبر}})
سیستم‌عاملدراگون‌فلی‌بی‌اس‌دی, فری‌بی‌اس‌دی, لینوکس, مک‌اواس, نت‌بی‌اس‌دی, اوپن‌بی‌اس‌دی, پلان ۹ از آزمایشگاه‌های بل, سولاریس (سیستم‌عامل), مایکروسافت ویندوز, آی‌اواس, اندروید, آی‌بی‌ام ای‌آی‌اکس
پروانهپروانه بی‌اس‌دی
.go
وبگاه
متأثر از
سی,[۴] لیمبو (زبان برنامه‌نویسی),[۵] پاسکال,[۴] اسمال‌تاک,[۶] الف, ای‌پی‌ال,[۷] بی‌سی‌پی‌ال, مادولا, اوکام
تأثیر گذاشته بر
Crystal

گو (به انگلیسی: Go) یک زبان برنامه‌نویسی ترجمه‌شده و دارای زباله جمع‌کن و همروند است که در شرکت گوگل و توسط رابرت گریسیمر، راب پایک و کن تامپسون توسعه داده می‌شود.[۸]

این زبان در نوامبر ۲۰۰۹ (برابر ‎آبان ۱۳۸۸) معرفی شد و در حال حاضر در چند سامانهٔ اجرایی گوگل استفاده می‌شود.[۹] مترجم گو از لینوکس، مک او اس، ویندوز و انواع سیستم‌های عامل بی‌اس‌دی مانند FreeBSD پشتیبانی می‌کند. از لحاظ معماری پردازنده نیز، معماری ایکس۸۶، معماری ایکس۶۴، معماری آرم و معماری POWER که مخصوص به شرکت آی‌بی‌ام است، توسط مترجم گو پشتیبانی می‌شوند.[۱۰]

«go» به عنوان یک آزمایش توسط مهندسان گوگل رابرت گریسیمر، راب پایک و کن تامپسون توسعه پیدا کرده است. این زبان برنامه‌نویسی به شیوه‌ای طراحی شده است که ضمن برطرف کردن انتقادهای رایج از دیگر زبان‌ها، ویژگی‌های مثبت آنها را حفظ کند. زبان جدید شامل ویژگی‌های زیر بود:

  • به صورت ایستا نوشته شده، مقیاس پذیر به سیستم‌های بزرگ (به عنوان جاوا و C ++)
  • نیاز به محیط‌های توسعه یکپارچه ندارند، اما از آن‌ها حمایت می‌کنند پشتیبانی از شبکه و چند پردازش

تاریخچه[ویرایش]

«گو» در سال ۲۰۰۷ (به شمسی: ۱۳۸۶) توسط «شرکت گوگل» با هدف افزایش بهره‌وری برنامه‌نویسی در محیط چندهسته‌ای، رایانه‌های شبکه‌ای و کدبیس‌های بزرگ طراحی شد.

«گو» در نوامبر ۲۰۰۹ (به شمسی: آذر ۱۳۸۸) به صورت عمومی معرفی شد و نسخه [27] و نسخه ۱.۰ آن در مارس ۲۰۱۲ (به شمسی: فروردین ۱۳۹۱) منتشر شد. «گو» به طور گسترده ای در محصولات گوگل و در بسیاری از سازمان های دیگر و پروژه های منبع باز استفاده می شود.

در آوریل ۲۰۱۸ ، لوگوی فعلی جایگزین لوگوی سابق آن شد با این حال، شگون‌نما (به انگلیسی: Mascot) آن که موش‌های کیسه‌دار (به انگلیسی: Gopher) است، دست نخورده باقی ماند.

سیاست انتشار[ویرایش]

هر نسخه اصلی گو تا زمانی که دو نسخه اصلی جدیدتر وجود داشته باشد پشتیبانی می شود. به عنوان مثال، گو نسخه ۱٫۵ تا زمان انتشار گو ۱٫۷ و گو ۱٫۶ تا زمان انتشار گو ۱٫۸ پشتیبانی می شد. مشکلات حیاتی، از جمله مشکلات امنیتی حیاتی در نسخه‌های پشتیبانی شده در صورت نیاز با صدور بازبینی‌های جزئی برطرف می‌شوند (به عنوان مثال، گو ۱٫۶٫۱، گو ۱٫۶٫۲ و غیره).[۱۱]

تاریخچه انتشار[ویرایش]

نسخه تاریخ انتشار تاریخ اتمام پشتیبانی یادداشت‌ها
نگارش قدیمی، دیگر پشتیبانی نمی‌شود: ۱٫۱۸ ۲۴ اسفند ۱۴۰۰ ۱۲ بهمن ۱۴۰۱ تا معرفی نسخه ۱/۲۰
نگارش قدیمی، دیگر پشتیبانی نمی‌شود: ۱٫۱۹ ۱۱ مرداد ۱۴۰۱ پاییز ۲۰۲۳ - تا معرفی نسخه ۱/۲۱
نگارش پایدار جاری: ۱٫۲۰ ۱۲ بهمن ۱۴۰۱ [۱۲] بهار ۲۰۲۴ [۱۲] تا معرفی نسخه ۱/۲۲
نگارش آتی: ۱٫۲۱ پاییز ۲۰۲۳ پاییز ۲۰۲۴ - تا معرفی نسخه ۱/۲۳
ایجاز:
نگارش قدیمی
نگارش قدیمی‌تر، هنوز پشتیبانی می‌شود
نگارش پایدار جاری
آخرین نگارش پیش‌نمایش
انتشار آتی
در بالا نماد شانس زبان گو که «موش‌های کیسه‌دار» است، نمایش داده شده

اهداف ایجاد[ویرایش]

اهداف ایجاد زبان گو شامل موارد زیر است:[۱۳]

  • کارایی زبان‌های ترجمه‌شده دارای سامانه نوع ایستا،[پ ۱] برنامه‌نویسی زبان‌های پویا[پ ۲]
  • امنیت نوع‌ها، و امنیت حافظه
  • پشتیبانی برای همروندی و ارتباط[پ ۳]
  • زمان ترجمه کوتاه

طراحی زبان[ویرایش]

“go” به‌طور قابل توجهی در سنت C است، اما باعث تغییرات بسیاری می‌شود که به منظور شفافیت، سادگی و ایمنی ایجاد می‌شود:

یک روش نحوی و محرک پذیرش الگوهای رایج در زبان‌های پویا:

  • · توصیف اولیه متغیر مختصر و اولیه از طریق استنتاج نوع (x := 0 not int x = 0; or var x = 0;).
  • زمان تدوین سریع
  • مدیریت بسته‌های از راه دور (به دست آوردن) و مستندات بسته آنلاین.

رویکردهای متمایز به مشکلات خاص:

  • ابتکارهای همپوشانی ساخته شده: فرایندهای سبک‌وزن (goroutines)، کانال‌ها و بیانیه انتخاب.
  • یک سیستم رابط به جای ارث مجازی، و نوع جایگذاری به جای ارثی غیرمجازی.

شی‌گرایی[ویرایش]

در زبان گو، ارث‌بری نوع‌ها وجود ندارد.[۱۴] در این زبان، می‌توان برای هر نوع داده‌ای، حتی برای نوع‌های داخلی، مثل اعداد صحیح فاقد بسته‌بندی،[پ ۴] تابع عضو تعریف کرد، و این عمل محدود به ساخت‌ها[پ ۵] (رده‌ها) نمی‌شود.[۱۵]

در زبان گو از رابط‌ها (به انگلیسی: Interfaces) می‌توان برای تعریف رفتار یک شی استفاده کرد. هر رابط مجموعه‌ای از تعریف توابع است، و هر نوعی که توابع این رابط را داشته باشد، این رابط را پیاده‌سازی کرده‌است.[۱۶]

در نمونه زیر، یک رابط تعریف شده‌است که یک تابع به نام Abs و نوع خروجی float64 مشخص کرده‌است. هر نوعی که این تابع را پیاده‌سازی کند، در واقع این رابط را پیاده‌سازی کرده‌است. به عنوان نمونه، هم MyFloat و هم Vertex این چنین هستند.

type Abser interface {
 Abs() float64
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
 if f <0 {
  return float64(-f)
 }
 return float64(f)
}

type Vertex struct {
 X, Y float64
}

func (v Vertex) Abs() float64 {
 return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
 var a Abser
 f := MyFloat(-math.Sqrt2)
 v := Vertex{3, 4}
        a = f  // a MyFloat implements Abser
        fmt.Println(a.Abs())
        a = v // a Vertex implements Abser
        fmt.Println(a.Abs())
}

همروندی[ویرایش]

گوروتین (به انگلیسی: goroutine) که برگرفته از نام کوروتین (به انگلیسی: coroutine) می‌باشد، تابعی است که به صورت همروند با بقیه گوروتین‌ها در فضای حافظه یکسان اجرا می‌شود.[۱۷] گوروتین‌ها معادل با ریسمان‌های[پ ۶] سیستم‌عامل نیستند، بلکه چندین گوروتین بین چندین ریسمان سیستم‌عامل تسهیم[پ ۷] می‌شوند.

برای ایجاد یک گوروتین، قبل از فراخوانی تابع، عبارت go را استفاده می‌کنیم. در نمونه زیر، یک گوروتین به‌صورت همروند با گوروتین فعلی ایجاد و اجرا می‌شود:

go list.Sort() // run list.Sort concurrently; don't wait for it.

گوروتین‌ها برای تبادل داده از کانال‌ها (به انگلیسی: channel) استفاده می‌کنند. در نمونه زیر، یک کانال به نام c ایجاد می‌شود که برای مشخص کردن تکمیل اجرای گوروتین داخلی استفاده می‌شود:

c := make(chan int) // Allocate a channel.
// Start the sort in a goroutine; when it completes, signal on the channel.
go func() {
    list.Sort()
    c <- 1  // Send a signal; value does not matter.
}()
doSomethingForAWhile()
<-c // Wait for sort to finish; discard sent value.

مدیریت بسته[ویرایش]

گو از سامانه مدیریت بسته اختصاصی خود استفاده می‌کند. وبگاه اصلی آن در pkg.go.dev قرار دارد. گو با استفاده از دستور go mod init [PACKAGE_NAME] سیستم مدیریت بسته خود را برای یک پروژه ایجاد می‌کند. همچنین با استفاده از دستور go get می‌توان بسته ای را نصب کرد.

از نکات مثبت این سامانه می‌توان به دستور go mod tidy اشاره کرد که به طور خودکار پکیج های مورد نیاز را نصب و پکیج های بلااستفاده را حذف می‌کند.

گو برای پیکربندی بسته های یک پروژه دو فایل با نام های go.mod و go.sum ایجاد می‌کند که در فایل go.mod لیست کاملی از وابستگی های پروژه وجود دارد و همچنین در فایل go.sum یک hash از هر بسته ذخیره می‌کند تا نسخه پکیج نصب شده را به یاد داشته باشد.


ابزارهای زبان[ویرایش]

زبان گو شامل همان نوع اشکال زدایی و تست است که در بسیاری از زبان ای توزیع شده دیگر هم استفاده می‌شود.

  • go build، برای ساخت نسخه قابل اجرای برنامه
  • go test، برای مقاصد تست واحد (Unit Testing) و محک (Microbenchmark) استفاده می‌شود.
  • go fmt، برای قالب بندی کد
  • go get، برای بازیابی و نصب بسته‌ها از راه دور است.
  • go mod، نرم نرم‌افزار مدیریت بسته (Package manager)
  • go vet، یک تحلیلگر استاتیک به دنبال خطاهای احتمالی در کد
  • go run، یک میانبر برای ساخت و اجرای کد
  • godoc، برای نمایش اسناد یا ارائه آن از طریق HTTP
  • gorename، برای تغییر نام متغیرها، توابع و غیره
  • cgo، امکان صدا زدن کد های زبان سی را از درون گو فراهم میکند
  • asm، برای تبدیل کدهای گو به اسمبلی کاربرد دارد.
  • dist، به ساخت، آزمایش، راه اندازی و توزیع کد کمک میکند.
  • fix، استفاده از api های قدیمی در برنامه را شناسایی و آنها را با api های جدید جایگزین می‌کند.
  • test2json، خروجی تست های گو را به فرمت جیسان تبدیل میکند.
  • pack، یک نسخه ساده از ابزار ar در یونیکس.
  • objdump، فایل های اجرایی رو جدا می‌کند.
  • trace، فایل های trace را ردیابی می‌کند.

و..

مثال‌ها[ویرایش]

برنامه Hello World[ویرایش]

مثال زیر برنامه Hello World را در گو پیاده‌سازی می‌کند:

package main

import "fmt"

func main() {
        // a first program in go
        fmt.Println("Hello, World")
}

برنامه Echo[ویرایش]

مثال زیر چگونگی نوشتن برنامه‌ای مشابه فرمان echo یونیکس را در گو نشان می‌دهد:[۱۸]

package main

import (
        "os"
        "flag"  // Command line option parser.
)

var omitNewline = flag.Bool("n", false, "don't print final newline")

const (
        Space = " "
        Newline = "\n"
)

func main() {
        flag.Parse()   // Scans the arg list and sets up flags.
        var s string
        for i := 0; i <flag.NArg(); i++ {
                if i> 0 {
                        s += Space
                }
                s += flag.Arg(i)
        }
        if !*omitNewline {
                s += Newline
        }
        os.Stdout.WriteString(s)
}

انتقادها[ویرایش]

منتقدان زبان گو می‌گویند:

  • فقدان ژنریک‌های زمان کامپایل منجر به تکرار کپی می‌شود، metaprogramming نمی‌تواند به صورت ایستا بررسی شود و کتابخانه استاندارد نمی‌تواند الگوریتم‌های عمومی ارائه دهد.
  • فقدان گسترش زبان (از طریق، به عنوان مثال، بیش از حد اپراتور) باعث می‌شود تا وظایف خاص به صورت مقدماتی انجام شود.
  • یک پارچگی نبودن همروندی اطلاعات در کامپایل خروجی رم به حافظه.
  • عدم وجود سیستم نوع Hindley-Milner برای تأیید ایمنی.
  • کندی سرعت و اشغال حافظه بیش از حد رم به شکل معماری گوروتین

پروژه‌هایی که از زبان گو استفاده می‌کنند[ویرایش]

برخی از برنامه‌های منبع باز قابل توجه در زبان گو[ویرایش]

برخی از frameworkهای منبع باز قابل توجه در زبان گو[ویرایش]

  • Gorilla, یک ابزار وب برای گو.
  • Martini, بسته برای برنامه‌های وب کاربردی / خدمات.
  • Beego, یک framework وب با کارایی بالا در گو، برای برنامه‌های وب و سرویس‌های Backend مورد استفاده قرار می‌گیرد.

اختلاف نام‌گذاری[ویرایش]

در روز ۱۰ نوامبر ۲۰۰۹، روز انتشار عمومی زبان، فرانسیس مک کیب، توسعه دهنده زبان برنامه‌نویسی !Go درخواست تغییر نام از زبان گوگل را برای جلوگیری از سردرگمی با زبان خود، که ۱۰ سال در حال توسعه آن است، کرد.

در ۱۲ اکتبر ۲۰۱۰، این مسئله توسط راس ککس (rsc@) توسعه دهنده گوگل با وضعیت سفارشی «متأسفانه» همراه با توضیح زیر بسته شد:

«بسیاری از محصولات و خدمات محاسباتی از نام Go استفاده می‌کنند. در ۱۱ ماه پس از انتشار ما، این شباهت نام کمترین میزان سردرگمی را به‌وجود آورده‌است.»

پیوند به بیرون[ویرایش]

پانویس[ویرایش]

  1. compiled statically typed language
  2. dynamic language
  3. communication
  4. unboxed
  5. structs
  6. thread
  7. multiplex

منابع[ویرایش]

  1. ۱٫۰ ۱٫۱ "Release History".
  2. https://go.dev/blog/tidy-web.
  3. http://ports.su/lang/go,-main.
  4. ۴٫۰ ۴٫۱ ۴٫۲ ۴٫۳ https://golang.org/doc/faq#ancestors.
  5. ۵٫۰ ۵٫۱ https://go.dev/doc/faq#ancestors.
  6. ۶٫۰ ۶٫۱ https://talks.golang.org/2015/gophercon-goevolution.slide#19; بیان به عنوان: "Object orientation in Go: Interfaces Inspiration: Smalltalk"; تاریخ انتشار: 2015.
  7. ۷٫۰ ۷٫۱ https://talks.golang.org/2014/hellogophers.slide#21.
  8. گوی گوگل: زبان برنامه‌نویسی جدیدی که در آن پایتون سی++ را ملاقات می‌کند
  9. "سوالات متداول گو: آیا گوگل از گو استفاده می‌کند؟". Retrieved 9 March 2013.
  10. "نصب گو". golang.org. The Go Authors. 11 June 2010. Retrieved 11 June 2010.
  11. "Release History - The Go Programming Language". go.dev (به انگلیسی). Retrieved 2023-04-28.
  12. ۱۲٫۰ ۱۲٫۱ "Release History - The Go Programming Language". go.dev (به انگلیسی). Retrieved 2023-04-28.
  13. راب پایک - زبان برنامه‌نویسی گو در یوتیوب
  14. سوالات مرسوم - ارث‌بری
  15. سوالات مرسوم - آیا گو یک زبان شی‌گراست؟
  16. مستندات گو - رابط‌ها و نوع‌ها
  17. گوی کارا - همروندی
  18. «echo.go from go tutorial». بایگانی‌شده از اصلی در ۷ نوامبر ۲۰۱۲. دریافت‌شده در ۴ نوامبر ۲۰۱۲.