Erlang – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
Jona1357 (שיחה | תרומות)
אין תקציר עריכה
מאין תקציר עריכה
שורה 1:
{{בעבודה|זמן=שבוע|שם=Jona1357}}
 
'''Erlang ( אֶרְלַנְג )''' היא שפת תכנות כללית ו[[תכנות פונקציונלי|פונקציונלית]] אשר נוצרה על ידי מדעני המחשב ג׳ו ארמסטרונג, רוברט וירדינג, ומייק וויליאמס ושוחררה לראשונה בשנת [[1986]]. Erlang תומכת הן בתכנות פונקציונלי והן ב[[עיבוד מקבילי|תכנות מקבילי]] ולפיכך נחשבת לשפה מרובת פרדיגמות תכנות. Erlang מתוכננת על מנת לתמוך בין היתר ב[[מערכת זמן אמת|מערכות זמן אמת]] ( מערכות אשר חייבות לעמוד במגבלת זמן מסויימת ) מרושתות ( Distributed ) . היא תומכת בין היתר בהצהרת קבועים, [[פקודת השמה|השמה]] ו[[מערכת טיפוסים|טיפוסיות]] דינמית. בנוסף, היא נחשבת ל-Fault Tolerant, כלומר, מסוגלת להמשיך לרוץ גם כאשר אחד מרכיביה נכשל, בהתאם לסגנון הקידוד "Let It Crash" ( ״ תן לזה להתרסק ״ ), המתבסס על ההנחה שקריסה של רכיב היא בלתי נמנעת, ולכן אין להשבית את כל המערכת בעקבות זאת.
 
ב-1986 כאשר היא שוחררה לראשונה, הייתה Erlang תוכנה פרטית ( Proprietary Software ) בראשות תאגיד התקשורת [[טלקומוניקציה|והטלקומוניקציה]] השוודי Ericsson. בשנת 1998 היא שוחחרה כתוכנה חופשית ומגיעה עם ספריות העזר החופשיות '''OTP''' ( קיצור של '''Open Telecom Platform''').
 
