קישור ל Qt

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

מה זה תכנות מונחה עצמים ?

למי שאינו יודע, תכנות מונחה עצמים הינו עניין של גישה וחשיבה ולא עניין של תחביר. מי שמתכנת בפרל מבין את זה מצויין, אבל הרבה מתכנתים המגיעים מעולם הג'אווה ו/או ה.NET לא מבינים את המשמעות ובד"כ אני מוצא את עצמי מנסה להסביר להם ללא הצלחה את הנושא.

2 דוגמאות ממש מעניינות של תכנות מונחה עצמים לא מבוסס תחביר הקיימות בעולם הקוד הפתוח הם xlib/xcb ו GTK. הגישות מאפשרות להעביר מידע בניהם על ידי רשומה כלשהי שמכילה התייחסות למידע שרוצים וכך אפשר באמצעות תכנות פרוצדורלי רגיל (כתיבת פונקציות שלא מחוברת לכלום) ליצור "אובייקטים".

איך אפשר לדבר עם ספריות הכתובות בשפה אחרת ?

יש לנו בעיקרון בעולם התכנות בעיה. כל שפה ולפעמים אפילו כל מהדר יוצר לנו ABI היחודי לשפה וכאמור לפעמים גם להמדר עצמו. מה זה ABI ?  ובכן ממש בגדול זה אומר מה הצורה הבינארית לגשת פונקציות ומה המידע (פרמטרים) שהפונקציות צריכות, ומה הסדר שלהם, סדר חזרה ועוד. בנוסף יש גם החלה של עוד התמודדויות של זיכרון stuck ו heap שהשפה מתייחסת אליהם, איך מתמודדים עם תחביר מסויים (נגיד של תכנות מונחה עצמים) וכו'. המידע הזה מגיע למערכת הפעלה ולא לתוכנה אחרת. כלומר שמערכת ההפעלה תבין למה אני מתכוון בכל שלב של ריצה כאשר אני צריך לבצע פעולה מסויימת. כאמור זה ממש בגדול בלי באמת לרדת לפרטים הקטנים והחשובים באמת. המשמעות של ABI בסופו של דבר זה Application Binay Interface.

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

ובכן, היות ו C הפך לצערי לסטנדרט עבודה, הרבה שפות יודעות לדבר ב ABI של C ובכך בעצם אפשר לקשר אותם (פעולה הנקראת binding) עם פונקציות הכתובות בשפה. הסיבה ש C הפך לסטנדרט בנושא, היא הפשטות של השפה אשר לא מחביאה התנהלות של דברים מפני המתכנת ובכך יוצרת Low Level שהוא הבסיס להכל.

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

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

אבל ב ++C למזלנו יש מצב שאפשר להגיד לו להתנהג כמו שפת C וכך אפשר להתמודד בשפות אחרות עם קוד ++C אשר לא תומכות ב ABI של השפה. שימו לב ש ++C אינו מסוגל להתמודד עם ABI של פסקל באותה מידה (אלא אם הוא יממש את ה ABI של פסקל).

מה זה Qt ?

Qt זה בעצם אוסף של ספריות (toolkit) המספקות לשפת ++C  שלוש יכולות עיקריות:

  1. ספרייה לעבודה עם רכיבים גרפיים ברמה גבוהה יותר מ xlib ו Xt או Windows API מהצד השני
  2. התקשרות עם ספריות מערכת ב API אחיד
  3. מספקת ל ++C כלים המאפשרים לתכנת בשפה בצורה הגיונית בלי להסתבך עם עודף היכולות של השפה שמאד לא פשוט לשלוט בכולם

הספרייה החלה את דרכה בחברה בשם TrollTech בשנת 1991 ונרכשה על ידי חברת Nokia ב2008.

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

מנהל החלונות המפורסם ביותר אשר משתמש בספרייה הוא KDE, אך יש עוד מנהלי חלונות שונים כדוגמת BlackBox ואחרים המשתמשים בספרייה.

התקשרות עם Qt ופסקל

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

