T (שפת תכנות)

T היא שפת תכנות מרובת פרדיגמות, וניב של שפת Scheme (שהיא ניב של Lisp). היא פותחה בתחילת שנות ה-80 של המאה ה-20 על ידי ג'ונתן א. ריס, קנט מ. פיטמן ונורמן י. אדמס מאוניברסיטת ייל כניסוי בעיצוב ומימוש שפת תכנות.

== רציונל ודוגמות ==

המטרה של T היא לבחון את התזה אשר פותחה על ידי גיא ל. סטיל ג'וניור וג'רלד ג'יי סוסמן בסדרת המאמרים שלהם על Scheme, שגורסת כי ניתן להשתמש ב-Scheme בתור הבסיס לשפת תכנות פרקטית אשר מסוגלת להביע מגוון רחב של רעיונות (High Expressive Power) וכן שמימושים של Scheme יכולים להיות טובים יותר ממערכות Lisp אחרות, ואף להתחרות במימושים של שפות תכנות כגון C ו-BLISS, שבעבר נחשבו נחשבות ליעילות הרבה יותר מניבי Lisp בארכיטקטורות מחשב קונבנציונליות (אם כי ניבי Lisp יכולים להיות יעילים באותה המידה באמצעות מהדר טוב <ref></ref>.

ב-T ישנם תכונות נוספות שחסרות ב Scheme . לדוגמה, T היא מונחית עצמים והיא מכילה סביבות מחלקה ראשונה, שנקראות "locales". מימוש תאורטי של פעולת ה-<code>cons</code><ref>cons היא פעולה בסיסית ברוב הניבים של שפות תכנות ממשפחת Lisp.

cons מרכיב (cons tructs) אובייקטים בזיכרון בצורה רקורסיבית אשר מייצגים רשימה מקושרת (״שרשרת חוליות״). כל אובייקט ברשימה מחולק לשני הערכים: car - החלק הראשון אשר מכיל את הערך.

וה-cdr - החלק השני אשר מכיל את ההפניה למקום הבא.</ref> לדוגמה:<syntaxhighlight lang="scheme">
 (define-predicate pair?)
 (define-settable-operation (car pair))
 (define-settable-operation (cdr pair))
 (define (cons the-car the-cdr)
 (object nil
 ((pair? self) t)
 ((car self) the-car)
 ((cdr self) the-cdr)
 (((setter car) self new-car) (set the-car new-car))
 (((setter cdr) self new-cdr) (set the-cdr new-cdr))))
</syntaxhighlight>
דוגמה זו ממחישה שאובייקטים ב- T קשורים באופן הדוק לסְגוֹרים (closures) ולהעברת מסרים (Message passing). ישנה פעולה מובנית בשפה (Primitive Function) ששמה <code>join</code> אשר מחברת 2 אובייקטים ביחד, ומאפשרת דבר המזכיר ירושה.

ב-T, כמו ניבי Lisp רבים אחרים, ניתן "לכתוב מחדש את השפה", כלומר, לשנות ערכים של פעולות וערכים מוגדרים בשפה, ולכן היא משויכת לפרדיגמה "מטא תכנות" . לדוגמה, ב Scheme, הפעולה <code>define</code> מגדירה ערך מסוים (סוג של השמה), ולכן ניתן להשתמש בה גם להגדרת עצמה מחדש, כך של <code>define</code> תהיה משמעות שונה .<syntaxhighlight lang="scheme">
(define define 6)
( write define)
</syntaxhighlight>בקוד לעיל שינינו את ערך הפעולה <code>define</code> ל 6, והדפסנו .

cons (מהמילה "construct" באנגלית שמשמעותה "לבנות") היא פעולה שקיימת ברוב השפות ממשפחת Lisp. היא יוצרת 2 תאים בזיכרון (בדרך כלל 4 בייטים (bytes) לכל תא) . התא הראשון מייצג את הערך, ואילו התא השני מייצג הפניה (מצביע) לתא הבא. בניבי LISP רבים מזינים את הערך <code>NIL</code> לפרמטר השני כאשר אין המשך לביטוי ה <code>cons</code> (כלומר, הגענו לאיבר האחרון) . בניבים רבים, <code>NIL</code> הוא שקר (FALSE) ו <code>T</code> הוא אמת (TRUE) . ב-Scheme, הניב שעליו שפת T התבססה, מסמנים אמת ב <code>t#</code> ושקר ב<code>f#</code>.

