תכנות גנרי

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה לניווט קפיצה לחיפוש

תכנות גנריאנגלית: Generic Programming), הוא סגנון פיתוח תוכנה בו אלגוריתמים נכתבים במונחים של טיפוסים שיוגדרו בהמשך, וסוג הטיפוס יוגדר על פי הצורך ואז יתבצע שימוש באלגוריתם עבור הטיפוס המסוים שנקבע. גישה זו, שהשפה שנקטה בה ראשונה הייתה ML בשנת 1973, הרשתה כתיבת פונקציות משותפות או טיפוסים השונים רק בקבוצת הטיפוסים עליהם הם משמשים, ועל ידי כך מופחתת כפילות בקוד.

ישויות תוכנה מסוג זה נקראות:

תמיכה בתכנות גנרי[עריכת קוד מקור | עריכה]

שפות מונחות עצמים[עריכת קוד מקור | עריכה]

כאשר יוצרים מחלקה בשפות תכנות בעלות טיפוסים סטטיים, לא נוח לכתוב מימוש עבור כל אחד המטיפוסים המוכלים. דוגמה ב-C++ למחלקה הנמנעת מהכפילות הזו על ידי הגדרת template:

template<typename T> 
class List 
{ 
 /* תוכן המחלקה */ 
};

/* דוגמה ליצירת רשימה גנרית המקבלת אתחול של הטיפוס */
List<Animal> list_of_animals;
List<Car> list_of_cars;

דוגמה למימוש מחסנית גנרית בשפת C#:

public class Stack<T>
{
 T[] items; 

// שימוש פונקציונלי באותו משתנה גנרי שהתקבל בהגדרת המחלקה בזמן ריצה
 public void Push(T item)
 {...}
 public T Pop()
 {...}
}

// שימוש במחלקה הגנרית - הגדרת מחסנית ואתחול למשתנים מסוג מחרוזת
Stack<string> stack = new Stack<string>();

// שימוש בפונקציות הגנריות עם הסוג המתאים
stack.Push("Edo");
stack.Push("Tzumer");
string str = stack.Pop();

שפות פונקציונאליות[עריכת קוד מקור | עריכה]

שפות אחרות[עריכת קוד מקור | עריכה]

במשפחת שפות ML, ישנו פולימורפיזם פרמטרי, ומודלים גנריים הנקראים "functors". גם Standard ML וגם OCaml תומכים ב-functors, המתפקדים באופן דומה ל-"class templates" בחבילה הגנרית של Ada. אבסטרקציה סינטקטית ב-Scheme בעלת קשר לגנריות, אלו הם למעשה קבוצה מכילה של templating המצויה ב- C++.

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

VHDL הנגזרת מ-Ada מכילה אף היא יכולות גנריות.