در قسمت اول از سلسله پستهای دنباله دار آشنایی با زبان Go به مباحث پایهای و داستان شکل گیری این زبان پرداختیم. در این پست به جنبههای فنی تر از این زبان میپردازیم. در ادامه با هیتوس همراه باشید.
در این پست با مطالب زیر آشنا میشوید:
- کامپایل، کامپایلر، و سرعت کامپایل در زبان Go
- کامپایلرهای زبان Go در محیطهای مختلف
- Syntax زبان Go
Go یک زبان کامپایل شونده است
برای اجرای برنامههای نوشته شده در Go، باید آنها را Compile نمایید. خروجی عملیات کامپایل، کد ماشین است. بدون نیاز به VM، بدون نیاز به JIT، و بدون نیاز به تفسیر. همانند C، حاصل برنامه شما مستقیما کدهای ماشین خواهد بود.
در حال حاضر کامپایلر Go که خودش در زبان C نوشته شده، قادر است برای پلتفرمهای x86 و x86 و arm کد ماشین تولید کند. سرعت کامپایل شدن برنامهها در Go بسیار بسیار بالاست! و در این زمینه جای هیچ رقابتی را برای دیگر زبانهای کامپایلری مانند C++ و Java و C# و ... باقی نگذاشته است.
خود کامپایلر نیز به صورت رسمی برای سیستم عاملهای Linux و Mac و FreeBSD و Windows منتشر میشود. اما به شکل غیر رسمی، کاربران گزارش کرده اند که روی سیستمهای دیگری مثل Android و Plane9 و بقیه BSDها هم موفق به اجرای آن شده اند.
در Go نیاز به چیزهایی شبیه makefileها و یا برنامههای مدیریت پروژه مثل Maven نیست. کامپایلر Go از فایلی که تابع main در آن قرار دارد شروع کرده و خودش بقیه کدهای مورد نیاز را شناسایی و لینک مینماید! حتی اگر یک برنامه چند صد هزار خطی با تعداد زیادی سورس فایل داشته باشید، فقط یک خط دستور ساده در ترمینال کافیست تا کل برنامه شما کامپایل شود.
لازم به ذکر است که کامپایلر Go کدهای شما را به شکل Static لینک مینماید. به این معنی که حاصل کامپایل برنامه شما در نهایت یک فایل اجرای یک تکه خواهد بود؛ مهم نیست که برنامه شما از تعداد زیادی فایل و یا Packageهای جانبی تشکیل شده، چیزی که در نهایت به شما تحویل داده خواهد شد یک فایل اجرایی ساده است که برای اجرا شدن هیچ پیش نیازی لازم ندارد و به راحتی قابل انتقال به دستگاههای دیگر است.
کامپایلر Go با کسی شوخی ندارد! چیزهایی که در زبانهای دیگر باعث Warning میشوند، همگی در Go به عنوان Error در نظر گرفته شده اند. مثلا اگر یک متغیر تعریف کرده باشید اما از آن استفاده نکرده باشید، کامپایلر به جای یک Warning سطحی، با یک پیغام Error کل عملیات کامپایل را متوقف میکند! در Go چنین اشتباهاتی پذیرفتنی نیست!
Go و Syntax آشنا
Go زبانی است از خانواده C و به همین دلیل برنامه نویسانی که با C و ++C و Java و #C و PHP و JavaScript و ... آشنایی دارند، بسیار راحت Syntax این زبان را یاد خواهند گرفت. برای مثال با کمی دقت در کد زیر، براحتی متوجه منظور آن خواهید شد:
package main import "fmt" func main(){ a := [] int{11, 22, 33, 44, 55} s := 0 for i := range a { s += a[i] } fmt.Printf("%d \n", s) }
Syntax یک زبان تاثیر زیادی در پیشرفت آن دارد. وقتی Syntax زبان آشنا باشد، برنامه نویسان راحت تر آن را یاد خواهند گرفت و به همین نسبت محبوبیت زبان بالاتر خواهد رفت. با بلا رفتن محبوبیت، سازندگان زبان با اشتیاق و سرعت بیشتری به کار توسعه مشغول میشوند. در این حالت ضریب اعتماد برنامه نویسان به زبان بالاتر میرود و کتابخانهها و ابزارهای بیشتری برای زبان تولید میشود.
برنامه نویسان بیشتر از اینکه کد نویسی کنند، به کد خوانی مشغول اند. تا زمانی که Syntax یک زبان توسط برنامه نویسان پذیرفته نشود نمیتواند محبوبیت چندایی پیدا کند. برای مثال زبانهای Functional با آن همه قابلیتهای منحصر به فردی که دارند، در اکثر اوقات فقط به دلیل داشتن Syntax نا آشنا در رابطه با جذب برنامه نویسان با مشکل مواجه میشوند.
Syntax زبان Go را میتوان ترکیبی از Syntax زبانهای C و Python و Pascal به حساب آورد. سعی شده تا Syntax زبان کوچک، تمیز، و قابل فهم باشد. برای مثال ساختار حلقه در Go فقط با for پیاده سازی شده و حلقههای while یا do از آن حذف شده اند.
نکته جالب دیگری در مورد Syntax زبان Go این است که گرامر آن Regular است! و به همین دلیل پردازش کدهای Go برای ابزارهای جانبی مثل IDEها بسیار آسان خواهد بود. همچنین Coding پیش فرض تمام سورس فایلهای UTF-8 است! (Ken Thompson و Rob Pike خودشان خالق UTF-8 هستند.)