פתיחת התפריט הראשי

APL

שפת תכנות

APL (נקראת על ראשי התיבות משם הספר שהציג אותה: ”A Programming Language“‏[1], בעברית: שפת תכנות) היא שפת תכנות שפותחה בשנות ה־60 של המאה ה־20 על ידי קֶנֵת' יוג'ין אַייבֶרְסוֹן. מבנה הנתונים המרכזי שלה הוא מערך מרובה ממדים. השפה עושה שימוש נרחב בסימנים מיוחדים כדי לייצג את כל הפונקציות והאופרטורים הידועים בה, מה שהופך אותה לתמציתית מאוד ביחס לשפות אחרות. ל־APL הייתה השפעה חשובה על התפתחות פרדיגמת התכנות הפונקציונלי[2], גיליונות אלקטרוניים, והמתמטיקה החישובית[3].כמו כן היא תרמה השראה לשפות תכנות אחרות[4][5]. בשנת 1979 אייברסון זכה בפרס טיורינג תמורת עבודתו על APL.

אֵיי־פִּי־אֶל
APL
פרדיגמות תכנות מערכים, תכנות פונקציונלי, תכנות מובנה, תכנות מודולרי
שנה 1966
מתכנן קֶנֵת' יוג'ין אייבֶרסון
מפתח לורֶנְס (”לַארי“) מוזֶר בְּרִיד, ריצ'רד (”דיק“) הנרי לַאתְ'װֶל, רוֹגֶ'ר ד' מוּר
גרסה אחרונה ISO/IEC 13751:2001 (1 בפברואר 2001)
טיפוסיות דינמית
מימושים 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.
לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית OOjs UI icon info big.svg

היסטוריהעריכה

הסימון המתמטיעריכה

קנת' יוג'ין אַייבֶרְסוֹן התחיל לעבוד על סימון מתמטי חדש למניפולציות מערכים באוניברסיטת הרווארד משנת 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 לדוחות מחקר קצרים של מערכות מחשב כמו ה־Burroughs B5000 ומנגנון המחסנית שלה כש־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. לאחר פרסום המאמר, הצוות החל לעבוד על יישום מלא של APL על מחשבי IBM. אחת המוטיבציות ליישום הסימון הייתה התעניינותו של ג'ון ל' לורנס, שהיה אז בתפקיד עם Science Research Associates Inc, חברה בתחום החינוך שנרכשה על ידי IBM בשנת 1964. לורנס ביקש מאייברסון ומשאר חברי הצוות לעזור לו להשתמש בשפה החדשה ככלי לשימוש ופיתוח תוכנה ומחשבים לתחום החינוך וההוראה בארצות הברית[8].

אחרי שלורנס מ' בְּרִיד ו־פיליפ ס' אַבְּרַמְס מאוניברסיטת סטנפורד הצטרפו לצוות באגף המחקר של IBM, הם המשיכו את עבודתם הקודמת של הצוות שעבד עד כה על חלק מהיישום של APL בעזרת FORTRAN IV שפותח עבור מחשב IBM 7090 שהריץ את מערכת ההפעלה IBSYS. הפרויקט הושלם בסוף 1965 וכונה IVSYS (קיצור ל־”Iverson System“ על שם אייברסון). בסיס היישום הוסבר בפירוט על ידי אברמס בדו"ח טכני של אוניברסיטת סטנפורד תחת הכותרת ”An Interpreter for Iverson Notation“ ב־1966. ההיבט האקדמי של הפרסום היה תחת פיקחו של ניקלאוס וירת[9]. כמו עם עבודתו הקודמת של הלרמן (מערכת ה־PAT), גם יישום זה לא כלל את מערכת הסימנים המקורית של APL, אלא במקום זאת נעשה שימוש במילים שמורות מהשפה האנגלית עבור כל הפונקציות והפעולות הפרימיטיביות של APL. המערכת עברה בהמשך התאמה עבור מערכות עם יכולת שיתוף משאבים (באנגלית: ”Time-sharing“), וכבר ב־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 עבור הכדורית ב־1964 למרות שעוד לא היה קיים אף יישום APL באותו הזמן[11]. אייברסון אמר שפלקוף נתן לו את ההשראה להשתמש בכדורית עבור סט התווים של APL[12].