{{שפת תכנות
| שם = Erlang
| סמל = [[File:Erlang logo.svg|thumb|Erlang logo]]
| פרדיגמות = [[תכנות פונקציונלי]], [[ עיבוד מקבילי#תכנות מקבילי|תכנות מקבילי]]
[[ עיבוד מקבילי#תכנות מקבילי | תכנות מקבילי ]]
| שנה = 1986
| מתכנן = Joe Armstrong, Robert Virding, Mike Williams , מתאגיד Ericsson
שורה 16 ⟵ 10:
| תאריך גרסה אחרונה = 2 באוקטובר, 2020
| טיפוסיות = דינמית, חזקה
| הושפעה על ידי = [[Lisp]],{{כ}} [[פרולוג (שפת תכנות)|פרולוג]], [[PLEX]], {{כ}}Smalltalk
| השפיעה על = Akka{{כ}}, [[ Clojure]], {{כ}}Dart, {{כ}}Elixir, {{כ}}F#, {{כ}}Opa, {{כ}}Oz, {{כ}}Reia, {{כ}}Rust, {{כ}}Scala
[[Prolog | פרולוג ]],
| סיומת = .erl .hrl.
[[PLEX]],
Smalltalk
| השפיעה על = Akka,[[ Clojure]], Dart, Elixir, F#, Opa, Oz, Reia, Rust,
Scala
| סיומת = .erl
.hrl
| אתר אינטרנט = https://www.erlang.org
}}
 
'''Erlang ( אֶרְלַנְג )''' היא שפת תכנות כללית ו[[תכנות פונקציונלי|פונקציונלית]] אשר נוצרה על ידי מדעני המחשב ג׳וג'ו ארמסטרונג, רוברט וירדינג, ומייק וויליאמסויליאמס ושוחררה לראשונה בשנת [[1986]]. Erlang תומכת הן בתכנות פונקציונלי והן ב[[עיבוד מקבילי|תכנות מקבילי]] ולפיכך נחשבת לשפה מרובת פרדיגמות תכנות. Erlang מתוכננת על מנת לתמוך בין היתר ב[[מערכת זמן אמת|מערכות זמן אמת]] ( מערכות אשר חייבות לעמוד במגבלת זמן מסויימת ) מרושתות ( Distributed ) . היא תומכת בין היתר בהצהרת קבועים, [[פקודת השמה|השמה]] ו[[מערכת טיפוסים|טיפוסיות]] דינמית. בנוסף, היא נחשבת ל-Fault Tolerant, כלומר, מסוגלת להמשיך לרוץ גם כאשר אחד מרכיביה נכשל, בהתאם לסגנון הקידוד "Let It Crash" ( ״ "תן לזה להתרסק ״ "), המתבסס על ההנחה שקריסה של רכיב היא בלתי נמנעת, ולכן אין להשבית את כל המערכת בעקבות זאת.
 
ב-1986 כאשר היא שוחררה לראשונה, הייתה Erlang תוכנה פרטית ( Proprietary Software ) בראשות תאגיד התקשורת וה[[טלקומוניקציה|והטלקומוניקציה]] השוודי Ericsson. בשנת 1998 היא שוחחרהשוחררה כתוכנה חופשית ומגיעה עם ספריות העזר החופשיות '''OTP''' ( קיצור של '''Open Telecom Platform''').
 
== היסטוריה ==
השם Erlang, ששויך לשפה על ידי Bjarne Däcker, נובע משמו של המתמטיקאי הדני Agner Krarup Erlang , וכן מקיצור המילים ״ "Ericsson Language ״ " כלומר, השפה של תאגיד התוכנה אריקסון, אשר אחראי לפיתוח שפת התכנות.
 
הגרסה הראשונה של Elang מומשה בשפת התכנות [[פרולוג (שפת תכנות)|פרולוג]] והושפעה משפות התכנות [[PLEX]] ו-[[Lisp]] .
 
== דוגמאות קוד ==
 
=== עצרת ===
מימוש פעולת ה[[עצרת]] ב-Erlang:<syntaxhighlight lang="erlang">
שורה 47 ⟵ 39:
</syntaxhighlight>
 
=== [[סדרת פיבונאצ'י|סדרת פיבונאצ׳י]] ===
אלגוריתם רקורסיבי ב-Erlang אשר מייצר את הסדרה.[[סדרת פיבונאצ'י]]:<syntaxhighlight lang="erlang">
-module(series).
-export([fib/1]).
שורה 78 ⟵ 70:
== סוגי נתונים בשפה ==
{{להשלים}}
ב-Erlang ישנם 8 סוגי נתונים פרימטיביםפרימטיביים:
 
* '''Integers''' ( מספרים שלמים ) -
* '''Atoms''' - נכתבים כמחרוזות של תווים אלפאנומרים עוקבים, כאשר הראשון הוא אות קטנה ( lowercase ). משמשים על מנת לציין ערכים שונים.
* '''Floats''' - משתנים עשרוניים ( Floating Point Numbers ).
* '''References''' - התכונה היחידה של סמלים אלו היא שניתן להשוות ביניהם. הם נוצרים על ידי הפעולה <code>(...)make_ref</code>.
* '''Binaries''' - אוסף של בתים ( bytes ). בית בהגדרתו הוא 8 סיביות, כלומר, 8 ספרות בינאריות .
* '''Pids''' - קיצור ל-Process Identifiers ( מזהי תהליכים ). Pid הוא הפניה לתהליך של Erlang והוא נוצר על ידי הפעולה <code>(...)spawn</code>.
* '''Ports''' - פורטים נוצרים על מנת לתקשר עם העולם החיצוני. הם נוצרים עם הפעולה המובנית <code>open_port</code> . הודעות יכולות להישלח ולהתקבל מפורטים, אך הן חייבות למלא אחר [[פרוטוקול תקשורת|פרוטוקול]] אשר נקרא "port protocol".
* '''Funs''' ( קיצור של Functions )- פונקציות, פעולות. הן נוצרות בתחביר הבא : <code>fun(...) -> ... end</code>.
 
ושלושה סוגי נתונים מורכבים:
Atoms - נכתבים כמחרוזות של תווים אלפאנומרים עוקבים, כאשר הראשון הוא אות קטנה ( lowercase ). משמשים על מנת לציין ערכים שונים.
* '''Tuples''' - מבני נתונים אשר מכילים מספר קבוע של נתונים. להמחשה, קטע הקוד <code>{D1,D2,...,Dn}</code> מציין tuple שאבריו <code>D1, D2, ... Dn</code>.
* '''Lists-''' – רשימות.
* '''Maps''' ( מילון, Dictionary ) - רשימה של זוגות של key ( מפתח ) ו- ( value ). בדומה למילון פשוט, אשר מכיל רשימה שמכילה זוגות של מילה והתרגום שלה. נכתב בתחביר הבא : <code>#{Key1=>Value1,...,KeyN=>ValueN}</code>.
 
ושתי צורות של [[סוכר תחבירי]]:
Floats - משתנים עשרוניים ( Floating Point Numbers )
* '''Strings''' - רשימה של תווים המוגדרת בדרך כלל באמצעות גרשיים כפולים ( מרכאות ), כקיצור לרשימה עם ערכי ה-unicode של התווים. לדוגמה, ניתן לייצג את המילה cat ( שמשמעותה בעברית חתול ) כך: :<code>״cat״</code> וכך: <code>[99,97,116]</code>.
* '''Records''' - מאפשרים דרך נוחה לשייך תג לכל איבר ב-tuple, כלומר, לפנות לאלמנט ב-tuple באמצעות שם ולא מקום ( מציין, אינדקס ) . תהליך אשר מתקיים לפני ההידור לוקח את הגדרת ה- Record ומחליף במקומו את המקום המתאים כאשר מתייחסים אליו.
 
ב-Erlang אין פעולה על מנת להגדיר מחלקות, אך ישנן ספריות חיצוניות זמינות לכך.<ref>{{קישור כללי|כתובת=https://code.google.com/p/ect/|הכותב=|כותרת="ect – Erlang Class Transformation – add object-oriented programming to Erlang – Google Project Hosting"|אתר=|תאריך=}}</ref>
References - התכונה היחידה של סמלים אלו היא שניתן להשוות ביניהם. הם נוצרים על ידי הפעולה <code>(...)make_ref</code>
 
Binaries - אוסף של בתים ( bytes ). בית בהגדרתו הוא 8 סיביות, כלומר, 8 ספרות בינאריות .
 
Pids - קיצור ל-Process Identifiers ( מזהי תהליכים ). Pid הוא הפניה לתהליך של Erlang והוא נוצר על ידי הפעולה <code>(...)spawn</code>.
 
Ports - פורטים נוצרים על מנת לתקשר עם העולם החיצוני. הם נוצרים עם הפעולה המובנית <code>open_port</code> . הודעות יכולות להישלח ולהתקבל מפורטים, אך הן חייבות למלא אחר [[פרוטוקול תקשורת|פרוטוקול]] אשר נקרא "port protocol".
 
Funs ( קיצור של Functions )- פונקציות, פעולות. הן נוצרות בתחביר הבא : <code>fun(...) -> ... end</code>.
 
Tuples - מבני נתונים אשר מכילים מספר קבוע של נתונים. להמחשה, קטע הקוד <code>{D1,D2,...,Dn}</code> מציין tuple שאבריו <code>D1, D2, ... Dn</code>.
 
Lists- רשימות
 
Maps ( מילון, Dictionary ) - רשימה של זוגות של key ( מפתח ) ו- ( value ). בדומה למילון פשוט, אשר מכיל רשימה שמכילה זוגות של מילה והתרגום שלה. נכתב בתחביר הבא : <code>#{Key1=>Value1,...,KeyN=>ValueN}</code>.
 
Strings - רשימה של תווים המוגדרת בדרך כלל באמצעות גרשיים כפולים ( מרכאות ), כקיצור לרשימה עם ערכי ה-unicode של התווים. לדוגמה, ניתן לייצג את המילה cat ( שמשמעותה בעברית חתול ) כך :<code>״cat״</code> וכך: <code>[99,97,116]</code>.
 
Records - מאפשרים דרך נוחה לשייך תג לכל איבר ב-tuple, כלומר, לפנות לאלמנט ב-tuple באמצעות שם ולא מקום ( מציין, אינדקס ) . תהליך אשר מתקיים לפני ההידור לוקח את הגדרת ה- Record ומחליף במקומו את המקום המתאים כאשר מתייחסים אליו.
 
ב-Erlang אין פעולה על מנת להגדיר מחלקות, אך ישנן ספריות חיצוניות זמינות לכך<ref>{{קישור כללי|כתובת=https://code.google.com/p/ect/|הכותב=|כותרת="ect – Erlang Class Transformation – add object-oriented programming to Erlang – Google Project Hosting"|אתר=|תאריך=}}</ref>
 
== טיפול בקריסות ==
=== Defensive Programming ( ״ "תכנות הגנתי ״ ") ===
ברוב שפות התכנות האחרות, קריסות תוכנה נחשבות ללא רצויות ולכן יש להימנע מהן בכל מחיר. לכן, נהוג ללכוד את התקלות, ולאחר מכן להתמודד עם השפעתן - תהליך אשר נקרא ''Exception Handling''. פילוסופית התכנון הזו נובעת בין היתר מכך שעקרונות פיתוח תוכנה רבים נקבעו בתקופה שבה מחשבים היו בעלי מעבד יחיד. בתנאים אלו, קריסות תוכנה אכן היו הרסניות. כתוצאה מכך, הפך סגנון תכנות בו חלק נרחב מהקוד מושקע לטיפול בקריסות תוכנה לנפוץ ביותר. סגנון זה, בו משקיעים משאבים אלו לטיפול בקריסות, נקרא ''"Defensive Programming" ( ״ "תכנות הגנתי ״ ")''.
 
=== Let It Crash ( ״ "תן לזה לקרוס ״ ") ===
=== Defensive Programming ( ״ תכנות הגנתי ״ ) ===
מתכנני Erlang הבינו כי על אף פי השלכותיהן השליליות, קריסות תוכנה הן בלתי נמנעות. לכן, במקום לטפל בקריסה נקודתית כמצב חירום אשר משהה את כל הפעילות הרגילה עד למציאת פתרון, הם חשבו שיהיה יותר רציונלי לטפל בקריסה נקודתית בדיוק כמו אירוע ( event ) אחר בזמן ריצה. לכן, כאשר תהליך ב-Erlang קורס, סיטואציה זו מדווחת רק כסוג אחר של הודעה.
ברוב שפות התכנות האחרות, קריסות תוכנה נחשבות ללא רצויות ולכן יש להימנע מהן בכל מחיר. לכן, נהוג ללכוד את התקלות, ולאחר מכן להתמודד עם השפעתן - תהליך אשר נקרא ''Exception Handling''. פילוסופית התכנון הזו נובעת בין היתר מכך שעקרונות פיתוח תוכנה רבים נקבעו בתקופה שבה מחשבים היו בעלי מעבד יחיד. בתנאים אלו, קריסות תוכנה אכן היו הרסניות. כתוצאה מכך, הפך סגנון תכנות בו חלק נרחב מהקוד מושקע לטיפול בקריסות תוכנה לנפוץ ביותר. סגנון זה, בו משקיעים משאבים אלו לטיפול בקריסות, נקרא ''Defensive Programming ( ״ תכנות הגנתי ״ )''
 
=== Let It Crash ( ״ תן לזה לקרוס ״ ) ===
מתכנני Erlang הבינו כי על אף פי השלכותיהן השליליות, קריסות תוכנה הן בלתי נמנעות. לכן, במקום לטפל בקריסה נקודתית כמצב חירום אשר משהה את כל הפעילות הרגילה עד למציאת פתרון, הם חשבו שיהיה יותר רציונלי לטפל בקריסה נקודתית בדיוק כמו אירוע ( event ) אחר בזמן ריצה. לכן, כאשר תהליך ב-Erlang קורס, סיטואציה זו מדווחת רק כסוג אחר של הודעה.
 
==== ההשלכות על עיצוב Erlang ====
סגנון זה השפיע על הפיצ׳ריםהפיצ'רים הבסיסיים של השפה:
* ב-Erlang אין זיכרון גלובלי משותף - לכל תהליך יש זיכרון מבודד משלו.
 
* ב-Erlang אין זיכרון גלובלי משותף - לכל תהליך יש זיכרון מבודד משלו.
* תהליכים ב-Erlang יכולים:
** להיווצר בקלות
** לתקשר רק באמצעות העברת מסרים
** לפקח אחד על השני. הדבר מאפשר היררכיות בין תהליכים ( Supervisor Trees ) .
* על תהליך לבצע את משימתו או להיכשל
* כישלון תהליך מדווח כהודעה.
 
=== Supervisor Trees ( עצי פיקוח ) ===
ביישום טיפוסי ב-Erlang תהליכים מנוהלים בצורה של [[עץ בינארי|עץ]] פיקוח. ארכיטקטורה זו מבוססת על ההיררכיה של תהליכים, כאשר התהליך בעל המעמד הגבוה נקרא '''supervisor''' והוא אחראי על פיקוח וניהול של תהליכים שבחסותו ( '''Child Proccesses''' ) . גם תהליך אשר נמצא בפיקוח על ידי תהליך אחר בעל מעמד גבוה יותר בהיררכיה, יכול לפקח על תהליכים משלו, וכך נוצרת היררכיה בעלת תהליכים רבים אשר מפקחים ומפוקחים. על העץ המפקח בין היתר נדרש לטפל במקרי קצה של התהליכים שבחסותו - כגון קריסה שלהם. במקרה של קריסה של אחד מהם יקבל העץ המפקח הודעה המכילה tuple שאיברו הראשון יהיה הערך מסוג הנתונים '''Atom''' ( אטום ) <code>'DOWN'</code>.
 
העץ המפקח אחראי להקשיב להודעות כאלו, ולאחר מכן גם לנקוט בפעולה המתאימה בהתאם לתוכן העבודה.
 
העץ המפקח אחראי להקשיב להודעות כאלו, ולאחר מכן גם לנקוט בפעולה המתאימה בהתאם לתוכן העבודה.
== מימוש ==
המימוש הרשמי של Erlang משתמש ב-BEAM - המכונה הוירטואלית של Erlang.
 
BEAM כלולה בהפצה הרשמית של Erlang, שנקראת Erlang/OTP. היא מריצה [[bytecodeBytecode]] אשר מומר בזמן ריצה ל-threaded[[Threaded code]] [[:en:Threaded_code{{אנ|(Threaded אנ׳ )]]code}}. בנוסף המימוש הרשמי מכיל מהדר אשר נוצר על ידי HiPE ( ראשי תיבות ל-של Performance Erlang Project ) באוניברסיטת אופסלה בשוודיה, וגם מפרש אשר ממיר ישירות מקוד מקור באמצעות עץ נתונים -abstract syntax tree. מאז אוקטובר 2001, המהדר נמצא באינטגרציה מלאה עם המימוש Erlang/OTP.
 
== ראו גם ==
* [[טלקומוניקציה]]
* [[Lisp]]
 
* [[תכנות פונקציונלי]]
[[Lisp]]
 
[[תכנות פונקציונלי]]
 
== קישורים חיצוניים ==