همه چیز درباره زبان Golang

نیاز همیشه نیرویی بوده که باعث شده تغییرات بوجود بیایند و داستان بوجود آمدن زبان golang از احساس نیاز سه تن از کارمندان گوگل به نام‌های کن تامپسون، رابرت پایک و رابرت گریسمر آغاز شد. تخصص آنها در زمینه کامپایلر و سیستم عامل بود و هر سه از منتقدان استفاده از C++ و Java به عنوان زبان‌های اصلی مورد استفاده در گوگل بودند. آنها ایده‌ی طراحی یک زبان جدید را در سال ۲۰۰۷ در سر داشتند و اولین نسخه این زبان جدید را در سال ۲۰۱۲ منتشر کردند. آنها همچنین می‌خواستند این زبان توان پاسخ به نیازهای جدیدی که با ظهور پردازنده‌های چند هسته‌ای، کامپیوترهای متصل به هم و کلاسترهای بزرگ محاسباتی بوجود آمده بود را نیز داشته باشند.

مشکلاتی که باید حل می‌شدند

مشکلاتی که باعث شد آنها به فکر طراحی زبان golang بیفتند به شرح زیر است:

  • سرعت build کم: سیستم‌های مورد استفاده در گوگل شامل چندین میلیون خط کد است. زمان مورد نیاز برای کامپایل و لینک شدن این کدها حتی با استفاده از سیستم‌های مدرن، build کردن ساعت‌ها و حتی روز‌ها به طول می‌انجامید.
  • تیم‌های بزرگ: کار در تیم‌های بزرگ (تیمی که شما حداکثر نصف افراد آنرا می‌شناسید) معضلات خاص خود را دارد. سلایق مختلف افراد، سبک‌های متفاوت کد نویسی، عدم یکسانی سطح سواد باعث می‌شود که هریک از اعضا تیم از یک زیر مجموعه از ویژگی‌ها و قدرت‌های زبان استفاده کنند. به طبع تیم‌های بزرگ مشکلات زیر را به همراه دارد:
    • استفاده هر برنامه‌نویس از یک زیر مجموعه زبان
    • درک برنامه پایین (خوانایی پایین، مستندات کم و …)
  • وابستگی‌های غیر قابل کنترل: وابستگی‌ها بالاخص در کدهای کامپایل‌شدنی یکی از مواردی است که باعث کاهش سرعت build و همچنین افزایش حجم کدهای تولید شده می‌شود. همچنین مدیریت آنها در برنامه‌های بزرگ بسیار سخت و غیر قابل کنترل است. بوجود آورندگان golang در گوگل با بهبود نحوه مدیریت وابستگی‌ها در زبان‌های C و C++ توانستند ۴۰ درصد از حجم کد را کاهش داده و باعث افزاش سرعت build شوند.
  • هزینه بروزرسانی: در این سیستم‌ها به خاطر وابستگی‌های زیاد و تیم بزرگ، بروزرسانی کدها یا وابستگی‌ها کار بسیار سخت و دشواری است.
  • سختی نوشتن ابزارهای اتوماتیک: بخاطر بزرگی کد و وابستگی‌هایشان نوشتن روندهای اتوماتیک مانند تست، build یا deploy بسیار سخت بوده و به همین خاطر افراد بیشتری برای کارهای عملیاتی یا توسعه ابزارهای اتوماتیک نیاز است.

اهداف طراحی Go

اهداف طراحی golang عبارتند از:
– این زبان بایستی بتواند توسط تیم بزرگی از برنامه‌نویسان برای برنامه‌های بزرگ که وابستگی‌های فراوانی دارند مورد استفاده قرار گیرد.
– این زبان بایستی به زبان‌های هم‌خانواده C نزدیک باشد. زیرا بسیاری از برنامه‌نویسان گوگل تازه‌کار بوده و با برنامه‌نویسی‌ رویه‌ای و یکی از زبان‌های هم‌خانواده C آشنایی دارند. این مورد باعث کارایی زودهنگام این دست برنامه‌نویسان می‌شود.
– این زبان بایستی مدرن باشد. زبان‌های C و C++ و تا حدی Java قدیمی بوده و قبل از تکنولوژی‌های مدرن امروز مانند پرازنده‌های چند هسته‌ای، شبکه و عصر وب طراحی شده‌اند. یکی از ویژگی‌های دنیای مدرن که می‌تواند بهتر مورد بررسی قرار گیرد همروندی است.

