יצירת DSL ב- Java, חלק 1: מהי שפה ספציפית לתחום?

אם אי פעם כתבת קובץ מקורי או תכננת דף אינטרנט עם CSS, כבר נתקלת בשפה DSL או ספציפית לתחום. DSL הם שפות תכנות קטנות ואקספרסיביות המותאמות אישית למשימות ספציפיות. בסדרה זו בת ארבעה חלקים, Venkat Subramaniam מציג את הרעיון של DSLs ובסופו של דבר מראה לך כיצד לבנות אותם באמצעות Java. במאמר ראשון זה, Venkat מסביר מהו DSL ומגדיר את ההבדל בין DSL חיצוני לבין פנימי. לאחר מכן הוא מציין כמה DSL שבהם אתה משתמש כנראה במשך שנים, אולי אפילו בלי להבין זאת.

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

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

אוקיי, זה L; מה עם D ו- S?

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

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

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

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

תמציתיות היא חלק נוסף בכתיבת DSL טוב, שמשמעותו בחירת תחביר שהוא גם קצר ואקספרסיבי. הטרנסיות מסיבה מקלה על הקריאה והתחזוקה של הקוד שלך. אקספרסיביות עוזרת לקדם תקשורת, הבנה ומהירות. למשל, למי שמבין את הכפל במטריצה, matrixA.multiply(matrixB);הוא פחות אקספרסיבי ותמציתי מאשר matrixA * matrixB. הראשון כולל פונקציות קריאה ושימוש בסוגריים, וכולל נקודה-פסיק מאיימת. האחרון הוא כבר ביטוי שיהיה די מוכר.