בשביל מה באמת שפת ה- Go טובה?

במהלך תשע שנות הפלוס שלה בטבע, שפת ה- Go של גוגל, הלא היא Golang - עם גרסה 1.13 החל מספטמבר 2019 - התפתחה מלהיות סקרן עבור גיקים אלפאיים להיות שפת התכנות שנבדקה בקרב כמה מהחשובים בעולם פרויקטים ממוקדי ענן. 

מדוע נבחרה Go על ידי מפתחי פרויקטים כמו Docker ו- Kubernetes? מהם המאפיינים המגדירים של גו, במה זה שונה משפות תכנות אחרות ואיזה פרויקטים זה הכי מתאים לבנייה? במאמר זה נחקור את מערך התכונות של גו, את מקרי השימוש האופטימליים, השמטות ומגבלות השפה, ולאן גו עשוי להגיע מכאן.

ללכת שפה היא קטנה ופשוטה

גו, או גולאנג כפי שהוא מכונה לעתים קרובות, פותחה על ידי עובדי גוגל - בעיקר גורו של יוניקס הוותיק והמהנדס המכובד של גוגל רוב פייק - אבל זה לא ממש "פרויקט גוגל". במקום זאת, גו מפותח כפרויקט קוד פתוח המובל על ידי הקהילה, בראשות מנהיגות שיש לה דעות חזקות לגבי אופן השימוש בגו ועל הכיוון שעל השפה לקחת.

Go נועד להיות פשוט ללמוד, פשוט לעבוד איתו וקל לקריאה על ידי מפתחים אחרים. ל- Go אין מערך תכונות גדול, במיוחד בהשוואה לשפות כמו C ++. Go מזכיר את C בתחביר שלו, מה שמקל יחסית על מפתחי C ותיקים ללמוד. עם זאת, תכונות רבות של Go, במיוחד תכונות התכנות הפונקציונליות שלו, מתחילות לשפות כגון Erlang.

כשפה דמוית C לבנייה ותחזוקה של יישומים ארגוניים חוצי פלטפורמות מכל הסוגים, ל- Go יש הרבה מן המשותף עם Java. וכאמצעי לאפשר פיתוח מהיר של קוד שעשוי לרוץ בכל מקום, אתה יכול לצייר הקבלה בין Go ו- Python, אם כי ההבדלים גדולים בהרבה מהדמיון.

לשפה של Go יש משהו לכולם

תיעוד ה- Go מתאר את Go כ"שפה מהירה, שהוקלדה באופן סטטי, ומורכבת, שמרגישה כמו שפה מודפסת ומפורשת דינמית. " אפילו תוכנית Go גדולה תיאסף תוך שניות ספורות. בנוסף, Go נמנעת מרוב מהתקורה של סגנון C הכוללת קבצים וספריות.

Go הופך את חיי היזם לקלים במספר דרכים:

  • נוֹחוּת.  Go הושווה לשפות תסריט כמו Python ביכולתו לספק צרכים רבים לתכנות נפוצות. חלק מהפונקציונליות הזו מובנית בשפה עצמה, כגון "גורוטינים" להתנהגות מקבילה והתנהגות דומה, ואילו יכולות נוספות זמינות בחבילות ספרייה רגילות של Go, כמו חבילת http של Go. כמו Python, Go מספק יכולות ניהול זיכרון אוטומטיות כולל איסוף אשפה.

    שלא כמו שפות סקריפטים כגון Python, קוד Go מתכנס לבינארי מקומי מהיר. ובניגוד ל- C או C ++, Go הידור מהיר במיוחד - מהיר מספיק כדי לגרום לעבודה עם Go להרגיש כמו עבודה עם שפת סקריפטים מאשר שפה מורכבת. יתר על כן, מערכת ה- build של Go היא פחות מורכבת מאלו של שפות מקובלות אחרות. נדרשים כמה צעדים והנהלת חשבונות מועטה בכדי לבנות ולהפעיל פרויקט Go.

  • מְהִירוּת.  בינאריות של Go פועלות לאט יותר ממקביליהן C, אך ההבדל במהירות הוא זניח עבור מרבית היישומים. ביצועי Go טובים כמו C עבור הרוב המכריע של העבודה, ובדרך כלל הרבה יותר מהירים משפות אחרות הידועות בזכות מהירות הפיתוח (למשל, JavaScript, Python ו- Ruby).
  • הִטַלטְלוּת.  קבצי הפעלה שנוצרו באמצעות שרשרת הכלים Go יכולים לעמוד לבד, ללא תלות חיצונית ברירת מחדל. שרשרת הכלים Go זמינה למגוון רחב של מערכות הפעלה ופלטפורמות חומרה, וניתן להשתמש בה כדי להרכיב קבצים בינאריים בין פלטפורמות.
  • יכולת פעולה הדדית.  Go מספקת את כל האמור לעיל מבלי לוותר על הגישה למערכת הבסיסית. תוכניות Go יכולות לדבר עם ספריות C חיצוניות או לבצע שיחות מערכת מקומיות. ב- Docker, למשל, ממשקי Go עם פונקציות לינוקס ברמה נמוכה, קבוצות קבוצות ומרחבי שמות, כדי לחולל קסמים במכולה.
  • תמיכה.  שרשרת הכלים Go זמינה באופן חופשי בתור בינארי של Linux, MacOS או Windows או כמכולה של Docker. Go נכלל כברירת מחדל בהפצות לינוקס פופולריות רבות, כגון Red Hat Enterprise Linux ו- Fedora, מה שמקל על פריסת ה- Go במקורות אלה. התמיכה ב- Go חזקה גם בסביבות פיתוח רבות של צד שלישי, החל מקוד Visual Studio של מיקרוסופט ועד ל- Komodo IDE של ActiveState.

איפה שפת Go עובדת הכי טוב

אף שפה אינה מתאימה לכל משרה, אך שפות מסוימות מתאימות ליותר משרות מאחרות.

Go זורחת בצורה הבהירה ביותר לפיתוח סוגי היישומים הבאים:

  • שירותי רשת מבוזרים. יישומי רשת חיים ומתים במקביל, ומאפייני המקבילות המקוריים של גו - בעיקר ערוצים וערוצים - מתאימים היטב לעבודה כזו. כתוצאה מכך, פרויקטים רבים של Go מיועדים לרשתות, פונקציות מבוזרות ושירותי ענן: ממשקי API, שרתי אינטרנט, מסגרות מינימליות ליישומי אינטרנט וכדומה.
  • פיתוח יליד ענן. התכונות המקבילות והרשתיות של גו ומידת הניידות הגבוהה שלה, הופכות אותו למתאים מאוד לבניית אפליקציות שמקורן בענן. למעשה, Go שימשה לבניית כמה אבני יסוד של מחשוב מקורי לענן, כולל Docker, Kubernetes ו- Istio.
  • החלפות לתשתית קיימת. חלק ניכר מהתוכנות שאנו תלויים בהן עבור תשתית אינטרנט מזדקן ומנוצל באמצעות מעללים. שכתוב דברים כאלה ב- Go מספק יתרונות רבים - בטיחות זיכרון טובה יותר, פריסה קלה יותר בין פלטפורמות ובסיס קוד נקי לקידום תחזוקה עתידית. שרת SSH חדש בשם Teleport וגרסה חדשה של פרוטוקול Time Network נכתבים ב- Go ומוצעים כתחליף לעמיתיהם המקובלים.
  • כלי עזר וכלים עצמאיים. תוכניות Go הידור לקבצים בינאריים עם תלות חיצונית מינימלית. זה הופך אותם למאוד אידיאליים ליצירת כלי עזר וכלים אחרים מכיוון שהם משיקים במהירות וניתן לארוז אותם בקלות להפצה מחדש.

לך מגבלות שפה

מערכת התכונות הדעתית של גו גררה שבחים וביקורת. Go נועד לטעות בצד של להיות קטן וקל להבנה, עם תכונות מסוימות שהושמטו במכוון. התוצאה היא שחלק מהתכונות הנפוצות בשפות אחרות פשוט אינן זמינות ב- Go - בכוונה.

תכונה כזו היא גנריות, המאפשרות לפונקציה לקבל סוגים רבים ושונים של משתנים. גו אינו כולל גנריות, ושומרי השפה מתנגדים להוסיפם, על בסיס הגנרית לפגוע בפשטות השפה. אפשר לעקוף את המגבלה הזו, אך מפתחים רבים עדיין מגרדים לראות גנריות שנוספו ל- Go באופן כלשהו. לפחות הצעה אחת ליישום גנריות ב- Go הועלתה, אך שום דבר לא הוגדר באבן.

חסרון נוסף ב- Go הוא גודל הבינאריות שנוצרו. בינאריות Go מוגדרות באופן סטטי כברירת מחדל, כלומר כל מה שנדרש בזמן ריצה נכלל בתמונה הבינארית. גישה זו מפשטת את תהליך הבנייה והפריסה, אך במחיר פשוט של "שלום עולם!" שוקל בסביבות 1.5MB ב- Windows של 64 סיביות. צוות ה- Go פעל לצמצום גודל הבינאריות האלה בכל מהדורה עוקבת. אפשר גם לכווץ קבצים בינאריים של Go באמצעות דחיסה או על ידי הסרת מידע על ניפוי הבאגים של Go. אפשרות אחרונה זו עשויה לעבוד טוב יותר עבור יישומים מבוזרים עצמאיים מאשר עבור שירותי ענן או רשת, כאשר מידע על איתור באגים שימושי אם שירות נכשל במקום.

מאפיין נוסף של Go, ניהול זיכרון אוטומטי, יכול להיתפס כחיסרון, שכן איסוף האשפה דורש כמות מסוימת של עיבוד תקורה. לפי התכנון, Go לא מספק ניהול זיכרון ידני, ואיסוף האשפה ב- Go ספג ביקורת על כך שהוא לא מתמודד היטב עם סוגי עומסי הזיכרון המופיעים ביישומים ארגוניים. בצד החיובי, Go 1.8 מביא שיפורים רבים בניהול הזיכרון ואיסוף האשפה המפחיתים את זמן הפיגור הכרוך בכך. כמובן שלמפתחי Go יש את היכולת להשתמש בהקצאת זיכרון ידנית בסיומת C, או באמצעות ספריית ניהול זיכרון ידנית של צד שלישי.

תרבות התוכנה סביב בניית ממשקי משתמש עשירים עבור יישומי Go, כמו אלה ביישומי שולחן העבודה, עדיין מפוזרת.

רוב יישומי ה- Go הם כלי שורת פקודה או שירותי רשת. עם זאת, פרויקטים שונים פועלים להביא GUIs עשירים ליישומי Go. יש איגודים למסגרות GTK ו- GTK3. פרויקט אחר נועד לספק ממשקי משתמש מקוריים לפלטפורמה, אם כי אלה מסתמכים על כריכות C ואינם כתובים ב- Go טהור. ומשתמשי Windows יכולים לנסות ללכת. אך לא זכה שום מנצח ברור או הימור בטוח לטווח הארוך במרחב זה, וכמה פרויקטים, כמו ניסיון של גוגל לבנות ספריית ממשק משתמש חוצה פלטפורמות, עברו דרך הדרך. כמו כן, מכיוון ש- Go אינה תלויה בפלטפורמה בעיצוב, אין זה סביר כי כל אלה יהפכו לחלק מערכת החבילות הרגילה.

למרות ש- Go יכול לדבר עם פונקציות מערכת מקוריות, היא לא תוכננה ליצירת רכיבי מערכת ברמה נמוכה, כגון גרעינים או מנהלי התקנים, או מערכות משובצות. אחרי הכל, זמן הריצה של Go ואספן האשפה ליישומי Go תלויים במערכת ההפעלה הבסיסית. (מפתחים המעוניינים בשפה חדישה לעבודה מסוג זה עשויים לבחון את שפת החלודה).

לך עתיד שפה

השלב הבא בפיתוח Go עשוי בהחלט להיות מונע יותר על ידי הרצונות והצרכים של בסיס המפתחים שלו, כאשר מטפליו של Go משנים את השפה כדי להתאים טוב יותר לקהל זה, ולא רק להוביל דוגמה עיקשת. במילים אחרות, גו עשויה לזכות בתכונות שבמקור לא נועדו לכך, כמו גנריות.

ברור שמפתחי גולנג רוצים את הדברים האלה. סקר המשתמשים ב- Go 2018 הציב גנריות בין שלושת האתגרים המובילים בדרך לאימוץ רחב יותר של Go, לצד תלות וניהול חבילות טובים יותר. והצעה קיימת ב- GitHub לגנריות נותרה פעילה כהצעה ל- Go 2.x. שינויים כמו אלה עשויים לסייע ל- Go לתפוס מקום מרכזי יותר בפיתוח ארגוני, בו Java, JavaScript ו- Python כיום ממלכות עליונות.

גם ללא שינויים משמעותיים, אנו יכולים לצפות לשימוש מוגבר ב- Go לצורך פרויקטים של בניית תשתיות מחדש, בהתאם לתחליפי SSH ו- NTP שתוארו לעיל, וכחלק מפרויקטים רב-שפתיים. 

יישומי צד ג 'של שרשרת הכלים Go התפשטו גם הם. ActiveGo של ActiveState מספק מהדורה נתמכת מסחרית של שפת ה- Go, וגם פרויקטים LLVM ו- gccgo מספקים יישומי קוד פתוח מורשים באופן חופשי של Go באמצעות שרשראות כלים חלופיות.

לבסוף, גו שימשה גם בסיס לפיתוח שפות חדשות לחלוטין, אם כי שתי דוגמאות לכך חדלו מהתפתחות פעילה. אחת הדוגמאות הייתה שפת ה- Have, שייעלה את תחביר ה- Go, יישמה כמה מאותם מושגים בדרכה שלה והועברה ל- Go לביצוע קל. פרויקט מושבת נוסף, אודן, השתמש במאסף ובשרשרת הכלים של גו כדי להרכיב שפה שתוכננה לאחרונה ולקחה השראה נוספת משפות כמו ליספ והאסקל.

קבוצת פרויקטים אחרונה זו ממחישה את אחת הדרכים שבהן כל חידוש IT הופך למהפכני באמת - כאשר אנשים מפרקים אותו ומטילים אותו מחדש ומגלים שימושים שמעצביו מעולם לא התכוונו אליו. העתיד של שפת ה- Go כפרויקט שנפרץ מתחיל. אך עתידו כשפת תכנות מרכזית כבר מובטח, בוודאי בענן, שם המהירות והפשטות של גו מקלות על פיתוח תשתיות ניתנות להרחבה שניתן לשמור עליהן בטווח הארוך.