סימני 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[13][14]. היישום דרש רק 8 ק"ב של זיכרון מחשב ב־16 סיביות, ו־מ"ב בודד על הדיסק הקשיח.

APL הייתה שימושית במחשבים מרכזיים לעבודה שיתופית עם מפרט טכני צנוע יחסית וללא יחידת ניהול זיכרון[15]. שיפורים נוספים לביצועים של APL פותחו בהמשך למחשבי IBM System/370 בעזרת מיטובים ושיבוץ המפרש שלה בקושחה של המעבד, שיבוץ זה היה ממותג כ־ APL Assist Microcode. זה אפשר ל־APL לרוץ מיד על המעבד וליעל את הביצועים שלה. כשהחומרה השתפרה באופן ניכר באמצע שנות ה־80, משתמשי APL החלו לעבור למחשבים אישיים ולנטוש את המחשבים המרכזיים.

מפרשי ה־APL הראשונים של IBM עבור מחשבי IBM 360 ו־IBM 370 יישמו שיתוף משאבים משלהם כדי לאפשר למשתמשים מרובים לעבוד על אותו המחשב באופן מרוכז ובאותו הזמן במקום להישען על שיתוף המשאבים של המערכת. מפרש מרובה המשתתפים הראשון APL\360 הושק ב־1966 ב־IBM[16][17][18]. המפרש יכל להגדיר משתנים חדשים במערכת ההפעלה ולקבל ממנה מידע דרך פונקציות I-beam ב־APL שיש להן הרשאות מיוחדות לתווך בינה לבין רכיבים אחרים במערכת שאינם כתובים ב־APL בעזרת פעולות אונאריות ובינאריות (המינוח המקובל ב־APL הוא פעולות מונאדיות ו־דיאדיות, בהקבלה)[19].

ב־1973 IBM השיקה את APL.SV שהיה המשכו של אותו המוצר (APL\360) אך הפעם היא הציעה משתנים משותפים (באנגלית: ”shared variables“) לשפה. תכונה חדשה זאת אפשרה תיווך קל יותר בין APL לשאר הרכיבים במערכת ההפעלה כמו מערכת הקבצים או שיתוף מידע בין תהליכים שרצים על מעבדים נפרדים במחשבים מרכזיים[20]. בשנות ה־70 מפרש ה־APL של IBM שהיה נועד למחשבים מרכזיים עד כה עבר התאמה עבור מחשבים שולחניים מסוג IBM 5100, שצויד עם מסך שפופרת קתודית קטן ומקלדת APL, בזמן שרוב המחשבים האישיים הציעו רק את BASIC. בשנות ה־80, המפרש VSAPL היה בשימוש מסחרי נפוץ עבור משתמשי CMS, VSPC, TSO, MUSIC/SP, ו־CICS.

בשנים 19731974, פטריק הַאגֶרְטִי ניהל את יישום מפרש ה־APL של אוניברסיטת מרילנד עבור המחשבים המרכזיים מסדרת UNIVAC 1100/2200 של היצרנית Sperry. באותו הזמן למחשבי Sperry לא היה קיים אף יישום APL[21].

בשנות ה־60 ושנות ה־70, מספר ספקיות שצמחו מתעשיית שיתוף משאבים מכרו שרותי APL ללקוחות שלהם בעזרת גרסאות שונות של המפרש APL\360 מאת IBM[18]. באמריקה הצפונית, הספקיות הידועות היו I. P. Sharp Associates (IPSA), Scientific Time Sharing Corporation (STSC), Time Sharing Resources (TSR), ו־ The Computer Company (TCC). הספקית CompuServe הצטרפה מאוחר יותר לשוק ב־1978 עם מפרש APL שהיה מבוסס על זה של DEC ו־Carnegie Mellon שהיה רץ על KI ו־KL שהיו מחשבי 36 סיביות של DEC. כשהחלו להופיע מחשבים מרכזיים זולים יותר כמו ה־IBM 4300, ומאוחר יותר גם המחשבים האישיים באמצע שנות ה־80, כל תעשיית שיתוף המשאבים נעלמה כליל.

