הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
CppCMS -- הצצה הראשונה.
כפי שסיפרתי בפורום ב־WhatsUp, בזמן האחרון אני מפתח Web Development Framework ב־++C. הפרויקט מתארח ב־cppcms.sf.net. לאחר מספר שבועות של עבודה בערבים, הגעתי לאיזשהו בסיס הראשוני שמאפשר לצלול לכתיבת מערכות התוכן עצמן ב־++C בצורה מהירה. רבים מהרעיונות שנכנסות למערכת למעשה נלקחו מ־Django (כמו למשל טיפול ב־URL).
הרכיבים שנכתבו הם:
- תשתית הפעלה.
- תשתית ליצירת תבניות (templates).
- תשתית לעבודה עם nice urls.
- עבודה מול MySQL ב־++C שמשתלבת עם CppCMS. מתוכנן ממשק אחיד למספר בסיסי הנתונים חופשיים -- PostgreSQL, Sqlite3, MySQL בעתיד.
- ניהול הגדרות מרוכז.
אני אספר כאן על כל הרכיבים האלה ועל מפת הדרכים של הפרויקט.
תשתית הפעלה
בניית יישום FastCGI פשוט לא מהווה בעיה גדולה, אבל העניין הופך להרבה יותר מורכב כשאנחנו מחליטים להפעיל מספר Threads שיטפלו בבקשות נכנסות וישתפו ביניהם משאבים, לטפל בהורדה מסודרת של התהליך בעת הצורך, ניהול תור בקשות נכנסות ועוד.
היום תשתית הפעלה מאפשרת ע"י שינוי פשוט בקובץ קונפיגורציה להגדיר אם להריץ את היישום במצב של single או multi threaded. להגדיר socket, להגדיר גודל תורים נכנסים וגודל של thread pool. התשתית הזאת יודעת להוריד כל את התהליך בצורה מסודרת לאחר קבלת signal מתאים. למעשה, יש כאן טיפול בכל הרכיבים החיוניים להפעלת יישום FastCGI.
תבניות
אחת הרכיבים החשובים ב־Frameworks כאלה זה תבניות (templates) שמספקים הפרדה בין לוגיקת היישום לבין תצוגה -- HTML. כך גם ב־CppCMS יש מערכת תבניות שמורכבת מהרכיבים הבאים:
- שפת תבניות שבנוסף לקוד HTML מכילה פקודות מיוחדות כמו לולאות, תנאים ועוד שמאפשרים בניית תבניות "חכמות".
- קומפיילר של התבניות שהופך את קוד התבניות למבנה פנימי -- OpCodes שמאפשר עבודה מהירה איתן מתוך קוד ה־++C.
- ספריית התבניות שמריצה את הפסאודו קוד מהקובץ ה"מקומפל" ומציירת דפים.
לדוגמה, ניתן להשתמש בפקודות כמו <% if def message %>, לולאות while או repeat-until אפשר לעשות "include" לתבנות אחרות ועוד. כאן ניתן למצוא דוגמה לתבנית כזו.
כך שמערכת תבניות מספקת מספר תכונות:
- אי תלות של קוד התוכנה ב־HTML שמאפשר להחליף תכנית בלי לקמפל אותה.
- בגלל שהתבניות מומרות מטקסט ל-opcode יעילה אז הפעלה שלהם לא דורשת שום parsing ולמעשה מהירה ויעילה.
- כל התבניות יכולות להיות להשתמש בזכרון משותף ל־threads או לאפילו תהליכים נפרדים בעזרת mmap (לפי הגדרות) כך שזה חוסך זכרון עבור תבניות גדולות או ריבוי של תהליכים.
"קישורים יפים"
למעשה, הרעיון נלקח מ־Django. לכל עמוד או צורת הקישור ניתן לשייך פעולה מסויימת (פונקציית callback) שתופעל ברגע שנכנסים לקישור הספציפי הזה. הקישורים עצמם נקבעים בעזרת ביטויים רגולריים ולמעשה מאפשרים בצורה קלה למפות פונקציות לכל פעולה שדרושה. לדוגמה:
url.add("^/login$", BIND(&Main_Thread::show_login,this)); url.add("^/edit/(\d+)$",BIND(&Main_Thread::edit_message,this,$1));
שורות אלו מקשרות login/ לפונקציה show_login ו- edit/NUMBER/ לפונקציה edit_message שמקבלת את מספר ההודעה כפרמטר ראשון. המימוש של התכונות העלו מבוסס באופן הדוק על boost::signal, boost::bind ו־boost::regex.
מה עוד מתוכנן לזמן הקרוב?
בסיסי נתונים: אחד השלבים הראשוניים וחשובים הוא להגדיר ממשק אחיד לכל בסיסי הנתונים הנפוצים, כך שמפתח יוכל להשתמש באותו API עבור כל בסיס הנתונים ואולי רק לשנות את השאילתות בנקודות מאוד ספציפיות בהן בסיסי נתונים אלה אינם תואמים. אני עוד לא החלטתי אם אכתוב ממשק כזה בעצמי, או אשתמש בפתרונות מוכנים כמו libdbi או odcb. בכל אופן, זה עוד דורש עבודה מסויימת.
מערכת cache שקופה: המאפשר ניהול cache בין threads של אותו התהליך, בין תהליכים שונים דרך זכרון משותף או אופילו תהליכים מבוזרים דרך memcached. רכיב זה חשוב לצורך בניית יישומים בעלי ביצועים גבוהים במיוחד.
תמיכה בדחיסת פלט ל־gzip עבור השרתים שלא תומכים בזה (lighttpd 1.4).
כתיבת מערכת תוכן אמיתית שתעבוד על בסיס ה־Framework הזה. בינתיים אני מתכנן בלוג שיסקור את הפיתוח של המערכת עצמה, אחרי שרכיבים חיוניים יושלמו (והחשוב בהם ממשק אחיד לבסיסי נתונים).
תגובות
נשמע מגניב . הייתי מציע להסתכל על המימוש של PDO של PHP בנושא אבסטרקציית בסיס נתונים.
זהו, יש מספר ספריות שמספקות ממשק אחיד לבסיסי נתונים נפוצים. אני עדיין מתלבט אם לקחת משהו מוכן (שבכל אחד מהם יש משהו שלא מוצא חן בעיניי) או לכתוב משהו בעצמי.
נשמע מעניין.
"לדוגמה, ניתן להשתמש בפקודות כמו , לולאות while או repeat-until אפשר לעשות "include" לתבנות אחרות ועוד. כאן ניתן למצוא דוגמה לתבנית כזו."
איך תבניות אלו מקומפלות?
כתבתי קומפיילר שממיר אותם למבנה פנימי -- איזשהו opcode פשוט שמכיל פעולות בסיסיות מאוד. אם את הורצה אתה יכול להסתכל בתת פרויקט compiler. והקובץ שנוצר נטען ע"י היישום ויש אוסף של מחלקות שיודעות להבנות את התוכן של עמוד (templates.h/cpp ב-framework).
היי ארתיום.
נשמע פרוייקט מעניין וייחודי. זה בוודי ירוץ פי כמה יותר מהר ממערכת שכתובה ב- PHP לדוגמה אבל האם היא תיהיה גמישה מספיק למשתמשים ? האם יהיה ניתן לשנות ולהוסיף בקלות מאפיינים?
בהצלחה !
תלוי על מה אתה מדבר?
אם מדובר בערכות הנושא, עיצוב, לא תהיה שום בעיה, יש הפרדה ברורה בין קוד לבין HTML.
לגבי מאפיינים, כמו שב-PHP אתה חייב לשנות קוד אולי שינויים קלים, כך גם פה תצטר לעשות זאת. אני לא חושב ב-++C מוסבך בהרבה מ-PHP רק שעדיין צריך לדעת לשנות את הקוד ולקמפל אותו...
הוסף תגובה:
חובה לאפשר JavaScript כדי להגיב.