Language Oriented Programming - LOP

Fractal

New member
Language Oriented Programming - LOP

One paradigm to rule them all: http://www.onboard.jetbrains.com/is1/articles/04/10/lop/ http://lambda-the-ultimate.org/node/view/377 some advantages that you will encounter: 1. write a self documented code. (it's a hard work to keep code & comments in sync, now you don't need comments) 2. LOP is a refinement of the multi-paradigm approach, so if you like multi-paradigm you will love this. 3. just read the damn thing! it's really inspiring.​
 

DadleFish

New member
זה לא נשמע לי כמו רעיון טוב.

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

Fractal

New member
גם אני חשבתי כמוך פעם....

גם לכל קוד בפרדיגמה מונחית עצמים אפשר להתאים קוד פרוצדוריאלי. (מה זה אומר בדיוק ?) אז בטח כבר הגעת למסקנה שפרדיגמה מונחית עצמים זה דרך מחשבה, LOP זה עוד צעד אחד בכיוון הנכון. ב-LOP אתה קודם כל חושב על הפתרון, ואח"כ בונה שפה מתאימה, זה פותח את המחשבה, היצירתיות ... בשפה קשיחה אתה כלוא בתוך איזה מסגרת שהוגדרה, אני קורע את התחת עכשיו להשתחרר מהכלא הקטן שהכנסתי את עצמי לתוכו(מבחינת חשיבה), ++C. <-- לא ש-++C שפה גרועה. תכנות מונחה עצמים יותר טוב מתכנות פרוצדוריאלי בגלל שהוא מקרב אותנו לתמונה שיש לנו בראש לפתרון. מאותה סיבה בדיוק תכנות מונחה שפות יותר טוב מתכנות מונחה עצמים, שכן אנו קרובים מתמיד לתמונה הזו. גם ספרייה שלא השתמשת בה חודשיים כנראה לא יהיה הדבר הכי טרוויאלי לבצע בו "שליפה מטורפת". דווקא DSL שיותר קרוב לתמונה שיש לנו במחשבה יעשה את החיים קלים יותר, זו המטרה של DSL. קח בחשבון שהמוח שלנו כבר יודע להתמודד עם הרבה מאד שפות. (מכיר את זה שב-CONTEXT מסויים אתה נותן משמעות מסויימת למילים/משפטים מאשר ב-CONTEXT אחר, זה MOD שהמוח שלך נכנס אליו שהוא מדסקס נושא מסויים.) תעשה לעצמך ניסוי, תחשוב על בעיה, ותנסה (בלי לחשוב על איך למפות אותה לשפת תכנות מסויימת) להציג פתרון, יכול להיות שתגיע לפתרון אלגנטי מבדרך כלל. (you need to free you mind - matrix) מה שאני מנסה להגיד זה שקודם כל LOP זו דרך מחשבה, ויכול להיות מועיל אפילו אם אתה בוחר לממש את הפתרון בשפה קשיחה. (דרך אגב, LISP זה שפה שמעודדת פיתוח ב-LOP)
 

DadleFish

New member
אני לא חושב שיש לזה איזשהו יתרון,

ברור שיש מקום להשתמש בשפות שונות לצרכים שונים, וברור שאם אצטרך לעבוד מול DB אעבוד דרך SQL; אבל מכאן ועד להמציא שפה ייעודית אחת לכל PROBLEM DOMAIN המרחק גדול מאוד. אולי בתיאוריה הרעיון יפה (וגם בתיאוריה הוא לא ממש מוצא חן בעיניי), אבל בפרקטיקה הוא ייכשל כשלון חרוץ לדעתי. נניח שתבנה שפה שלמה לכל PROBLEM DOMAIN, בדומה למה ש-SQL עושה ל-DB טבלאיים. אפילו קישור של SQL ל-C זה לא עניין של מה בכך. תוסיף סיבוכיות של נניח קישוריות של 10 שפות, כשכל אחת צריכה להיות מסוגלת לתקשר עם כל אחת אחרת. נשמע לי לחלוטין לא פיזיבילי. אולי אני טועה אבל נראה לי שעקומת הלימוד של כזה עולם תהיה מטורפת. בוא נניח שהגישה תופסת באמת ויש איזה 100 שפות עכשיו, כל אחת מתאימה ל-DOMAIN אחר. תאר לעצמך מה יהיה זמן ההכשרה של תוכניתן; תאר לעצמך מה יהיה זמן החפיפה שיידרש כדי להכניס מישהו למערכת שרק 20% מהשפות שהיא משתמשת בה לא מוכרות לאותו תוכניתן. מעבר לכל זה, יש גישה רוחבית (שאומרת "תלמד כמה שיותר טכנולוגיות"), ויש גישה ורטיקלית (שאומרת "תתמקד ותתמקצע בתחום אחד - נגיד JAVA"). כמו תמיד בחיים, דרך המלך נמצאת בין שתי הגישות. אבל אם יש לך 100 שפות תכנות על הראש, אין סיכוי שתצליח להתמקצע באמת בכלום, ומה אז? מה יהיה כשתצטרך להביא פתרון מסובך במיוחד, כמו שרק מומחי JAVA או מומחי ++C יכולים להביא? לגבי LOP ו-LISP, אני לא מכיר את LISP בכזו רמה - בא לך להרחיב?
 