Sharp APL היה היישום של I. P. Sharp Associates, תחילה כשירות שצמח מתעשיית שיתוף המשאבים במחשבים מרכזיים בשנות ה־60 ומאוחר יותר הפך להיות מוצר בפני עצמו כתוכנה החל משנת 1979. Sharp APL היה יישום מתקדם יחסית של APL עם משתנים שיתופיים, חבילות, הרחבות, מערכת קבצים, ומערכים מקוננים.

מפרשי APL היו זמינים גם מיצרניות המחשבים המרכזיים: Burroughs Corporation, Control Data Corporation (CDC), Data General, DEC, Harris, Hewlett-Packard (HP), Siemens AG, Xerox ואחרות.

גַארְתְ' פוֹסְטֶר מאוניברסיטת סירקיוז יזם מפגשים קבועים עבור קהילת מיישמי APL במרכז הכנסים של סירקיוז, ב־Blue Mountain Lake שבמדינת ניו יורק. בהמשך השנים יוגִ'ין מַקְדוֹנֶל ארגן מפגשים דומים במתחם הכנסים אַסִילוֹמַאר ליד מוֹנְטֶרֵיי בקליפורניה, וב־דִיוֹנוֹת פַגָ'רוֹ ליד װַטְסוֹנְװִיל שבמדינת קליפורניה. קבוצת SIGAPL (ראשי תיבות: ”Special Interest Group on Array Programming Languages“) מטעם האגודה למכונות מחשוב (ACM) ממשיכה לתמוך בקהילת APL כיום[22].

מיקרו־מחשביםעריכה

המיקרו־מחשבים החלו להופיע רק החל משנות ה־70 והשפה הנפוצה בהם הייתה BASIC[23]. למרות זאת מיקרו־מחשבים מסוימים הציעו את APL במקום. הראשון מבניהם היה ה־MCM/70 מבוסס Intel 8008 שהושק ב־1974[24][25] והשימוש המרכזי בו היה בתחום החינוך וההוראה[26]. מיקרו־מחשב נוסף שהציע מפרש APL היה ה־VideoBrain Family Computer שהושק ב־1977 עם ניב ה־APL/S שהיה ייחודי לו.

ה־Commodore SuperPET שהושק ב־1981 בא עם מפרש APL שפותח על ידי אוניברסיטת ווטרלו[27].

בשנת 1976, ביל גייטס טען במכתבו הפתוח לחובבנים, ש־Microsoft הייתה בתהליך יישום APL עבור Intel 8080 ו־Motorola 6800, אבל עם ”מעט מאוד תמריץ להפוך [אותו] לזמין עבור חובבנים“ לאור הפרת זכויות היוצרים שחברתו סבלה מצידם[28]. מפרש ה־APL של Microsoft אכן מעולם לא הושק.

APL2עריכה

מתחילת שנות ה־80 הפיתוח של IBM APL תחת הנהגתו של גִ'ים בְּרָאוֹן הוביל לגרסה חדשה של APL שהחידוש המרכזי בה היה קינון מערכים, כלומר תיאור מערכים המכילים מערכים אחרים בתוכם, ומספר חידושים נלווים בבקרת הזרימה של השפה כדי לשלב בה את המערכים המקוננים. קנת' אייברסון שכבר לא היה יותר בשליטה על הפיתוח של APL, עזב את IBM והצטרף ל־I. P. Sharp Associates (IPSA), היכן שהוא תרם רבות לפיתוחה של Sharp APL לפי השקפתו וחזונו[29][30][31].