ویژگی‌های زبان Go

در این بخش بصورت مختصر ویژگی‌های زبان ارائه می‌شود.

  • کوچک بودن: این زبان به نسبت زبان‌های دیگر کوچک است.
    • تعداد کلمات کلیدی این زبان (۲۵ کلمه) نسبت به سایر زبانها مانند C++11(۸۶ کلمه)، Java(۵۰ کلمه)، ES6(۴۸ کلمه)، پایتون۳(۳۳ کلمه) و سی (۳۲ کلمه) کمتر است.
    • سینتکس این زبان برای آنان که C یاد گرفته اند ساده و روان است.
    • مستندات عالی برای شروع دارد. (+ + +)
  • مدیریت وابستگی‌ها: این زبان به نحوه جالبی وابستگی‌ها را مدیریت می‌کند. ویژگی‌های این فرآیند به صورت زیر است:
    • نیازی به فایل Header نیست.
    • وابستگی‌های استفاده‌نشده باعث کامپایل‌نشدن کد می‌شوند.
    • در گراف وابستگی‌های فایل‌های یک پروژه نبایستی دور وجود داشته باشد.
  • رویه‌گرا: رویه‌گرایی در این زبان باعث می‌شود که ساختار برنامه شبیه به C باشد. ممکن است برای شما این سوال پیش آید که آیا golang یک زبان شی‌گراست یا نه؟ جواب به این سوال هم آری است هم نه.
    جواب به این سوال می‌تواند نه باشد زیرا:

    • اثری از کلاس‌ها و ارتباط بین آنها نیست.
    • همه چیز یک object نیست.
    • خبری از الگوهای طراحی نیست.
    • چارچوب‌ها و کتابخانه‌های پیچیده شی‌گرایی وجود ندارند.
      جواب به این سوال آری است زیرا:
    • مکانیزم‌های تبادل پیام وجود دارد.
    • پنهان‌سازی و کپسوله‌سازی وجود دارد.
    • چندریختی و polymorphism وجود دارد.
    • وراثت وجود دارد.
  • تایپ استاتیک: سیستم مدیریت تایپ‌های زبان golang ایستا است. بدین معنی که تایپ‌ها در زمان کامپایل چک می‌شوند. همچنین وجود تایپ ایستا باعث می‌شود کامپایلر بتواند بهینه‌سازی بیشتری روی متغیرهای کد نهایی ایجاد کند.
  • کامپایل به کد ماشین و لینک استاتیک: این باعث می‌شود که کدها کامپایل شده و در سیستم عامل مقصد اجرا شود. در نتیجه:
    • هیچ مفسری وجود ندارد.
    • ماشین مجازی وجود ندارد مانند JVM.
    • هیچ ترجمه‌ی زمان اجرایی وجود ندارد مانند JIT در .Net Framework.
    • هیچ پیش‌نیازی برای اجرا وجود ندارد.
  • دارای سیستم runtime و Garbage Collection : سیستم runtime بدین صورت است که زیرساختی برای اجرای ویژگی‌های همروندی golang ایجاد می‌کند. در حقیقت این سیستم بسیاری از موارد پر دردسر همروندی را از دید برنامه نویس مخفی می‌کند. همچنین این سیستم باعث می‌شود که بتوان در این زبان از روند Garbage Collection استفاده کرد. این امر باعث ساده‌شدن روند مدیریت حافظه و کاهش خطاهای زمان اجرا می‌شود.
  • امکانات سطح بالای همروندی: برنامه‌نویسی همروند اصلا کار آسانی نبوده و نیست. همروندی در سطوح مختلفی قابل دستیابی است. در بالاترین سطح می‌توان چندین پروسه داشت که کارهای مشابه‌ای انجام می‌دهند، اما پروسه‌ها بسیار سنگین و پرهزینه هستند. استفاده از Threadها به علت سبک‌تر بودن می‌تواند مشکلات را کاهش دهد. راه حل سوم پیشنهاد شده استفاده از برنامه‌نویسی غیرهمگام است که باعث پیچیدگی بسیار توسعه و عیب‌یابی نرم‌افزار می‌گردد. golang با معرفی مکانیزم goroutine و با کمک runtime روند توسعه نرم‌افزار غیر همگام را به شدت ساده می‌کند. ویژگی‌های goroutineها عبارتند از:
    • ایجاد آنها همانند Threadها در زمان اجرا
    • استفاده اشتراکی از حافظه
    • زمان‌بندی goroutine ها در runtime انجام می‌شود.
    • تعدادی goroutine برای اجرا روی چندین Thread اجرا می‌شوند.
    • سایز حافظه goroutine ها در زمان اجرا تغییر می‌کند.
      همچنین امکان ارتباط میان goroutine به کمک مکانیزم تبادل پیام در ویژگی‌های اولیه زبان بوجود آمده است.
  • کتابخانه استاندارد غنی: golang کتابخانه‌های بسیاری برای کارهای مختلف دارد که این کتابخانه باعث افزایش سرعت توسعه می‌گردد.
  • ابزارها: golang ابزارهایی بار کامپایل، نصب، build و حتی بهبود فرمت کد دارد.

