אל תיתנו להם שפה לידיים

בזמן האחרון חזרתי לעשות binding לעוד header של Xlib (כולל ההרחבות שלו) לפסקל. ובמקור רציתי לכתוב "אל תיתנו להם C לידיים" אבל הבעיה הזו מוכרת בכל עולם התכנות, ואם העולם היה כתוב רובו בפסקל (והגיע הזמן באמת שזה יקרה), אז אנשים היו מתעללים בשפה באותה מידה.

אם חשבתם לרגע למה X כזה מסריח, מספיק שתעיפו מבט בקוד שלו. נתחיל בדברים "עדינים" כמו struct אחד מוכר וידוע בשם XEvent ועוד struct בהרחבה של X שנקרא xEvent (ההבדלים הם ב X מול ה x – כלומר הגודל של הX).

אתם עדיין לא הגעתם למצב שבו אתם מתחילים לקבל גועל נכון ?

אז הנה משהו יותר כבד (פרס למי שמצליח לקרוא. הפרס הוא כמובן לשכתב את זה לשפה נורמאלית כדוגמת פסקל😛 [אם כי כבר עשיתי את העבודה בשבילכם]):

extern int (*XSetExtensionErrorHandler(
int (*handler)(
Display *,
char *,
char *
)
))(
Display *,
char *,
char *
);

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

טוב עדיין אתם לא מספיק מתרגשים אני רואה. אממ… אני יודע, נמשיך רגע בכיוון של callbacks:

typedef struct _XExtensionHooks {
int (*create_gc)(
Display*            /* display */,
GC            /* gc */,
XExtCodes*        /* codes */
);
int (*copy_gc)(
Display*            /* display */,
GC            /* gc */,
XExtCodes*        /* codes */
);
int (*flush_gc)(
Display*            /* display */,
GC            /* gc */,
XExtCodes*        /* codes */
);
int (*free_gc)(
Display*            /* display */,
GC            /* gc */,
XExtCodes*        /* codes */
);
int (*create_font)(
Display*            /* display */,
XFontStruct*        /* fs */,
XExtCodes*        /* codes */
);
int (*free_font)(
Display*            /* display */,
XFontStruct*        /* fs */,
XExtCodes*        /* codes */
);
int (*close_display)(
Display*            /* display */,
XExtCodes*        /* codes */
);
Bool (*wire_to_event)(
Display*            /* display */,
XEvent*            /* re */,
xEvent*            /* event */
);
Status (*event_to_wire)(
Display*            /* display */,
XEvent*            /* re */,
xEvent*            /* event */
);
int (*error)(
Display*            /* display */,
xError*            /* err */,
XExtCodes*        /* codes */,
int*            /* ret_code */
);
char *(*error_string)(
Display*        /* display */,
int            /* code */,
XExtCodes*        /* codes */,
char*            /* buffer */,
int            /* nbytes */
);
} XExtensionHooks;

מה הצלחתם להבין את כל זה ?!

טוב הנה סתם תכנון לקוי, בשביל שתבינו שזה לא השפה (טוב זה גם השפה) אלא המתכנתים:

typedef struct _XKeyInfo
{
#if defined(__cplusplus) || defined(c_plusplus)
XID            c_class;
#else
XID            class;
#endif
int            length;
unsigned short      min_keycode;
unsigned short      max_keycode;
unsigned short      num_keys;
} XKeyInfo

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

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

9 מחשבות על “אל תיתנו להם שפה לידיים

  1. צפריר כהן

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

    ה־headers של X משתמשות מסיבות של תאימות אחורה (או אולי סתם אינרציה) בתחביר ההכרזה המקורי של C (זה שמכונה K&R). צריך לזכור ש־X11 היא תוכנית שנוצרה במקור עוד לפני שהיה קיים ANSI C שבו נכנסה ההכרזה של שם המשתנה לתוך רשימת הפרמטרים.

  2. ik_5 מאת

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

    דבר שני, עדיין זה לא הופך את הקוד של X לטוב. אני חושב שהגיע הזמן ליצור את X12 שיכלול בתוכו גם עבודה ווקטורית, וגם תחביר ו API טוב יותר (וכמובן מעבר הדרגתי לרעיון שלו) והלתחיל לזנוח את הקוד המיושן הזה. זו לפחות דעתי.

  3. אחד

    יש לי תחושה רעה של קוד מהנדסים.
    כאן לפחות יש שמות קצת יותר טובים ממה שאני ראיתי אצל חלק מהמהנדסים.
    לדוגמה:
    a,b,c
    a1,b1,c1
    וזה לא סקריפטים קטנים, הם יכלים לכתוב אלגוריטמים שלמים עם משתני חסרי משמעות ולסבול את הכאב ראש אחר כך(והם גם אוהבים להשתמש במטלאב).

  4. צפריר כהן

    לתכנן את X12? וזה ממי שלפני כמה זמן קיטר על כמה ש־KDE4 שבר ממשקים?

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

  5. ik_5 מאת

    צפריר, חשבתי שיקח לך יותר זמן לעלות על זה. הבעיה עם X שהוא בנוי ע"י מנהדסים. הוא מצדפתוח מאוד, אבל בשביל להשיג דברים צריך לעבוד קשה. כיום xlib הוא דינוזאור מבחינת הצורה שהוא עובד. צריך פרוטוקול חדש שיתממש כמו שצריך. אפילו freedesktop מדברים על הבעיות שיש ל X ועל כך שיש פרוייקטים שלמים שמממשים אותו מחדש. מה שאומר שיש בעיה מאוד חמורה עם המימוש. הבאתי כאן דוגמאות ממש פשוטות יחסית. נתקלתי בבעיות גם של תוספים מ98 שהם בעיתיים מאוד

    שמוליק, חפש את הקוד של מנהל חלונות טקסטואלי בשם Turbo Vision. הוא התחיל את דרכו לפני שx10 יצא (זה הטיוטא של x11) אי שם בשנות ה80, ויש היום את FreeVision שאנשים ב FPC עשו שמממש אותו מחדש רק בצורה פתוחה..

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s