כשיצרניות באותו הזמן התחילו לפתח מפרשי APL עבור חומרה חדשה, במיוחד עבור מיקרו־מחשבים מבוססי יוניקס, APL2 הייתה לרוב הבחירה הסטנדרטית כקוו מנחה עבור אותם מפרשי APL חדשים. אפילו כיום, מפתחי APL מבטיחים תאימות עם APL2 בשיווק המוצרים שלהם כנקודת זכות[32][33].

APL2 עדיין זמינה עבור מחשבים מרכזיים, והושקה לראשונה עבור מערכות CMS ו־TSO בשנת 1984[34]. IBM ציטטה את השימוש בה עבור פתרון בעיות, עיצוב מערכות, פיתוח אבות טיפוס, הנדסה, חישובים מדעיים, למידת מכונה[35], ללימוד מתמטיקה ונושאים אחרים, לגישה והדמיית מסדי נתונים[36]. מהודרת ה־Workstation של APL2 עבור המערכות Windows, OS/2, AIX, Linux, ו־Solaris הושקה רק בשנות ה־90.[דרוש מקור]

יישומים עכשווייםעריכה

יישומי APL של APLX, Dyalog כוללים הרחבות לשפה כמו תמיכה בתכנות מונחה-עצמים, תמיכה ב־.NET Framework, קידוד קובצי XML, הדפסת תרשימים, תיווך בין השפה למערכת ההפעלה, וביטויי תחשיב למדא.

שפות תכנות נגזרותעריכה

APL עיצבה או השפיעה באופן ניכר על שפות התכנות:

תכונות השפהעריכה

מערכת תוויםעריכה

מערכת התווים הייחודית והלא מוכרת של APL הייתה עבורה מקור לביקורת ושבח כאחד. התופעה שמתכנתים שלומדים ומסתגלים אליה הופכים לחסידים נלהבים שלה יכולה לרמוז שאכן קיים משקל מהותי לסימון המתמטי המקורי של אייברסון וזהו חלק בלתי נפרד מהשפה. בשנות ה־60 וה־70 מעט מסופים ואף צגים יכלו להציג את הסימנים של APL. הפופולריים מבניהם ניצל את יכולת ההדפסה של הכדורית (ה־IBM Selectric) בעזרת החלפת ראש ההדפסה (באנגלית: Typeball) האלפביתי באחד שהכיל בו את התווים הנחוצים כדי להדפיס פלט בשפת הסימנים של APL. המסוף הראשון שידע להציג את כל התווים של 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

(פונקציה)

פעולה או מיפוי, אשר לוקחת פרמטר אחד (מימין), אף פרמטר, או שני פרמטרים (מימין ומשמאל), אשר יכולים סקלרים, מערכים או מבנים מורכבים יותר.
  • פרימיטיבית (באנגלית: primitive) - מובנת בשפה ומיוצגת בעזרת סימן בתו בודד.
  • מוגדרת (באנגלית: defined) - הוגדרה על ידי המשתמש עם שם חדש בסביבת העבודה[60].
  • נגזרת (באנגלית: derived) - נוצרה כתוצאה משילוב של אופרטור ופונקציה.
array

(מערך)

נתונים המסודרים באפס או יותר ממדים אורתוגנליים בשורות (בניגוד לסדר בטורים), כשכל פריט הוא סקלר פרימיטיבי או מערך אחר[61].
niladic לא לוקח אף פרמטרים.
monadic

(פעולה אונארית)

דורש פרמטר אחד בלבד, מימין עבור פונקציות, משמאל עבור אופרטורים.
dyadic

(פעולה בינארית)

דורש שני פרמטרים, משמאל ומימין.
ambivalent או monadic מאפשר שימוש עם פרמטר בודד או זוג פרמטרים. מאפשר להשמיט את הפרמטר השמאלי.
operator

(פעולה)

פעולה שלוקחת פרמטר אחד (משמאל) או שניים (מימין ומשמאל) שהם פונקציה או מערך, ומחזירה פונקציה חדשה. בניגוד לפונקציות, קיימות רק פעולות פרימיטיביות ומוגדרות, אך לא נגזרות.

