Issuu on Google+

‫معرفی زبان برنامه نویسی ‪Go‬‬ ‫‪golang.org‬‬

‫امیررضا قادری ‪ -‬آبان ‪۱۳۹۱‬‬ ‫نسخه ‪1.1‬‬ ‫‪amirreza.blog@gmail.com‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫کگذاری این سند با حفظ نام نویسنده آزاد است‪ .‬نه تنها آزاد است‪ ،‬بلکه توصیه نیز می گردد!‬ ‫باز پخش یا به اشترا گ‌‬ ‫خوشحال می شوم که اگر اشکالی در این مطلب پیدا کردید )املیی‪ ،‬معنایی‪ ،‬مفهومی‪ (… ،‬و یا اگر توصیه ایی برای بهتر شدن نگارش آن دارید‪ ،‬آنرا از طریق‬ ‫ایمیل با من در میان بگذارید‪.‬‬ ‫‪.‬‬ ‫یتوانید هر از چندگاهی برای دریافت نسخگ‌هی جدید تر اقدام نمایید‪.‬‬ ‫این نوشته بدون اطل ع قبلی بروزرسانی خواهد شد‪ .‬بنابراین م گ‌‬

‫یتوانید از آدرس زیر دانلود کنید‪:‬‬ ‫نسخگ‌هی ‪ ۱.۰‬این سند را م گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫‪https://www.dropbox.com/s/rntxj5dyqlui6ff/golang-persian-intro.zip‬‬


‫توضیح درباره متن نوشته‪:‬‬ ‫یباشند‪.‬‬ ‫با اینکه تمام سعی بر این بوده که مطالب به صورت ساده بیان شود‪ ،‬اما مخاطبان اصلی این نوشته برنامگ‌هنویسان با تجربه م گ‌‬ ‫این نوشته برای »آموزش« نوشته نشده است‪ .‬برای »آشنایی« نوشته شده است‪ .‬شما قرار نیست در اینجا زبان ‪ Go‬را یاد بگیرید‪ ،‬بلکه قرار است با آن آشنا شوید‬ ‫تا در صورت بوجود آمدن علقه‪ ،‬برای یادگیری آن اقدام کنید‪ .‬از همین رو کدهای زیادی در این نوشته وجود ندارد و سعی شده نظر خواننده به جای سینتکس‬ ‫نهای دیگر هم مفید خواهد بود‪ .‬این‬ ‫تهایی که در آن وجود دارد جلب شود‪ .‬آشنایی با خیلی از این مفاهیم‪ ،‬حتی برای برنامگ‌هنویسان زبا گ‌‬ ‫زبان‪ ،‬به مفاهیم و قابلی گ‌‬ ‫نوشته در قالب یک »اسلید« به شما ارائه شده است‪ ،‬و خواندن آن وقت زیادی از شما نخواهد گرفت‪) .‬بهتر است برنامگ‌هی ‪ PDF‬خوان خود را طوری تنظیم کنید‬ ‫که این نوشته را در حالت ‪ Fullscreen‬نمایش دهد‪(.‬‬ ‫همچنین‪ ،‬زبان فارسی که براستی شکر است‪ ،‬گزینه ی خیلی مناسبی برای استفاده در علوم کامپیوتری نیست! معنی فارسی بسیاری از واژگ‌ههای موجود در‬ ‫ب فارسی موجود در این‬ ‫یکند و جز سردرگمی برای خواننده چیز دیگری به همراه ندارد‪ .‬نمونگ‌هاش هم کت گ‌‬ ‫مباحث کامپیوتری‪ ،‬درک درستی از آن واژه ارایه نم گ‌‬ ‫نها آگاهند‪ .‬البته مشکل از زبان فارسی نیست‪ ،‬مساله این است که خیلی از این واژگ‌هها‬ ‫ل به شبهات موجود در آ گ‌‬ ‫زمینه است که متخصصان علوم کامپیوتر کام ب ً‬ ‫ل سردرگم می شود‪ ،‬چرا که‬ ‫حتی در زبان انگلیسی هم معنی مخصوص به خودشان را ندارند! اگر یک شهروند انگلیسی هم متون تخصصی کامپیوتر را بخواند کام ب ً‬ ‫نها بسیار متفاوت است‪).‬نمونه اش نام همین زبان برنامه نویسی ‪ ( Go :‬به همین خاطر در این نوشته سعی شده تا‬ ‫معنی واژگ‌هها در این متون با کاربرد معمول آ گ‌‬ ‫نها پرهیز شود‪.‬‬ ‫جایی که ممکن است از واژگ‌ههای اصلی انگلیسی استفاده کرده و از معنی یا معادل سازی فارسی برای آ گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫»من بسیاری از ایدگ‌ههای موجود در این زبان رو دوست دارم‪ .‬در واقع‪ ،‬بهتره بگم از همه ی این ایدگ‌هها خوشم میاد«‬ ‫‪Martin Odersky‬‬

‫خالق زبان برنامه نویسی‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫‪Scala‬‬

‫و سازنده ی نسل فعلی کامپایلر جاوا ) ‪( javac‬‬


package main import "fmt" func main() { fmt.Printf("Hello, World! \n") }

‫ – امیررضا قادری‬Go ‫معرفی زبان برنامه نویسی‬


‫تاریخچه ای کوتاه‬ ‫در سپتامبر سال ‪،2007‬‬

‫‪Ken Thompson‬‬

‫سترین چهرگ‌ههای دنیای نرگ‌مافزارکه‬ ‫و ‪ ، Rob Pike‬دو تن از سرشنا گ‌‬

‫نیازی به معرفیگ‌شان نیست ‪ ،‬ایده ی ساخت یک زبان برنامه نویسی سیستمی جدید را با ‪، Robert Griesemer‬‬ ‫یکی دیگر از مهندسین مشغول در‬

‫‪Google‬‬

‫در میان گذاشتند‪.‬‬

‫نها کار بر روی این زبان جدید را شرو ع کردند و در این مدت تعداد دیگری از همکارانشان همچون‬ ‫آ گ‌‬ ‫و‬

‫‪Brad Fitzpatrick‬‬

‫نها ملحق شدند‪.‬‬ ‫و ‪ Andrew Gerrand‬به تیم آ گ‌‬

‫‪Russ Cox‬‬

‫)شاید بد نباشد اگر این اسامی را گوگل کنید!(‬

‫در نوامبر سال ‪ ، 2009‬اولین نسخه ی آزمایشی زبان با پشتیبانی گوگل به صورت متن باز به عموم برنامه نویسان‬ ‫عرضه شد‪ .‬از آن زمان تا کنون بیش از ‪ ۳۰۰‬نفر از برنامه نویسان داوطلب در توسعگ‌هی این پروژه شرکت داشته‬ ‫اند!‬ ‫از اولین ماه انتشار این زبان‪ ،‬شرکت های ‪ Startup‬زیادی استفاده از آن را شرو ع کردند‪ .‬با اینکه زبان در نسخه‬ ‫یبرد‪ ،‬اما برای خیلی ها وجود نام‬ ‫ی آزمایشی به سر م گ‌‬ ‫زبان اطمینان حاصل کنند‪.‬‬ ‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫‪Ken Thompson‬‬

‫و‬

‫‪Rob Pike‬‬

‫کافی بود تا از کیفیت‬


‫گتر اما‪ ،‬منتظر نسخه ی پایدار زبان ماندند‪ .‬تا اینکه در ماه مارس سال ‪ ،2012‬نسخه ی ‪ 1.0‬از‬ ‫شرکت های بزر گ‌‬ ‫زبان برنامه نویسی ‪ Go‬به صورت پایدار منتشر شد‪.‬‬ ‫در زمان نگارش این نوشته‪ ،‬با وجود اینکه تنها فقط ‪ ۸‬ماه از انتشار نسخه ی پایدار زبان گذشته است‪ ،‬شرکت‬ ‫های بزرگ زیادی در محصولتشان از‬

‫‪Go‬‬

‫نها را با هم مرور‬ ‫استفاده کرده اند‪ .‬در لیست زیر‪ ،‬اسامی تعدادی از آ گ‌‬

‫میکنیم‪:‬‬ ‫‪BBC‬‬

‫‪Youtube‬‬

‫‪Google‬‬

‫‪bitly‬‬

‫‪Nokia Siemens‬‬

‫‪Canonical‬‬

‫‪SmugMug‬‬

‫‪CloudFlare‬‬

‫‪Heroku‬‬

‫‪moovweb‬‬

‫‪iron.io‬‬

‫‪Feedbooks‬‬

‫‪SoundCloud‬‬

‫‪swirl.us‬‬

‫‪Airbrake‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫نهای‬ ‫مهای ‪ Back-end‬استفاده شده است‪ .‬جایی که زبا گ‌‬ ‫تقریبب ًا در تمام اسامی بال‪ ،‬از ‪ Go‬برای طراحی سیست گ‌‬ ‫اسکریپتی قدرت مناسب را ندارند و معمول از‬

‫‪JVM‬‬

‫یشود؛ در خیلی از مواقع هم برای رسیدن به‬ ‫استفاده م گ‌‬

‫یآید‪.‬‬ ‫سرعت بالتر‪ ،‬پای کدهای ‪ C‬و ‪ C++‬به میان م گ‌‬ ‫نهای برنامه نویسی زبانی بوده که توانسته باشد فقط با گذشت ‪ ۷‬ماه از انتشار اولین‬ ‫یکنم در تاریخ زبا گ‌‬ ‫فکر نم گ‌‬ ‫نسخه ی پایدارش‪ ،‬با چنین مقبولیتی روبرو شود‪.‬‬ ‫نهایی مثل ‪ C++‬و‬ ‫مسلم است که ‪ Go‬هنوز در اول راه است‪ ،‬و برای رسیدن به جایگاه زبا گ‌‬

‫‪Java‬‬

‫یرسد که برای »شرو ع« بسیار موفق عمل کرده است‪.‬‬ ‫راه درازی در پیش دارد‪ ،‬اما به نظر م گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫و ‪ Python‬و ‪...‬‬


‫‪ Go‬یک زبان مدرن و همه منظوره است‬ ‫‪ Go‬زبانی است که برای نیازهای امروز برنامه نویسان طراحی شده‪ .‬تمام سعی طراحان بر این بوده که بتوانند‬ ‫تناسبی بین قدرت‪ ،‬سرعت‪ ،‬و سادگی ایجاد کنند‪ .‬ایدگ‌ههایی که در آن بکار رفته با دقت و وسواس زیادی انتخاب‬ ‫تهای زبان تا یک سال بحث و تبادل نظر‬ ‫و پیادگ‌هسازی شدگ‌هاند‪ .‬طبق گفته ی تیم توسعه‪ ،‬بر سر بعضی از قابلی گ‌‬ ‫صورت گرفته است!‬ ‫‪ Rob Pike‬عنوان میکند که ایده ی اولیه آنها ساخت یک زبان سیستمی بود که بتواند جایگزین مناسبی برای‬ ‫‪ C++‬باشد‪ .‬در روزهای اول‪ ،‬حتی سایت پروژه هم ‪ Go‬را به عنوان زبانی برای برنامه نویسی سیستم معرفی می‬ ‫نهای سطح‬ ‫نها بر سادگی‪ ،‬باعث شده نظر برنامه نویسان زبا گ‌‬ ‫کرد‪ .‬اما بگ‌ا گذشت زمان متوجه شدند که تأکید آ گ‌‬ ‫بالتری مثل ‪ Python‬یا ‪ Ruby‬هم به ‪ Go‬جلب شود؛ این قضیه برای تیم توسعه هم جالب بود!‬ ‫یتوان گفت‬ ‫دگ‌رواقع م گ‌‬ ‫‪Python‬‬

‫که ‪Go‬‬

‫با ظرافت فراوان قدرت و سرعت زبانی مثل‬

‫‪C‬‬

‫را با سهولت و سادگی زبانی مثل‬

‫ترکیب کرده ‪ .‬به همین دلیل قادر است طیف بسیار وسیعی از برنامگ‌هها را پوشش دهد‪ ،‬از برنامگ‌ههای‬

‫سیستمی گرفته تا برنامگ‌ههای ساده ی چند خطی‪ .‬چه کسی گفته که یک زبان سیستمی‪ ،‬حتمب ًا باید سخت باشد؟‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬یک زبان »آزاد« و متن باز است‬ ‫ل آزاد است و تحت کنترل هیچ‬ ‫با اینکه ‪ Go‬مستقیمب ًا از طرف گوگل پشتیبانی می شود‪ ،‬ولی یک زبان کام ب ً‬ ‫شرکتی نیست‪ Pike .‬اعلم کرده که برای اثبات این موضو ع‪ ،‬از قصد هیچ لوگو ای از شرکت گوگل را در سایت‬ ‫این زبان قرار نداده اند!‬ ‫این یعنی‪:‬‬ ‫‪‬‬

‫سیاست کاری و تجاری هیچ شرکتی بر آینده ی زبان تأثیر نخواهد گذاشت‪.‬‬

‫‪‬‬

‫توسعه و بهسازی زبان با سرعت بیشتری انجام می شود‪.‬‬

‫‪‬‬

‫یتوانند به طور شفاف تمام مراحل توسعه را دنبال کنند‪.‬‬ ‫همه م گ‌‬

‫‪‬‬

‫کتابخانگ‌هها و فریم ورک های متن باز بیشتری برای زبان وجود خواهد داشت‪.‬‬

‫‪‬‬

‫…‪...‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬یک زبان کامپایل شونده است‬ ‫نها را ‪ Compile‬نمایید‪ .‬خروجی عملیات کامپایل‪ ،‬کد ماشین‬ ‫برای اجرای برنامگ‌ههای نوشته شده در ‪ ،Go‬باید آ گ‌‬ ‫است‪ .‬بدون نیاز به ‪ ،VM‬بدون نیاز به ‪ ، JIT‬و بدون نیاز به تفسیر‪.‬‬ ‫همانند ‪ ، C‬حاصل برنامه ی شما مستقیمب ًا کدهای ماشین خواهد بود‪.‬‬ ‫در حال حاضر کامپایلر ‪ Go‬که خودش در زبان ‪ C‬نوشته شده‪ ،‬قادر است برای پلتفرم های‬

‫‪x86‬‬

‫و‬

‫‪x64‬‬

‫و‬

‫‪arm‬‬

‫کد ماشین تولید کند‪ .‬سرعت کامپایل شدن برنامگ‌هها در ‪ Go‬بسیار بسیار بالست! و در این زمینه جای هیچ‬ ‫نهای کامپایلری مانند ‪ C++‬و‬ ‫رقابتی را برای دیگر زبا گ‌‬

‫‪Java‬‬

‫و ‪ C#‬و … باقی نگذاشته است‪.‬‬

‫م عامل های ‪ Linux‬و ‪ Mac‬و ‪ FreeBSD‬و‬ ‫خود کامپایلر نیز به صورت رسمی برای سیست گ‌‬

‫‪Windows‬‬

‫منتشر می‬

‫مهای دیگری مثل ‪ Android‬و ‪ Plane9‬و‬ ‫شود‪ .‬اما به شکل غیر رسمی‪ ،‬کاربران گزارش کردگ‌هاند که روی سیست گ‌‬ ‫بقیه ‪ BSD‬ها هم موفق به اجرای آن شده‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫اند‪) .‬نسخگ‌هی ‪ ۱.۱‬زبان در این زمینه پیشرفت زیادی داشته است(‬


‫در ‪ Go‬نیاز به چیزهایی شبیه ‪ makefile‬ها و یا برنامگ‌ههای مدیریت پروژه مثل ‪ Maven‬نیست‪ .‬کامپایلر ‪ Go‬از‬ ‫فایلی که تابع ‪ main‬در آن قرار دارد شرو ع کرده و خودش بقیه کدهای مورد نیاز را شناسایی و لینک می نماید!‬ ‫حتی اگر یک برنامگ‌هی چند صد هزار خطی با تعداد زیادی سورس فایل داشته باشید‪ ،‬فقط یک خط دستور ساده‬ ‫در ترمینال کافیست تا کل برنامه ی شما کامپایل شود‪.‬‬ ‫ینماید‪ .‬به این معنی که حاصل کامپایل‬ ‫لزم به ذکر است که کامپایلر ‪ Go‬کدهای شما را به شکل ‪ Static‬لینک م گ‌‬ ‫کتکه« خواهد بود؛ مهم نیست که برنامگ‌هی شما از تعداد زیادی‬ ‫برنامگ‌هی شما در نهایت »یک« فایل اجرایی »ی گ‌‬ ‫فایل و یا‬

‫‪Package‬‬

‫های جانبی تشکیل شده ‪ ،‬چیزی که در نهایت به شما تحویل داده خواهد شد یک فایل‬

‫شنیازی لزم ندارد و به راحتی قابل انتقال به دستگاهگ‌های دیگر‬ ‫اجرایی ساده است که برای اجرا شدن هیچ پی گ‌‬ ‫است‪.‬‬

‫)برای مثال‪ ،‬دستگاه مشتری(‬

‫نهای دیگر باعث ‪ Warning‬می شوند‪ ،‬همگی در ‪ Go‬به‬ ‫کامپایلر ‪ Go‬با کسی شوخی ندارد! چیزهایی که در زبا گ‌‬ ‫عنوان‬

‫‪Error‬‬

‫ل اگر یک متغیر تعریف کرده باشید اما از آن استفاده نکرده باشید‪،‬‬ ‫در نظر گرفته شدگ‌هاند‪ .‬مث ب ً‬

‫کامپایلر به جای یک ‪ Warning‬سطحی‪ ،‬با یک پیغام ‪ Error‬کل عملیات کامپایل را متوقف میکند! در ‪ Go‬چنین‬ ‫اشتباهاتی پذیرفتی نیست!‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬و ‪ Syntax‬آشنا‬ ‫ی است از خانوادگ‌هی ‪ C‬و به همین دلیل برنامگ‌هنویسانی که با ‪ C‬و ‪ C++‬و ‪ Java‬و ‪ C#‬و ‪ PHP‬و‬ ‫‪ Go‬زبان گ‌‬

‫‪Javascript‬‬

‫و‪ ...‬آشنایی دارند‪ ،‬بسیار راحت ‪ Syntax‬این زبان را یاد خواهند گرفت‪ .‬برای مثال با کمی دقت در کد زیر‪،‬‬ ‫براحتی متوجه منظور آن خواهید شد‪:‬‬ ‫‪package main‬‬ ‫"‪import "fmt‬‬ ‫{ )( ‪func main‬‬ ‫}‪a := []int{11, 22, 33, 44, 55‬‬ ‫‪s := 0‬‬ ‫{ ‪for i := range a‬‬ ‫]‪s += a[i‬‬ ‫}‬ ‫‪//output: 165‬‬

‫)‪fmt.Printf("%d \n", s‬‬ ‫}‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫تتر آن را‬ ‫‪ Syntax‬یک زبان تأثیر زیادی در پیشرفت آن دارد‪ .‬وقتی ‪ Syntax‬زبان آشنا باشد‪ ،‬برنامگ‌هنویسان راح گ‌‬ ‫یاد خواهند گرفت و به همین نسبت محبوبیت زبان بالتر خواهد رفت‪ .‬با بال رفتن محبوبیت‪ ،‬سازندگان زبان با‬ ‫یشوند‪ .‬در این حالت ضریب اعتماد برنامگ‌هنویسان به زبان بالتر‬ ‫اشتیاق و سرعت بیشتری به کار توسعه مشغول م گ‌‬ ‫یشود‪.‬‬ ‫یرود و کتابخانگ‌هها و ابزارهای بیشتری برای زبان تولید م گ‌‬ ‫م گ‌‬ ‫لاند‪ .‬تا زمانی که ‪ Syntax‬یک زبان توسط برنامه‬ ‫برنامگ‌هنویسان بیشتر از اینکه کدنویسی کنند‪ ،‬به کدخوانی مشغو گ‌‬ ‫نهای ‪ Functional‬با آن همه‬ ‫یتواند محبوبیت چندانی پیدا کند‪ .‬برای مثال زبا گ‌‬ ‫نویسان پذیرفته نشود نم گ‌‬ ‫تهای منحصر به فردی که دارند‪ ،‬در اکثر اوقات فقط به دلیل داشتن ‪ Syntax‬نا آشنا در رابطه با جذب‬ ‫قابلی گ‌‬ ‫یشوند‪.‬‬ ‫برنامگ‌هنویسان با مشکل مواجه م گ‌‬ ‫نهای ‪ C‬و ‪ Python‬و ‪ Pascal‬به حساب آورد‪ .‬سعی شده تا‬ ‫یتوان ترکیبی از ‪ Syntax‬زبا گ‌‬ ‫‪ Syntax‬زبان ‪ Go‬را م گ‌‬ ‫‪ Syntax‬زبان کوچک‪ ،‬تمیز‪ ،‬و قابل فهم باشد‪ .‬برای مثال ساختار حلقه در ‪ Go‬فقط با ‪ for‬پیادگ‌هسازی شده و‬ ‫حلقه های ‪ while‬یا ‪ do‬از آن حذف شدگ‌هاند‪.‬‬ ‫نکتگ‌هی جالب دیگری در مورد ‪ Syntax‬زبان ‪ Go‬این است که گرامر آن ‪ Regular‬است! و به همین دلیل پردازش‬ ‫شفرض تمام سورس‬ ‫کدهای ‪ Go‬برای ابزارهای جانبی مثل ‪ IDE‬ها بسیار آسان خواهد بود‪ .‬همچنین ‪ Coding‬پی گ‌‬ ‫لها ‪ UTF-8‬است!‬ ‫فای گ‌‬

‫) چرا که ‪ Ken Thompson‬و ‪ Rob Pike‬خودشان خالق ‪ UTF-8‬بودگ‌هاند!! (‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬یک زبان رویه ای است ) ‪(Procedural‬‬ ‫یگراست؟‬ ‫یآید این است که آیا ‪ Go‬یک زبان ش گ‌‬ ‫سؤالی که برای تعداد زیادی از برنامگ‌هنویسان مشتاق پیش م گ‌‬ ‫یگرا با آن آشنا هستید‪.‬‬ ‫نهای معروف ش گ‌‬ ‫جواب این است‪ :‬خوشبختانهگ‌‪ ،‬خیر !! حداقل نه به شکلی که در زبا گ‌‬ ‫توضیح ‪:‬‬ ‫شی گرایی یک »مفهوم« است‪ ،‬نه یک »قابلیت«! اینطور نیست که در زبانی باشد و در زبان دیگری وجود نداشته‬ ‫نباشد! برای مثال در زبانی مانند‬

‫‪C‬‬

‫یتوان از مفاهیم شی گرایی استفاده کرد‪ .‬حتی در‬ ‫که شی گرا نیست هم م گ‌‬

‫یگرایی بهره برد!‬ ‫یتوان از ش گ‌‬ ‫یک زبان ‪Functional‬گ‌ مانند ‪ Lisp‬هم م گ‌‬ ‫البته مسلم است که اگر یک زبان دارای »گرامر« خاصی برای این منظور باشد )مانند ‪ ( Java‬پیادگ‌هسازی کدهای‬ ‫نتر خواهد بود‪.‬‬ ‫شی گرا در آن آسا گ‌‬ ‫اولین نکتگ‌های که باید درک شود این است که شی گرا بودن یک زبان‪ ،‬به هیچ عنوان تضمینی بر کیفیت ساخت‬ ‫یشوند هم نیست!‬ ‫آن زبان نیست! حتی تضمینی بر کیفیت کدهایی که در آن زبان نوشته م گ‌‬ ‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یخوانید و تبلیغاتی که حول و‬ ‫بها دربارگ‌هاش م گ‌‬ ‫دومین نکته این است که شی گرایی‪ ،‬بر عکس چیزی که در کتا گ‌‬ ‫حوش آن می شود‪ ،‬دارای مخالفان زیادی است!‬ ‫یتوانید خودتان در‬ ‫صحبت در مورد نظرات مثبت و منفی نسبت به شی گرایی در این نوشته نمی‌گنجد‪ .‬شما م گ‌‬ ‫نباره تحقیق کنید‪ .‬اما برای جلب توجه هرچه بیشتر شما به این موضو عگ‌‪ ،‬لیست کوچکی از اسامی افرادی را به‬ ‫ای گ‌‬ ‫شما نشان میدهم که از مخالفان معروف شی گرایی به حساب می آیند‪:‬‬

‫‪Ken Thompson‬‬ ‫)خالق سیستم عامل ‪ ،Unix‬خالق زبان برنامه نویسی ‪ ،B‬اولین توسعگ‌هدهنده ‪ ،Regular expressions‬خالق کدینگ ‪ ،UTF-8‬خالق زبان برنامه نویسی ‪( .…Go‬‬

‫‪Dennis Ritchie‬‬ ‫)نفر دوم در خلق سیستم عامل ‪ ،Unix‬خالق زبان برنامه نویسی ‪( .… ،C‬‬

‫‪Rob Pike‬‬ ‫)عضو تیم توسعه سیستم عامل ‪ Unix‬و سیستم عامل ‪ ،Plan9‬خالق کدینگ ‪ ،UTF-8‬خالق زبان برنامه نویسی ‪ ،Limbo‬خالق زبان برنامه نویسی ‪( .… ،Go‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪Richard Stallman‬‬ ‫)خالق پروژه ‪ ،GNU‬از توسعه دهندگان اولیه مجموعه کامپایلرهای ‪ ،GCC‬از توسعه دهندگان اولیه ‪ Emacs، GDB، Gmake‬و …‪( .‬‬

‫‪Linus Torvalds‬‬ ‫)خالق سیستم عامل ‪ ،Linux‬خالق ‪( .… ،Git‬‬

‫‪Rich Hickey‬‬ ‫)خالق زبان برنامه نویسی ‪( .… ، Clojure‬‬

‫‪Joe Armstrong‬‬ ‫)خالق زبان برنامه نویسی ‪ ،Erlang‬از طراحان پلتفرم ‪( .… ،OTP‬‬

‫‪Simon Peyton-Jones‬‬ ‫)از طراحان اصلی زبان برنامه نویسی ‪ ،Haskell‬توسعگ‌هدهنده ی اصلی کامپایلر ‪(.… ،GHC‬‬

‫‪Paul Graham‬‬ ‫تهایی مثل‬ ‫)خالق زبان برنامه نویسی ‪ ،Arc‬مؤسس شرکت ‪ – Y Combinator‬شرکتی که مولد سای گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫‪Scribd, reddit, Dropbox, Disqus‬‬

