Erlang – הבדלי גרסאות
תוכן שנמחק תוכן שנוסף
אין תקציר עריכה |
מאין תקציר עריכה |
||
שורה 1:
{{בעבודה|זמן=שבוע|שם=Jona1357}}
'''Erlang ( אֶרְלַנְג )''' היא שפת תכנות כללית ו[[תכנות פונקציונלי|פונקציונלית]] אשר נוצרה על ידי מדעני המחשב ג׳ו ארמסטרונג, רוברט וירדינג, ומייק וויליאמס ושוחררה לראשונה בשנת [[1986]]. Erlang תומכת הן בתכנות פונקציונלי והן ב[[עיבוד מקבילי|תכנות מקבילי]] ולפיכך נחשבת לשפה מרובת פרדיגמות תכנות. Erlang מתוכננת על מנת לתמוך בין היתר ב[[מערכת זמן אמת|מערכות זמן אמת]] ( מערכות אשר חייבות לעמוד במגבלת זמן מסויימת ) מרושתות ( Distributed ) . היא תומכת בין היתר בהצהרת קבועים, [[פקודת השמה|השמה]] ו[[מערכת טיפוסים|טיפוסיות]] דינמית. בנוסף, היא נחשבת ל-Fault Tolerant, כלומר, מסוגלת להמשיך לרוץ גם כאשר אחד מרכיביה נכשל, בהתאם לסגנון הקידוד "Let It Crash" ( ״ תן לזה להתרסק ״ ), המתבסס על ההנחה שקריסה של רכיב היא בלתי נמנעת, ולכן אין להשבית את כל המערכת בעקבות זאת.▼
ב-1986 כאשר היא שוחררה לראשונה, הייתה Erlang תוכנה פרטית ( Proprietary Software ) בראשות תאגיד התקשורת [[טלקומוניקציה|והטלקומוניקציה]] השוודי Ericsson. בשנת 1998 היא שוחחרה כתוכנה חופשית ומגיעה עם ספריות העזר החופשיות '''OTP''' ( קיצור של '''Open Telecom Platform''').▼
{{שפת תכנות
| שם = Erlang
| סמל =
| פרדיגמות = [[תכנות פונקציונלי]], [[ עיבוד מקבילי#תכנות מקבילי|תכנות מקבילי]]
| שנה = 1986
| מתכנן = Joe Armstrong, Robert Virding, Mike Williams , מתאגיד Ericsson
שורה 16 ⟵ 10:
| תאריך גרסה אחרונה = 2 באוקטובר, 2020
| טיפוסיות = דינמית, חזקה
| הושפעה על ידי = [[Lisp]],{{כ}} [[פרולוג (שפת תכנות)|פרולוג]], [[PLEX]], {{כ}}Smalltalk
| השפיעה על = Akka{{כ}}, [[
▲| השפיעה על = Akka,[[ Clojure]], Dart, Elixir, F#, Opa, Oz, Reia, Rust,
▲| סיומת = .erl
| אתר אינטרנט = https://www.erlang.org
}}
▲'''Erlang (
▲ב-1986 כאשר היא שוחררה לראשונה, הייתה Erlang תוכנה פרטית (
== היסטוריה ==
השם Erlang, ששויך לשפה על ידי Bjarne Däcker, נובע משמו של המתמטיקאי הדני Agner Krarup Erlang
הגרסה הראשונה של Elang מומשה בשפת התכנות [[פרולוג (שפת תכנות)|פרולוג]] והושפעה משפות התכנות [[PLEX]] ו-[[Lisp]]
== דוגמאות קוד ==
=== עצרת ===
מימוש פעולת ה[[עצרת]] ב-Erlang:<syntaxhighlight lang="erlang">
שורה 47 ⟵ 39:
</syntaxhighlight>
===
אלגוריתם רקורסיבי ב-Erlang אשר מייצר את
-module(series).
-export([fib/1]).
שורה 78 ⟵ 70:
== סוגי נתונים בשפה ==
{{להשלים}}
ב-Erlang ישנם 8 סוגי נתונים
* '''Integers''' (
* '''Atoms'''
* '''References'''
* '''Pids'''
* '''Ports'''
* '''Funs''' (
ושלושה סוגי נתונים מורכבים:
▲Atoms - נכתבים כמחרוזות של תווים אלפאנומרים עוקבים, כאשר הראשון הוא אות קטנה ( lowercase ). משמשים על מנת לציין ערכים שונים.
* '''Tuples'''
* '''Maps''' (
ושתי צורות של [[סוכר תחבירי]]:
▲Floats - משתנים עשרוניים ( Floating Point Numbers )
* '''Strings'''
* '''Records'''
ב-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 ( ״ תכנות הגנתי ״ ) ===
מתכנני Erlang הבינו כי על אף פי השלכותיהן השליליות, קריסות תוכנה הן בלתי נמנעות. לכן, במקום לטפל בקריסה נקודתית כמצב חירום אשר משהה את כל הפעילות הרגילה עד למציאת פתרון, הם חשבו שיהיה יותר רציונלי לטפל בקריסה נקודתית בדיוק כמו אירוע (
▲ברוב שפות התכנות האחרות, קריסות תוכנה נחשבות ללא רצויות ולכן יש להימנע מהן בכל מחיר. לכן, נהוג ללכוד את התקלות, ולאחר מכן להתמודד עם השפעתן - תהליך אשר נקרא ''Exception Handling''. פילוסופית התכנון הזו נובעת בין היתר מכך שעקרונות פיתוח תוכנה רבים נקבעו בתקופה שבה מחשבים היו בעלי מעבד יחיד. בתנאים אלו, קריסות תוכנה אכן היו הרסניות. כתוצאה מכך, הפך סגנון תכנות בו חלק נרחב מהקוד מושקע לטיפול בקריסות תוכנה לנפוץ ביותר. סגנון זה, בו משקיעים משאבים אלו לטיפול בקריסות, נקרא ''Defensive Programming ( ״ תכנות הגנתי ״ )''
▲=== Let It Crash ( ״ תן לזה לקרוס ״ ) ===
▲מתכנני Erlang הבינו כי על אף פי השלכותיהן השליליות, קריסות תוכנה הן בלתי נמנעות. לכן, במקום לטפל בקריסה נקודתית כמצב חירום אשר משהה את כל הפעילות הרגילה עד למציאת פתרון, הם חשבו שיהיה יותר רציונלי לטפל בקריסה נקודתית בדיוק כמו אירוע ( event ) אחר בזמן ריצה. לכן, כאשר תהליך ב-Erlang קורס, סיטואציה זו מדווחת רק כסוג אחר של הודעה.
==== ההשלכות על עיצוב Erlang ====
סגנון זה השפיע על
▲* ב-Erlang אין זיכרון גלובלי משותף - לכל תהליך יש זיכרון מבודד משלו.
* תהליכים ב-Erlang יכולים:
** להיווצר בקלות
** לתקשר רק באמצעות העברת מסרים
** לפקח אחד על השני. הדבר מאפשר היררכיות בין תהליכים (
* על תהליך לבצע את משימתו או להיכשל
* כישלון תהליך מדווח כהודעה.
=== Supervisor Trees (
ביישום טיפוסי ב-Erlang תהליכים מנוהלים בצורה של [[עץ בינארי|עץ]] פיקוח. ארכיטקטורה זו מבוססת על ההיררכיה של תהליכים, כאשר התהליך בעל המעמד הגבוה נקרא '''supervisor''' והוא אחראי על פיקוח וניהול של תהליכים שבחסותו (
▲העץ המפקח אחראי להקשיב להודעות כאלו, ולאחר מכן גם לנקוט בפעולה המתאימה בהתאם לתוכן העבודה.
== מימוש ==
המימוש הרשמי של Erlang משתמש ב-BEAM
BEAM כלולה בהפצה הרשמית של Erlang, שנקראת Erlang/OTP. היא מריצה [[
== ראו גם ==
* [[טלקומוניקציה]]
* [[Lisp]]▼
* [[תכנות פונקציונלי]]▼
▲[[Lisp]]
▲[[תכנות פונקציונלי]]
== קישורים חיצוניים ==
|