תחבירעריכה

דוגמאותעריכה

”שלום עולם“עריכה

הדפסת השורה ”שלום עולם“ ב־APL תעשה כך:

'Hello, world!'

ב־APL ניתן להגדיר פעולות ברירת מחדל במקרים מסוימים כשלא מצוינת אף פעולה או פונקציה אחרת. המחרוזת 'Hello, world!' מודפסת כפלט מכיוון שפעולת ברירת המחדל ב־APL היא הדפסת פלט.

העלאה בחזקהעריכה

העלאה בחזקה ב־APL נעשית בעזרת הפונקציה כך: 2⋆3, כלומר 2 בחזקת 3 (זה יכתב כ־2^3 במספר שפות אחרות, וכ־2**3 בשפות כמו פייתון ו־Fortran). עם זאת, במקרה שלא צוין בסיס (כגון ⋆3 או ^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[x6?40]

הקוד התמציתי לעיל משלב את הפונקציות הבאות:

  • הראשונה שתעבור הערכה (מאחר ש־APL מעריכה ביטויים בקדימות מימין לשמאל) תהיה הפונקציה הדיאדית ? (מכונה באנגלית deal כשנעשה בה שימוש דיאדי) תחזיר מערך ובו תבחר מספר/ים לפי הכמות משמאל (במקרה זה: 6) בתוך הטווח מימין (במקרה זה: 40), כלומר היא תחזיר מערך בגודל 6 פריטים וערכם נע מ־1 עד 40 באופן אקראי[62].
  • פעולת הייחוס תקלוט את המערך שהחזירה ? לתוך המשתנה x.
  • המערך יעבור מיון מחדש בסדר עולה על ידי הפונקציה המונאדית שתקח את כל מה שתחום בסוגריים המרובעות (המתייחסים בפועל לאינדקס המערך x) כפרמטר לימינה.
  • הסוגריים המרובעות יקלטו את הסידור החדש מ־ עבור המערך x.

מאחר שלא צוינה אף פונקציה משמאל ל־x שתנחה מה לעשות עם הפלט, אז המפרש פשוט ידפיס אותו בשורה אחת כשכל פריט במערך מופרד ברווח בלי הנחיה נוספת.

הפונקציה ? יכולה גם להיות מונאדית (כלומר אונארית, במקרה זה היא מכונה ”roll“ באנגלית) ותחזיר מספר אקראי בודד לפי טווח הפרמטר שמשמאל. לדוגמה ?20 תחזיר מספר אקראי בין 1 ל־20.

מספרים ראשונייםעריכה

הביטוי הבא יחשב את כל המספרים הראשוניים מ־1 עד R. סיבוכיות החישוב תהיה   גם בזמן הריצה וגם בצריכת הזיכרון.

(~RR∘.×R)/R1ι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[34]. בשנת 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[34].

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 הציגה שיפורים חשובים לשפה והבולט בהם היה קינון מערכים (הכלת מערכים בתוך מערכים)[34]. נכון ל־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 Frmework. הוא הושק לראשונה על ידי 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.

קישורים חיצונייםעריכה

  מדיה וקבצים בנושא APL בוויקישיתוף

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

  1. ^ 1.0 1.1 Kenneth Iverson - A Programming Language — Software Preservation Group, www.softwarepreservation.org Archived 2014-10-27 at the Wayback Machine
  2. ^ ACM: Fellows Award / John Backus, web.archive.org, ‏2008-02-12
  3. ^ 3.0 3.1 Moler, Cleve, The Growth of MATLAB, web.archive.com
  4. ^ 4.0 4.1 Essays/Bibliography - J Wiki, code.jsoftware.com
  5. ^ 5.0 5.1 An Interview with Arthur Whitney, web.archive.org, ‏2009-04-04
  6. ^ Kenneth E. Iverson. Automatic Data Processing, Chapter 6 : A Programming Language. Color scan. — Software Preservation Group, web.archive.org, ‏2009-06-04
  7. ^ Hellerman, H., Experimental Personalized Array Translator System, Communications of the ACM 433, 1964, עמ' 7
  8. ^ The Evolution of APL, www.jsoftware.com
  9. ^ Abrams, Philip S., An interpreter for "Iverson notation", Department of Computer Science, Stanford University, ‏אוגוסט 1966
  10. ^ Haigh, Thomas, Biographies: Kenneth E. Iverson, IEEE Annals of the History of Computing, 2005
  11. ^ 11.0 11.1 Larry Breed, The First APL Terminal Session, SIGAPL APL Quote Quad 22, 1991-9, עמ' 2–4 doi: 10.1145/138094.140933
  12. ^ December 19: APL Co-Inventor Falkoff Born | This Day in History | Computer History Museum, www.computerhistory.org
  13. ^ Vector, the Journal of the British APL Association, vector.org.uk
  14. ^ APL\1130 Manual, ‏מאי 1969
  15. ^ Remembering APL, www.quadibloc.com
  16. ^ Falkoff, Adin; Iverson, Kenneth E., APL\360 Users Guide, ‏August 1968
  17. ^ APL\360 Terminal System, ‏March 1967
  18. ^ 18.0 18.1 Pakin, Sandra, APL\360 Reference Manual, Science Research Associates, Inc., 1968, ISBN 978-0-574-16135-2
  19. ^ Falkoff, Adin D.; Iverson, Kenneth E., The Design of APL
  20. ^ Allen Kent, James G. Williams, Encyclopedia of Microcomputers: Volume 1 - Access Methods to Assembly Language and Assemblers, CRC Press, 1987-10-01. (באנגלית)
  21. ^ Minker, Jack, Beginning of Computing and Computer Sciences at the University of Maryland, ‏ינואר 2004
  22. ^ SIGAPL - Home, www.sigapl.org
  23. ^ Fifty Years of BASIC, the Programming Language That Made Computers Personal, Time (באנגלית)
  24. ^ MCM 70 / 700, old-computers.com
  25. ^ Zbigniew Stachniak, Inventing the PC: The MCM/70 Story, McGill-Queen's Press - MQUP, 2011. (באנגלית)
  26. ^ Michael Miller 17 Dec 2014, 9:15 P.m, PCs That Paved the Way for the Altair, PCMag UK, ‏2014-12-17 (באנגלית)
  27. ^ COMPUTE! The Journal for Progressive Computing, Small System Services Inc., 1981
  28. ^ DigiBarn Newsletters: Homebrew Club Newsletter Vol 2, Issue 1 (Jan 31, 1976), www.digibarn.com
  29. ^ Remembering Ken Iverson, keiapl.org
  30. ^ Kenneth E. Iverson - A.M. Turing Award Laureate, amturing.acm.org
  31. ^ ACM SIGPLAN, APL2: The Early Years, www.sigapl.org, ‏ינואר 10, 2015
  32. ^ Overview of the APL System, microapl.com
  33. ^ Robertson, Graeme, A Personal View of APL2010, archive.vector.org.uk, ‏ינואר 10, 2015
  34. ^ 34.0 34.1 34.2 34.3 Adin D. Falkoff, The IBM Family of APL Systems, undefined, ‏1991 (באנגלית)
  35. ^ 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
  36. ^ IBM APL2 - Overview - United States, www.ibm.com, ‏2019-03-11 (בAmerican English)
  37. ^ Thomas A. Standish, Some Features of PPL, a Polymorphic Programming Language, SIGPLAN Not. 4, 1969-8, עמ' 20–26 doi: 10.1145/1115858.1115864
  38. ^ I. D. G. Enterprise, Computerworld, IDG Enterprise, 1977-07-04. (באנגלית)
  39. ^ 39.0 39.1 Dyalog - APL Fonts and Keyboards, www.dyalog.com
  40. ^ NARS2000 Keyboard, www.sudleyplace.com
  41. ^ Introduction to APL, microapl.com
  42. ^ Brown, James A.; Hawks, Brent; Trimble, Ray, Extending the APL character set, ACM SIGAPL APL Quote Quad, 1993 doi: 10.1145/166198.166203
  43. ^ Vector, the Journal of the British APL Association, archive.vector.org.uk
  44. ^ Dyalog Usermeeting (29 בנובמבר 2013), Dyalog '13: Computer Science Outreach and Education with APL, בדיקה אחרונה ב-12 במרץ 2019 
  45. ^ 45.0 45.1 Operators, microapl.com
  46. ^ Primitive Functions, microapl.com
  47. ^ APL Primitives, microapl.com
  48. ^ Control Structures, microapl.com
  49. ^ The Workspace, microapl.com
  50. ^ Conway's Game of Life in one line of APL, web.archive.org, ‏2013-07-08
  51. ^ Entering APL Symbols, microapl.com
  52. ^ Lee Dickey, A list of APL transliteration schemes, uwaterloo.ca, ‏7 יולי 1993 (באנגלית)
  53. ^ Notation as a Tool of Thought, www.jsoftware.com Archived 2013-09-20 at the Wayback Machine
  54. ^ Batenburg, APL Efficiency, www.ekevanbatenburg.nl, ‏ינואר 1, 2015 (באנגלית)
  55. ^ Vaxman, APL Great Programming, www.vaxman.de, ‏ינואר 1, 2015 (באנגלית)
  56. ^ 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
  57. ^ APL Borealis Inc. - Canada's APL Product & Service Provider, www.aplborealis.com
  58. ^ A Dictionary of APL, www.jsoftware.com
  59. ^ / Reduction, microapl.com
  60. ^ User-defined Functions and Operators, microapl.com
  61. ^ Nial Systems Limited - Array Theory, web.archive.org, ‏2011-07-09
  62. ^ SIGAPL - Systematically Random Numbers, www.sigapl.org
  63. ^ SimCorp, 2017 Annual Report, ‏February 1, 2018
  64. ^ Using APL in an Artificial Intelligence environment: A knowledge engineering system dealing with biographical data | Request PDF, ResearchGate (באנגלית)
  65. ^ Gary Sullivan, Kenneth Fordyce, Artificial Intelligence Development Aids (AIDA), SIGAPL APL Quote Quad 15, 1985-5, עמ' 106–113 doi: 10.1145/255315.255347
  66. ^ Manuel Alfonseca, Neural Networks in APL, SIGAPL APL Quote Quad 20, 1990-5, עמ' 2–6 doi: 10.1145/97811.97816
  67. ^ Robot programming in APL, begriffs.com
  68. ^ Vi idag (בשוודית)
  69. ^ DNA Identification Technology, dna-view.com
  70. ^ Dyalog Usermeeting (17 באוקטובר 2014), Dyalog14: There's DNA Everywhere – an Opportunity for APL, בדיקה אחרונה ב-12 במרץ 2019 
  71. ^ code golf - Tips for golfing in APL, Programming Puzzles & Code Golf Stack Exchange
  72. ^ W. N. Holmes, Is APL a Programming Language?, The Computer Journal 21, 1978-05-01, עמ' 128–131 doi: 10.1093/comjnl/21.2.128
  73. ^ 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 (באנגלית)
  74. ^ Nadia Magnenat-Thalmann, Daniel Thalmann, Computer Animation: Theory and Practice, Springer Science & Business Media, 2012-12-06. (באנגלית)
  75. ^ Stormwind Simulator at Dyalog '16, Optima Systems, ‏2016-10-17 (בAmerican English)
  76. ^ APL Quotations and Anecdotes, www.jsoftware.com
  77. ^ ACM Award Citation / Lawrence Breed, web.archive.org, ‏2012-04-02
  78. ^ ACM Award Citation / Richard Lathwell, web.archive.org, ‏2012-04-02
  79. ^ ACM Award Citation / Roger Moore, web.archive.org, ‏2012-04-02
  80. ^ OLD-COMPUTERS.COM : The Museum, www.old-computers.com
  81. ^ Welcome, IBM, to personal computing, BYTE, דצמבר 1975, עמ' 90
  82. ^ Chronology of APL, www.sigapl.org
  83. ^ Larry Breed, How We Got To APL\1130, Vector (British APL Association), ‏August 2006 (באנגלית) Archived 2008-05-12 at the Wayback Machine
  84. ^ Roger Moore, History of I. P. Sharp Associates Timesharing and Network, Rogerdmoore.ca, ‏2005
  85. ^ Blumenthal, Marcia, VAX-11s Acquire APL Processor, Computerworld, 1981
  86. ^ 86.0 86.1 Kenneth E. Iverson Award for Outstanding Contribution to APL, SIGAPL
  87. ^ IBM APL2: What's New - United States, www-01.ibm.com, ‏2018-12-04 (בAmerican English)
  88. ^ Dyalog - Home, www.dyalog.com
  89. ^ British APL Association, Dyalog at 25, Vector Magazine, 2008(הקישור אינו פעיל)
  90. ^ Kromberg, Morten, Arrays of Objects, 2007
  91. ^ Scholes, John, D: A functional subset of Dyalog APL, Vector Magazine
  92. ^ Dyalog - Prices and Licences, www.dyalog.com
  93. ^ 2016 Iverson Award Recognises Dyalog's CEO and CXO
  94. ^ NARS2000 Welcome Page, www.nars2000.org
  95. ^ APLX has been withdrawn from commercial sale but can be downloaded free of charge, Microapl.com
  96. ^ Free Software DirectoryGNU APL, directory.fsf.org
  97. ^ Stallman, Richard M, RMS Berättar
  98. ^ Timothy Budd, An APL Compiler, Springer Science & Business Media, 2012-12-06. (באנגלית)
  99. ^ SIGAPL, What is APL?, www.sigapl.org
  100. ^ 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
  101. ^ Hsu, Aaron W.; Bowman, William J., Revisiting APL in the Modern Era, Indiana University / Princeton
  102. ^ 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
  103. ^ Guy Blelloch, Gary W. Sabot, Compiling Collection-Oriented Languages onto Massively Parallel Computers, Journal of Parallel and Distributed Computing 8, 1990, עמ' 119–134
  104. ^ Jendrsczok, Johannes; Hoffmann, Rolf; Ediger, Patrick; Keller, Jörg., Implementing APL-like data parallel functions on a GCA machine, Fernuni-Hagen.De, עמ' 1-6
  105. ^ Norman Brenner, VLSI Circuit Design Using APL with Fortran Subroutines, SIGAPL APL Quote Quad 14, 1984-6, עמ' 77–79 doi: 10.1145/384283.801079
  106. ^ 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
  107. ^ Lee, Robert S., Two Implementations of APL, PC Magazine, 1983
  108. ^ MARTHA and LLAMA, The APL Computer Language, marthallama.org
  109. ^ Robert Metzger, Zhaofang Wen, Automatic Algorithm Recognition and Replacement: A New Approach to Program Optimization, MIT Press, 2000-06-02. (באנגלית)
  110. ^ Lawrence Snyder, Recognition and selection of idioms for code optimization, Acta Informatica 17, 1982-08-01, עמ' 327–348 doi: 10.1007/BF00264357
  111. ^ Cheng, Feng Sheng, Idiom matching: an optimization technique for an APL compiler, Iowa State University, 1981
  112. ^ Idiom Recognition, help.dyalog.com
  113. ^ George O. Strawn, Does APL really need run-time parsing?, Software: Practice and Experience 7, 1977, עמ' 193–200 doi: 10.1002/spe.4380070207
  114. ^ Dyalog Ltd, Compiler User Guide, www.dyalog.com
  115. ^ 115.0 115.1 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
  116. ^ Chronology of APL, www.sigapl.org
  117. ^ 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
  118. ^ Snake Island Research Inc, The APEX Project, http://www.snakeisland.com