Fractal

New member
אתה לא בהכרך ממציא DSL חדש עבור כל

דומיין, שפות קטנות בנויות בצורה שכבתית, ככה שאתה יכול למצוא את השכבה שהכי קרובה לצרכים שלך ולבנות שפה מעליה. אבל שוב, גם ספרייה צריך ללמוד, גם בספרייה יש ניואנסים קטנים של סמנטיקה שצריך להכיר. אז אפילו אם ללמוד DSL יקח 20% יותר זמן (אני חושב שזה בכלל לא נכון), אבל תהליכי החשיבה בשפה הקטנה הזו יהיו הרבה יותר טבעיים ומהירים, הקוד שלך יהיה הרבה יותר תמציתי (אתה תתאר בדיוק מה שאתה חושב, ולא תנסה לתאר את המיפוי של השפה שבחרת לפתרון שלך <- כאן טמונה הבעיה) * כמובן אני מתעלם מהעובדה שלפעמים שצטרך לממש את אותה שפה קטנה שמתאימה, אבל זה לא ממש שונה מהצורך לממש ספרייה. (לרוב שווה את המאמץ) אתה בטח יודע שזה לא ממש טרוויאלי לתפוס וממש להבין את האיכויות של תכנות מונחה עצמים (אחרי ששקועים עמוק בסגנון פרוצדוריאלי) עד שלא ממש עובדים בזה. בקשר ל-LISP אז יש את מנגנון המקרוים שמאפשר להרחיב את השפה, ובכלל לעשות דברים די מדהימים. אני יכול להמליץ לך על הספר המעולה של NORVIG. ותראה את השפה הקטנה הזו לתיאור לולאות ב-CL : http://www.gigamonkeys.com/book/loop-for-black-belts.html (זה ספר שלם באינטרנט, אני אישית ממליץ למתחילים ללמוד מהספר המעולה של NORVIG) בנוסף מאד ממולץ לקרא קצת על CLOS. (צורה שונה לתכנות מונחה עצמים) http://www.gigamonkeys.com/book/object-reorientation-generic-functions.html http://www.gigamonkeys.com/book/object-reorientation-classes.html תכנות מונחה עצמים שהרוב מכירים הוא מבוסס על MSG-PASSING, יש גם צורה אחרת שמבוססת על פונקציות ג'נריות - ושים לב איך הטמיעו פרדיגמה נוספת בתוך LISP. * בהתחלה היו ל-LISP הרחבות של שפה שהיו מבוססים על MSG-PASSING. אם יש לך קצת זמן פנוי בידיים תנסה להתחיל ללמוד LISP, אולי תתמכר, אני בטוח שזה לא יהיה לשווא, גם אם תחליט שזה לא בשבילך.
 

גיל14

New member
אה?

* כמובן אני מתעלם מהעובדה שלפעמים תצטרך לממש את אותה שפה קטנה לפעמים? תקנּי אם אני טועה, אבל אם אתה רוצה להשתמש בשפה יחודית לכל domain, לא תצטרך לממש אותה לכל domain? פלוס קונצים לכל תוכנה?
 

גיל14

New member
וגם

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

Fractal

New member
קראת עד הסוף ?

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

DadleFish

New member
אבל אני לא מבין,

אם אתה ממילא צריך לבחור לממש DSL או ספריה - מה טוב יותר ב-DSL? להיפך; הרי אם כל DSL תגדיר קונבנציה משלה, יהיה לך בעיקר בלאגן. אם תעשה ספריות סטנדרטיות (ואפשר לקחת דוגמה מצוינת מ-JAVA למשל), יהיה לך API שהוא DS - בשבילך, DSA
למה עדיפה שפה על ספריה סטנדרטית? אז אמנם JAVA היא לא דוגמה טובה כל כך לשפה כזו, כי JAVA לא מאפשרת יותר מדי דברים (כמו גישה LOW LEVEL) בגלל הפורטביליות שלה; אבל אפשר לעשות את זה ב-++C. קח למשל את ACE. ספריה משובחת שמאפשרת לבנות אפליקציות שרת במהירות. צרף לזה את STL ואת BOOST, ויש לך תשתית חזקה ביותר. אם אתה מתמקצע בכל מה שהזכרתי וגם ב-++C, יהיה לך קל יחסית לכתוב אפליקציה מורכבת. עוד לא השתכנעתי שהמשיח יופיע בדמות 100 שפות שונות. להיפך, אני בעד קונסולידציה של השפות ככל האפשר.
 

Fractal

New member
הסבר.

"הרי אם כל DSL תגדיר קונבנציה משלה, יהיה לך בעיקר בלאגן" אתה שוכח שגם שאתה לוקח ספריות שונות אתה מקבל קונבנציות שונות. (ביג בלאגן) הטענה שלי היא שכל החסרונות שיש ל-LOP יש גם לספריות, אבל ההפך אינו נכון. "מה טוב יותר ב-DSL?" דוגמא קטנה ופשוטה היא הוספת מבנה שפתי ל-++C. מבנה דומה ל-SWICH מבחינה תחבירית + הרחבה שלכל CASE אפשר לשים לא רק קבוע, אלא גם תנאי (כמו ב-IF). לדעתי זה הפתרון הלז הרבה יותר אסטטי מאשר זו של שרשור IF ELSE. (יש כאן גם היבטים של אסטטיקה של שפה, אבל זה דיון שלם בפני עצמו) ומשהו קצת יותר מורכב, תרגיל, תתאר לי בכלליות עיצוב של ספרייה למימוש משחקים בסגנון שחמט, איך המשתמש יתבצע איתחול של הלוח עם הכלים עליו? אם אתה רוצה אתה מוזמן לתת קטע קוד של אפליקציה לבחירתך (משהו קטן, ורצוי בתחום שמוכר כדי שנוכל לפתח עליו דיון) ואני אנסה להציג את אותו פתרון ב-LOP. ( נקווה לטוב
) * תבחר משהו קטן אבל מסובך, כי אחרת יכול להיות שההפשטות של אובייקטים ופונקציות יספיקו ואז לא ממש יהיה לי מה לחדש.
 

DadleFish

New member
השאלה היא אחרת

אמרת, "אבל תהליכי החשיבה בשפה הקטנה הזו יהיו הרבה יותר טבעיים ומהירים, הקוד שלך יהיה הרבה יותר תמציתי" אני מסכים. גם עם עניין מימוש הספריה אל מול מימוש השפה - גם עם זה אני מסכים. מה שמפריע לי זה האינטגרציה בין השפות, שהיא דבר מלאכותי ב-100% מהמקרים שאני מכיר (לדוגמה, PRO-C שמאפשרת כתיבת SQL ל-ORACLE בתוך קוד C, וגם JNI שהוא לא ממשק חביב - לדעתי). יש לך בעיית יכולות, כלומר - לא כל מה ששפה א' יכולה לעשות ושפה ב' יכולה לעשות, תוכל לעשות ביחד (ע"ע JNI). השורה התחתונה מבחינתי היא שהרעיון אולי יפה בתיאוריה, אבל בפרקטיקה נדמה לי שיש פשוט יותר מדי בעיות. בקשר ל-LISP, משום התעניינותי הקיימת ב-AI, הגיע הזמן שאלמד גם LISP... אני לא מוצא את הזמן, בינתיים. תודה על הלינקים, אני אבדוק אותם.
 

andav

New member
מה עם haskell

(אני מודה מראש שאני ממש לא מכיר אותה , רק קראתי עליה קצת) haskell
 

Fractal

New member
לא מכיר מספיק טוב כדי להגיב.

אבל זו שפה עצלה, ככה שאפשר ליצור איתה כל מיני דברים מעניינים.
 

Fractal

New member
שוב אתה מציג חיסרון גם של ספריות

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

Fractal

New member
ועוד דבר קטן

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