דוגמה למימוש פעולת cons בניב Common Lisp: <syntaxhighlight lang="lisp" line="1">
(CONS 'HELLO ( CONS 'WORLD NIL ) )
</syntaxhighlight>תחילה, הפעולה יצרה חוליה שהערך בתא הראשון שלה זה HELLO', והפניה לחוליה הבאה. ערך התא הראשון של החוליה השנייה הוא WORLD' והערך השני הוא NIL (המקביל לביטוי הבוליאני "שקר" (False) בניבי Lisp), ולכן אין חוליה שלישית והרשימה נגמרת . יש לסמן מחרוזות (בין היתר) ב-Common Lisp (וכן בניבים אחרים) בגרש בתחילתן על מנת לאותת למהדר לא להתייחס לטקסט כביטוי כגון מחרוזת או מתודה שצריך לפשטו. ניתן גם לכתוב את המילה השמורה quote לפני הערך כדי לקבל אותה תוצאה, בניבים רבים. לדוגמה, (<code>qoute hello)</code> יחזיר HELLO.

אם נדפיס את הרשימה נקבל : <code>(HELLO WORLD</code>).

מופיע ייצוג גרפי לחידוד ההבנה:
{| class="wikitable"
|+חוליה ראשונה
!POINTER TO NEXT
!HELLO'
|}
{| class="wikitable"
|+חוליה שנייה
!NIL
!WORLD'
|}
מבנה נתונים זה מזכיר רבות את מבנה הנתונים "שרשרת חוליות", אשר נפוץ בשפות עיליות רבות. בדרך כלל המצביע של האיבר האחרון הוא null (מסמל "כלום" בשפות התכנות סי שארפ וג'אווה (ועוד)), <code>none</code> (בפייתון) וכדומה, בהתאם לשפת התכנות.
{| class="wikitable"
|+ציר זמן של ניבי Lisp
!1955
!1960
!1965
!1970
!1975
!1980
!1985
!1990
!1995
!2000
!2005
!2010
!2015
!2019
|-
! colspan="3" |LISP 2 ,LISP 1.5 ,LISP
| colspan="10" |
|-
| colspan="2" |
! colspan="5" |Maclisp
| colspan="6" |
|-
| colspan="3" |
! colspan="5" |Interlisp
| colspan="5" |
|-
| colspan="4" |
! colspan="5" |Lisp Machine Lisp
| colspan="4" |
|-
| colspan="4" |
! colspan="4" |Scheme
! colspan="2" |R5RS
! colspan="1" |R6RS
! colspan="3" |R7RS small
|-
| colspan="4" |
! colspan="2" |NIL
|-
| colspan="5" |
! colspan="2" |Franz Lisp
|-
| colspan="5" |
! colspan="9" |Common Lisp
|-
| colspan="5" |
! colspan="9" |Le Lisp
|-
| colspan="6" |
! colspan="3" |T
| colspan="4" |
|-
| colspan="6" |
! colspan="8" |Emacs Lisp
|-
| colspan="6" |
! colspan="8" |AutoLISP
|-
| colspan="6" |
! colspan="8" |PicoLisp
|-
| colspan="7" |
! colspan="6" |EuLisp
|-
| colspan="7" |
! colspan="8" |ISLISP
|-
| colspan="7" |
! colspan="8" |OpenLisp
|-
| colspan="7" |
! colspan="4" |PLT Scheme
! colspan="3" |Racket
|-
| colspan="7" |
! colspan="7" |GNU Guile
|-
| colspan="9" |
! colspan="5" |Visual LISP
|-
| colspan="10" |
! colspan="2" |Qi, QiII
! colspan="2" |Shen
|-
| colspan="10" |
! colspan="4" |Clojure
|-
| colspan="10" |
! colspan="4" |Arc
|-
| colspan="10" |
! colspan="4" |LFE
|-
| colspan="11" |
! colspan="3" |Hy
|
|}

== היסבים (פורטים) ==
<small>נא לא להתבלבל בין המושג היסב (פורט) למושג פורט בתקשורת מחשבים.</small>

T הותאמה לפלטפורמות חומרה ומערכות הפעלה רבות, כגון :
* MIPS: DEC 3100 (pmax), SGI IRIS
* Motorola 68000 (m68k): Apollo Domain/OS, HP/UX, Mac/AUX, NeXT, SunOS 3
* NS320xx (n32k): Encore Multimax
* SPARC: SunOS 4 and above, Solaris, Unix on Connection Machine 5
* VAX: Ultrix

== ראו גם ==
* Scheme
* Lisp
* Common Lisp
* אוניברסיטת ייל

== קישורים חיצוניים ==
* 
* [http://www.paulgraham.com/thist.html ההיסטוריה של T]
* [https://web.archive.org/web/20070103020434/http://mumble.net/~campbell/t/t.html T revival project], באתר Wayback Machine

==הערות שוליים==

קטגוריה:שפות תכנות
קטגוריה:ניבי Lisp