תכנות הצהרתי
תכנות הצהרתי (Declarative programming) הוא פרדיגמת תכנות במדעי המחשב המבטאת את הלוגיקה החישובית בלי להגדיר את בקרת הזרימה שלה. שפות רבות משתמשות בצורה זו כך שהתוכנית תתאר מה היא צריכה לבצע, ולא איך היא צריכה לבצע זאת, בשונה מתכנות אימפרטיבי, הדורש הגדרה של אלגוריתם.
שפות תכנות הצהרתיות כוללות בין היתר ביטויים רגולריים, תכנות לוגי ותכנות פונקציונלי.
קיימות מספר פרדיגמות שונות המבוססות על תכנות הצהרתי.
- תכנות פונקציונלי (Functional programming) – תכנות פונקציונלי מנסה למזער ולהימנע מתופעות לוואי (side effect) ולפיכך נחשבת פרדיגמה זו כתכנות הצהרתי. אף על פי ששפות תכנות פונקציונליות מגדירות לרוב "איך" לבצע פעולה, המהדר של שפת התכנות רשאי לשנות את ההתנהגות של פונקציה, כל עוד אותה תוצאה נשמרת לאותו קלט. כך ניתן להגדיר שפונקציה תבצע את פעולתה בצורה מקבילית, או לערוך אופטימזציות בפונקציה (כדוגמת Deforestation) שלא ניתן לבצע בצורה בטוחה בשפות המאפשרות תופעות לוואי.
- תכנות לוגי (Logic programming)
- תכנות אילוצים (Constraint programming) – בתכנות אילוצים מגדירים אילוצים בין המשתנים, והאילוצים נפתרים באמצעות מתן ערכים למשתנים באופן שבו הפתרון יתאים למספר המרבי של אילוצים.
- שפות המיועדות לתחום ספציפי (Domain-specific languages) – דוגמאות לכך הם CSS, ביטויים רגולריים וחלק מ-SQL (שאילתות SELECT). שפות תגיות רבות הן דקלרטיביות כדוגמת HTML, MXML, XAML, XSLT ו-SVG.
דוגמאות
עריכהבדוגמה הבאה בשפת SQL מתבצעת שליפת כל הרשומות מתוך טבלה Book כאשר הן מסוננות לפי התנאי שדה price גדול מ-100, וממויינות לפי שדה title.
SELECT *
FROM Book
WHERE price > 100.00
ORDER BY title;
בתכנות אימפרטיבי היה צריך ליצור משתנה שקורא לתוכו כל הרשומות, לולאת For שסוקרת את כל הרשומות, מסננת אותן באמצעות תנאי If, ולאחר מכן ממיינת את כל התוצאות. בדוגמה הבאה בשפת C# אפשר לראות מימוש לא שלם של התהליך וניתן לראות את הפשטות והקלות של תכנות הצהרתי לעומת המורכבות של תכנות אימפרטיבי אף בשפה מודרנית.
List<BookStruct> Book = LoadAllBookRecordFromTbl();
List<BookStruct> BookDest = new List<BookStruct>();
foreach (var bookItem in Book)
{
if (bookItem.price > 100.00F)
BookDest.Add(bookItem);
}
BookDest.Sort((s1, s2) => s1.title.CompareTo(s2.title));