APL
פרדיגמות | תכנות מערכים, תכנות פונקציונלי, תכנות מובנה, תכנות מודולרי |
---|---|
תאריך השקה | 1966 |
מתכנן | קֶנֵת' יוג'ין אייבֶרסון |
מפתח | לורֶנְס ("לַארי") מוזֶר בְּרִיד, ריצ'רד ("דיק") הנרי לַאתְ'װֶל, רוֹגֶ'ר ד' מוּר |
טיפוסיות | דינמית |
מימושים | APL\360, APL\1130, APL*Plus, Sharp APL, APL2, Dyalog APL, NARS2000, APLX, GNU APL |
הושפעה על ידי | הסימון והתחביר המתמטי המסורתי |
השפיעה על | A ו־A+, FP, J, K, LYaPAS, MATLAB, Nial, PPL, S, Speakeasy, Speakeasy, Wolfram Language |
רישיון | מגוון |
סיומת | apl .dyalog. |
APL (מבוטא: "אֵיי־פִּי־אֶל", נקראת על פי ראשי התיבות של שם הספר שהציג אותה: "A Programming Language"[1], בעברית: "שפת תכנות") היא שפת תכנות שפותחה בשנות ה־60 של המאה ה־20 על ידי קֶנֵת' יוג'ין אַייבֶרְסוֹן.
מבנה הנתונים הבסיסי של APL הוא מערך מרובה ממדים. השפה נכתבת בעזרת סימנים מיוחדים המאפשרים ייצוג של כל הפונקציות והאופרטורים הקיימים בה בתווים בודדים, וכתוצאה מכך היא תמציתית מאוד ביחס לשפות אחרות.
ל־APL הייתה השפעה חשובה על התפתחות פרדיגמת התכנות הפונקציונלי[2], גיליונות אלקטרוניים, והמתמטיקה החישובית[3]. כמו כן הייתה לה השפעה על שפות תכנות אחרות[4][5]. על פיתוח APL הוענק לאייברסון פרס טיורינג בשנת 1979.
היסטוריה
[עריכת קוד מקור | עריכה]הסימון המתמטי
[עריכת קוד מקור | עריכה]קנת' יוג'ין אַייבֶרְסוֹן (אנ') התחיל לעבוד על סימון מתמטי חדש לפעולות על מערכים באוניברסיטת הרווארד בשנת 1957. בשנת 1960 הוא התחיל לעבוד ב־IBM, שם המשיך לפתח את הסימון החדש יחד עם אַדִין ד' פַלְקוֹף והפיץ אותו בספרו A Programming Language בשנת 1962[1]. ההקדמה בספר מתארת את ייעודה של השפה כך:
Applied mathematics is largely concerned with the design and analysis of explicit procedures for calculating the exact or approximate values of various functions. Such explicit procedures are called algorithms or programs. Because an effective notation for the description of programs exhibits considerable syntactic structure, it is called a programming language.
בתרגום לעברית: ”המתמטיקה השימושית עוסקת בעיקר בעיצוב וניתוח של תהליכים מפורטים לחישוב ערכן המדויק או המשוער של פונקציות שונות. תהליכים מפורטים כאלה נקראים אלגוריתמים או תוכניות. מכיוון שסימון יעיל לתיאור תוכניות מניב תחביר מובנה מאוד, הוא נקרא שפת תכנות”.
הסימון החדש שימש בעיקר בתוך IBM לדו"חות מחקר קצרים של מערכות מחשב, למשל B5000 של המתחרה Burroughs ומנגנון המחסנית שלה, בתקופה שבה IBM העריכה את יעילותן של ארכיטקטורות מחשב שונות עבור מחשבים עתידיים.
אייברסון השתמש בסימון שלו גם בטיוטה לפרק "A Programming Language" בספר "Automatic Data Processing" שאותו חיבר יחד עם פרד ברוקס[6].
המשך פיתוח הסימון לשפת תכנות
[עריכת קוד מקור | עריכה]הניסיון הראשון להשתמש בסימון כדי לתאר מערכות מחשב שלמות ב־IBM התחיל בשנת 1962, אחרי שפלקוף שוחח עם ויליאם קַרְטֶר על עבודתו להגדרת סט פקודות אחיד בסדרת המחשבים שנודעה בהמשך בשם IBM System/360.
בשנת 1963 הֶרְבֶּרְט הֶלֶרְמַן, שעבד אז במכון המחקר של IBM, מימש חלק מהסימון של APL על מחשב IBM 1620. המימוש החלקי של הלרמן שימש בקורס תיכוני מיוחד שעסק בחישוב ערכי פונקציות טרנסצנדנטיות באמצעות טורים. התלמידים ניסו את הקוד שלהם במעבדתו של הלרמן. מימוש חלקי זה של הסימון נקרא אז Personalized Array Translator (PAT)[7].
ב־1963, פלקוף, אייברסון, ואדוארד ה' סַאסֶנְגוּת' ג'וניור (כולם עובדי IBM) השתמשו בסימון לתיאור פורמלי של הארכיטקטורה והפונקציונליות של סדרת המחשבים IBM System/360. עבודתם פורסמה כמאמר בכתב העת של IBM, IBM Systems Journal, בשנת 1964. לאחר פרסום המאמר, הצוות החל לעבוד על מימוש מלא של APL על מחשבי IBM[8].
אחרי שלורנס מ' בְּרִיד ופיליפ ס' אַבְּרַמְס מאוניברסיטת סטנפורד הצטרפו לצוות באגף המחקר של IBM, הם המשיכו את עבודתם הקודמת על מימוש חלק מהסימון בעזרת FORTRAN IV על מחשב IBM 7090 שהריץ את מערכת ההפעלה IBSYS. עבודתם הושלמה בסוף 1965 וכונתה IVSYS (קיצור ל־"Iverson System" על שם אייברסון). בסיס המימוש הוסבר בפירוט על ידי אברמס בדו"ח טכני של אוניברסיטת סטנפורד, "An Interpreter for Iverson Notation" ב־1966. ההיבט האקדמי של הפרסום היה תחת פיקוחו של ניקלאוס וירת[9]. כמו עבודתו הקודמת של הלרמן (מערכת ה־PAT), גם מימוש זה לא כלל את מערכת הסימנים של APL, אלא השתמש במילים שמורות מהשפה האנגלית עבור כל הפונקציות והאופרטורים של APL. המערכת הותאמה בהמשך למערכות מרובות משתמשים, וב־1966 הופעלה על מחשבי IBM System/360 Model 50 ונעשה בה שימוש פנימי ב־IBM[10].
חומרה
[עריכת קוד מקור | עריכה]הפיתוח החשוב ביותר שאיפשר שימוש יעיל ב-APL לפני זמינותם של מסופים מבוססי שק"ק היה פיתוח מכונת הכתיבה החשמלית של IBM (באנגלית: IBM Selectric), שנודעה בשם "כדורית". במכונה זו ניתן היה להחליף את ראש ההדפסה (הכדור, באנגלית: "Typing element" או בשפת סלנג "Typeball") הרגיל, שהכיל את התווים האלפביתיים, בראש אחר שכלל את הסימנים הנחוצים ל־APL. פיתוח זה איפשר שימוש ב-APL עם מסופים כמו IBM 1050 ו־IBM 2741 שהדפיסו את הפלט שלהם על גבי נייר. בנוסף, היה אפשר להניח מדבקות על גבי המקשים הרגילים של המקלדת כדי להציג איזה סימן כל מקש מייצג בראש ההדפסה של APL. באופן זה התאפשרו לראשונה כתיבה והדפסה של קוד APL עם הסימון המתמטי המקורי של אייברסון במקום מילות מפתח מסורבלות המייצגות אותם בשפה האנגלית. פלקוף ואייברסון הגדירו שני ראשי הדפסה עבור APL, 987 ו־988, עוד לפני המימוש של APL כתוכנת מחשב[11].
גם עם השימוש במכונת הכתיבה הכדורית, סימני APL רבים עדיין הודפסו בעזרת שני סימנים קיימים זה על גבי זה. לדוגמה הסימן ⍋
(ששמו grade up) נכתב בעזרת השימוש בסימן דלתא (shift-H) ועל גביו פס אנכי (shift-M). מצב זה היה בלתי נמנע מאחר שמספר הסימנים ב־APL היה גדול בהרבה ממספר התווים שראש ההדפסה היה יכול להכיל (88 תווים), אף שתווים אלפביתיים רגילים הוגבלו לאותיות גדולות בלבד.
זמינות מסחרית
[עריכת קוד מקור | עריכה]סביבת העבודה הראשונה של APL פותחה על ידי לארי בְּרִיד ב־1966 על מחשב IBM 1050 במעבדות IBM Mohansic Labs ליד המרכז למחקר על שם תומאס װטסון, ביתה של APL, ב־יוֹרְקטַאוֹן הַײטְס, מדינת ניו־יורק[11].
IBM נטלה חלק מרכזי בהשקת APL למטרות מסחריות. APL הושקה לראשונה כמוצר מסחרי בשנת 1967 עבור מחשבי IBM 1130 כ־APL\1130[12][13]. מערכת זו דרשה זיכרון בגודל 8K מילים של 16 סיביות, בנוסף לדיסק קשיח ייעודי בגודל 1 מ"ב.
APL זכתה לפופולריות במחשבים מרכזיים מסוף שנות ה-60 עד תחילת שנות ה-80, בין השאר בגלל התמיכה בריבוי משתמשים על מחשבים עם מפרט טכני צנוע יחסית גם ללא חומרה לניהול זיכרון וירטואלי[14]. שיפורים נוספים לביצועים של APL פותחו בהמשך לחלק ממחשבי IBM System/370 בהם נוספה תמיכה בהרצת APL בקושחה של המעבד, שנקראה APL Assist Microcode. שימוש בתכונה זו איפשר האצת חומרה ל־APL. משתמשי APL החלו לעבור למחשבים אישיים ולנטוש את המחשבים המרכזיים רק כאשר החומרה של מיקרו-מחשבים הגיעה לביצועים מספיקים, באמצע שנות ה־80.
מפרשי ה־APL הראשונים של IBM עבור מחשבי IBM 360 ו־IBM 370 כללו מימוש פנימי של ריבוי משתמשים במקום להישען על שיתוף המשאבים של המערכת. המפרש מרובה המשתמשים הראשון, APL\360, הושק ב־1966 ב־IBM[15][16][17]. המפרש היה יכול להגדיר משתנים חדשים במערכת ההפעלה ולקבל ממנה מידע דרך פונקציות APL מיוחדות שנקראו I-beam[18].
ב־1973 השיקה IBM את APL.SV שהיה המשכו של אותו המוצר (APL\360) אך הפעם היא הציעה משתנים משותפים (באנגלית: "shared variables") לשפה. תכונה חדשה זאת אפשרה תיווך קל יותר בין APL לשאר הרכיבים במערכת ההפעלה כמו מערכת הקבצים או שיתוף מידע בין תהליכים שרצים על מעבדים נפרדים במחשבים מרכזיים[19]. בשנות ה־70, מפרש ה־APL של IBM שהיה מיועד עד אז למחשבים מרכזיים עבר התאמה למחשבים שולחניים מסוג IBM 5100, שכללו מסך שק"ק קטן ומקלדת APL, בזמן שרוב המחשבים האישיים כללו רק שפת BASIC. בשנות ה־80, המפרש VSAPL היה נפוץ בין משתמשי CMS, VSPC, TSO, MUSIC/SP, ו־CICS.
בשנים 1973–1974, פטריק הַאגֶרְטִי ניהל את מימוש מפרש ה־APL של אוניברסיטת מרילנד עבור המחשבים המרכזיים מסדרת UNIVAC 1100/2200 של היצרנית Sperry. באותו הזמן למחשבי Sperry לא היה קיים מימוש APL[20].
בשנות ה־60 ושנות ה־70, מספר ספקיות של שיתוף משאבים מכרו שרותי APL ללקוחות שלהם בעזרת גרסאות שונות של המפרש APL\360 של IBM[17]. באמריקה הצפונית, הספקיות הידועות היו I. P. Sharp Associates (IPSA), Scientific Time Sharing Corporation (STSC), Time Sharing Resources (TSR), ו־ The Computer Company (TCC). הספקית CompuServe הצטרפה מאוחר יותר לשוק ב־1978 עם מפרש APL שהיה מבוסס על זה של DEC ו־אוניברסיטת קרנגי מלון ורץ על KI ו־KL, מחשבי 36 סיביות של DEC. כשהחלו להופיע מחשבים מרכזיים זולים יותר כמו IBM 4300, ומאוחר יותר גם המחשבים האישיים באמצע שנות ה־80, כל תעשיית שיתוף המשאבים נעלמה כליל.
Sharp APL הייתה תוכנה של חברת I. P. Sharp Associates, שהתחילה כשירות שצמח מתעשיית שיתוף המשאבים במחשבים מרכזיים בשנות ה־60, ומאוחר יותר הפכה למוצר עצמאי החל משנת 1979. Sharp APL היה מימוש מתקדם יחסית של APL עם הרחבות כגון מערכת קבצים, מערכים מקוננים, ומשתנים משותפים.
מפרשי APL היו זמינים גם מיצרניות מחשבים אחרות: בורוז, קונטרול דאטה, דאטה ג'נרל, DEC, Harris, היולט פקארד (HP), Siemens AG, זירוקס ואחרות.
גַארְתְ' פוֹסְטֶר מאוניברסיטת סירקיוז יזם מפגשים קבועים עבור קהילת המממשים של APL במרכז הכנסים של סירקיוז, ב־Blue Mountain Lake שבמדינת ניו יורק. מאוחר יותר ארגן יוגִ'ין מַקְדוֹנֶל מפגשים דומים במרכז הכנסים אַסִילוֹמַאר ליד מונטריי, וב-Pajaro Dunes שליד ווטסונוויל בקליפורניה. קבוצת המשתמשים SIGAPL (ראשי תיבות: "Special Interest Group on Array Programming Languages") של ACM ממשיכה לתמוך בקהילת APL[21].
מיקרו־מחשבים
[עריכת קוד מקור | עריכה]המיקרו־מחשבים החלו להופיע בשנות ה־70 והשפה הנפוצה בהם הייתה BASIC[22]. עם זאת, מיקרו־מחשבים מסוימים הציעו את APL כתחליף - הראשון היה ה־MCM/70, שהיה מבוסס על Intel 8008 והושק ב־1974[23][24], והשימוש המרכזי בו היה בתחום החינוך וההוראה[25]. מיקרו־מחשב נוסף שהציע מפרש APL היה ה־VideoBrain Family Computer שהושק ב־1977 עם תוכנת APL/S.
ה־Commodore SuperPET שהושק ב־1981 כלל מפרש APL שפותח על ידי אוניברסיטת ווטרלו[26].
בשנת 1976 טען ביל גייטס במכתבו הפתוח לחובבי מחשבים, ש־Microsoft עבדה על מימוש APL עבור Intel 8080 ו־מוטורולה 6800, אבל היה לה "מעט מאוד תמריץ להפוך אותו לזמין עבור חובבי מחשבים" לנוכח הפופולריות של פיראטיות תוכנה שמיקרוסופט חוותה עם מפרש ה-BASIC שלה[27]. מפרש ה־APL של מיקרוסופט אכן מעולם לא הושק.
APL2
[עריכת קוד מקור | עריכה]מתחילת שנות ה־80 קבוצת הפיתוח של APL ב-IBM תחת הנהגתו של ג'ים בראון פיתחה גרסה חדשה של APL שהחידוש המרכזי בה היה קינון מערכים, כלומר תיאור מערכים המכילים מערכים אחרים בתוכם, ומספר חידושים נלווים של השפה כדי לשלב בה את המערכים המקוננים. קנת' אייברסון, שכבר לא היה בשליטה על הפיתוח של APL, עזב את IBM והצטרף ל־I. P. Sharp Associates (IPSA), שם תרם רבות לפיתוחה של Sharp APL לפי השקפתו וחזונו[28][29][30]. APL2 עדיין זמינה עבור מחשבים מרכזיים, והושקה לראשונה עבור מערכות CMS ו־TSO בשנת 1984[31].
כשיצרניות אחרות התחילו לפתח מפרשי APL עבור חומרה חדשה, במיוחד עבור מיקרו־מחשבים מבוססי יוניקס, APL2 הייתה לרוב הבחירה הסטנדרטית. אפילו כיום, מפתחי APL מצהירים על תאימות עם APL2 בשיווק המוצרים שלהם[32][33]. IBM ציטטה את השימוש בה עבור פתרון בעיות, עיצוב מערכות, פיתוח אבות טיפוס, חישובים הנדסיים ומדעיים, מערכות מומחות[34], לימוד מתמטיקה ונושאים אחרים, הדמיה, וגישה למסדי נתונים[35]. מהדורת ה־Workstation של APL2 עבור המערכות Windows, OS/2, AIX, Linux, ו־Solaris הושקה רק בשנות ה־90.[דרוש מקור]
בשנת 2021 מכרה IBM את APL2 לחברת Log-On Software, אשר מפתחת ומוכרת אותה בשם Log-On APL2[36].
מימושים מודרניים
[עריכת קוד מקור | עריכה]מימושי APL של APLX, Dyalog ואחרים כוללים הרחבות לשפה כמו תמיכה בתכנות מונחה-עצמים, תמיכה ב־.NET Framwork, טיפול בקובצי XML, הדפסת תרשימים, ממשקים למערכת ההפעלה, וביטויי תחשיב למדא.
שפות תכנות נגזרות
[עריכת קוד מקור | עריכה]APL היא הבסיס או השפיעה באופן ניכר על שפת תכנות אחרות:
- A ו־A+ - אלטרנטיבה ל־APL, השנייה מציעה הרחבות גרפיות.
- FP - שפת לתכנות פונקציונלי.
- J - שפה נוספת שעוצבה על ידי אייברסון. ומשתמשת בתווי ASCII ומילות מפתח במקום הסימון המתמטי המקורי של APL[4].
- K - גרסה קניינית של APL שפותחה על ידי ארתור וִיטְנִי[5].
- LYaPAS - ניב APL בשפה הרוסית שפותח בברית המועצות.
- MATLAB - כלי לחישובים נומריים[3].
- Nial - שפת תכנות מערכים עילית עם סימון האופייני לתכנות פונקציונלי.
- PPL - (ראשי תיבות Polymorphic Programming Language) שפת תכנות שפותחה באוניברסיטת הרווארד[37].
- S - שפת תכנות לחישובים סטטיסטיים (מוכרת בגרסת הקוד הפתוח שלה, R).
- Speakeasy - סביבה אינטראקטיבית לחישובים נומריים.
- Wolfram Language - שפת התכנות של Mathematica, מערכת למתמטיקה חישובית.
תכונות השפה
[עריכת קוד מקור | עריכה]מערכת תווים
[עריכת קוד מקור | עריכה]מערכת התווים הייחודית והלא מוכרת של APL הייתה עבורה מקור לביקורת ושבח כאחד. התופעה שמתכנתים שלומדים ומסתגלים אליה הופכים לחסידים נלהבים שלה יכולה לרמוז שאכן קיים משקל מהותי לסימון המתמטי המקורי של אייברסון וזהו חלק בלתי נפרד מהשפה. בשנות ה־60 וה־70 מעט מסופים יכלו להציג את הסימנים של APL. הפופולריים ביניהם ניצלו את התמיכה של מכונת הכתיבה IBM Selectric בעזרת החלפת ראש ההדפסה. המסוף הראשון שידע להציג את כל התווים של APL היה מסוף החד־שורה TI Model 745 של Texas Instruments שהושק ב־1977[38].
עם הופעת הצגים הגרפיים, המדפסות, וקידוד ה־Unicode, בעיית התווים של APL כמעט נעלמה. עם זאת, כתיבת APL עדיין דורשת עורכי טקסט שתומכים בשיטת קלט ייחודית לה, מיפוי מקלדות, לעיתים שימוש במקלדת וירטואלית[39][40], או הדבקת תווים מודפסים על גבי המקלדת, פתרונות מתסכלים עבור מתכנתים עם רקע משפות תכנות אחרות[41][42][43]. אצל מתחילים שאין להם רקע קודם בתכנות, מחקר שנוסה על תלמידי תיכון הראה שכתיבת תווי APL לא הפריעה לתלמידים לתכנת באופן ניכר[44].
טענה לטובת השימוש ב־APL היא שהכתיבה בה דורשת פחות הקלדה, ושמתכנתים משננים את מפת התווים שלה עם הזמן. כמו כן, מקלדות ייעודיות ל־APL מיוצרות כיום ונמצאות בשימוש, גופנים ייעודיים ל־APL זמינים להורדה עבור מערכות הפעלה כמו חלונות ולינוקס[39].
עיצוב
[עריכת קוד מקור | עריכה]בניגוד לשאר השפות המובנות, קוד טיפוסי של APL בדרך כלל בנוי כשירשור של אופרטורים[45], פונקציות מונאדיות ודיאדיות (המונחים של APL עבור פעולות אונאריות ובינאריות) על/בין מערכים[46]. ל־APL קיימים פרימיטיבים (המונח של APL לפונקציות ופעולות המובנות בשפה) רבים המתוארים על ידי סימן בודד או הרכבה של מספר סימנים[47]. לכל הפרימיטיבים ב־APL יש קדימות שווה, והם אסוציאטיביים עם קדימות לימין. כתוצאה מכך, הבנת הקוד ב־APL נוחה יותר בקריאה מימין לשמאל.
מימושים מוקדמים של APL (בסביבות שנות ה־70) לא כללו בקרת זרימה, כגון do
, while
או מבני קוד מהצורה if-then-else
. APL עודדה הפעלת פונקציות על פני מערכים שלמים, דבר שפטר את המתכנת מהצורך לכתוב קוד מובנה עם בקרת זרימה מפורשת. לדוגמה הפונקציה iota
(בסימונו של אייברסון: ι
) יכלה להחליף איטרציה של לולאת for
: ιN
כאשר N הוא סקלר חיובי ושלם תחזיר מערך חד־ממדי מהצורה . מימושי APL חדשים יותר כוללים בקרת זרימה ומבני קוד מקיפים המאפשרים הפרדה ברורה בין בקרת הזרימה של התהליכים למבני הנתונים[48].
סביבת התכנות של APL נקראת workspace (עברית: סביבת עבודה). בסביבת עבודה משתמש יכול להגדיר משתנים עבור נתונים ושגרות עבור תהליכים ב־APL. המשתמש יכול לבצע פעולות על המשתנים תוך שימוש במפרש כמו בשפת תסריט[49]. בדוגמאות למטה, המפרש מזין 6 רווחים בתחילת השורה לפני קבלת הקלט מהמשתמש, ומדפיס פלט בהתאם.
n ← 4 5 6 7
|
המשתמש יוצר מערך חדש מהצורה ומייחס אותו למשתנה n בסביבת העבודה. הדרך התמציתית והמקובלת יותר לעשות את זה ב־APL תהיה להשתמש בפ' ⍳ כך: n ← 3 + ⍳4 , מבלי להיעזר בלולאות, הכנסת נתונים ידנית או בקרת זרימה.
|
n
4 5 6 7
|
המשתמש מבקש להדפיס את תוכן המשתנה n , שכרגע מייצג את המערך שהגדיר בשלב הקודם.
|
n+4
8 9 10 11
|
המשתמש מעתיק את המערך הישן לתוך מערך חדש בזיכרון, ומוסיף 4 על כל ערך. המפרש מדפיס מיד את המערך החדש שנוצר בתור פלט מאחר שלא נעשה שימוש בפעולת ההשמה← למשתנה חדש.
|
+/n
22
|
המשתמש מסכם את כל ערכי המערך n בעזרת סימון תמציתי זה המכונה "plus, over...".
|
m ← +/(3+⍳4)
m
22
|
כל הצעדים שנעשו עד כה יכולים להכתב בהצהרה אחת. מאחר ש־APL מפענחת את הביטויים עם קדימות מימין לשמאל, ⍳4 קודם תיצור מערך חדש מהצורה ואז +3 תוסיף 3 על כל אחד מהערכים בתוך המערך. לאחר מכן כל הביטוי שנוצר (המוקף בסוגריים) יעבור סיכום בעזרת /+ . המשתמש יבקש להציג את הפלט בקריאה למשתנה m בשורה השנייה.
בסימון מתמטי רגיל, הביטוי שקול ל־. |
המשתמש יכול לשמור את סביבת העבודה יחד עם כל המשתנים והשגרות שהגדיר בה, ולהקפיא את מצב הריצה הנוכחי שלה.
APL משתמשת בסימנים שאינם כלולים ב־ASCII. הסימנים גם מרחיבים את הסימון המקובל באלגברה ובפעולות חשבון בסיסיות. היכולת לבטא פעולות המטפלות בריבוי נתונים (SIMD) על גבי מערכים בעזרת תו ייחודי בודד מאפשרת לנסח אלגוריתמים כמו משחק החיים בשורה אחת בלבד[50]. תאורטית, ברוב הגרסאות של APL, ניתן לבטא כל פונקציה בעזרת ביטוי בודד, כלומר בשורה אחת.
כדי לכתוב את הסימנים המיוחדים של APL, מתכנתים נוהגים להשתמש במקלדות ייעודיות עם מקשים שעליהם מוצגים הסימנים[51]. אף על פי שיש מספר דרכים לכתוב קוד ב־APL בעזרת תווי ASCII[52], אין זה מקובל בפועל (עובדה זו יכולה לתמוך בתזה של אייברסון - "סימון ככלי חשיבה"[53]). רוב המימושים המודרניים משתמשים בפריסה הסטנדרטית של המקלדות, עם שיטת קלט הממפה את המקשים לתווים הייחודיים של APL. היסטורית, הגופן של APL התאפיין באותיות אלפביתיות גדולות בכתב נטוי, וכתב ישר עבור המספרים והסימנים. רוב המימושים עדיין מספקים גופנים ייעודיים כדי להציג קוד APL.
חסידי השפה מתמודדים עם הטענה שהסימון של APL הפך אותה לשפת כתיבה בלבד (באנגלית: write-only language, ביטוי לעגני לשפת תכנות לא מובנת, שקשה לקרוא ולהבין קוד מקור שנכתב בהן. הביטוי נגזר מניגוד של המונח קבצים לקריאה בלבד המוגנים מכתיבה במערכת), בכך שקוד בלתי קריא הוא ברוב המקרים תוצאה של חוסר מיומנות של המתכנת, או טעויות של מתכנתים מתחילים שאינם בקיאים באופן הכתיבה המקובל והאופייני לשפה, דבר שיכול לקרות בכל שפה. יתר על כך, נטען כי APL מאפשרת לכתוב קוד הרבה יותר מתומצת שדורש פחות זמן גם בכתיבה וגם בעיון, ובסופו של דבר חוסך בזמן ובמתכנתים[דרוש מקור].
טיעון נוסף הוא כי מאחר שהשפה היא מאוד תמציתית, היא מתאימה יותר לפיתוח תוכנות בקנה מידה גדול, כיוון שהיא מאפשרת הקטנה ניכרת של מספר שורות הקוד. מתכנתי APL רואים שפות אחרות כגון Java ו־COBOL כמסורבלות וטרחניות. APL אכן נפוצה במקומות שבהם לזמן הפיתוח יש חשיבות קריטית מהיבט עסקי, כמו במערכות מסחר אלגוריתמיות ואוטומטיות[54][55][56][57].
מינוח
[עריכת קוד מקור | עריכה]APL עושה הבדלה ברורה בין פונקציות (שגרות) ואופרטורים (פעולות)[45][58]. פונקציות מקבלות מערכים (מתוך משתנים, קבועים, או ביטויים) כפרמטרים, בזמן שאופרטורים (בדומה לשפות פונקציונליות) יכולים לקבל כפרמטרים גם פונקציות וגם מערכים ולהחזיר פונקציה חדשה משילוב של פונקציות ופעולות קיימות. לדוגמה פונקציית סיכום מערכים ב־APL נוצרת מהחלת פונקציית החיבור (+
) בעזרת אופרטור הצמצום (ב־APL מילולית: reduction או בסימון המתמטי של אייברסון /
)[59] על מערך. אופרטור הצמצום מפעיל את הגורם משמאל, במקרה זה: פונקציית החיבור, בין כל שני פריטים בתוך המערך שנמצא מימין, ובכך מביא לחיבור של כל הפריטים בתוכו ומחזיר את סכומם. כדוגמה נוספת, הפעלת פונקציית המקסימום (⌈
, המחזירה את הערך הגדול מהשניים) בעזרת פעולת הצמצום (/
) על גבי מערך תפעיל את הפונקציה בין כל שני פריטים בתוכו ובכך תחזיר את הערך הגדול מכל הפריטים בו. מאוחר יותר בשפת J, אייברסון שינה את המינוח ל־פוֹעַל (באנגלית: verb) עבור פונקציות; ול־תואר פועל או ל־מילת חיבור (באנגלית: adverb או conjunction) עבור אופרטורים.
חלוקה זאת היא חלק בלתי נפרד מהשפה עצמה, ורוב הפרימיטיבים שלה גם מתחלקים לשתי הקטגוריות האלה, למעט מספר מועט של חריגים שאינם פונקציות ואינם אופרטורים, כגון פעולת ההשמה (←
). כתיבת קוד חדש ב־APL היא לרוב פיתוח פונקציות חדשות, ורק לעיתים רחוקות אופרטורים חדשים.
מונחים מסוימים ב־APL לעיתים אינם תואמים את השימוש הנהוג בהם בספרות הקשורה למתמטיקה ובכלל במדעי המחשב.
מונח | תיאור |
---|---|
function
(פונקציה) |
פעולה או מיפוי, אשר מקבלת פרמטר אחד (מימין), או שני פרמטרים (מימין ומשמאל), או שאניה מקבלת אף פרמטר. הפרמטרים יכולים סקלרים, מערכים או מבנים מורכבים יותר.
|
array
(מערך) |
נתונים המסודרים באפס או יותר ממדים אורתוגנליים בשורות (בניגוד לסדר בטורים), כשכל פריט הוא סקלר פרימיטיבי או מערך אחר[61]. |
niladic | לא מקבל או דורש פרמטרים. |
monadic | דורש פרמטר אחד בלבד, מימין עבור פונקציות, משמאל עבור אופרטורים. |
dyadic | דורש שני פרמטרים, משמאל ומימין. |
ambivalent או monadic | מאפשר שימוש עם פרמטר בודד או זוג פרמטרים. מאפשר להשמיט את הפרמטר השמאלי. |
operator
(פעולה) |
פעולה שלוקחת פרמטר אחד (משמאל) או שניים (מימין ומשמאל) שהם פונקציה או מערך, ומחזירה פונקציה חדשה. בניגוד לפונקציות, קיימים רק אופרטורים פרימיטיביים ומוגדרים, אך לא נגזרים. |
תחביר
[עריכת קוד מקור | עריכה]דוגמאות
[עריכת קוד מקור | עריכה]"Hello World"
[עריכת קוד מקור | עריכה]הדפסת השורה "Hello World" ב־APL תעשה כך:
'Hello, world!'
ב־APL מקובל להגדיר פעולות ברירת מחדל במקרים שבהם לא מצוינת אף פעולה או פונקציה אחרת. המחרוזת 'Hello, world!'
מודפסת כפלט מכיוון שפעולת ברירת המחדל ב־APL היא הדפסת פלט.
העלאה בחזקה
[עריכת קוד מקור | עריכה]העלאה בחזקה ב־APL נעשית בעזרת הפונקציה ⋆
כך: 2⋆3
, כלומר 2 בחזקת 3 (זה יכתב כ־2^3
במספר שפות אחרות, וכ־2**3
בשפות כמו פייתון ו־Fortran). עם זאת, במקרה שלא צוין בסיס (כגון ⋆3
), APL תניח שהבסיס הוא הקבוע e (...2.71828), ולכן ⋆3
יהיה שקול ל־2.71828⋆3
.
סטטיסטיקה פשוטה
[עריכת קוד מקור | עריכה]נניח ש־X
הוא מערך מספרים, אז הביטוי (+/X)÷⍴X
מחזיר את הממוצע החשבוני שלהם. בקריאה מימין לשמאל (כפי שהקדימות ב־APL עובדת), ⍴X
נותן את מספר הפריטים במערך X, ומאחר ש־÷
היא פעולה דיאדית (בינארית), הערכה מלאה של הביטוי משמאל דרושה לפני הפעלתה. הביטוי משמאל מוקף בסוגריים כי אחרת X לבדו יילקח כפרמטר לפני פעולת הסיכום +/X
המחברת כל הפריטים בתוך X. בהתבסס על זה, הביטוי ((+/((X - (+/X)÷⍴X)*2))÷⍴X)*0.5
מחשב את סטיית התקן. יתר על כן, מאחר שהשמה למשתנה (←
) נחשבת לפעולה, ניתן להשתמש בה בתוך הקוד גם כן ולקבל:
SD←((+/((X - AV←(T←+/X)÷⍴X)*2))÷⍴X)*0.5
דבר שיאפשר שימוש חוזר במשתנים SD
, AV
, ו־T
. באופן שגרתי, מתכנת APL יגדיר את הביטוי כפונקציה במקום לכתוב אותו כל פעם מחדש.
בחירת 6 מספרים להגרלה
[עריכת קוד מקור | עריכה]הביטוי הבא מציג דוגמה לבחירת 6 מספרים שלמים פסודו־אקראיים להגרלה הנעים בין 1 ל־40, שאינם חוזרים על עצמם, ומדפיס אותם בסדר עולה.
x[⍋x←6?40]
הקוד התמציתי לעיל משלב את הפונקציות הבאות:
- הראשונה שתעבור הערכה (מאחר ש־APL מעריכה ביטויים בקדימות מימין לשמאל) תהיה הפונקציה הדיאדית
?
(מכונה באנגלית deal כשנעשה בה שימוש דיאדי), שתחזיר מערך שגודלו לפי הפרמטר משמאל (במקרה זה: 6) ובו מספר/ים בטווח לפי הפרמטר מימין מימין (במקרה זה: 40), כלומר היא תחזיר מערך בגודל 6 פריטים שערכם מוגרל בין 1 ל-40 באופן אקראי[62]. - פעולת ההשמה
←
תקלוט את המערך שהחזירה?
לתוך המשתנהx
. - המערך יעבור מיון מחדש בסדר עולה על ידי הפונקציה המונאדית
⍋
שתיקח את כל מה שתחום בסוגריים המרובעים (המתייחסים בפועל לאינדקס המערךx
) כפרמטר לימינה. - הסוגריים המרובעים יקלטו את הסידור החדש מ־
⍋
עבור המערךx
.
מאחר שלא צוינה אף פונקציה משמאל ל־x
שתנחה מה לעשות עם הפלט, המפרש פשוט ידפיס אותו בשורה אחת כשכל פריט במערך מופרד ברווח בלי הנחיה נוספת.
הפונקציה ?
יכולה גם להיות מונאדית (כלומר אונארית, במקרה זה היא מכונה "roll" באנגלית), ואז היא תחזיר מספר אקראי בודד לפי טווח הפרמטר שמשמאל. לדוגמה ?20
תחזיר מספר אקראי בין 1 ל־20.
מספרים ראשוניים
[עריכת קוד מקור | עריכה]הביטוי הבא יחשב את כל המספרים הראשוניים מ־1 עד R. סיבוכיות החישוב תהיה גם בזמן הריצה וגם בצריכת הזיכרון.
(~R∊R∘.×R)/R←1↓ιR
הביטוי מפורש מימין לשמאל כך:
- הפונקציה
ι
(יוטא) יוצרת מערך חדש של מספרים שלמים מ־1
עדR
בסדר עולה. (כך שאםR=6
בתחילת הריצה אזιR
יחזיר את המערך . - השמט את הפריט הראשון מהמערך שנוצר (כלומר את
1
) בעזרת הפונקציה↓
, כך שבהמשך הדוגמה לעיל1↓ιR
יחזיר את המערך . - הגדר את המשתנה
R
להיות המערך החדש שהתקבל מ־↓
בעזרת פעולה הייחוס←
. - פעולת הצמצום
/
תכריח את אגף שמאל (המוקף בסוגריים) לעבור הערכה מלאה קודם כל לפני החלתו בין כל שני פריטים במערך שהתקבל עד כה באגף ימין. - צור מטריצה דו־ממדית המתארת את תוצאות מכפלת כל הפריטים במערך
R
אופקית ואנכית על ידי הפעולה°.×
(הנמצאת ביןR
ו־R
). התוצאה שתתקבל תהיה:
- בעזרת פעולת
∈
(מכונה פעולת אפסילון או בדיקת שייכות), בנה מערך חדש באותו האורך שלR
, כשכל פריט במערך יהיה1
אם הפריט באותו מיקום במערךR
המקורי נמצא בתוך הטבלה שהתקבלה לעיל, אחרת הפריט יהיה0
. למעשה הפעולה∈
מחזירה משוב על איזה פריטים במערך משמאל כלולים במבנה מימין. התוצאה תהיה כי רק4
ו־6
הופיעו בטבלה. - שלול לוגית את כל הערכים במערך שהתקבל מ־
∈
בעזרת הפעולה∼
המייצגת שלילה לוגית ב־APL. התוצאה עד כה תהיה . - חזור והשלם את פעולת הצמצום
/
אחרי ששני האגפים עברו הערכה מלאה. במקרה זה, כשיש מערך בוליאני מימין ומערך כלשהו משמאל, פעולת הצמצום תחזיר מערך חדש ובו מסוננים רק הפריטים מהמערך מימין (R
) עבורם הופיע ערך חיובי (1
) במערך משמאל (התוצאה של∼
). התוצאה הסופית תהיה , שלושת המספרים הראשוניים בטווח כש־R=6
.
מיון
[עריכת קוד מקור | עריכה]הדוגמה הבאה תמיין מערך מחרוזות בסדר עולה לפי מספר התווים בכל מחרוזת.
X[⍋X+.≠' ';]
משחק החיים
[עריכת קוד מקור | עריכה]הפונקציה הבאה (life
), כתובה ב־Dyalog APL, לוקחת מטריצה בוליאנית ומחשבת את הצעד הבא לפי האלגוריתם של משחק החיים. הדוגמה הזאת מפגינה את היכולת של APL לבטא תהליכים מורכבים במעט קוד. עם זאת היא קשה להבנה ללא ידע מתקדם ב־APL.
life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}
הסרת תגיות HTML
[עריכת קוד מקור | עריכה]הדוגמה הבאה, גם כתובה ב־Dyalog APL, מראה קליטת טקסט HTML אקראי לתוך המשתנה txt
ואז משתמשת בביטוי הכתוב ב־APL על מנת להפשיט את הקלט מכל תגיות ה־HTML שמעורבים בו ואז מדפיסה פלט ללא התגיות.
txt←'<html><body><p>This is <em>emphasized</em> text.</p></body></html>'
{⍵ /⍨ ~{⍵∨≠\⍵}⍵∊'<>'} txt
This is emphasized text.
שימושיות
[עריכת קוד מקור | עריכה]APL משמשת כשפה תכנות כללית ורב תחומית ונעשה בה שימוש מסחרי ומדעי נרחב בעבר, בין היתר ליישומים בתחום הפיננסי, ניהול השקעות, ביטוח[63], בינה מלאכותית[64][65], למידת מכונה[66], רובוטיקה[67], ניהול נכסים,[דרוש מקור] שרותי בריאות[68], זיהוי DNA[69][70], ועל ידי חובבי תכנות[71]. יש הטוענים כי APL אינה שפת תכנות אלא כלי חישוב[72] מאחר שהאופי הסימבולי ויכולת הטיפול שלה במערכים עיצבו אותה ואת אופן השימוש שלה מן היסוד ולכן היא הפכה לכלי ייעודי עבור מדעני נתונים[73] ואנשי מחקר המתמחים בתחומים ממוקדים ואינם נדרשים בהכרח לכישורים של הנדסת תוכנה.
APL מתאימה מאוד לעיבוד תמונות מגמתי והנפשה ממוחשבת שבהם טרנספורמציות גרפיות יכולות להיות ממומשות כמכפלת מטריצות. אחד מאולפני הגרפיקה הממוחשבת המסחריים הראשונים בארצות הברית, Digital Effects, פיתחו ב־APL את Visions, ויצרו בעזרתה את פרסומות הטלוויזיה והאנימציות לסרט Tron (1982)[74]. מאוחר יותר, סימולטור השייט Stormwind מיישם את כל רכיבי הליבה שלו, את מנוע ההדמיה התלת־ממדית, ואת רוב סימולציית הפיזיקה שלו בעזרת APL[75].
מימושים בולטים
[עריכת קוד מקור | עריכה]APL\360
[עריכת קוד מקור | עריכה]המימוש הראשון של APL שהתאפיין במערכת הסימנים של אייברסון היה APL\360 שרץ על מחשבי IBM System/360, והושלם בנובמבר 1966[76] אף על פי שבאותו הזמן השימוש בו היה פנימי בלבד בתוך IBM[31]. בשנת 1973 היוצרים שלו, לַארי בְּרִיד, דִיק לַאתְ'װֶל, ורוֹגֶ'ר מוּר זכו בפרס גרייס מאריי הופר של ה-ACM על "עבודתם בתכנון ומימוש APL\360, קביעת סטנדרטים חדשים בפשטות, יעילות, אמינות, וזמן תגובה למערכות אינטראקטיביות."[77][78][79].
ב־1975, מיקרו־מחשבים מסוג IBM 5100 הציעו את APL\360 כאחת משתי השפות המובנות בזיכרון ה־ROM שלהם, יחד עם מקלדת וצג שתמכו בכל סימני APL[80][81].
פיתוחים משמעותיים ב־APL\360 היו CMS/APL, שהשתמשה בזיכרון הווירטואלי של מערכת ה־CMS; ו־APL.SV אשר הציגה לראשונה את המשתנים המשותפים, משתנים ופונקציות לתיווך בין APL ומערכת ההפעלה. מאוחר יותר APL\360 עברה התאמה עבור מחשבי ה־IBM System/370 ו־VSPC. פיתוחה המשיך עד גרסתה האחרונה שהושקה ב־1983, ולאחר מכן היא הוחלפה ב־APL2[31].
APL\1130
[עריכת קוד מקור | עריכה]בשנת 1968 הושק APL\1130, מימוש ה־APL הראשון שהיה זמין לציבור הרחב מחוץ למעבדות של IBM[82]. המימוש פותח על ידי IBM עבור מחשבי ה־IBM 1130. היא הפכה לתוכנת ה־IBM Type-III Library הפופולרית ביותר ש־IBM השיקה אי פעם[83].
APL*Plus ו־Sharp APL
[עריכת קוד מקור | עריכה]APL*Plus ו־Sharp APL הן גרסאות של APL\360 עם הרחבות שהיו חיוניות עבור חברות מסחריות באותו הזמן. ההרחבות כללו עיצוב תבניות עבור נתונים, ואמצעים לשמירת מערכי APL בקבצים חיצוניים. שני המימושים פותחו בשתי חברות נפרדות שהעסיקו עובדים מהצוות המקורי ב־IBM שפיתח את APL\360[84].
שתי החברות היו I. P. Sharp Associates (IPSA), חברת שירותי APL\360 שנוסדה ב־1964 על ידי אִיאַן שַארְפּ, רוֹגֶ'ר מוּר ואחרים, והשנייה הייתה Scientific Time Sharing Corporation (STSC) חברה לשירותי שיתוף משאבים ושירותי ייעוץ שנוסדה ב־1969 על ידי לורנס בְּרִיד ואחרים. שתי החברות פיתחו יחד את APL*Plus, הן המשיכו לעבוד יחד אף על פי שבהמשך הזמן הפיתוח שלהן התפצל לשני מימושים נפרדים: Sharp APL ו־APL*Plus.
STSC ייצאה את APL*Plus להרבה פלטפורמות, ביניהן VAX 11[85], מחשבים אישיים, ו־Unix, ואילו IPSA בחרה להפוך את המימוש שלה (Sharp APL) זמין למחשבים אישיים בעזרת PC-XT/360, רכיב חומרה שסיפק שכבת תאימות למחשבים אישיים עבור תוכנות שפותחו במקור למחשבים מרכזיים של IBM.
ב־1993, נוסדה החברה הקנדית Soliton Incorporated כדי לתמוך ב־Sharp APL והמשך פיתוחה. היא פיתחה את SAX (ראשי תיבות Sharp APL ל־Unix). נכון ל־2018, APL+Win הוא המימוש ההמשכי ל־APL*Plus.
ב־1985, זכה איאן שארפ בפרס אייברסון מטעם קבוצת SIGPAL ב־ACM על עבודתו ותרומתו לשפת APL[86].
APL2
[עריכת קוד מקור | עריכה]APL2 היה מימוש מחודש של APL\360 מאת IBM שהפיתוח שלו החל ב־1971 והושק לראשונה ב־1984. APL2 הציגה שיפורים חשובים לשפה והבולט בהם היה קינון מערכים (הכלת מערכים בתוך מערכים)[31]. נכון ל־2018, APL2 זמינה עבור מחשבים מרכזיים שרצים על z/OS או z/VM, או תחנות עבודה שרצות על AIX, Linux, Solaris וחלונות[87].
כל הצוות שהיה אחראי על הפיתוח והתחזוקה של APL2 זכה בפרס אייברסון משותף בשנת 2007[86].
Dyalog APL
[עריכת קוד מקור | עריכה]המימוש Dyalog APL הושק לראשונה מאת Dyalog Ltd הבריטית[88] ב־1983[89]. נכון ל־2018 הוא זמין ל־Linux (כולל על ה־Raspberry Pi),AIX, macOS, וחלונות. הוא מבוסס על APL2, ומציע הרחבות ל־APL בשביל תכנות מונחה עצמים[90] ותכנות פונקציונלי[91]. הרישיון שלו הוא חינמי עבור שימוש פרטי ולא מסחרי[92].
ב־1995, שניים מחברי צוות הפיתוח של Dyalog APL - ג'ון סקוֹלְס ו־פיטר דוֹנֶלי - זכו בפרס אייברסון עבור עבודתם על המפרש[93].
NARS2000
[עריכת קוד מקור | עריכה]NARS2000 (ראשי תיבות "Nested Arrays Research System") הוא מפרש APL חופשי וקוד פתוח מאת בּוֹבּ סְמִית', מפתח וותיק מהצוות של STSC שעבדו על המימוש של APL*Plus בשנות ה־70 וה־80. NARS2000 כולל טיפוסי נתונים חדשים עבור השפה וחידושים אחרים[94].
APLX
[עריכת קוד מקור | עריכה]APLX הוא ניב חוצה-פלטפורמות של APL, מבוסס על APL2 עם מספר הרחבות כמו תכנות מונחה עצמים ותמיכה ב־NET Framework.. הוא הושק לראשונה על ידי MicroAPL הבריטית ב־2002. APLX אינו נמצא יותר בשימוש מסחרי והפיתוח שלו הפסיק. ניתן להשיג אותו בחינם מהאתר של Dyalog[95].
GNU APL
[עריכת קוד מקור | עריכה]GNU APL הוא מימוש חופשי מטעם המיזם של GNU עבור APL המורחבת כפי שאופיינה ב־ISO/IEC 13751:2001, ולכן הוא דומה ל־APL2. המימוש רץ על GNU\Linux ועל חלונות בעזרת Cygwin ומשתמש ב־Unicode. הוא פותח על ידי יורגן זאוארמן[96].
ריצ'רד סטולמן, מייסד מיזם GNU, היה מהראשונים שאימצו את APL. סטולמן נעזר ב־APL כדי לכתוב עורך טקסט כשהיה בתיכון בקיץ 1969[97].
הידור ופירוש
[עריכת קוד מקור | עריכה]APL היא שפה מפורשת בהתאם למסורת שלה, תכונותיה כגון טיפוסיות דינמית הופכים אותה לשפה שאינה מתאימה להידור[98] למרות זאת, מהיותה שפת תכנות מערכים המציבה את המערך במרכז השימוש בה[99], היא נותנת הזדמנות למיטוב תהליך הפרוש שלה בעזרת עיבוד מקבילי של כל המערכים[100][101][102][103][104] ובעזרת VLSI[105][106]. מיטובים אלה הפכו את APL לשפת ביצועים גבוהים[107],לדוגמה APL מצטיינת בביצועיה בפעולות מורכבות עם מטריצות מאחר שהיא פועלת על גבי מערכים בלי בקרת זרימה ופעולות ביניים שמאטות שפות אחרות[108].
עם זאת, APL אינה שפה מפורשת גרידא, וקטעים מהקוד עוברים תהליך הידור חלקי בשיטות ורמות שונות. דוגמאות להידור ב־APL כוללות:
זיהוי צרופים
[עריכת קוד מקור | עריכה]רוב מפרשי APL תומכים בזיהוי צרופים (באנגלית: idioms) הטיפוסיים לשפה[109]ומעריכים צרופים כאלה כפעולה אחת וחוסכים את צעדי הביניים[110][111].לדוגמה, כשהמפרש מזהה צרוף מהצורה BV/⍳⍴A
(היכן ש־BV
הוא ערך בוליאני ו־A
הוא מערך), הוא מיד מעריך את כל הביטוי כפעולה אחת במקום לפרש את הביטוי צעד אחר צעד, ובכך הוא בעצם חוסך את יצירתם של שני מערכים נוספים בפעולות הביניים על מנת להשלים את הביטוי[112].
בייטקוד ממוטב
[עריכת קוד מקור | עריכה]הטיפוסיות הדינמית של APL מאפשרת למשתנים להצביע על מערכים (מכל טיפוס), פונקציות, או פעולות (אופרטורים). באופן הכללי המפרש לא יכול לדעת באיזה טיפוס מדובר בלי לבצע ניתוח תחבירי ובדיקת טיפוסיות בזמן ריצה[113].עם זאת, במקרים מסוימים ניתן להסיק באיזה טיפוסיות (יהיה) מדובר עוד לפני הריצה ולהכין בייטקוד ממוטב מראש שייעל את הביצועים. את הבייטקוד ניתן למטב בעזרת שיטות מיטוב ידועות כגון זיהוי והידור מראש של ביטויים קבועים שאינם משנים את ערכם לאורך כל זמן הריצה (באנגלית: Constant folding), והחלפת והשמטת ביטויים השקולים זה לה במשתנה המצביע לביטוי המשותף לכל המקרים (באנגלית: Common subexpression elimination).בזמן הריצה המפרש יריץ את מקטע הבייטקוד שהוכן מראש אך ורק אם ההנחות בנוגע לטיפוסיות היו אכן נכונות. Dyalog APL נותנת תמיכה מלאה למיטובי בייטקוד עבור השפה[114].
הידור
[עריכת קוד מקור | עריכה]הידור APL היה נושא למחקר וניסויים משחר הופעת השפה. המהדר הראשון עבור APL היה ה־APL-700 מאת Burroughs[115] שהושק בסביבות 1971[116]. כדי לאפשר הידור של APL נדרשות מגבלות מסוימות[115][117].
APEX הוא מהדר APL מחקרי שפותח על ידי רוברט בֶּרְנֶקִי (שהיה חלק מצוות הפיתוח של IPSA ו־Sharp APL) וזמין כתוכנה חופשית תחת הרישיון הציבורי הכללי של GNU[118].
STSC APL Compiler (מהדר ל־APL מאת STSC, המפתחת של APL*Plus) מבצע שילוב של מיטוב בייטקוד והידור, אך לא הידור מלא. הוא מאפשר הידור לשפת מכונה רק עבור פונקציות שכל שאר הפונקציות והמשתנים שהן תלויות בהם כבר הוכרזו וידועים מראש. אך המפרש עדיין מספק את כל הפונקציות והפעולות עבור ספריית הליבה של השפה, ומשמש כנסיגה עבור פונקציות שאינן עומדות בתנאים הנחוצים להידור.
תקינה
[עריכת קוד מקור | עריכה]APL עברה תקינה על ידי קבוצת העבודה X3J10 מטעם מכון התקנים האמריקני (ANSI) על ידי ארגון התקינה הבינלאומי (ISO) וע"י הנציבות הבינלאומית לאלקטרוטכניקה (IEC) בוועדה הטכנית המשותפת של ISO/IEC מס' 1, תת־וועדה מס' 22, קבוצת עבודה מס' 3. ליבת APL מאופיינת ב־ISO 8485:1989, ו־APL המורחבת מאופיינת ב־ISO/IEC 13751:2001.
קישורים חיצוניים
[עריכת קוד מקור | עריכה]- TryAPL.org - מפרש APL לניסוי השפה זמין מהדפדפן.
- APL Wiki - אתר הויקי של APL.
הערות שוליים
[עריכת קוד מקור | עריכה]- ^ 1 2 Kenneth Iverson - A Programming Language — Software Preservation Group, www.softwarepreservation.org (ארכיון)
- ^ ACM: Fellows Award / John Backus, web.archive.org, 2008-02-12
- ^ 1 2 Moler, Cleve, The Growth of MATLAB, web.archive.com
- ^ 1 2 Essays/Bibliography - J Wiki, code.jsoftware.com
- ^ 1 2 An Interview with Arthur Whitney, web.archive.org, 2009-04-04
- ^ Kenneth E. Iverson. Automatic Data Processing, Chapter 6 : A Programming Language. Color scan. — Software Preservation Group, web.archive.org, 2009-06-04
- ^ Hellerman, H., Experimental Personalized Array Translator System, Communications of the ACM 433, 1964, עמ' 7
- ^ The Evolution of APL, www.jsoftware.com
- ^ Abrams, Philip S., An interpreter for "Iverson notation", Department of Computer Science, Stanford University, אוגוסט 1966
- ^ Haigh, Thomas, Biographies: Kenneth E. Iverson, IEEE Annals of the History of Computing, 2005
- ^ 1 2 Larry Breed, The First APL Terminal Session, SIGAPL APL Quote Quad 22, 1991-9, עמ' 2–4 doi: 10.1145/138094.140933
- ^ Vector, the Journal of the British APL Association, vector.org.uk (ארכיון)
- ^ APL\1130 Manual, מאי 1969 (ארכיון)
- ^ Remembering APL, www.quadibloc.com
- ^ Falkoff, Adin; Iverson, Kenneth E., APL\360 Users Guide, August 1968 (ארכיון)
- ^ APL\360 Terminal System, March 1967 (ארכיון)
- ^ 1 2 Pakin, Sandra, APL\360 Reference Manual, Science Research Associates, Inc., 1968, ISBN 978-0-574-16135-2
- ^ Falkoff, Adin D.; Iverson, Kenneth E., The Design of APL
- ^ Allen Kent, James G. Williams, Encyclopedia of Microcomputers: Volume 1 - Access Methods to Assembly Language and Assemblers, CRC Press, 1987-10-01. (באנגלית)
- ^ Minker, Jack, Beginning of Computing and Computer Sciences at the University of Maryland, ינואר 2004
- ^ SIGAPL - Home, www.sigapl.org
- ^ Fifty Years of BASIC, the Programming Language That Made Computers Personal, Time (באנגלית)
- ^ MCM 70 / 700, old-computers.com (ארכיון)
- ^ Zbigniew Stachniak, Inventing the PC: The MCM/70 Story, McGill-Queen's Press - MQUP, 2011. (באנגלית)
- ^ Michael Miller 17 Dec 2014, 9:15 P.m, PCs That Paved the Way for the Altair, PCMag UK, 2014-12-17 (באנגלית)
- ^ COMPUTE! The Journal for Progressive Computing, Small System Services Inc., 1981
- ^ DigiBarn Newsletters: Homebrew Club Newsletter Vol 2, Issue 1 (Jan 31, 1976), www.digibarn.com
- ^ Remembering Ken Iverson, keiapl.org
- ^ Kenneth E. Iverson - A.M. Turing Award Laureate, amturing.acm.org
- ^ ACM SIGPLAN, APL2: The Early Years, www.sigapl.org, ינואר 10, 2015
- ^ 1 2 3 4 Adin D. Falkoff, The IBM Family of APL Systems, undefined, 1991 (באנגלית)
- ^ Overview of the APL System, microapl.com
- ^ Robertson, Graeme, A Personal View of APL2010, archive.vector.org.uk, ינואר 10, 2015
- ^ Rodriguez, P.; Rojas, J.; Alfonseca, M.; Burgos, J. I., n Expert System in Chemical Synthesis written in APL2/PC, ACM SIGAPL APL Quote Quad, 1989, עמ' 299-303 doi: https://doi.org/10.1145%2F75144.75185
- ^ IBM APL2 - Overview - United States, www.ibm.com, 2019-03-11 (באנגלית)
- ^ Log-On Software Announces Log-On APL2, log-on.com, January 26, 2021
- ^ Thomas A. Standish, Some Features of PPL, a Polymorphic Programming Language, SIGPLAN Not. 4, 1969-8, עמ' 20–26 doi: 10.1145/1115858.1115864
- ^ I. D. G. Enterprise, Computerworld, IDG Enterprise, 1977-07-04. (באנגלית)
- ^ 1 2 Dyalog - APL Fonts and Keyboards, www.dyalog.com
- ^ NARS2000 Keyboard, www.sudleyplace.com
- ^ Introduction to APL, microapl.com
- ^ Brown, James A.; Hawks, Brent; Trimble, Ray, Extending the APL character set, ACM SIGAPL APL Quote Quad, 1993 doi: 10.1145/166198.166203
- ^ Vector, the Journal of the British APL Association, archive.vector.org.uk
- ^ Dyalog Usermeeting (2013-11-29), Dyalog '13: Computer Science Outreach and Education with APL, נבדק ב-2019-03-12
- ^ 1 2 Operators, microapl.com
- ^ Primitive Functions, microapl.com
- ^ APL Primitives, microapl.com
- ^ Control Structures, microapl.com
- ^ The Workspace, microapl.com
- ^ Conway's Game of Life in one line of APL, web.archive.org, 2013-07-08
- ^ Entering APL Symbols, microapl.com
- ^ Lee Dickey, A list of APL transliteration schemes, uwaterloo.ca, 7 יולי 1993 (באנגלית)
- ^ Notation as a Tool of Thought, www.jsoftware.com (ארכיון)
- ^ Batenburg, APL Efficiency, www.ekevanbatenburg.nl, ינואר 1, 2015 (באנגלית)
- ^ Vaxman, APL Great Programming, www.vaxman.de, ינואר 1, 2015 (באנגלית)
- ^ Wolfgang H. Janko, Investigation into the Efficiency of Using APL for the Programming of an Inference Machine, SIGAPL APL Quote Quad 17, 1987-1, עמ' 450–456 doi: 10.1145/384282.28372
- ^ APL Borealis Inc. - Canada's APL Product & Service Provider, www.aplborealis.com
- ^ A Dictionary of APL, www.jsoftware.com
- ^ / Reduction, microapl.com
- ^ User-defined Functions and Operators, microapl.com
- ^ Nial Systems Limited - Array Theory, web.archive.org, 2011-07-09
- ^ SIGAPL - Systematically Random Numbers, www.sigapl.org
- ^ SimCorp, 2017 Annual Report, February 1, 2018
- ^ Using APL in an Artificial Intelligence environment: A knowledge engineering system dealing with biographical data | Request PDF, ResearchGate (באנגלית)
- ^ Gary Sullivan, Kenneth Fordyce, Artificial Intelligence Development Aids (AIDA), SIGAPL APL Quote Quad 15, 1985-5, עמ' 106–113 doi: 10.1145/255315.255347
- ^ Manuel Alfonseca, Neural Networks in APL, SIGAPL APL Quote Quad 20, 1990-5, עמ' 2–6 doi: 10.1145/97811.97816
- ^ Robot programming in APL, begriffs.com
- ^ Vi idag (בשוודית)
- ^ DNA Identification Technology, dna-view.com
- ^ Dyalog Usermeeting (2014-10-17), Dyalog14: There's DNA Everywhere – an Opportunity for APL, נבדק ב-2019-03-12
- ^ code golf - Tips for golfing in APL, Programming Puzzles & Code Golf Stack Exchange
- ^ W. N. Holmes, Is APL a Programming Language?, The Computer Journal 21, 1978-05-01, עמ' 128–131 doi: 10.1093/comjnl/21.2.128
- ^ Design Patterns vs. Anti-pattern in APL - Functional Conf 2017, Functional Conf 2017 - Design Patterns vs. Anti-pattern in APL | ConfEngine - Conference Platform, 2011-11-03 (באנגלית)(הקישור אינו פעיל)
- ^ Nadia Magnenat-Thalmann, Daniel Thalmann, Computer Animation: Theory and Practice, Springer Science & Business Media, 2012-12-06. (באנגלית)
- ^ Stormwind Simulator at Dyalog '16, Optima Systems, 2016-10-17 (באנגלית)
- ^ APL Quotations and Anecdotes, www.jsoftware.com
- ^ ACM Award Citation / Lawrence Breed, web.archive.org, 2012-04-02
- ^ ACM Award Citation / Richard Lathwell, web.archive.org, 2012-04-02
- ^ ACM Award Citation / Roger Moore, web.archive.org, 2012-04-02
- ^ OLD-COMPUTERS.COM : The Museum, www.old-computers.com (ארכיון)
- ^ Welcome, IBM, to personal computing, BYTE, דצמבר 1975, עמ' 90
- ^ Chronology of APL, www.sigapl.org
- ^ Larry Breed, How We Got To APL\1130, Vector (British APL Association), August 2006 (באנגלית) (ארכיון)
- ^ Roger Moore, History of I. P. Sharp Associates Timesharing and Network, Rogerdmoore.ca, 2005
- ^ Blumenthal, Marcia, VAX-11s Acquire APL Processor, Computerworld, 1981
- ^ 1 2 Kenneth E. Iverson Award for Outstanding Contribution to APL, SIGAPL
- ^ IBM APL2: What's New - United States, www-01.ibm.com, 2018-12-04 (באנגלית)
- ^ Dyalog - Home, www.dyalog.com
- ^ British APL Association, Dyalog at 25, Vector Magazine, 2008(הקישור אינו פעיל)
- ^ Kromberg, Morten, Arrays of Objects, 2007
- ^ Scholes, John, D: A functional subset of Dyalog APL, Vector Magazine
- ^ Dyalog - Prices and Licences, www.dyalog.com
- ^ 2016 Iverson Award Recognises Dyalog's CEO and CXO
- ^ NARS2000 Welcome Page, www.nars2000.org
- ^ APLX has been withdrawn from commercial sale but can be downloaded free of charge, Microapl.com
- ^ Free Software Directory, GNU APL, directory.fsf.org
- ^ Stallman, Richard M, RMS Berättar
- ^ Timothy Budd, An APL Compiler, Springer Science & Business Media, 2012-12-06. (באנגלית)
- ^ SIGAPL, What is APL?, www.sigapl.org
- ^ Dz-Ching Ju, Wai-Mee Ching, Exploitation of APL Data Parallelism on a Shared-memory MIMD Machine, SIGPLAN Not. 26, 1991-4, עמ' 61–72 doi: 10.1145/109626.109633
- ^ Hsu, Aaron W.; Bowman, William J., Revisiting APL in the Modern Era, Indiana University / Princeton
- ^ W.- Ching, D. Ju, Execution of automatically parallelized APL programs on RP3, IBM Journal of Research and Development 35, 1991-9, עמ' 767–777 doi: 10.1147/rd.355.0767
- ^ Guy Blelloch, Gary W. Sabot, Compiling Collection-Oriented Languages onto Massively Parallel Computers, Journal of Parallel and Distributed Computing 8, 1990, עמ' 119–134
- ^ Jendrsczok, Johannes; Hoffmann, Rolf; Ediger, Patrick; Keller, Jörg., Implementing APL-like data parallel functions on a GCA machine, Fernuni-Hagen.De, עמ' 1-6
- ^ Norman Brenner, VLSI Circuit Design Using APL with Fortran Subroutines, SIGAPL APL Quote Quad 14, 1984-6, עמ' 77–79 doi: 10.1145/384283.801079
- ^ D. J. Gamble, R. F. Hobson, Towards a graphics/procedural environment for constructing VLSI module generators, Conference Proceeding IEEE Pacific Rim Conference on Communications, Computers and Signal Processing, 1989-6, עמ' 606–611 doi: 10.1109/PACRIM.1989.48437
- ^ Lee, Robert S., Two Implementations of APL, PC Magazine, 1983
- ^ MARTHA and LLAMA, The APL Computer Language, marthallama.org
- ^ Robert Metzger, Zhaofang Wen, Automatic Algorithm Recognition and Replacement: A New Approach to Program Optimization, MIT Press, 2000-06-02. (באנגלית)
- ^ Lawrence Snyder, Recognition and selection of idioms for code optimization, Acta Informatica 17, 1982-08-01, עמ' 327–348 doi: 10.1007/BF00264357
- ^ Cheng, Feng Sheng, Idiom matching: an optimization technique for an APL compiler, Iowa State University, 1981
- ^ Idiom Recognition, help.dyalog.com
- ^ George O. Strawn, Does APL really need run-time parsing?, Software: Practice and Experience 7, 1977, עמ' 193–200 doi: 10.1002/spe.4380070207
- ^ Dyalog Ltd, Compiler User Guide, www.dyalog.com
- ^ 1 2 G. C. Driscoll, D. L. Orth, Compiling APL: The Yorktown APL Translator, IBM Journal of Research and Development 30, 1986-11, עמ' 583–593 doi: 10.1147/rd.306.0583
- ^ Chronology of APL, www.sigapl.org
- ^ W. Ching, Program analysis and code generation in an APL/370 compiler, IBM Journal of Research and Development 30, 1986-11, עמ' 594–602 doi: 10.1147/rd.306.0594
- ^ Snake Island Research Inc, The APEX Project, http://www.snakeisland.com