ایرادات وارده بر Go

برخی از ویژگی‌های golang خود می‌تواند از منظری نوعی نقص و کمبود باشد.

  • کوچک بودن زبان عملا باعث می‌شود بسیاری از امکاناتی که در زبان‌های دیگر وجود دارد در این زبان وجود نداشته باشد. ممکن است کاری که در زبان‌های دیگر به سادگی قابل انجام است در این زبان با مشکل همراه شود.
  • سیستم تایپ استاتیک زبان به علت کوچک بودن امکاناتی را که سیستم‌هایی مانند جاوا در اختیار کاربران قرار می‌دهد را ندارد.
  • عدم وجود شی‌گرایی باعث ایجاد دردسرهایی شده و حتی امکان استفاده مجدد از کد و تجربیات گذشته را از بین می‌برد.
  • وجود سیستم runtime باعث می‌شود در سیستم‌های mission critical نتوان با قطعیت در مورد زمان‌بندی و اجرای کدها تصمیم گرفت که عملا این زبان را از رده‌ی زبان‌های سیستمی دور می‌شود.
  • وجود مکانیزم ارتباط بین goroutine ها عملا سربار زمان اجرا اعمال کرده و در حالت‌هایی که ارتباط بسیاری میان اجزای سیستم برقرار است این سربار قابل توجه است.

چه کسانی از Go استفاده می‌کنند؟

  • پروژه docker به عنوان یکی از بزرگترین استفاده کننده‌ها از این زبان است. این پروژه با بوجود آوردن یک لایه روی امکانات کرنل لینوکس و با استفاده از یک مسیر کسب و کاری جدید این امکان را فراهم آورده تا container ها دوباره بحث داغ این روزها باشند.
  •  Google به عنوان مثال در youtube از golang استفاده می‌کند. به عنوان مثال می‌توان به پروژه vitess اشاره کرد.
  • سرویس Heroku یکی دیگر از استفاده کنندگان این زبان است و به عنوان مثال درایور postgresql در زبان golang توسط آنها نگهداری می‌شود. این پایگاه داده بخش مهمی در زیرساخت این شرکت است.
  • شرکت Canonical سیستم juju خود را بصورت کامل با این زبان بازنویسی کرده‌است.
  • شرکت soundcloud نیز در زیرساخت خود از این زبان استفاده می‌کند.
  • سرویس bitly، این سرویس نیز برای پاسخگویی به هزاران درخواست در ثانیه سیستم خود را بصورت کامل توسط golang بازنویسی کرده است.
  • سرویس Iron.io که یک سیستم انجام محاسبات در محیط ابری است کل سرویس خود را به golang مهاجرت داده است.
  • سرویس Drone.io یک سیستم continous integration است که به زبان golang توسعه یافته است.

نویسنده مطلب: حسین

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *