go_libhdate

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

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

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

אם תריצו ידנית את הפקודה

go tool cgo

על חבילה המדברת (כלומר עושה binding) עם C, תראו שתקבלו בעצם ספרייה בשם ‎_obj ושם כל ה"קסם" גלוי לעיניים:

$ tree _obj
_obj
├── _cgo_defun.c
├── _cgo_export.c
├── _cgo_export.h
├── _cgo_flags
├── _cgo_gotypes.go
├── _cgo_main.c
├── _cgo_.o
├── funcs.cgo1.go
└── funcs.cgo2.c

לקח לי המון זמן להבין כיצד לבצע binding, היות והתעוד לדעתי אינו מספיק טוב.
Go מגיע עם הדגמות, וההדגמה שהתחילה לסייע לי להבין יותר איך בכלל לבצע את הbinding היא של /usr/share/go/misc/cgo/gmp/ אשר מספקת הסבר כיצד בעצם לבצע binding עבור ספריית gmp, והיא טובה הרבה יותר מהתעוד של cgo.

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

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

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

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

למעשה אני עדיין לא סגור בכלל שהמימוש שלי תקין, ולכן עדיין לא סימנתי אותו כיציב.
כשהוא יהיה יציב, git יכיל trunk בשמות של:

stable/1.0

אשר יצביעו תמיד על משהו שיציב, טוב ועובד בעיני.

אז אחרי הרבה חפירות כאן, אם אתם מעוניינים לראות את מה שעשיתי, תוכלו למצוא בגיטהאב או במראה בBitBucket.

כמו כן, תמיד אשמח לדיווחי באגים בנושא, בשביל שהקוד יהיה טוב יותר, וכמובן patch תמיד מתקבלים בברכה🙂

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s