‫است…‪( .‬‬


‫‪Edsger Dijkstra‬‬ ‫)از بزرگترین محققان دنیای کامپیوتر وابدا کننده ی الگوریتم های تأثیر گذاری مثل الگوریتم معروف »دایکسترا« …‪( .‬‬

‫‪Alexander Stepanov‬‬ ‫)طراح اولیه کتابخانه ‪ STL‬در زبان ‪( .… ، C++‬‬

‫‪Luca Cardelli‬‬ ‫نهای ‪ OCaml، Haskell‬و ‪ F#‬می باشد‪ ،‬از طراحان زبان برنامه نویسی‬ ‫)نویسنده اولین کامپایلر زبان برنامه نویسی ‪ – ML‬زبان ‪ ML‬ریشه ی اصلی زبا گ‌‬ ‫‪( .… ، Modula-3‬‬ ‫یتوانید با ایمیل من تماس بگیرید‪.‬‬ ‫در صورت درخواست منبع برای هر کدام از این اسامی‪ ،‬م گ‌‬

‫سترین افراد در دنیای برنامگ‌هنویسی هستند؛ اگر هیچکدام از این افراد نظر خیلی‬ ‫نها سرشنا گ‌‬ ‫یتوان گفت که ای گ‌‬ ‫م گ‌‬ ‫یگرایی ندارند‪ ،‬پس شاید بد نباشد که کمی از وقت خود را به تحقیق در این رابطه اختصاص‬ ‫مثبتی نسبت به ش گ‌‬ ‫دهید!‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫ساختار رویه ای ‪ Go‬در برابر شی گرایی‬ ‫نهایی مثل‬ ‫طراحان ‪ Go‬بر این باورند که مدل شی گرایی در زبا گ‌‬

‫‪Java‬‬

‫و ‪ C#‬و ‪ C++‬پیچیدگی های زیادی‬

‫دارد‪ .‬و این پیچیدگی در زبان‪ ،‬باعث تولید کدهای پیچیده خواهد شد‪.‬‬ ‫‪ Go‬یک زبان رویه ای است )‪ ،(Procedural‬اما نه یک زبان رویه ایی کلسیک مانند ‪.C‬‬ ‫طراحان ‪ Go‬نوآوری های جالبی در ساختار کلسیک زبان های رویه ایی ایجاد کردگ‌هاند تا ‪ Go‬را به یک زبان رویه‬ ‫ای »مدرن« تبدیل کنند!‬ ‫نهای دیگر حس‬ ‫یگرایی مرسوم در زبا گ‌‬ ‫برنامه نویسان با کمک این ساختار رویه ایی مدرن‪ ،‬نیاز چندانی به آن ش گ‌‬ ‫نخواهند کرد‪ .‬در ادامه با تعدادی از ایدگ‌ههای جدید ‪ Go‬در این زمینه آشنا می شوید‪....‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫سها و اشیا ‪:‬‬ ‫ابتدا یک توضیح ساده درباره کل اه‌‬ ‫یتواند یک‬ ‫نهای برنامه نویسی روشی وجود دارد که برنامه نویس به کمک آن م گ‌‬ ‫در بیشتر زبا گ‌‬

‫‪Data Type‬‬

‫جدید ایجاد کند‪ Data Type .‬که به اختصار ‪ Type‬خوانده می شود‪ ،‬الگویی است که تعیین میکند یک »داده«‬ ‫چه ساختاری در حافظه خواهد داشت و چه عملیاتی میتوان روی آن انجام داد‪.‬‬ ‫شهای مختلفی برای ساخت یک‬ ‫نهای مختلف‪ ،‬رو گ‌‬ ‫زبا گ‌‬

‫‪Type‬‬

‫ل در زبان ‪ C‬از ‪ struct‬برای این‬ ‫ارایه کرده اند‪ .‬مث ب ً‬

‫نهای شی گرا هم ساختاری وجود دارد به نام‬ ‫منظور استفاده می شود‪) .‬با همراهی ‪ ( typedef‬در اکثر زبا گ‌‬

‫‪Class‬‬

‫که به برنامه نویس امکان ساخت یک ‪ Type‬جدید را میدهد‪.‬‬ ‫نهای شی گرا‪ ،‬یک‬ ‫در زبا گ‌‬

‫‪Type‬‬

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

‫»خصوصیات« و »رفتار« آن ‪ Type‬هستند‪.‬‬ ‫برای استفاده از یک ‪ ،Type‬باید یک »نمونه« از آن ‪ Type‬را در حافظه ایجاد کنید‪ .‬در زبان های شی گرا این‬ ‫»نمونگ‌هها« را اصطلحا ‪ Object‬یا »شی« می نامند‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬به جای ‪ Class‬از ‪ struct‬استفاده میکند‪:‬‬ ‫‪ Go‬هم مثل ‪ C‬از ‪ struct‬ها برای ساخت یک ‪ Type‬جدید استفاده میکند‪ .‬با این تفاوت که ‪ struct‬های‬

‫‪Go‬‬

‫یتواند علوه بر داشتن فیلد‪ ،‬دارای متد هم باشد‪.‬‬ ‫نسبت به ‪ C‬پیشرفته ترند‪ .‬یک ‪ struct‬در ‪ Go‬م گ‌‬ ‫متد ها در ‪ Go‬همان توابع معمولی هستند‪ .‬حتی داخل ‪ struct‬ها هم نوشته نمی شوند‪ .‬فقط لزم است با یک‬ ‫نها را به ‪ struct‬ها نسبت دهیم‪.‬‬ ‫تغییر کوچک به هنگام تعریفشان‪ ،‬آ گ‌‬ ‫دگ‌ر واقع با وجود داشتن چنین ‪ struct‬هایی در زبان ‪ ،Go‬شما نیازی به داشتن چیزی مثل‬

‫‪Class‬‬

‫ندارید! همان‬

‫کتر قابل انجام خواهد‬ ‫تتر و سب گ‌‬ ‫کارهایی که با ‪ Class‬ها قابل انجام است‪ ،‬با این ‪ struct‬های جدید خیلی راح گ‌‬ ‫بود‪.‬‬ ‫زبان برنامگ‌هنویسی ‪ Rust‬هم که در حال توسعه از طرف ‪ Mozilla‬است‪ ،‬با اینکه در نسخگ‌ههای اولیه خود دارای‬ ‫ساختار ‪ Class‬بود‪ ،‬اما در نسخه ی ‪ ، 0.4‬ساختار ‪ Class‬را از زبان حذف کرد و آن را با ‪ struct‬هایی مشابه‬ ‫چیزی که در ‪ Go‬وجود دارد جایگزین نمود‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬از ‪ Composition‬به جای »وراثت« استفاده میکند‪:‬‬ ‫‪ Java‬سعی کرد با حذف قابلیت »وراثت چندگانه« که در ‪ C++‬وجود داشت‪ ،‬باعث ساده شدن مکانیزم وراثت در‬ ‫ل با حذف وراثت‪ Composition ،‬را به جای آن جایگزین کرد‪.‬‬ ‫زبان شود‪ Go .‬یک قدم جلوتر رفت و ک ب ً‬ ‫یتواند ‪ A‬را مانند یک‬ ‫‪ Composition‬چیست؟ فرض کنید دو ‪ struct‬به نام های ‪ A‬و ‪ B‬تعریف کرده ایم‪ B .‬م گ‌‬ ‫فیلد معمولی در ‪ struct‬خود قرار دهد تا به اعضای موجود در ‪ A‬دسترسی داشته باشد‪.‬‬ ‫همان��د شیوه ی ‪ struct‬های تو در تو در زبان ‪ .C‬به این ترتیب بدون درگیر شدن با پیچیدگی های مبحث‬ ‫یتوانیم مکانیزمی شبیه آن را در کدهایمان داشته باشیم‪.‬‬ ‫وراثت‪ ،‬م گ‌‬ ‫نهای شی گرا از یک سیستم سلسله مرتبه ایی برای کار با اشیاء بهره می برند‪.‬‬ ‫یدانید که خیلی از زبا گ‌‬ ‫حتمب ًا م گ‌‬ ‫ل در بیشتر آن ها‪ ،‬یک شی ‪ Object‬وجود دارد و بقیه اشیاء همگی به طریقی از آن ارث می برند‪.‬‬ ‫مث ب ً‬ ‫در ‪ Go‬چنین چیزی وجود ندارد‪ .‬هر ‪ Type‬برای خودش مستقل است‪ .‬نیازی نیست کامپایلر در هر عمل کامپایل‬ ‫رابطه ی وراثت بین ‪ Type‬ها را چک کند‪ .‬یکی از دلیل اصلی سرعت کامپایلر ‪ Go‬نیز همین مساله است‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫بسازی در ‪ ،Go‬متوجه مزیت آن نسبت به وراثت‬ ‫اطمینان داشته باشید که خودتان هم با استفاده از قابلیت ترکی گ‌‬ ‫خواهید شد‪.‬‬ ‫حتی در کتاب‬

‫‪Design Patterns: Elements of Reusable Object-Oriented Software‬‬

‫ب مرجع در زمینه شی گرایی می باشد‪ ،‬عنوان شده که‪:‬‬ ‫از معروف ترین کت گ‌‬ ‫بسازی اشیاء را به وراثت ترجیح دهید«‬ ‫»ترکی گ‌‬ ‫"‪"Favor 'object composition' over 'class inheritance'.‬‬

‫کترین معنی ای بود که توانستم برای واژه ی ‪ composition‬در نظر بگیرم‪.‬‬ ‫بسازی نزدی گ‌‬ ‫پ‪.‬ن‪ :‬ترکی گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫که یکی‬


‫یتواند برای اعضا حق دسترسی تعیین کند‪:‬‬ ‫‪ Go‬م اه‌‬ ‫اگر نام یک عضو با حرف کوچک شرو ع شود )مثل ‪ ،(hello‬آن عضو فقط برای اعضای داخل ‪ Package‬در‬ ‫دسترس است‪.‬‬ ‫یتواند در محیط خارج از ‪ Package‬نیز در‬ ‫اگر نام یک عضو با حرف بزرگ شرو ع شود )مثل ‪ ،(Hello‬آن عضو م گ‌‬ ‫دسترس قرار گیرد‪.‬‬ ‫یتوان به سطح دسترسی آن پی برد‪.‬‬ ‫در این حالت فقط با یک نگاه به نام آن عضو‪ ،‬م گ‌‬ ‫دقت کنید که این روش فقط یک »استایل نام گذاری« نیست‪ .‬این یک »قانون« است‪ ،‬به این معنی که کامپایلر‬ ‫واقعا در زمان کامپایل این سطوح دسترسی را چک می کند‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬دارای ساختار ‪ interface‬است‪:‬‬ ‫‪interface‬‬

‫یگرا در ‪ Go‬حظور دارند‪.‬‬ ‫نهای ش گ‌‬ ‫تهای معرفی شده توسط زبا گ‌‬ ‫به عنوان یکی از بهترین قابلی گ‌‬

‫برنامگ‌هنویسان‬

‫‪Java‬‬

‫ل آشنایی دارند‪.‬‬ ‫و ‪ C#‬با ‪ interface‬ها کام ب ً‬

‫به زبان ساده‪ ،‬یک ‪ interface‬مشابه یک »سند قرارداد« است‪ .‬تمام ‪ Type‬هایی که به یک ‪ interface‬وابسته‬ ‫فاند از قراردادهایی که توسط آن ‪ interface‬تعریف شده تبعیت کنند‪ .‬بدین صورت آن‬ ‫هستند موظ گ‌‬

‫‪interface‬‬

‫تهای مختلف‪ ،‬به وکالت از تمام ‪ Type‬های وابسته به آن مورد استفاده قرار بگیرد‪) .‬به جای‬ ‫یتواند در موقعی گ‌‬ ‫م گ‌‬ ‫ن ‪ Type‬ها را جداگانه احظار کنید‪(.‬‬ ‫کتک آ گ‌‬ ‫اینکه ت گ‌‬ ‫یشود‪.‬‬ ‫در ‪ ،Go‬قرارداد بین یک ‪ Interface‬و ‪ Type‬های وابسته به آن‪ ،‬فقط شامل تعاریف متدها م گ‌‬ ‫تهای مهم‬ ‫نها به عنوان یکی از قابلی گ‌‬ ‫یباشند؛ آ گ‌‬ ‫‪ Interface‬ها نگرش اصلی زبان ‪ Go‬به مبحث ‪ Polymorphism‬م گ‌‬ ‫نها برای افراد‬ ‫یگیرند‪ .‬مطالعه و یادگیری آ گ‌‬ ‫زبان تلقی شده و به هنگام ساخت ‪ API‬ها بسیار مورد استفاده قرار م گ‌‬ ‫یشود‪.‬‬ ‫علقگ‌همند به زبان ‪ Go‬توصیه م گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یگرا حتمب ًا از‬ ‫درست است که ‪ Go‬چیزی تحت عنوان ‪ Class‬ندارد‪ ،‬اما اجباری نیست که برای نوشتن کدهای ش گ‌‬ ‫یگرا طراحی کنید‪ .‬این‬ ‫‪ Class‬ها استفاده کنید‪ .‬اجباری هم نیست که حتمب ًا برنامگ‌ههای خود را به صورت ش گ‌‬ ‫نهایی مثل‬ ‫مای است که امثال زبا گ‌‬ ‫توه گ‌‬

‫‪Java‬‬

‫و ‪ C#‬و ‪ C++‬به شما تلقین کردگ‌هاند‪.‬‬

‫یتوان گفت که‬ ‫یگرا را در اختیار شما قرار داده است‪ .‬حتی م گ‌‬ ‫تهای لزم برای برنامگ‌هنویسی ش گ‌‬ ‫‪ Go‬تمام قابلی گ‌‬ ‫تتر است‪.‬‬ ‫نهای دیگر سادگ‌هتر و راح گ‌‬ ‫یگرایی در ‪ Go‬به نسبت خیلی از زبا گ‌‬ ‫ش گ‌‬ ‫نهایی مثل‬ ‫مساله این است که دیدگاه ‪ Go‬نسبت به ساخت برنامگ‌هها‪ ،‬با دیدگاهی که در زبا گ‌‬

‫‪Java‬‬

‫یا ‪ C#‬با آن‬

‫نها یکی است‪ ،‬اما روش کارشان با یکدیگر فرق دارد‪.‬‬ ‫آشنا هستید متفاوت است‪ .‬هدف آ گ‌‬ ‫یگیرد‪ ،‬نه ‪ Class‬ها و متدها‪...‬‬ ‫برنامگ‌هنویسی در ‪ Go‬بر مبنای ‪ Type‬ها و توابع صورت م گ‌‬ ‫یگرایی‬ ‫تیافته در ابعاد وسیع‪ ،‬حتمب ًا باید به ش گ‌‬ ‫یکنند که برای نوشتن برنامگ‌ههای ساخ گ‌‬ ‫سازندگان ‪ Go‬فکر نم گ‌‬ ‫بتری هم وجود داشته باشد‪ .‬این دیدگاه شبیه همان نگرشی است که‬ ‫متوسل شد؛ شاید راگ‌ههای سادگ‌هتر و مناس گ‌‬ ‫یکنند‪.‬‬ ‫تهاست که آن را عنوان م گ‌‬ ‫یگرا مد گ‌‬ ‫نهای ش گ‌‬ ‫نهای ‪ Functional‬به عنوان قطب مخالف زبا گ‌‬ ‫زبا گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬یک زبان ‪ Static-Type‬است‬ ‫نهای ‪ Dynamic‬از سه مزیت عمده برخوردارند‪:‬‬ ‫نهای ‪ Static‬نسبت به زبا گ‌‬ ‫زبا گ‌‬ ‫‪‬‬

‫یشود‪ ،‬سرعت اجرای برنامه به مراتب‬ ‫نهای ‪ Static‬نو ع تمام دادگ‌هها از قبل مشخص م گ‌‬ ‫سرعت! چون در زبا گ‌‬ ‫نهای ‪ Dynamic‬نو ع داده ها به هنگام اجرا مشخص خواهد‬ ‫نهای ‪ Dynamic‬خواهد بود‪ .‬در زبا گ‌‬ ‫بالتر از زبا گ‌‬ ‫شد‪.‬‬

‫‪‬‬

‫نهای ‪ Static‬کامپایلر قادر است تمام دادگ‌هها و پارامترها را چک کند تا اگر برنامه نویس به‬ ‫امنیت! در زبا گ‌‬ ‫صورت سهوی متغیری را در جای اشتباهی به کار برده بود‪ ،‬قبل از کامپایل برنامه به او هشدار داده شود‪.‬‬

‫‪‬‬

‫نهای ‪ Dynamic‬نیاز به دقت بالیی دارد‪ .‬برای مثال باید نو ع‬ ‫مستندات! مستندسازی کدها در زبا گ‌‬ ‫پارامترهای یک تابع را در مستندات ذکر کنیم تا برنامگ‌هنویسان دیگر بدانند که قرار است چه نو ع داده ایی‬ ‫نهای ‪ Static‬نو ع هر پارامتر جزیی از خود کد است و برنامه نویس با یک‬ ‫را به تابع ارسال کنند‪ .‬اما در زبا گ‌‬ ‫یتواند اطلعات زیادی دربارگ‌هی آن بدست آورد‪.‬‬ ‫نگاه ساده به نحوگ‌هی تعریف تابع م گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یکنند‪ ،‬یک عیب بزرگ نیز دارند‪ :‬اینکه ‪ Static‬هستند!!‬ ‫نهای ‪ Static‬ارائه م گ‌‬ ‫جدای از مزایایی که زبا گ‌‬ ‫درست است‪ Static ،‬بودن یک زبان شبیه چاقوی دولبه است‪ .‬مزیت اصلی آن‪ ،‬همان عیب آن است‪.‬‬ ‫یدانند که‬ ‫نهای ‪ Dynamic‬به خوبی م گ‌‬ ‫نها باید مدام با ‪ Type‬ها سر و کله بزنید‪ .‬برنامه نویسان زبا گ‌‬ ‫در این زبا گ‌‬ ‫یشان تأثیر دارد‪.‬‬ ‫‪ Dynamic‬بودن زبان دلخواهشان‪ ،‬تا چه میزانی در سرعت کدنویس گ‌‬ ‫ل اگر‬ ‫یدهیم تشخیص دهد‪ .‬مث ب ً‬ ‫یتواند ‪ Type‬یک متغیر را از روی مقداری که به آن نسبت م گ‌‬ ‫خوشبختانه ‪ Go‬م گ‌‬ ‫عدد ‪ 12‬را در متغیر ‪ A‬بریزیم‪ Go ،‬متغیر ‪ A‬را از نو ع ‪ int‬فرض خواهد کرد‪ .‬این قابلیت شبیه سیستم‬ ‫‪ inference‬در زبان‬

‫‪Haskell‬‬

‫‪Type‬‬

‫است‪.‬‬

‫یشوید که‬ ‫وقتی چنین سیستم تشخیص ‪ Type‬ای را با مدل سادگ‌ه و سریع کامپایل برنامگ‌هها ادغام کنید‪ ،‬متوجه م گ‌‬ ‫نهای ‪ Dynamic‬خواهد بود‪.‬‬ ‫سرعت کدنویسی شما قابل رقابت با سرعت کدنویسی در زبا گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫نهای پایگ‌های و کامپایلری ‪ --‬و کمبود های ‪ C‬رو جبران‬ ‫»من فکر میکنم این )زبان ‪ (Go‬به سنت ‪ Unix‬و ‪ C‬برگشته ‪ --‬برگشتی به زبا گ‌‬ ‫کرده‪ ،‬من فکر نمیکنم که ‪ C++‬یک پیشرفت در این زمینه بوده باشه‪ ،‬اما معتقدم که ‪ Go‬قطعب ًا یک پیشرفت برای زبان ‪ C‬به حساب میاد‪ .‬و از‬ ‫طرفی هم این افراد در گذشته با آدم هایی مثل ‪ Kernighan‬و امثال اون کار میکردن و اطمینان دارم که تجربه ی بسیار بالیی در ساخت‬ ‫نهای برنامه نویسی دارن‪ .‬این زبان خیلی ظریفانه مهندسی شده و از اول خیلی از ابزارهایی که احتیاج دارید در اون وجود داره‪ .‬حتی‬ ‫زبا گ‌‬ ‫لها در حال توسعه بوده‪ .‬خلصه بگم که زبان خیلی‬ ‫اولین نسخه ایی هم که ازش منتشر شد در سطحی از تکامل قرار داشت که انگار سا گ‌‬ ‫جالبیه‪«...‬‬ ‫‪Joe Armstrong‬‬ ‫خالق زبان برنامه نویسی ‪ Erlang‬و پلتفرم ‪OTP‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬و ‪Concurrency‬‬ ‫تها و منابع‪ ،‬تعریف درست و قابل‬ ‫قبل از هر چیز‪ ،‬نیاز داریم این مفاهیم را تعریف کنیم‪ .‬متأسفانه خیلی از سای گ‌‬ ‫فهمی از ‪ Concurrency‬و ‪ Parallelism‬ارایه نکرده اند و درک این مفاهیم را برای خیلی از برنامه نویسان مشکل‬ ‫ساخته اند‪.‬‬ ‫یشویم‪:‬‬ ‫در ادامه با تعریف ‪ Rob Pike‬از این مفاهیم آشنا م گ‌‬ ‫‪ : Concurrency‬برنامه نویسی بر مبنای مجموعه ای از واحدهای اجرایی مستقل‪ ،‬که هدف مشترکی دارند‪.‬‬ ‫‪ : Parallelism‬توانایی اجرای چندین پردازش به صورت موازی‪ ،‬با هدف دستیابی به سرعتی بالتر‪.‬‬ ‫‪ Concurrency‬مدلی برای ساخت یک برنامه است‪ ،‬اما ‪ Parallelism‬مدلی برای اجرای برنامه هاست‪.‬‬ ‫‪ Concurrency‬در فاز ساخت برنامه اعمال می شود‪ ،‬اما ‪ Parallelism‬در زمان اجرای برنامه اتفاق می افتد‪.‬‬ ‫در ‪ Concurrency‬واحدهای اجرایی مستقل از یکدیگرند‪ ،‬ولی هدف مشترکی دارند‪.‬‬ ‫ش دو برنامگ‌هی جداگانه(‬ ‫در ‪ Parallelism‬پردازش ها ممکن است هیچ ربطی به هم نداشته باشند‪) .‬مثل پرداز ِ‬ ‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Concurrency‬اجرای ‪ Parallel‬واحدهای اجرایی را تضمین نمی‌کند! ممکن است برنامه ی شما‬

‫‪Concurrent‬‬

‫باشد اما اجزایش به طور ‪ Parallel‬اجرا نشوند ) مثل ‪ Concurrency‬در ‪ .( Python‬مهم این است که ساختار‬ ‫برنامه به صورت ‪ Concurrent‬نوشته شده باشد‪.‬‬ ‫یکند که در صورت وجود بستر سخت افزاری و نرم افزاری‬ ‫‪ Concurrency‬ساختاری را برای برنامه محیا م گ‌‬ ‫مناسب‪ ،‬اجزای مختلف برنامه بتوانند به شکل ‪ Parallel‬پردازش شوند‪.‬‬ ‫به عبارت دیگر‪ ،‬اگر برنامه ای به صورت ‪ Concurrent‬ساخته نشود‪ ،‬به صورت ‪ Parallel‬اجرا نخواهد شد!‬ ‫البته ‪ Load‬کردن چندین نمونه از یک برنامه در حافظه برای انجام پردازش ‪ Parallel‬مبحث جداگانه ایست که ربطی به بحث فعلی ندارد‪.‬‬

‫هر برنامه نویس هم ممکن است به شیوه ی متفاوتی ‪ Concurrency‬را در ساختار برنامگ‌هاش اعمال کند‪ .‬قانون‬ ‫ثابتی برای طراحی برنامگ‌ههای ‪ Concurrent‬وجود ندارد‪.‬‬ ‫لزم به ذکر است که برای دستیابی به پردازش ‪ ،Parallel‬حتمب ًا باید بیش از یک هسته ی ‪ CPU‬در دسترس باشد‬ ‫تا پردازش ‪ Parallel‬به شکل واقعی اتفاق بیفتد‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫مهای توزیع شده‪ ،‬و نیاز وب‬ ‫لهای اخیر با گسترش استفاده از پردازنده های چند هسته ایی‪ ،‬سیست گ‌‬ ‫��ر سا گ‌‬ ‫خگو بودن به تعداد بالیی از درخواست ها‪ ،‬وجود بستری مناسب برای برنامه نویسی‬ ‫سرویس ها برای پاس گ‌‬ ‫ل قابل احساس است‪.‬‬ ‫»همروند« ) ‪ ( Concurrent‬کام ب ً‬ ‫عگرا« ) ‪ ( Functional‬که به طور ذاتی برنامه نویسی ‪ Concurrent‬را به شما تلقین می‬ ‫نهای »تاب گ‌‬ ‫در این بین‪ ،‬زبا گ‌‬ ‫کنند ) توضیح در این باره خارج از بحث این نوشته است(‪ ،‬در این زمینه پیش افتاده اند و هر روز بر‬ ‫نهایی مثل ‪ Erlang‬و ‪ Haskell‬و ‪ Clojure‬و …‪.‬‬ ‫تشان افزوده می شود‪ .‬زبا گ‌‬ ‫محبوبی گ‌‬ ‫نها هنوز هم به‬ ‫شهایی کرده اند‪ ،‬اما اکثر آ گ‌‬ ‫نهای »دستوری« ) ‪ ( Imperative‬هم هر کدام در این راستا تل گ‌‬ ‫زبا گ‌‬ ‫طور مستقیم از ‪ Thread‬ها و ‪ Process‬ها استفاده میکنند‪.‬‬ ‫نها‬ ‫درست است که مبنای کار همگ‌هی پردازش ها درنهایت بر پایه ی ‪ Thread‬ها و ‪ Process‬ها خواهد بود‪ ،‬اما ای گ‌‬ ‫نها برای پیادگ‌هسازی‬ ‫یشوند و استفاده ی مستقیم از آ گ‌‬ ‫جزو مفاهیم سطح پایین یک سیستم عامل محسوب م گ‌‬ ‫‪ Concurrency‬بسیار بسیار دشوار است و در عمل بهینگی لزم را ندارد‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یرسد استفاده از تکنیک عملیات ناهمگام ) ‪ ( Asynchronous‬تا حدودی به روند ساخت برنامگ‌ههای‬ ‫به نظر م گ‌‬ ‫نها کمک کرده و بهینگی لزم را برای آنان فراهم نموده است‪.‬‬ ‫‪ Concurrent‬در این زبا گ‌‬ ‫کتابخانگ‌ههایی مثل ‪ gevent‬در ‪ Python‬یا محیط های همچون ‪ node.js‬برای‬

‫‪Javascript‬‬

‫از نمونگ‌ههای موفق در‬

‫بکارگیری تکنیک عملیات ‪ Asynchronous‬می باشند‪ .‬با اینکه چنین فریم ورک هایی از استقبال بسیار خوبی‬ ‫برخوردار شده اند‪ ،‬اما راه حل جامعی برای برنامه نویسی ‪ Concurrent‬به حساب نمی آید‪.‬‬ ‫حقیقت این است که عملیات ‪ Asynchronous‬برای گونه ی خاصی از برنامگ‌هها که رخدادهای‬

‫‪I/O‬‬

‫در مقیاس بال‬

‫یافتند بسیار خوب عمل میکند )مثل وب سرورها( اما وقتی صحبت از پردازش های سنگین‬ ‫نها اتفاق م گ‌‬ ‫در آ گ‌‬ ‫یشود‪ ،‬مدل ‪ Asynchronous‬راه حل مناسبی ارایه نمی کند‪.‬‬ ‫م گ‌‬ ‫در مدل‬

‫‪Asynchronous‬‬

‫اگر قسمتی از برنامه نیاز به پردازش طولنی مدت داشته باشد‪ ،‬بقیه اجزا باید منتظر‬

‫بمانند تا کار آن قسمت تمام شود؛ چرا که تمام اجزای برنامه فقط در »یک« ‪ Thread‬پردازش می شود‪ .‬از همین‬ ‫رو پردازش ها باید بسیار کوچک و گذرا تعریف شوند‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یرسد یک پیاگ‌هسازی مناسب از قابلیت ‪ Concurrency‬باید دارای خصوصیات زیر باشد‪:‬‬ ‫با توضیحات بال به نظر م گ‌‬ ‫‪‬‬

‫پیادگ‌هسازی ‪ Concurrency‬باید ساده و آسان باشد‪.‬‬

‫‪‬‬

‫پیادگ‌هسازی ‪ Concurrency‬باید بهینه و سبک باشد‪.‬‬

‫‪‬‬

‫پیادگ‌هسازی ‪ Concurrency‬باید تا جایی که ممکن است همه منظوره باشد‪.‬‬

‫خوشبختانه یکی از دلیل اصلی ساخت زبان ‪ Go‬پشتیبانی قدرتمند از برنامگ‌هنویسی ‪ Concurrent‬بوده است‪ .‬این‬ ‫زبان نه به صورت یک »کتابخانه« و نه به صورت یک قابلیت جانبی‪ ،‬بلکه به صورت درونی از‬

‫‪Concurrency‬‬

‫یکند‪ .‬حتی دارای یک سینتکس مخصوص برای این کار است!‬ ‫پشتیبانی م گ‌‬ ‫‪ Go‬چنین بستری را مدیون تجربه ی سی ساله ی ‪ Rob Pike‬در زمنیه ی طراحی سیستم عامل ها و زبان های‬ ‫‪ Concurrent‬است‪ .‬هر چه باشدگ‌‪ ،‬کار این افراد در گذشته )و در حال( ساخت و طراحی سیستم عامل بوده است‪.‬‬ ‫از آنجایی که برنامگ‌هنویسی ‪ Concurrent‬در ‪ Go‬اهمیت زیادی دارد‪ ،‬طراحان زبان یک قابلیت منحصربه فرد را‬ ‫برای این منظور در زبان جاسازی کرده اند‪.....‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪goroutines‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫اگر یادتان باشد گفتیم که‬

‫‪Concurrency‬‬

‫یعنی برنامه نویسی بر مبنای مجموعه ای از واحدهای اجرایی‬

‫مستقل‪ ،‬اما نگفتیم منظورمان از »واحد اجرایی مستقل« چیست‪ .‬دگ‌ر واقع‪ ،‬هر زبانی دیدگاه خاص خودش را به‬ ‫این مفهوم دارد‪.‬‬ ‫در زبان ‪ Go‬ساختاری به اسم‬ ‫یک‬

‫‪goroutine‬‬

‫‪goroutine‬‬

‫دگ‌ر واقع همانند یک‬

‫بیانگر این واحد اجرایی مستقل است‪.‬‬

‫‪Coroutine‬‬

‫نها بی دلیل نیست‪ .‬اما قبل از هر چیز‪،‬‬ ‫است و تشابه اسمی آ گ‌‬

‫توضیح کوتاهی داشته باشیم برای افرادی که با ‪ Coroutine‬ها آشنایی ندارند‪:‬‬ ‫یشود‪ ،‬اجرای آن تابع تا زمانی که کارش به طور کامل به پایان‬ ‫نهای برنامه نویسی وقتی یک تابع اجرا م گ‌‬ ‫در زبا گ‌‬ ‫نرسیده و یا مقداری از آن برگشت داده نشده ادامه خواهد داشت‪ Coroutine .‬تابعی است که می تواند اجرایش را‬ ‫در میانه ی راه متوقف کند و به حالت ‪ Standby‬برود!‬ ‫ل متوقف شده بود ادامه پیدا می کند‪ .‬این‬ ‫بعد ها اگر دوباره به این تابع بازگشتیم‪ ،‬اجرای تابع از جایی که قب ب ً‬ ‫نها سوییچ کند‪.‬‬ ‫یسازد تا ‪ Coroutine‬ها را زمانبندی نماید و یا بین آ گ‌‬ ‫قابلیت برنامه نویس را قادر م گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫رمز کار در این است که علوه بر داشتن یک ‪ Stack‬سراسری برای نگگ‌هداری وضعیت کلی برنامه‪ ،‬برای هر‬ ‫یشود تا ‪ Coroutine‬بتواند وضعیت فعلی خود را به هنگام سوییچ‬ ‫‪ Coroutine‬نیز یک ‪ Stack‬جداگانه ساخته م گ‌‬ ‫شدن در آن ذخیره کند‪.‬‬ ‫یک ‪ Coroutine‬بسیار شبیه یک ‪ Thread‬است‪ .‬وقتی سیستم عامل از یک ‪ Thread‬به ‪ Thread‬دیگری سوییچ‬ ‫یبرد تا وقتی دوباره به آن برگشت آن ‪ Thread‬قادر به ادامه‬ ‫می کند‪ Thread ،‬قبلی را به حالت ‪ Standby‬فرو م گ‌‬ ‫یزنند چرا که‬ ‫ی اجرایش باشد‪ .‬برای همین است که گاهی ‪ Coroutine‬ها را با نام ‪ Green Thread‬هم صدا م گ‌‬ ‫نها بسیار شبیه‬ ‫رفتار آ گ‌‬ ‫‪Coroutine‬‬

‫‪Thread‬‬

‫هاست‪.‬‬

‫نهای‬ ‫نهایی مثل ‪ Python , Ruby, Lua, Perl, Scheme, Haskell, Erlang‬و خیلی زبا گ‌‬ ‫ها در زبا گ‌‬

‫دیگر وجود دارند‪ ،‬هرچند که ممکن است با اسم متفاوتی ظاهر شوند‪.‬‬ ‫برای مثال در ‪ Python‬با نام ‪ ، Greenlet‬در ‪ Ruby‬با نام‬

‫‪Fiber‬‬

‫‪ ،‬و یا در ‪ Erlang‬با نام‬

‫‪Lightweight Process‬‬

‫نها سلیقگ‌هی خاص خودشان را در پیادگ‌هسازی ‪ Coroutine‬ها اعمال‬ ‫شناخته می شوند‪ .‬البته هر کدام از این زبا گ‌‬ ‫کرده اند‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Coroutine‬ها چندین فرق اساسی با ‪ Thread‬ها دارند‪:‬‬ ‫‪‬‬

‫عمل زمانبندی و سوییچ کردن بین ‪ Thread‬ها به صورت اتوماتیک و توسط سیستم عامل انجام می شود‪.‬‬ ‫اما در مورد ‪ Coroutine‬ها خود برنامه نویس باید به صورت دستی زمانبندی و کنترل اجرای‬

‫‪Coroutine‬‬

‫ها را مدیریت کند‪.‬‬ ‫‪‬‬

‫یشود و‬ ‫از آنجایی که ‪ Coroutine‬ها دگ‌ر واقع نوعی از توابع هستند‪ ،‬قالبا در داخل »یک« ‪ Thread‬اجرا م گ‌‬ ‫یتوانند براحتی‬ ‫به همین خاطر قادر نیستند از چندین هستگ‌هی پردازنده استفاده کنند‪ .‬اما ‪ Thread‬ها م گ‌‬ ‫روی هستگ‌ههای مختلف پخش شوند‪.‬‬

‫‪‬‬

‫‪ Coroutine‬ها در لیهگ‌ی کاری خود زبان برنامه نویسی مثل سیستم ‪ Runtime‬یا ‪ VM‬آن زبان اجرا و‬ ‫یشود‪.‬‬ ‫مدیریت می شوند‪ .‬اما ‪ Thread‬ها در لیهگ‌ی کاری سیستم عامل اجرا و مدیریت م گ‌‬

‫‪‬‬

‫چون ‪ Coroutine‬ها نوعی از توابع معمولی هستند و در لیهگ‌ی کاری زبان برنامه نویسی اجرا می شوند‪،‬‬ ‫نها دگ‌هها و شاید هم صدها برابر سریعتر و بهینگ‌هتر از‬ ‫نها در حافظه و یا سوییچ کردن بین آ گ‌‬ ‫پس اجرای آ گ‌‬ ‫‪ Thread‬هاست!‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یک ‪ goroutine‬دگ‌ر واقع پیادگ‌هسازی منحصر به فرد زبان ‪ Go‬از ‪ Coroutine‬هاست که به عنوان واحد اصلی‬ ‫‪ Concurrency‬در این زبان جاسازی شده است‪ .‬در ادامه با خصوصیات‬ ‫‪‬‬

‫یگیرد و در لیهگ‌ی خود زبان )سیستم ‪( Runtime‬‬ ‫اجرای ‪ goroutine‬ها در لیهگ‌ی سیستم عامل صورت نم گ‌‬ ‫مدیریت می شود‪.‬‬

‫‪‬‬

‫) البته وظیفگ‌هی اجرای ‪ grotoutine‬ها در لیگ‌هگ‌ی سیستم عامل به عهدگ‌هی ‪ Thread‬هاست(‬

‫یشود و این مسئولیت از‬ ‫زمانبندی ‪ goroutine‬ها به طور اتوماتیک توسط سیستم ‪ Runtime‬زبان انجام م گ‌‬ ‫دوش برنامه نویس برداشته شده است‪.‬‬

‫‪‬‬

‫‪goroutine‬‬

‫یشوید‪:‬‬ ‫ها آشنا م گ‌‬

‫)زمانبندی تقریبا ‪( Preemptive‬‬

‫یتواند ‪ goroutine‬ها را روی چندین ‪ Thread‬پخش کند و چون ‪ Thread‬ها نیز‬ ‫سیستم ‪ Runtime‬م گ‌‬ ‫یافتد‪.‬‬ ‫یتوانند روی هستگ‌ههای مختلف ‪ CPU‬پخش شوند‪ ،‬پس اجرای واقعی ‪ Parallel‬اتفاق م گ‌‬ ‫م گ‌‬

‫‪‬‬

‫سیستم ‪ Runtime‬در ‪ Go‬فقط مسئول کنترل ‪ goroutine‬ها در یک ماشین است‪ .‬یعنی یک ماشین با‬ ‫شهای ‪ Distributed‬باید توسط خود برنامگ‌هنویس طراحی‬ ‫چند ‪ ، CPU‬یا یک ‪ CPU‬چند هسته ای‪ .‬پرداز گ‌‬ ‫شود‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪‬‬

‫‪ goroutine‬ها بسیار سبک و بهینه هستند‪ .‬در کامپیوتری که ممکن است با ایجاد ‪ 1000‬عدد‬ ‫شفرض ‪ Stack‬برای هر‬ ‫یتوان ‪ 1,000,000‬عدد ‪ goroutine‬را اجرا کرد! سایز پی گ‌‬ ‫کرش کند‪ ،‬م گ‌‬

‫‪Thread‬‬

‫‪goroutine‬‬

‫فقط ‪ 4kB‬است!‬ ‫‪‬‬

‫‪ goroutine‬ها بلک نمی شوند‪ .‬اگر در یک ‪ goroutine‬عملیات بلک شونده ی ‪ I/O‬صورت بگیرد‪ ،‬بقیه‬ ‫‪ goroutine‬ها در ‪ Thread‬دیگری به اجرای خودشان ادامه می دهند‪.‬‬

‫‪‬‬

‫در جایی هم که ممکن باشد‪ ،‬سیستم ‪ Runtime‬خود به خود از عملیات ‪ Asynchronous‬برای رخدادهای‬ ‫‪ I/O‬استفاده میکند!!! شما نیاز نیست با مدل برنامگ‌هنویسی ‪ Asynchronous‬درگیر شوید!!‬

‫‪goroutine ‬‬

‫یکنند و به این شیوه قادرند‬ ‫ها بر مبنای سیستم انتقال پیام ) ‪ ( Message Passing‬کار م گ‌‬

‫با یکدیگر در ارتباط باشند‪ .‬در ‪ Go‬پیاگ‌مها توسط ‪ channel‬ها که در واقع همان کانال های ارتباطی بین‬ ‫یشوند‪.‬‬ ‫‪ goroutine‬ها هستند رد و بدل م گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪‬‬

‫یافتد‪ .‬یعنی پیام فقط زمانی‬ ‫شفرضگ‌‪ ،‬عمل انتقال پیام در ‪ Go‬به شکل ‪ Synchronous‬اتفاق م گ‌‬ ‫به صورت پی گ‌‬ ‫یشود که فرستنده و گیرنده هر دو آماده باشند‪ .‬این قضیه باعث سادگ‌هتر شدن برنامگ‌هنویسی می‬ ‫فرستاده م گ‌‬ ‫یتوانید عمل انتقال پیام را به شکل ‪ Asynchronous‬نیز انجام دهید‪.‬‬ ‫شود‪ .‬البته در صورت لزوم م گ‌‬

‫‪‬‬

‫‪ Channel‬های ‪ Go‬مانند خود زبان ‪ Static Type‬هستند‪ .‬اگر یک ‪ channel‬تعیین کند که قرار است فقط‬ ‫دادگ‌ههای ‪ int‬را ردو بدل کند‪ ،‬دادگ‌هی دیگری از آن نخواهد گذشت‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫احتماب ًل متوجه شباهت ‪ goroutine‬های‬

‫‪Go‬‬

‫و ‪ Lightweight Process‬های ‪ Erlang‬شده اید‪ .‬البته این دو‬

‫تهای پایگ‌های بسیاری با یکدیگر دارند‪ goroutine .‬ها بر مبنای مدل‬ ‫جدای از شباهت ظاهر��‪ ،‬تفاو گ‌‬

‫‪CSP‬‬

‫پیادگ‌هسازی شدگ‌هاند در حالی که ‪ Lightweight Process‬ها بر مبنای مدل ‪ Actor‬توسعه پیدا کردگ‌هاند‪.‬‬ ‫مهمترین تفاوت مدل ‪ CSP‬و مدل ‪ Actor‬به شرح زیر است‪:‬‬ ‫‪‬‬

‫یباشند‪.‬‬ ‫در مدل ‪ CSP‬واحدهای اجرایی بی نام هستند در حالی در مدل ‪ Actor‬دارای شناسه م گ‌‬

‫‪‬‬

‫یگیرد در حالی که در مدل ‪ Actor‬به شکل‬ ‫ارسال پیاگ‌م در مدل ‪ CSP‬به شکل ‪ Synchronous‬انجام م گ‌‬ ‫یافتد‪.‬‬ ‫‪ Asynchronous‬اتفاق م گ‌‬

‫‪‬‬

‫یگیرد ولی در مدل ‪ Actor‬مستقیم و بدون واسطه‬ ‫ارسال پیام در مدل ‪ CSP‬به کمک ‪ Channel‬ها انجام م گ‌‬ ‫است‪.‬‬

‫لها مزایا و معایب خودشان را دارند‪ .‬همچنین باید دقت داشت که ‪ Go‬مانند ‪ Erlang‬یک زبان‬ ‫هر کدام از این مد گ‌‬ ‫‪ Functional‬نیست و از ساختارهای ‪ Immutable‬استفاده نمی کند‪ ،‬پس لزم است برنامه نویس کمی بیشتر در‬ ‫ساخت برنامگ‌ههای ‪ Concurrent‬محتاط باشد!‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Rob Pike‬در یک ویدیو آموزشی در ‪ Youtube‬به نام‬

‫‪Go Concurrency Patterns‬‬

‫مثالی جالب از توانایی‬

‫‪ goroutine‬ها را به همگان نشان داد‪ .‬او کدی نوشته بود که صدهزار ‪ goroutine‬را در حافظه ایجاد میکرد‪.‬‬ ‫سپس یک عدد‬

‫‪int‬‬

‫یچرخید و هر ‪ goroutine‬هم یک واحد به آن عدد‬ ‫تبگ‌هدست م گ‌‬ ‫بین این ‪ goroutine‬ها دس گ‌‬

‫یکرد‪.‬‬ ‫اضافه م گ‌‬ ‫دقت کنید که برنامه کامپایل نشده بود‪ .‬بنابراین وقتی ‪ Pike‬دکمگ‌هی ‪ Run‬را فشار میداد‪ ،‬برنامه باید کامپایل‬ ‫میشد‪ ،‬لینک میشد‪ ،‬در حافظه اجرا میشد‪ ،‬و جواب اجرا برگشت داده میشد‪ ....‬کل این پروسه فقط یک ثانیه به‬ ‫طول انجامید!!!‬ ‫احتماب ًل اجرای یک برنامگ‌هی ‪ Hello World‬در‬

‫‪Java‬‬

‫یا‬

‫‪C#‬‬

‫که از قبل هم کامپایل شده باشد‪ ،‬ممکن است بیشتر‬

‫یکند‪(-; .‬‬ ‫از یک ثانیه به طول انجامد! این حرف جنبگ‌هی شوخی داشت و از نظر علمی چیزی را ثابت نم گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫تهای ‪Functional‬‬ ‫‪ Go‬و قابلی ه‌‬ ‫ت و پا کردگ‌هاند‪.‬‬ ‫نهای ‪ Functional‬از سایه بیرون آمدگ‌هاند و محبوبیت خوبی برای خود دس گ‌‬ ‫لها اخیر زبا گ‌‬ ‫در سا گ‌‬ ‫نهای ‪ Functional‬شکل گرفته‬ ‫مخصوصب ًا بعد از معرفی مدل ‪ MapReduce‬از طرف گوگل که با الهام گیری از زبا گ‌‬ ‫بود‪ ،‬و همچنین رایج شدن ‪ CPU‬های چند هستگ‌هایی و نیاز به بستری مناسب برای ‪ Concurrency‬و پیشرو بودن‬ ‫نها معطوف شده است‪.‬‬ ‫نهای ‪ Functional‬در این زمینه‪ ،‬توجه همه به آ گ‌‬ ‫زبا گ‌‬ ‫نهای ‪ Functional‬حظور دارند‪.‬‬ ‫یباشند و تقریبب ًا در تمام زبا گ‌‬ ‫نهای ‪ Functional‬م گ‌‬ ‫توابع )(‪ map‬و )(‪ reduce‬از توابع اساسی زبا گ‌‬

‫نهای‬ ‫نهای غیر ‪ Functional‬مثل ‪ Python‬و ‪ Ruby‬و ‪ Javascript‬و … هم با اینکه جزو زبا گ‌‬ ‫حتی زبا گ‌‬

‫‪Functional‬‬

‫نهای ‪ Functional‬را ارایه نکنند‪.‬‬ ‫یهای زبا گ‌‬ ‫یآیند اما دلشان نیامده تا بعضی از ویژگ گ‌‬ ‫به حساب نم گ‌‬ ‫‪ Go‬یک زبان سیستمی است؛ یعنی هرچقدر هم که ساده باشد‪ ،‬باید همانند ‪ C‬جنبگ‌ههای سطح پایین خود را‬ ‫حفظ کند‪ .‬نباید انتظار داشت که چنین زبانی گرایش ‪ Functional‬داشته باشد‪ .‬اما طراحان ‪ Go‬ترجیح دادگ‌هاند‬ ‫که کمی هم چاشنی ‪ Functional‬به زبان اضافه کنند‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یتوان‪:‬‬ ‫یآیند )‪ .( First-Class‬یعنی م گ‌‬ ‫در ‪ ، Go‬توابع جزو اعضای درجه اول زبان به حساب م گ‌‬ ‫‪‬‬

‫یک تابع را همانند مقادیر معمولی به عنوان آرگومان به توابع دیگر ارسال کرد‪،‬‬

‫‪‬‬

‫یک تابع را به عنوان جواب خروجی از تابع دیگر برگشت داد‪،‬‬

‫‪‬‬

‫یک تابع را به یک متغیر نسبت داد؛ به همان صورتی که یک عدد را به یک متغیر ‪ int‬نسبت میدهیم‪.‬‬

‫ینام )‪ ( Anonymous functions‬است‪ .‬توابع ‪ Anonymous‬توابعی‬ ‫‪ Go‬همچنین دارای قابلیت استفاده از توابع ب گ‌‬ ‫یتوانند به صورت »لحظگ‌های« تولید شوند و مورد استفاده قرار بگیرند؛ یعنی نیازی نیست که مانند‬ ‫هستند که م گ‌‬ ‫نها را در جایی از کدهایتان تعریف کرده باشید‪ .‬این توابع خصوصا هنگام کار با‬ ‫توابع معمولی از قبل آ گ‌‬ ‫یشوند‪.‬‬ ‫‪ goroutine‬ها بسیار مفید واقع م گ‌‬ ‫وقتی زبانی دارای توابع ‪ First-Class‬باشد‪ ،‬و امکان تعریف توابع ‪ Anonymous‬را هم داشته باشد‪ ،‬یعنی‬

‫‪Closure‬‬

‫ها نیز در آن زبان حظور دارند‪ .‬کار ‪ Closure‬ها بر مبنای توابع تو در تو استوار است‪ .‬ممکن است برنامگ‌هنویسانی‬ ‫نهای ‪ Functional‬آشنایی دارند با ‪ Closure‬ها آشنا نباشند‪ .‬پس بهتر است کمی درباره‬ ‫که کمتر با زبا گ‌‬ ‫ها توضیح دهیم‪...‬‬ ‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫‪Closure‬‬


‫توضیح درباره ‪ Closure‬ها ‪:‬‬ ‫یروند‪ .‬در‬ ‫یشوند پس از اتمام اجرای آن تابع از بین م گ‌‬ ‫به حالت معمول فیلدهایی که داخل یک تابع تعریف م گ‌‬ ‫یتواند یک تابع دیگر باشد؛ به همان صورتی‬ ‫نها ‪ First-Class‬هستند‪ ،‬خروجی یک تابع م گ‌‬ ‫نهایی که توابع در آ گ‌‬ ‫زبا گ‌‬ ‫که ممکن است یک عدد ‪ int‬به عنوان خروجی در نظر گرفته شود‪.‬‬ ‫یدهد‪ .‬مسلما‬ ‫فرض کنیم تابعی داریم به نام ‪ Outer‬که یک زیرتابع به اسم ‪ Inner‬را به عنوان خروجی برگشت م گ‌‬ ‫وقتی که تابع‬

‫‪Outer‬‬

‫یگردد‪ .‬در چنین‬ ‫یدهد‪ ،‬اجرای تابع ‪ Outer‬تمام شده قلمداد م گ‌‬ ‫تابع ‪ Inner‬را برگشت م گ‌‬

‫حالتی باید تمام فیلدها و اطلعات تابع ‪ Outer‬از بین برود‪.‬‬ ‫اما اگر تابع ‪ Inner‬که به عنوان خروجی برگشت داده شده‪ ،‬از فیلدهای تابع ‪ Outer‬استفاده کرده باشد‪ ،‬آن‬ ‫یتواند حتی بعد از اتمام کار‬ ‫فیلدها تا زمان زنده بودن تابع ‪ Inner‬از بین نخواهند رفت! بنابراین تابع ‪ Inner‬م گ‌‬ ‫یتواند برای استفادگ‌هی داخلی خودش‪،‬‬ ‫تابع ‪ Outer‬هم از فیلدهای آن استفاده کند‪ .‬تابعی مانند ‪ Inner‬که م گ‌‬ ‫یشود‪.‬‬ ‫دادگ‌ههایی از خارج را به خود وابسته سازد‪ Closure ،‬نامیده م گ‌‬ ‫درک بهتر ‪ Closure‬ها به کمی زمان و تمرین نیاز دارد؛ اما بدانید که اگر با کتابخانگ‌هایی مثل‬ ‫یکنید‪ ،‬احتماب ًل دگ‌هها بار بدون اینکه خودتان متوجه شوید از ‪ Closure‬ها استفاده کردگ‌هاید!‬ ‫م گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫‪jQuery‬‬

‫کار‬


‫کتابخانه استاندارد‪ ،‬مستندات‪ ،‬ابزارها‬ ‫نهای برنامگ‌هنویسی است‪ .‬از‬ ‫عترین کتابخانگ‌ههای موجود در بین تمام زبا گ‌‬ ‫کتابخانگ‌هی استاندارد ‪ Go‬یکی از جام گ‌‬ ‫طرفی چون ‪ Go‬یک زبان نوظهور است‪ ،‬طراحی کتابخانگ‌ه در حالت بسیار تمیز و یکپارچگ‌های قرار دارد‪.‬‬ ‫‪ Package‬هایی برای آرشیو و فشرده سازی‪:‬‬

‫‪tar, zip, bzip2, flate, gzip, lzw, zlib, . . . .‬‬

‫‪ Package‬هایی برای رمزنگاری و عملیات هش‪:‬‬

‫‪aes, cipher, des, dsa, rc4, rsa, md5, sha1, sha256, sha512, tls, x509, . . . .‬‬

‫لها مختلف‪:‬‬ ‫‪ Package‬هایی برای کار با فای گ‌‬

‫‪base32, base64, binary, csv, gob, hex, pem, json, xml, . . . .‬‬

‫‪ Package‬هایی برای کار با گرافیک دو بعدی‪:‬‬ ‫‪ Package‬هایی برای کار با مباحث شبکه‪:‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫‪color, draw, gif, jpeg, png, . . . .‬‬

‫‪http, cgi, fcgi, mail, url, jsonrpc, . . . .‬‬


‫یشود‪ .‬تمام ‪ Package‬های بال در ‪ Go‬نوشته شدگ‌هاند‪ .‬برای داشتن‬ ‫ذات سیستمی زبان ‪ Go‬در اینجا مشخص م گ‌‬ ‫یشدیم‪.‬‬ ‫نهای دیگر‪ ،‬باید متوسل به کتابخانگ‌ههای نوشته شده در زبان ‪ C‬م گ‌‬ ‫خیلی از این ‪ Package‬ها در زبا گ‌‬ ‫خوبی ‪ Go‬در این است که برای اعمال سطح پایین دیگر نیازی به ‪ C‬نیست‪ Go .‬دگ‌ر واقع همان ‪ C‬مدرن است‪ ،‬از‬ ‫طرف همان کسانی که روزی ‪ C‬و ‪ Unix‬را به شما معرفی کرده بودند!‬ ‫همگ‌هی ‪ Package‬های بال را همراه کنید با ‪ Package‬هایی برای عملیات ریاضی‪ ،‬زمان و تاریخ‪ ،‬محیط سیستم‬ ‫عامل‪ ،‬پایگاه داده‪ ،‬ورودی و خروجی‪ ،‬رشتگ‌هها‪ ،‬پردازش و ‪ Parse‬کردن متن و ‪. . . .‬‬ ‫یتوان آن را با ‪ Nginx‬یا‬ ‫در ضمن‪ ،‬کتابخانگ‌هی استاندارد با یک ‪ HTTP Server‬داخلی همراه است که به راحتی م گ‌‬ ‫نها اشاره شد هم از همین‬ ‫تهایی که در ابتدای این نوشته به آ گ‌‬ ‫‪ Node.js‬مقایسه کرد‪ .‬در واقع‪ ،‬اکثر سای گ‌‬

‫‪Server‬‬

‫یکنند‪.‬‬ ‫نشان استفاده م گ‌‬ ‫داخلی برای خدمات رسانی به کاربرا گ‌‬ ‫همچنین در کتابخانگ‌هی استاندارد ‪ Go‬یک سیستم ‪ Template Engine‬ارایه شده تا برنامگ‌هنویسی وب را برای شما‬ ‫نتر کند‪ .‬با این حساب‪ ،‬احتماب ًل متوجه شدگ‌هاید که برای برنامگ‌هنویسی وب در ‪ ،Go‬نیاز چندانی به‬ ‫آسا گ‌‬ ‫نهای دیگر نخواهید داشت‪ .‬کتابخانگ‌هی استاندارد ‪ Go‬همه چیز را از قبل برایتان مهیا‬ ‫کهای مرسوم در زبا گ‌‬ ‫مور گ‌‬ ‫فری گ‌‬ ‫کرده است!‬ ‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫از نظر مستندات‪ Go ،‬در جایگاه بسیار خوبی قرار دارد‪ .‬در سایت زبان مستندات خوبی برای‪:‬‬ ‫•‬

‫شرو ع یادگیری زبان‪،‬‬

‫•‬

‫توضیح درباره ابزارهای موجود در زبان‪،‬‬

‫•‬

‫تهای آن‪،‬‬ ‫توضیح عملکرد زبان و چگونگی کار با قابلی گ‌‬

‫•‬

‫اسلیدها و ویدیو های آموزشی‪،‬‬

‫•‬

‫‪....‬‬

‫یشان به طور کامل مستندت سازی‬ ‫پیدا خواهید کرد‪ .‬همچنین تمام ‪ Package‬ها و تک تک توابع و پارامترها گ‌‬ ‫شدگ‌هاند‪.‬‬ ‫اگر زبان انگلیسی شما در حد مطلوبی قرار دارد )که به عنوان یک برنامگ‌هنویس باید هم اینچنین باشد!!!( در‬ ‫زمینه یادگیری ‪ Go‬با هیچ مشکلی مواجه نخواهید شد و نیاز به هیچ کتاب و منبع خاصی نخواهید داشت؛ چرا‬ ‫که مستندات موجود در سایت زبان به اندازگ‌هی کافی کامل و مناسب است‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یگذرد‪ ،‬اما ‪ Go‬ابزارهای جانبی نسبتب ًا کاملی در اختیار دارد‪:‬‬ ‫با اینکه زمان زیادی از انتشار نسخگ‌هی پایدار زبان نم گ‌‬ ‫ابزار ‪go‬‬

‫که کار کامپایل و نصب ‪ Package‬را آسان کرده است‪ .‬این ابزار حتی قابلیت این را دارد که ‪ Package‬ها‬

‫تهایی مثل ‪ github‬دریافت و نصب نماید!‬ ‫را به صورت اتوماتیک از سای گ‌‬ ‫ابزار‬

‫‪godoc‬‬

‫قادر است سایت ‪ golang.org‬را به صورت محلی در کامپیوتر شما اجرا کند! سایت اصلی‬

‫یتواند مستندات مربوط به‬ ‫‪ golang.org‬هم به کمک همین ابزار در حال اجراست‪ .‬همچنین ‪ godoc‬م گ‌‬

‫‪Package‬‬

‫نها را مستقیمب ًا در ترمینال نمایش دهد‪.‬‬ ‫ها و توابع آ گ‌‬ ‫یتوانند استایل‬ ‫یکند‪ .‬برای مثال هر کدام از اعضای تیم م گ‌‬ ‫ابزار ‪ gofmt‬استایل کدنویسی شما را مدیریت م گ‌‬ ‫کدنویسی خودشان را داشته باشند‪ ،‬اما در نهایت از ‪ gofmt‬برای یکپارچه کردن استایل کدهای پروژه استفاده‬ ‫کنند‪.‬‬ ‫ابزار‬

‫‪gocode‬‬

‫هم برای کمک به ادیتورها و ‪ IDE‬ها طراحی شده‪ .‬این ابزار با بررسی کدهای شما اطلعات موجود‬

‫یتوانند از این اطلعات برای‬ ‫نها هم م گ‌‬ ‫یگذارد‪ .‬آ گ‌‬ ‫نها را استخراج کرده و در اختیار ادیتورها و ‪ IDE‬ها م گ‌‬ ‫در آ گ‌‬ ‫پیادگ‌هسازی قابلیت ‪ Autocompletion‬استفاده نمایند‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫مهمترین ابزار کار هر برنامگ‌هنویس ویرایشگر متن است‪ .‬خوشبختانه ‪ Go‬از پشتیبانی خوبی در این زمینه برخوردار‬ ‫است‪ .‬در رابطه با ویرایشگرهای ساده و سبک‪ Go ،‬از ‪ Kate‬و ‪ Notepad++‬و ‪ BBEdit‬و ‪ Gedit‬و … به صورت‬ ‫یکند‪.‬‬ ‫رسمی پشتیبانی م گ‌‬ ‫یکنند‪ Go ،‬پشتیبانی رسمی و کاملی را برای ویراشگرهای‬ ‫برای کسانی که با ویراشگرهای حرفگ‌های کدنویسی م گ‌‬ ‫بی رقیب ‪ Vim‬و ‪ Emacs‬ارائه کرده است‪ .‬دگ‌ر واقع از آنجایی که تیم سازندگان ‪ Go‬و اکثر جامعگ‌هی کاربری آن نیز‬ ‫یکنند‪ ،‬پشتیبانی از این دو از اولویت بسیار بالیی برخوردار است‪.‬‬ ‫با همین ابزارها کدنویسی م گ‌‬ ‫نهای کامپایلری نیاز خاصی به وجود ‪ IDE‬حس نخواهید کرد؛ اما برای کسانی که کار با‬ ‫در ‪ Go‬همانند دیگر زبا گ‌‬ ‫یدهند‪ Go ،‬از پشتیبانی مناسبی برای ‪ IDE‬های ‪ Eclipse‬و ‪ IntelliJ‬برخوردار است‪.‬‬ ‫‪ IDE‬ها را ترجیح م گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫ل جداگانه دارن و ما در حال رقابت با ‪Go‬‬ ‫یشین‪ Go ،‬و ‪ Rust‬دو هدف کام ب ً‬ ‫»‪ Go‬زبان جذابیه‪ ،‬و همونطوری که از ] این نوشته[ متوجه م گ‌‬

‫نیستیم‪ .‬زبانی که ‪ Rob Pike‬ساخته تأثیر زیادی روی ‪ Rust‬داشته‪«.‬‬ ‫‪pcwalton‬‬ ‫از اعضای تیم برنامگ‌هنویسی زبان ‪Rust‬‬

‫تهای وبلگ شخصی ‪ Rob Pike‬است که ‪ Pike‬در آن توضیح داده به چه دلیلی سادگی و‬ ‫نوشتگ‌هایی که در متن بال به آن اشاره شده مربوط به یکی از پس گ‌‬ ‫نهای دیگر را در ‪ Go‬قرار نداده‪.‬‬ ‫تهای رایج در زبا گ‌‬ ‫مینیمال بودن ‪ Go‬براش مهم بوده و چرا خیلی از قابلی گ‌‬ ‫‪http://commandcenter.blogspot.com.com/2012/06/less-is-exponentially-more.html‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫تهای نداشته‪ ،‬قابلیت اصلی زبان ‪Go‬‬ ‫قابلی ه‌‬ ‫بالمثل جالبی وجود دارد‪:‬‬ ‫در اجتما ع برنامگ‌هنویسان ‪ Go‬ضر گ‌‬ ‫تها را ندارد! «‬ ‫» مهمترین قابلیت ‪ Go‬این است که خیلی از قابلی گ‌‬ ‫نها در‬ ‫نهای دیگر را در این زبان قرار ندادگ‌هاند‪ .‬موضع آ گ‌‬ ‫تهای موجود در زبا گ‌‬ ‫طراحان ‪ Go‬تعداد زیادی از قابلی گ‌‬ ‫نها فلسفگ‌هی ‪ C‬را در پیش گرفتگ‌هاند و به شدت تأکید دارند‬ ‫نباره بسیار رادیکال است و با کسی تعارف ندارند! آ گ‌‬ ‫ای گ‌‬ ‫تا زمانی که یک قابلیت »واقعا« مورد نیاز نباشد‪ ،‬چیزی را به ‪ Go‬اضافه نخواهند کرد‪.‬‬ ‫یشود با‬ ‫نهای دیگر‪ ،‬در هر نسخگ‌هی جدیدی که از ‪ Go‬منتشر م گ‌‬ ‫این یعنی انتظار نداشته باشید که مانند زبا گ‌‬ ‫نها داشتید؟‬ ‫تهای جدید مواجه شوید‪ .‬این افراد از دنیای ‪ Unix‬و ‪ C‬آمدگ‌هاند‪ ،‬آیا انتظار دیگری از آ گ‌‬ ‫انبوهی از قابلی گ‌‬ ‫تهایی که هر از چند ماه به آن‬ ‫طراحان ‪ Go‬معتقدند که تمرکز برنامگ‌هنویسان باید به خود زبان باشد نه قابلی گ‌‬ ‫یگیرد‪.‬‬ ‫یهای زیادی در ‪ Go‬صورت م گ‌‬ ‫یشود! لزم به ذکر است که از نظر زیرساختی هر روز بهینگ‌هساز گ‌‬ ‫اضافه م گ‌‬ ‫یادتان باشد که ‪ Go‬یک زبان ‪ Native‬است‪ .‬حتی کامپایلرهای زبان ‪ C‬بعد از گذشت ‪ ۴۰‬سال هنوز در حال‬ ‫توسعه هستند!‬ ‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫تهایی که در ‪ Go‬وجود ندارند‪:‬‬ ‫لیستی از قابلی اه‌‬ ‫تها را به زبان اضافه نکرده اند و دلیل مناسبی هم برای کارشان‬ ‫ن قابلی گ‌‬ ‫دقت کنید که سازندگ‌هگان ‪ Go‬از قصد ای گ‌‬ ‫شهای سادگ‌هتر و بهتری را ارائه کردگ‌هاند یا اینکه شیوه برنامگ‌هنویسی در ‪ Go‬به‬ ‫نها رو گ‌‬ ‫دارند‪ .‬اصوب ًل یا به جای آ گ‌‬ ‫تها نیاز ندارد‪:‬‬ ‫طریقی است که به این قابلی گ‌‬ ‫‪‬‬

‫سها‬ ‫کل گ‌‬

‫‪‬‬

‫وراثت‬

‫‪‬‬

‫سازندگ‌هها و مخرب ها ) ‪( Constructors & Destructors‬‬

‫‪‬‬

‫محاسبات اشارگ‌هگرها ) ‪( Pointer Arithmetic‬‬

‫‪‬‬

‫ارجا ع‬

‫‪‬‬

‫تها ) ‪( Templates‬‬ ‫تمپل گ‌‬

‫‪‬‬

‫استثناها ) ‪( Exceptions‬‬

‫‪‬‬

‫سربارگذاری متدها ) ‪( Method Overloading‬‬

‫‪‬‬

‫سربارگذاری عملگر ) ‪( Operator Overloading‬‬

‫‪‬‬

‫ت ریز و درشت دیگر‪....‬‬ ‫و چندین قابلی گ‌‬

‫‪this‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫‪ Go‬بهترین زبان برنامه‌هنویسی‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫نیست!‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یهای ‪ Go‬صحبت کردیم؛ اما آیا واقعب ًا ممکن است که یک زبان هیچ نقطه ضعفی‬ ‫تا الن فقط در مورد خوب گ‌‬ ‫نداشته باشد؟ مسلمب ًا خیر‪...‬‬ ‫فهایی هستند که سازندگ‌هگان زبان کام ب ً‬ ‫ل‬ ‫فهای ‪ Go‬از دو زاویه قابل بررسی است‪ .‬در زاویه اول نقطه ضع گ‌‬ ‫نقطه ضع گ‌‬ ‫فهایی هستند که‬ ‫نها کار شود‪ .‬در زاویه دوم نقطه ضع گ‌‬ ‫نها آگاهی داشته و قبول دارند که باید بیشتر روی آ گ‌‬ ‫به آ گ‌‬ ‫یشود! اما برنامگ‌هنویسانی که قصد مهاجرت از‬ ‫در جامعگ‌هی کاربری ‪ Go‬به عنوان نقاط قوت به آن نگریسته م گ‌‬ ‫نها مشکل پیدا کنند‪.‬‬ ‫نهای دیگر را دارند‪ ،‬ممکن است با آ گ‌‬ ‫زبا گ‌‬ ‫نقص اول تفاوت سرعت ‪ Go‬با زبان ‪ C‬است! ‪ Go‬به علت داشتن سیستم ‪ Runtime‬و سیستم‬

‫‪Garbage‬‬

‫چوقت توانایی برابری با ‪ C‬را نخواهد داشت‪ .‬اینکه چرا ‪ C‬تا این اندازه‬ ‫‪ ،Collector‬حداقل به صورت تئوری هی گ‌‬ ‫سریع است‪ ،‬خود نیاز به بحث جداگانگ‌هایی دارد‪.‬‬ ‫در حال حاضر کامپایلر ‪ Go‬فقط قادر است کدهای »مناسب« تولید کند‪ ،‬نه کدهای »سریع«! به این معنی که‬ ‫یدهد‪ .‬البته توجه کنید که تولید‬ ‫ی خاصی را روی کدهای نهایی انجام نم گ‌‬ ‫کامپایلر ‪ Go‬در نسخگ‌هی فعلی بهینگ‌هساز گ‌‬ ‫ل کار راحتی نیست‪ .‬در این زمینه‬ ‫کد ماشین روی چندین پلتفرم مختلف برای یک زبان ‪ Native‬مانند ‪ Go‬اص ب ً‬ ‫باید کمی صبر کرد و فرصت بیشتری به توسعگ‌هدهندگ‌ههای زبان داد‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫نهایی مانند‬ ‫یشود‪ .‬اگر بخواهیم ‪ Go‬را با زبا گ‌‬ ‫فراموش نکنید که ‪ Go‬در حال حاضر هم یک زبان سریع محسوب م گ‌‬ ‫نها مقایسه کنیم‪ ،‬تجربه ثابت کرده است که ‪ Go‬بین ‪ 20‬تا ‪ 50‬برابر‬ ‫‪ Python‬یا ‪ Ruby‬یا ‪ PHP‬و یا امثال آ گ‌‬ ‫یکند!‬ ‫عتر عمل م گ‌‬ ‫سری گ‌‬ ‫نها کندتر عمل کند‪ .‬در چنین حالتی‪ ،‬مطمئن‬ ‫البته موارد زیادی وجود دارد که دیده شده ‪ Go‬به نسبت این زبا گ‌‬ ‫نهایی برای حل مشکل‬ ‫باشید که آن عملیات در پشت صحنه توسط کدهای ‪ C‬اجرا شده است‪ .‬در چنین زبا گ‌‬ ‫یدهند‪.‬‬ ‫لها را در ‪ C‬توسعه م گ‌‬ ‫سرعت‪ ،‬بسیاری از ماژو گ‌‬ ‫یتوانیم با قطعیت نظری را مطرح نماییم‪.‬‬ ‫نهایی مثل ‪ Java‬یا ‪ C#‬مقایسه کنیم‪ ،‬نم گ‌‬ ‫اگر بخواهیم ‪ Go‬را با زبا گ‌‬ ‫‪Microsoft‬‬

‫نها دلر از سرمایه خود را برای توسعگ‌هی‬ ‫و ‪) Oracle‬همان ‪ SUN‬سابق( میزان زیادی از وقت و میلیو گ‌‬

‫ماشین مجازی این دو زبان صرف کرده اند‪.‬‬ ‫عترین پلتفرگ‌مهای‬ ‫یشود‪ ،‬دگ‌ر واقع یکی از سری گ‌‬ ‫حتی ‪ Java‬که همیشه به شوخی به عنوان یک زبان کند معرفی م گ‌‬ ‫موجود در دنیای برنامگ‌هنویسی است‪ .‬در خیلی از موارد ‪ Go‬سریعتر از این دو پلتفرم بوده‪ ،‬و در خیلی از موارد هم‬ ‫یتوان گفت که از‬ ‫نها ابراز نظر کرد‪ .‬اما با جرأت م گ‌‬ ‫یتوان به صورت مطلق درباره سرعت آ گ‌‬ ‫نها‪ .‬واقعب ًا نم گ‌‬ ‫کندتر از آ گ‌‬ ‫نظر میزان مصرفی حافظه‪،‬‬

‫‪Go‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫ثابت کرده که ممکن است حتی تا ‪ 10‬برابر بهینگ‌هتر از این پلتفرگ‌مها عمل کند!!!‬


‫مطلب مهم این است که ‪ Go‬به شدت در حال توسعه است و تقریبب ًا هر روز بهینگ‌هسازی های زیادی در آن اعمال‬ ‫یشود‪ .‬حال که ‪ Go‬به وضعیت ثبات رسیده است‪ ،‬تازه تیم توسعه کار خود را در زمینه بهینگ‌هسازی زبان شرو ع‬ ‫م گ‌‬ ‫کرده‪ .‬برای مثال‪ Pike ،‬اعلم کرده که بعضی از کدها )مخصوصب ًا کدهای ‪ ( Concurrent‬در نسخگ‌هی آیندگ‌هی زبان‬ ‫لکرد بهتری خواهند داشت!‬ ‫) ‪ ( Go1.1‬تا ‪ ۵۰‬درصد عم گ‌‬ ‫از طرفی‪ ،‬سرعت یک معیار مطلق نیست‪ .‬خیلی از مسایل ممکن است بر سرعت برنامگ‌ه تأثیر گذار باشد‪ ،‬که یکی‬ ‫یکند‪ .‬شما هم به هنگام انتخاب‬ ‫مهایی است که انتخاب م گ‌‬ ‫شها و الگوریت گ‌‬ ‫نها خود برنامگ‌هنویس و رو گ‌‬ ‫از مهمترین آ گ‌‬ ‫‪ Go‬به عنوان زبان آیندگ‌هی خود‪ ،‬زیاد ذهن خود را با عنصر سرعت درگیر نکنید‪ Go .‬زبانی است با سرعتی بسیار‬ ‫مناسب که روز به روز نیز در حال پیشرفت در این زمینه است؛ فقط باید کمی صبر داشت و به تیم ‪ Go‬فرصت‬ ‫داد تا کارشان را انجام دهند‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫نقص دیگر‪ ،‬سیستم ‪ Garbage Collector‬است‪ Go .‬در ابتدا برای معماری ‪ x64‬طراحی شده بود )‪ ۶۴‬بیت(‪ .‬دلیل‬ ‫آن هم این بود که چون پلتفرگ‌مهای ‪ ۳۲‬بیتی کم کم در حال جایگزین شدن با پلتفرگ‌مهای ‪ ۶۴‬بیتی هستند‪ ،‬تیم‬ ‫توسعه تمام توجه خود را به پلتفرگ‌مهای ‪ ۶۴‬بیتی معطوف کرده بود‪.‬‬ ‫متاسفانه در حاضر سیستم ‪ Garbage Collector‬روی معماری‬

‫‪x86‬‬

‫با یک نقص فنی روبرو است )‪ ۳۲‬بیت( که‬

‫یتواند باعث کرش کردن برنامه شود! البته این مشکل فقط برای معماری ‪ x86‬است و اگر‬ ‫در موارد معدودی م گ‌‬ ‫برنامگ‌هها را روی معماری ‪ x64‬اجرا کنید با مشکلی مواجه نخواهید شد‪ .‬از همین رو توصیه شده است تا زمان‬ ‫مهای ‪ ۶۴‬بیتی اجرا کنید‪.‬‬ ‫برطرف کردن این مشکل‪ ،‬برنامگ‌ههای خود را فقط روی سیست گ‌‬ ‫نکتگ‌هی بعدی این است که در حال حاظر سیستم ‪ Runtime‬روی پلتفرگ‌مهای ‪ ۶۴‬بیتی‪ ،‬فقط توانایی استفاده از‬

‫‪۱۶‬‬

‫گیگابایت حافظه را دارد )به طور متوالی( ‪ .‬خیلی نادر اند برنامگ‌ههایی که به صورت پیوسته به ‪ ۱۶‬گیگابایت حافظه‬ ‫کتری تقسیم کنید تا این‬ ‫تهای کوچ گ‌‬ ‫نیاز داشته باشند‪ ،‬اما در صورت نیاز‪ ،‬باید برنامگ‌هی خود را به قسم گ‌‬ ‫محدودیت را دور بزنید‪.‬‬ ‫مهای ‪ ۳۲‬بیتی وجود دارد‪ ،‬و میزان‬ ‫در مخزن توسعگ‌هی ‪ ،Go‬اصلحیگ‌ههایی برای رفع مشکل ‪ GC‬در سیست گ‌‬ ‫گسترش حافظه برای سیستم‬

‫‪Runtime‬‬

‫نیز به ‪ ۱۲۸‬گیگابایت افزایش داده شده است‪ .‬به احتمال بسیار زیاد این‬

‫اصلحیه ها در نسخگ‌هی ‪ ۱.۱‬زبان قرار خواهند گرفت‪.‬‬ ‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫نقص بعدی خصوصا برای برنامگ‌هنویسان ایرانی مشکل ساز است!! کمی به اسم این این زبان دقت کنید‪:‬‬

‫‪Go‬‬

‫اسم این زبان کمی غلط انداز است!! و شاید نتوان خیلی راحت اسم آن را به زبان آورد!!!! ‪(-:‬‬ ‫خوشبختانه یا متاسفانه‪ ،‬برنامگ‌هنویسان دیگر کشورها نیز به گونگ‌های با نام این زبان مشکل دارند‪ .‬مساله این است‬ ‫که کلمگ‌هی ‪ Go‬معانی زیادی در زبان انگلیسی دارد به شکلی که جستجو کردن نام ‪ Go‬در موتورهای جستجو‬ ‫نتیجگ‌هی دلخواه را به همراه نداشته و از همین رو پیدا کردن اطلعات دربارگ‌هی زبان بسیار دشوار است‪.‬‬ ‫به همین دلیل‪ ،‬در جامعگ‌هی برنامگ‌هنویسان این زبان‪ ،‬چه ایرانی و چه خارجی‪ ،‬قانونی وجود دارد که اگر در جایی‬ ‫یشود‪ ،‬بهتر‬ ‫یدادید که نام رسمی آن باعث ایجاد گمراهی م گ‌‬ ‫قصد صحبت دربارگ‌هی این زبان را داشتید و احتمال م گ‌‬ ‫است از واژگ‌هی ‪ Golang‬به عنوان نام زبان استفاده کنید‪.‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫یکنید(‬ ‫)به همان شکلی که ‪ Erlang‬را تلفظ م گ‌‬


‫نقص بعدی در رابطه با یادگیری ‪ Go‬است‪ .‬دقت کنید که ‪ Go‬یک زبان سیستمی است‪ .‬در این حالت با همان‬ ‫یشوید که در زبان ‪ C‬نیز با آن روبرو خواهید شد‪ .‬یعنی برنامگ‌هنویسی با ‪ Go‬به سطح قابل قبولی‬ ‫وضعیتی روبرو م گ‌‬ ‫از تجربه و تخصص در علوم کامپیوتری نیاز دارد‪.‬‬ ‫ل با طرز کار ‪ ، CPU‬حافظه ‪ ، I/O ،‬و مباحث سطح پایین مربوط به‬ ‫نهایی مثل ‪ Go‬یا ‪ ، C‬تا زمانی که کام ب ً‬ ‫در زبا گ‌‬ ‫یتوانید براحتی با زبان ارتباط برقرار کنید‪ .‬شاید بتوانید به دلیل سادگی زبان آن را‬ ‫هرکدام آشنا نباشید‪ ،‬نم گ‌‬ ‫براحتی یاد بگیرید‪ ،‬اما آگاهی شما از زبان همیشه در حد پایینی قرار خواهد داشت‪ .‬در حالی که یک برنامگ‌هنویس‬ ‫‪Ruby‬‬

‫چوقت نیاز نداشته باشد تا از ‪ Register‬ها سر در بیاورد!‬ ‫ممکن است هی گ‌‬

‫شزمینه ی مناسبی برخوردار باشید‪ .‬اینطور نیست‬ ‫تهای ‪ Concurrency‬باید از پی گ‌‬ ‫خصوصب ًا برای استفاده از قابلی گ‌‬ ‫که به صرف برنامگ‌هنویسی در این زبان‪ ،‬اطمینان پیدا کنید که برنامگ‌هی شما روی یک ‪ CPU‬شانزده هستگ‌هایی‬ ‫عتر اجرا خواهد شد! برنامگ‌هنویسی ‪ Concurrent‬نیازمند مطالعگ‌هی زیاد و تجربگ‌هی کافی است‪.‬‬ ‫شانزده برابر سری گ‌‬ ‫یکند!‬ ‫‪ Go‬برای شما معجزه نم گ‌‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یشوند‪ .‬تفکراتی در این اجتما ع وجود دارد که‬ ‫مباحث دیگری هم هستند که به اجتما ع کاربران ‪ Go‬مربوط م گ‌‬ ‫یآیند کمی عجیب باشد‪.‬‬ ‫نهای دیگر م گ‌‬ ‫ممکن است برای برنامگ‌هنویسانی که از زبا گ‌‬ ‫برای مثال‪ ،‬تیم توسعگ‌هی ‪ Go‬و اجتما ع کاربری آن همیشه عنوان کردگ‌هاند که استفاده از کتابخانگ‌ههای ساده‪ ،‬از‬ ‫کها یکی از عوامل اصلی در پیچیده‬ ‫مور گ‌‬ ‫کها برخوردار است؛ و اینکه فری گ‌‬ ‫مور گ‌‬ ‫اولویت بسیار بالتری نسبت به فری گ‌‬ ‫نها استفاده کنید بهتر است! و یا اینکه ‪ Andrew Gerrand‬یکی از‬ ‫یباشند و هر چه کمتر از آ گ‌‬ ‫شدن پروژه م گ‌‬ ‫مورک هایی مثل ‪ Django‬یا‬ ‫یکند چقدر از اینکه ‪ Go‬فری گ‌‬ ‫اعضای اصلی تیم توسعه در اکانت تویتر خود اعلم م گ‌‬ ‫چوقت هم نداشته باشد!!!‬ ‫‪ Rails‬ندارد خوشحال است و امیدوار است که هی گ‌‬ ‫کها عادت کردگ‌هاند چنین نظراتی کمی‬ ‫مور گ‌‬ ‫نهای دیگر که به کار با فری گ‌‬ ‫مسلمب ًا برای خیلی از برنامگ‌هنویسان زبا گ‌‬ ‫عجیب و غریب است! در ‪ Go‬فلسفگ‌هی ‪ Unix‬حکم فرما است‪ .‬جای تعجبی هم ندارد‪ ،‬چون این افراد خودشان‬ ‫خالق ‪ Unix‬هستند!‬ ‫یدهند؛ در صورت نیاز‬ ‫در فلسفه ‪ Unix‬باید از ابزارهای کوچکی استفاده کرد که هر کدام کار مشخصی انجام م گ‌‬ ‫مورک ها به عنوان‬ ‫تهای کوچک‪ ،‬ابزار بزرگتری را ایجاد کرد‪ .‬فری گ‌‬ ‫یتوان با کنار هم قرار دادن این قسم گ‌‬ ‫م گ‌‬ ‫ل در جبهه مخالف فلسفگ‌هی ‪ Unix‬قرار‬ ‫یکنند‪ ،‬عم ب ً‬ ‫سیستمی که ابزارهای یکپارچه و غیرقابل تجزیگ‌ه را توصیه م گ‌‬ ‫دارند‪.‬‬ ‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫یشوند که چرا ‪ Go‬کار با ‪ Type‬و توابع را جایگزین ‪ Class‬ها و متدها‬ ‫خیلی از برنامگ‌هنویسان تازه وارد متوجه نم گ‌‬ ‫کرده‪ ...‬چرا وراثت را از زبان حذف کرده‪ ...‬چرا این زبان ‪ Exception‬ندارد‪ ...‬چرا از سربارگذاری توابع پشتیبانی‬ ‫یکند‪ ...‬و دگ‌هها سؤال دیگر‪...‬‬ ‫نم گ‌‬ ‫نها هم مانند‬ ‫نها بعد از مدتی که با ‪ Go‬کار کردگ‌هاند‪ ،‬عنوان کردگ‌هاند که ای کاش زبان پیشین گ‌آ گ‌‬ ‫اما تقریبب ًا اکثر گ‌آ گ‌‬ ‫‪ Go‬پیادگ‌هسازی شده بود! برنامگ‌هنویسان نباید در ‪ Go‬به شیوگ‌هی ‪ Java‬کدنویسی کنند‪ ...‬نباید به شیوگ‌هی‬ ‫کدنویسی کنند‪ ...‬و یا هر زبان دیگری‪...‬‬

‫در ‪ Go‬باید به شیواه‌هی ‪ Go‬برناماه‌هنویسی کرد!‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬

‫‪Python‬‬


‫از کجا شروع کنم؟‬ ‫مستقیم به سایت ‪ golang.org‬بروید‪ .‬ابتدا پکیج مربوط به سیستم عامل خود را دانلود و نصب نمایید‪ .‬برای‬ ‫خواندن مستندات هم به قسمت ‪ Documents‬سایت بروید‪ .‬این قسمت بسیار جالب دستگ‌هبندی شده است‪ .‬برای‬ ‫کهای این صفحه را از بال به پایین مطالعه کنید‪ .‬دقت کنید که رعایت‬ ‫آشنایی با ‪ Go‬کافی است به ترتیب لین گ‌‬ ‫کها بسیار به شما کمک خواهد کرد‪.‬‬ ‫ترتیب در خواندن لین گ‌‬ ‫یافتد اطل ع پیدا کنید‪:‬‬ ‫حتمب ًا عضو گروه کاربری زبان شوید تا از بحث و اخباری که روزانه در آن اتفاق م گ‌‬ ‫‪https://groups.google.com/group/golang-nuts‬‬

‫در ضمن‪ ،‬یادتان نرود که تگ مخصوص به ‪ golang‬را در تویتر دنبال کنید‪:‬‬ ‫‪https://twitter.com/#!/search/realtime/%23golang‬‬

‫لپلس‪:‬‬ ‫و همچنین تگ مربوط به ‪ golang‬در گوگ گ‌‬ ‫‪https://plus.google.com/s/%23golang‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫هر از چند گاهی هم به وبلگ رسمی زبان سر بزنید‪:‬‬ ‫‪blog.golang.org/‬‬

‫مطالب مربوط به درگاه ‪ golang‬در سایت ‪ reddit‬را هم از یاد نبرید‪:‬‬ ‫‪reddit.com/r/golang/‬‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


‫خوب‪ ،‬به پایان این نوشته رسیدگ‌هایم‪.‬‬ ‫شزمینگ‌هی مناسبی را برای یادگیری زبان ‪ Go‬فراهم کنم‪.‬‬ ‫امیدوارم که توانسته باشم پی گ‌‬ ‫با تشکر از وقتی که برای خواندن این نوشته در نظر گرفتید‪.‬‬ ‫»امیررضا قادری«‬

‫معرفی زبان برنامه نویسی ‪ – Go‬امیررضا قادری‬


go language