گو (زبان برنامهنویسی)
طراحی شده توسط | رابرت گریسیمر، راب پایک، کن تامپسون |
---|---|
توسعهدهنده | گوگل |
ظهوریافته در | ۱۰ نوامبر ۲۰۰۹ |
انتشار پایدار | 1.23.3[۱]
/ ۸ ژوئیه ۲۰۱۹; ۳ سپتامبر ۲۰۱۹; ۲۶ فوریه ۲۰۲۰; ۱۶ ژوئیه ۲۰۲۰; ۱۱ اوت ۲۰۲۰; ۱۲ نوامبر ۲۰۲۰; ۳ دسامبر ۲۰۲۰; ۱۹ ژانویه ۲۰۲۱; ۴ فوریه ۲۰۲۱; ۱۶ فوریه ۲۰۲۱; ۱۰ مارس ۲۰۲۱; ۱۱ مارس ۲۰۲۱; ۱ آوریل ۲۰۲۱; ۶ مه ۲۰۲۱; ۳ ژوئن ۲۰۲۱; ۱۲ ژوئیه ۲۰۲۱; ۵ اوت ۲۰۲۱; ۱۶ اوت ۲۰۲۱; ۹ سپتامبر ۲۰۲۱; ۷ اکتبر ۲۰۲۱; ۴ نوامبر ۲۰۲۱; ۲ دسامبر ۲۰۲۱; ۹ دسامبر ۲۰۲۱; ۶ ژانویه ۲۰۲۲; ۱۰ فوریه ۲۰۲۲; ۳ مارس ۲۰۲۲; ۱۵ مارس ۲۰۲۲; ۱۲ آوریل ۲۰۲۲; ۱۰ مه ۲۰۲۲; ۱ ژوئن ۲۰۲۲; ۱۲ ژوئیه ۲۰۲۲; ۲ اوت ۲۰۲۲; ۶ سپتامبر ۲۰۲۲; ۴ اکتبر ۲۰۲۲; ۱ نوامبر ۲۰۲۲; ۶ دسامبر ۲۰۲۲; ۱۰ ژانویه ۲۰۲۳; ۱ فوریه ۲۰۲۳; ۱۴ فوریه ۲۰۲۳; ۷ مارس ۲۰۲۳; ۴ آوریل ۲۰۲۳; ۲ مه ۲۰۲۳; ۶ ژوئن ۲۰۲۳; ۱۱ ژوئیه ۲۰۲۳; ۱ اوت ۲۰۲۳; ۸ اوت ۲۰۲۳; ۶ سپتامبر ۲۰۲۳; ۵ اکتبر ۲۰۲۳; ۱۰ اکتبر ۲۰۲۳; ۷ نوامبر ۲۰۲۳; ۵ دسامبر ۲۰۲۳; ۹ ژانویه ۲۰۲۴; ۶ فوریه ۲۰۲۴; ۵ مارس ۲۰۲۴; ۳ آوریل ۲۰۲۴ |
سیستمعامل | دراگونفلیبیاسدی, فریبیاسدی, لینوکس, مکاواس, نتبیاسدی, اوپنبیاسدی, پلان ۹ از آزمایشگاههای بل, سولاریس (سیستمعامل), مایکروسافت ویندوز, آیاواس, اندروید, آیبیام ایآیاکس |
پروانه | پروانه بیاسدی |
.go | |
وبگاه | |
متأثر از | |
سی,[۴] لیمبو (زبان برنامهنویسی),[۵] پاسکال,[۴] اوبرون (زبان برنامهنویسی),[۴] اسمالتاک,[۶] الف, ایپیال,[۷] بیسیپیال, مادولا, اوکام | |
تأثیر گذاشته بر | |
Crystal |
گو (به انگلیسی: Go) یک زبان برنامهنویسی ترجمهشده و دارای زباله جمعکن و همروند است که در شرکت گوگل و توسط رابرت گریسیمر، راب پایک و کن تامپسون توسعه داده میشود.[۸]
این زبان در نوامبر ۲۰۰۹ (برابر آبان ۱۳۸۸) معرفی شد و در حال حاضر در چند سامانهٔ اجرایی گوگل استفاده میشود.[۹] مترجم گو از لینوکس، مک او اس، ویندوز و انواع سیستمهای عامل بیاسدی مانند FreeBSD پشتیبانی میکند. از لحاظ معماری پردازنده نیز، معماری ایکس۸۶، معماری ایکس۶۴، معماری آرم و معماری POWER که مخصوص به شرکت آیبیام است، توسط مترجم گو پشتیبانی میشوند.[۱۰]
«go» به عنوان یک آزمایش توسط مهندسان گوگل رابرت گریسیمر، راب پایک و کن تامپسون توسعه پیدا کرده است. این زبان برنامهنویسی به شیوهای طراحی شده است که ضمن برطرف کردن انتقادهای رایج از دیگر زبانها، ویژگیهای مثبت آنها را حفظ کند. زبان جدید شامل ویژگیهای زیر بود:
- به صورت ایستا نوشته شده، مقیاس پذیر به سیستمهای بزرگ (به عنوان جاوا و C ++)
- نیاز به محیطهای توسعه یکپارچه ندارند، اما از آنها حمایت میکنند پشتیبانی از شبکه و چند پردازش
تاریخچه
[ویرایش]«گو» در سال ۲۰۰۷ (به شمسی: ۱۳۸۶) توسط «شرکت گوگل» با هدف افزایش بهرهوری برنامهنویسی در محیط چندهستهای، رایانههای شبکهای و کدبیسهای بزرگ طراحی شد.
«گو» در نوامبر ۲۰۰۹ (به شمسی: آذر ۱۳۸۸) به صورت عمومی معرفی شد و نسخه [27] و نسخه ۱.۰ آن در مارس ۲۰۱۲ (به شمسی: فروردین ۱۳۹۱) منتشر شد. «گو» به طور گسترده ای در محصولات گوگل و در بسیاری از سازمان های دیگر و پروژه های منبع باز استفاده می شود.
در آوریل ۲۰۱۸ ، لوگوی فعلی جایگزین لوگوی سابق آن شد با این حال، شگوننما (به انگلیسی: Mascot) آن که موشهای کیسهدار (به انگلیسی: Gopher) است، دست نخورده باقی ماند.
سیاست انتشار
[ویرایش]هر نسخه اصلی گو تا زمانی که دو نسخه اصلی جدیدتر وجود داشته باشد پشتیبانی می شود. به عنوان مثال، گو نسخه ۱٫۵ تا زمان انتشار گو ۱٫۷ و گو ۱٫۶ تا زمان انتشار گو ۱٫۸ پشتیبانی می شد. مشکلات حیاتی، از جمله مشکلات امنیتی حیاتی در نسخههای پشتیبانی شده در صورت نیاز با صدور بازبینیهای جزئی برطرف میشوند (به عنوان مثال، گو ۱٫۶٫۱، گو ۱٫۶٫۲ و غیره).[۱۱]
تاریخچه انتشار
[ویرایش]نسخه | تاریخ انتشار | تاریخ اتمام پشتیبانی | یادداشتها |
---|---|---|---|
۱٫۱۸ | ۲۴ اسفند ۱۴۰۰ | ۱۲ بهمن ۱۴۰۱ تا معرفی نسخه ۱/۲۰ | |
۱٫۱۹ | ۱۱ مرداد ۱۴۰۱ | پاییز ۲۰۲۳ - تا معرفی نسخه ۱/۲۱ | |
۱٫۲۰ | ۱۲ بهمن ۱۴۰۱ [۱۲] | بهار ۲۰۲۴ [۱۲] تا معرفی نسخه ۱/۲۲ | |
۱٫۲۱ | پاییز ۲۰۲۳ | پاییز ۲۰۲۴ - تا معرفی نسخه ۱/۲۳ | |
ایجاز: نگارش قدیمی نگارش قدیمیتر، هنوز پشتیبانی میشود نگارش پایدار جاری آخرین نگارش پیشنمایش انتشار آتی |
اهداف ایجاد
[ویرایش]اهداف ایجاد زبان گو شامل موارد زیر است:[۱۳]
- کارایی زبانهای ترجمهشده دارای سامانه نوع ایستا،[پ ۱] برنامهنویسی زبانهای پویا[پ ۲]
- امنیت نوعها، و امنیت حافظه
- پشتیبانی برای همروندی و ارتباط[پ ۳]
- زمان ترجمه کوتاه
طراحی زبان
[ویرایش]“go” بهطور قابل توجهی در سنت C است، اما باعث تغییرات بسیاری میشود که به منظور شفافیت، سادگی و ایمنی ایجاد میشود:
یک روش نحوی و محرک پذیرش الگوهای رایج در زبانهای پویا:
- · توصیف اولیه متغیر مختصر و اولیه از طریق استنتاج نوع (
x := 0
notint x = 0;
orvar 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
، برای نمایش اسناد یا ارائه آن از طریق HTTPgorename
، برای تغییر نام متغیرها، توابع و غیره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 برای تأیید ایمنی.
- کندی سرعت و اشغال حافظه بیش از حد رم به شکل معماری گوروتین
پروژههایی که از زبان گو استفاده میکنند
[ویرایش]برخی از برنامههای منبع باز قابل توجه در زبان گو
[ویرایش]- CockroachDB, یک پایگاه داده منبع باز، قابل انعطاف و سازگار است.
- داکر، یک نرمافزار متن باز که دیپلویمنت نرمافزارهای کاربردی را درون کانتینر نرمافزاری به وسیلهٔ فراهم کردن لایهٔ انتزاعی اضافهای فراهم میکند.
- Syncthing, یک نرمافزار کلاینت/سرور هماهنگسازی فایل منبع باز است.
- Snappy, یک مدیریت بسته برای Ubuntu Touch که توسط Canonical توسعه یافتهاست.
- OpenShift, یک پلت فرم محاسبات ابری.
برخی از frameworkهای منبع باز قابل توجه در زبان گو
[ویرایش]- Gorilla, یک ابزار وب برای گو.
- Martini, بسته برای برنامههای وب کاربردی / خدمات.
- Beego, یک framework وب با کارایی بالا در گو، برای برنامههای وب و سرویسهای Backend مورد استفاده قرار میگیرد.
اختلاف نامگذاری
[ویرایش]در روز ۱۰ نوامبر ۲۰۰۹، روز انتشار عمومی زبان، فرانسیس مک کیب، توسعه دهنده زبان برنامهنویسی !Go درخواست تغییر نام از زبان گوگل را برای جلوگیری از سردرگمی با زبان خود، که ۱۰ سال در حال توسعه آن است، کرد.
در ۱۲ اکتبر ۲۰۱۰، این مسئله توسط راس ککس (rsc@) توسعه دهنده گوگل با وضعیت سفارشی «متأسفانه» همراه با توضیح زیر بسته شد:
«بسیاری از محصولات و خدمات محاسباتی از نام Go استفاده میکنند. در ۱۱ ماه پس از انتشار ما، این شباهت نام کمترین میزان سردرگمی را بهوجود آوردهاست.»
پیوند به بیرون
[ویرایش]پانویس
[ویرایش]منابع
[ویرایش]- ↑ ۱٫۰ ۱٫۱ "Release History".
- ↑ https://go.dev/blog/tidy-web.
- ↑ http://ports.su/lang/go,-main.
- ↑ ۴٫۰ ۴٫۱ ۴٫۲ ۴٫۳ ۴٫۴ ۴٫۵ https://golang.org/doc/faq#ancestors.
- ↑ ۵٫۰ ۵٫۱ https://go.dev/doc/faq#ancestors.
- ↑ ۶٫۰ ۶٫۱ https://talks.golang.org/2015/gophercon-goevolution.slide#19; بیان به عنوان: "Object orientation in Go: Interfaces Inspiration: Smalltalk"; تاریخ انتشار: 2015.
- ↑ ۷٫۰ ۷٫۱ https://talks.golang.org/2014/hellogophers.slide#21.
- ↑ گوی گوگل: زبان برنامهنویسی جدیدی که در آن پایتون سی++ را ملاقات میکند
- ↑ "سوالات متداول گو: آیا گوگل از گو استفاده میکند؟". Retrieved 9 March 2013.
- ↑ "نصب گو". golang.org. The Go Authors. 11 June 2010. Retrieved 11 June 2010.
- ↑ "Release History - The Go Programming Language". go.dev (به انگلیسی). Retrieved 2023-04-28.
- ↑ ۱۲٫۰ ۱۲٫۱ "Release History - The Go Programming Language". go.dev (به انگلیسی). Retrieved 2023-04-28.
- ↑ راب پایک - زبان برنامهنویسی گو در یوتیوب
- ↑ سوالات مرسوم - ارثبری
- ↑ سوالات مرسوم - آیا گو یک زبان شیگراست؟
- ↑ مستندات گو - رابطها و نوعها
- ↑ گوی کارا - همروندی
- ↑ «echo.go from go tutorial». بایگانیشده از اصلی در ۷ نوامبر ۲۰۱۲. دریافتشده در ۴ نوامبر ۲۰۱۲.
- کارمندان گوگل
- کتابها درباره گوگل
- گوگل
- گو (زبان برنامهنویسی)
- اختراعهای آمریکایی
- زبانهای برنامهنویسی ایستا
- زبانهای برنامهنویسی خانواده سی
- زبانهای برنامهنویسی رویهای
- زبانهای برنامهنویسی ساختهشده در ۲۰۰۹ (میلادی)
- زبانهای برنامهنویسی سطح بالا
- زبانهای برنامهنویسی همروند
- کامپایلرها و مفسرهای آزاد
- نرمافزارهای آزاد چندسکویی
- نرمافزارهای چندسکویی
- نرمافزارهای گوگل
- نرمافزارهایی که از پروانه بیاسدی استفاده میکنند
- زبانهای برنامهنویسی سیستمی