Tcl
פרדיגמות | מרובת פרדיגמות: מונחית עצמים, פונקציונלית, פרוצדורלית, מונחית אירועים |
---|---|
תאריך השקה | 1988 |
מתכנן | ג'ון אוסטרווט |
מפתח | ג'ון אוסטרווט |
מימושים | ActiveTcl |
הושפעה על ידי | AWK, LISP |
השפיעה על | Windows PowerShell |
רישיון | רישיון BSD |
סיומת | .tcl |
http://www.tcl.tk | |
Tcl (ראשי תיבות של "Tool Command Language"; את השם Tcl מבטאים "טיקל") היא שפת תסריט שפותחה על ידי חוקר מדעי המחשב ג'ון אוסטרווט. Tcl נמצאת בשימוש נרחב ב-CGI, בבדיקות תוכנה וביצירת ממשקים גרפיים. ב-Tcl כל דבר הוא פקודה, אפילו מבני שפה בסיסיים כמו if ו-for. למרות זאת, התחביר של Tcl דומה מאוד לזה של C ושפות תסריט מקבילות. ל-Tcl הרחבות רבות וקהילה גדולה של מפתחים המתחזקים אותה, מה שעושה את השפה לחזקה מאוד ובעלת מגוון של יכולות. השילוב בין Tcl להרחבה שלה התומכת בממשקים גרפיים (TK GUI Toolkit) מאוד נפוץ ושמו Tcl/TK (מבוטא "טיקל-טוק"). עד גרסה 8.5, Tcl תמכה בתכנות מונחה עצמים אך ורק באמצעות הרחבות כדוגמת IncrTCL. החל מגרסה 8.6, Tcl תומכת בתכנות מונחה עצמים באופן טבעי.
תכונות
[עריכת קוד מקור | עריכה]- Tcl היא שפה מפורשת, זאת אומרת שכדי להריץ קוד יש צורך במפרש.
- כל דבר הוא פקודה, אפילו מבני שפה.
- ניתן ליצור פקודות עם מספר משתנה של ארגומנטים.
- כל המשתנים הם מחרוזות, או שניתן לבטא אותם בקלות כמחרוזות.
- ניתנת בקלות להרחבה באמצעות השפות C, C ו-Java.
- חוצה-פלטפורמות - פועלת על כל פלטפורמה או מערכת הפעלה ידועה.
תחביר
[עריכת קוד מקור | עריכה]תוכנת TCL מורכבת מאוסף פקודות לביצוע. קריאה לפקודה היא רשימה של מילים המופרדת ברווחים. המילה הראשונה היא שם הפקודה ושאר המילים הם הארגומנטים לפקודה:
commandName argument1 argument2 ... argumentN
דוגמה מעשית לכתיבת "Hello World" על המסך באמצעות הפקודה puts.
puts "Hello, world!"
כעת, אם נרצה לחשב ביטוי מתמטי ולהוציא אותו למסך כפלט נכתוב:
puts [expr {5 6*10}]
הפקודה expr מחשבת ביטוי מתמטי שניתן לה כארגומנט. הקפנו אותה בסוגריים מרובעים כדי לקבל את הערך שהוחזר על ידה. כעת נראה דוגמה למשפט תנאי:
if {$a==0} {
puts "a is zero"
}
a הוא משתנה והוספנו לו את האופרטור $ כדי לקבל את ערכו. אם לא נוסיף לו $, a פשוט יחשב מחרוזת.
פונקציות
[עריכת קוד מקור | עריכה]- ב tcl פונקציות נקראות פרוצדורות, ולשם הגדרת פרוצדורה משתמשים בפקודה proc
proc name arglist body
כדי להחזיר ערך המחושב בתוך הפרוצדורה נשתמש בפקודה return
- ראו דוגמה
proc calc_mean {a b} {
return [expr ($a $b)/2]
}
משתנים וטווח הכרה
[עריכת קוד מקור | עריכה]כדי להשתמש במשתנים אנו זקוקים קודם כל לפקודה set כדי לשים ערכים לתוכם. כמו כן אין צורך להכריז עליהם או על סוגם בשום מקום.
set a "hello"
המחרוזת "hello" תכנס למשתנה בשם a, וכדי לגשת אחר כך לערכו נוסיף $ לפניו. ב-Tcl כל המשתנים הם בעצם ייחוסים למידע האמיתי שנמצא בזיכרון. כאשר שמים ערך לתוך משתנה באמצעות set, הוא רק מקצה מיקום חדש בזיכרון והאוסף זבל מוחק לאחר מכן את הערך הקודם. בגישה רגילה למשתנים, ניתן לגשת אך ורק לאלו שנמצאים בטווח ההכרה (הסקופ) הנוכחי או בסקופ הגלובלי כמו ב-java או ב-C , כל זה ע"פ שיטת הסקופ הסטטי. ב-TCL יש אפשרות לסקופ דינאמי: ניתן באמצעות הפקודה upvar ליצור ייחוס למשתנה הנמצא במקום כלשהו במחסנית הקריאות. לצורך זה יש לספק את שם המשתנה ואת הרמה בשרשרת הדינמית (במחסנית) בה הוא נמצא.
ניהול זיכרון
[עריכת קוד מקור | עריכה]Tcl זקוקה לניהול זיכרון מפני שהיא תומכת ביצירת אובייקטים ומפני שהמשתנים הם בסך הכל ייחוסים. דוגמה לאובייקט היא רשימה שבתוכה מופיעה רשימה אחרת באמצעות ייחוס. ל-Tcl יש אוסף זבל (Garbage Collector) הפועל בשיטת מניית התייחסויות. השפה מתגברת על בעיית ההצבעה המעגלית (הטיפוסית לשיטה זו) בכך שכל הערכים בשפה אינם ברי שינוי (immutable). נגיד ש-a מצביע ל-b. כעת נרצה לכוון את b ל-a, לא נוכל לעשות זאת משום שכשננסה לשנות את b, ייווצר מיקום חדש בזיכרון ש-b יצביע אליו. עכשיו, אף על פי ש-b מצביע על a, a מצביע למיקום אחר בזיכרון. כך לא ייווצרו הצבעות מעגליות.
הרחבות
[עריכת קוד מקור | עריכה]ל-Tcl הרחבות רבות שניתן להתקין, כל הרחבה כזאת מסודרת במה שנקרא packages. ה-Tcl/TK היא הרחבה שמאפשרת בניית GUI באופן פשוט מאוד. ל-TK בעצמה יש הרחבות שימושיות כגון וידג'טים מיוחדים או ספריות גרפיות. TK הותאמה גם לשפות תסריט אחרות כמו פייתון ו-Perl. הרחבת ה-Expect היא גם כן הרחבה נפוצה מאוד המאפשרת אוטומציה ובדיקה של תוכנות בסביבת UNIX. ספריית ה-TclLIB מאגדת בתוכה מספר עצום של סקריפטים המסייעים לעבודה עם Tcl.
גרסאות של המפרש
[עריכת קוד מקור | עריכה]ה"מפרש" מופץ בקוד פתוח תחת רישיון מבוסס על BSD-licence. כמו כן ישנה גרסה מהודרת נפוצה של ActiveState.