ההתקשרות של Qt עם פסקל מספקת שיכבה מאוד מעניינת אשר מאפשרת לכל מי שכותב גם בשפת C לדבר עם Qt באותה מידה כמו בפסקל. קוד C יוצר ספרייה משותפת אשר מורידה את יכולות התחביר של ++C אל רמה נמוכה יותר שכל מתודה עוברת להיות פונקציה המעבירה גם התייחסות לאובייקט (מי שמתכנת בפרל, או הבין את ההסבר שלי למעלה מתחיל להבין את התמונה) וכך יש לנו קוד C המסוגל להריץ קוד ++C בצורה "טבעית" המהודר לספרייה משותפת.

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

אם אתם מתכנתים בפסקל "נקי", אז ההתקשרות הזו עם Qt יכולה להישאר בתכנות פרוצדורלי (מצב ברירת המחדל של פעולת הקישור), בעוד שבמידה והחלטתם לעבוד בקישוריות מונחת עצמים, אז אפשר להתשמש בקישור ב Lazarus , אשר שם הצוות העלה את הרמה לתכנות מונחה עצמים -> דורש עבודה עבור כל גרסה חדשה של קישוריות להוסיף תמיכה לעוד  דברים.

לאלו הרגילים לעולם Borland ו/או לזרוס בכלל, תגלו כי ה API הטבעי של Qt דומה מאוד עד זהה כמעט לגמרי לAPI שבורלנד סיפקה עבורינו בשביל פיתוח סביבות גרפיות.  דבר שהופך את Qt למערכת לפיתוח גרפי ממש מעניינת וכמעט לגמרי טבעית עבור מפתחי פסקל המקצועיים. הדמיון כל כך רב עד שלפעמים השם של המתודה או רק סדר הפרמטרים הוא מה שמשנה בין תוכנה המשתמש ב LCL/VCL לבין המחלקה הספציפית ב Qt. עצם הצורה שמחלקות מפורקות ומתעסקות ב Qt גם זהה כמעט לגמרי לגישה שיש לנו בדלפי ולזרוס.

קוד שכתוב בLCL נראה כך:

...
begin
  Application.Initialize;
  Apllication.CreateForm(...
 ...
  Application.run;
end.

קוד ב Qt (עדיין בפסקל) יראה כך:

...
begin
  QApp := QApplication_create(@argc,argv, QApplicationGuiClient);
  ...
  QObject_connect(...
  QApplication_exec;
  QApplication_destroy(QApp);
end.

מה חדש ב FPC Qt4 גרסה 2.1 ?

ובכן אם שמתם לב לא היתה גרסה 2.0 לשיחרור אלא מגרסה 1.72 היתה קפיצה ל 2.1. הקפיצה הזו הביאה איתה כמה שינויים, כאשר 2 החשובים בהם הם:

  • התקשרות עם Qt 4.6
  • שינוי שם הספרייה מ libqt4intf.so אל libQt4Pas.so

השינויים האלו עדיין לא נכנסו ללזרוס אשר עובד עם Qt 4.5 וגרסת 1.72 של ספריית הקישור.

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

רשומה זו פורסמה בקטגוריה C, FPC, Lazarus, Qt, קוד פתוח. אפשר להגיע ישירות לרשומה זו עם קישור ישיר.

6 תגובות על קישור ל Qt

  1. שניר דוד הגיב:

    פוסט משובח ביותר! תודה רבה.

  2. Artyom הגיב:

    מעניין, תגיד לי, איך נפתר עניין של פונקציות וירטואליות? למשל אם אני יורש מ־QWidget ומממש פונקציות כמו: paintEvent, ‏mouseMoveEvent או mousePressEvent? כיצד אפשר לחבר את זה ל־FPC?

    שאלה שניה, כפי שאני מבין, אובייקטים של Qt לא הופכים לאובייקטים טבעיים ב־Pascal? וכיצד מנוהלים סיגנלים ברמת Pascal? אתה יכול להציג דוגמה (כי זה מעניין)

  3. ik_5 הגיב:

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

    http://users.telenet.be/Jan.Van.hijfte/qtforfpc/demos-V2.1_Qt4.5.3.tar.gz

  4. מאיר הגיב:

    פוסט טוב, יישר כח.

  5. ik_5 הגיב:

    מאיר, אם זה מגיע ממך אז אני באמת יכול להיות בטוח שהוא טוב :)
    תודה רבה

  6. בועז3 הגיב:

    well said

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s