Skip to content

Latest commit

 

History

History
137 lines (118 loc) · 15.9 KB

go-introduction.md

File metadata and controls

137 lines (118 loc) · 15.9 KB

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

مشکلات

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

  • سرعت build کم: سیستم های مورد استفاده در گوگل شامل چندین میلیون خط کد است. زمان مورد نیاز برای کامپایل و لینک شدن این کدها حتی با استفاده سیستم‌های مدرن build ساعت‌ها و حتی روز‌ها به طول می‌انجامید.

  • تیم‌های بزرگ: کار در تیم‌های بزرگ(تیمی که شما حداکثر نصف افراد آنرا می‌شناسید) معضلات خاص خود را دارد. سلایق مختلف افراد، سبک‌های متفاوت کد نویسی، عدم یکسانی سطح سواد باعث می‌شود که هریک از اعضا تیم از یک زیر مجموعه از ویژگی‌ها و قدرتهای زبان استفاده کنند. به طبع تیم‌های بزرگ مشکلات زیر را به همراه دارد:

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

  • هزینه بروزرسانی: در این سیستم ها به خاطر وابستگی‌های زیاد و تیم بزرگ بروزرسانی کدها یا وابستگی‌ها کار بسیار سخت و دشواری است.

  • سختی نوشتن ابزارهای اتوماتیک: بخاطر بزرگی کد و وابستگی‌هایشان نوشتن روندهای اتوماتیک مانند تست، build یا deploy بسیار سخت بوده و به همین خاطر افراد بیشتری برای کارهای عملیاتی یا توسعه ابزارهای اتوماتیک نیاز است.

اهداف طراحی golang

اهداف طراحی golang عبارتند از:

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

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

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

  • کوچک بودن: این زبان به نسبت زبان‌های دیگر کوچک است
    • تعداد کلمات کلیدی این زبان(۲۵ کلمه) نسبت به سایر زبانها مانند 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 و حتی بهبود فرمت کد دارد.

ایرادات وارده

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

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

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

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

منابع و مطالعه بیشتر