ראסט (שפת תכנות)

ראסטאנגלית: Rust) היא שפת תכנות מרובת פרדיגמות תכנות שפותחה על ידי מוזילה, השמה דגש על מהירות ובטיחות. השפה מתאפיינת ביכולות ביצועיות גבוהות, כמו היכולות הביצועיות של שפות סף, אך גם בפשטות המאפיינת שפות עיליות. היא מתאימה לאנשים בעלי ניסיון בשפות כמו שפת C, המחפשים אלטרנטיבה בטוחה יותר, כמו גם לאנשים בעלי ניסיון בשפות כמו פייתון שמעוניינים לכתוב קוד עם יכולת ביצועית גבוהה יותר, אבל בלי לוותר על חלק מהתכונות שמשרתות את השפה.

ראסט
Rust programming language black logo.svg
פרדיגמות שפה מהודרת, תכנות פונקציונלי, concurrent computing, תכנות גנרי, תכנות אימפרטיבי עריכת הנתון בוויקינתונים
שנה 7 ביולי 2010 עריכת הנתון בוויקינתונים
מתכנן Graydon Hoare עריכת הנתון בוויקינתונים
מפתח מוזילה, Graydon Hoare, Rust Foundation עריכת הנתון בוויקינתונים
גרסה אחרונה 1.51.0 (25 במרץ 2021)
הושפעה על ידי Alef, C++, סי שארפ, Cyclone, ארלנג, Haskell, לימבו, Newsqueak, OCaml, Scheme, Standard ML, Swift (programming language) עריכת הנתון בוויקינתונים
השפיעה על Crystal, Elm, Idris, Spark, Swift, Project Verona, Zig, PHP
רישיון אפאצ'י 2.0, רישיון MIT עריכת הנתון בוויקינתונים
סיומת rs, rlib
www.rust-lang.org
לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית OOjs UI icon info big.svg

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

התחביר של השפה פשוט וקל ללמידה.

השפה זכתה בתואר "שפת התכנות האהובה ביותר" לשנים 2016 עד 2020 בסקר קהילת המתכנתים של StackOverflow.

למרות היותה שפה חדשה, חברות גדולות כמו פייסבוק, דיסקורד, מיקרוסופט וכולי משתמשות בראסט כדי לפתח את המוצרים שלהם.

ב-8 בפברואר 2021, הוקמה קרן ראסט (Rust Foundation) במטרה לפקח ולקדם את שפת התכנות.

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

Hello Worldעריכה

דוגמה לתוכנית Hello world הכתובה בראסט. המאקרו println! מדפיס הודעה להתקן היציאה התקני (מסך).

fn main() {
 println!("Hello World!");
}

חישוב עצרתעריכה

רקורסיביעריכה

fn factorial(i: u64) -> u64 {
	match i {
		0 => 1,
		n => n * factorial(n-1)
	}
}

איטרטיביעריכה

fn factorial(i: u64) -> u64 {
	let mut acc = 1;
	for num in 2..=i {
		acc *= num;
	}
	acc
}

באמצעות iteratorsעריכה

fn factorial(i: u64) -> u64 {
	(1..=i).product()
}

מנגנון הטיפוסיםעריכה

מנגנון טיפוסים סטטי - הכל נקבע בזמן קומפילציה (ולמרות שאפשר להגדיר משתנים מקומיים בלי הצהרת הטיפוס זה רק כשברור בצורה דטרמיניסטית מהו הטיפוס - גם במקרה של שימוש במנגנון Options או Result, בשביל להשתמש בטיפוס כזה בקוד צריך לפתוח אותו על ידי match או unwrap, כך שהקוד תמיד דטרמיניסטי).

המהדר ינסה להסיק את הטיפוס לפי הערך שהושם למשתנה וכן לפי דרך השימוש בו. במקרים בהם קיימים כמה סוגים אפשריים, אנו חייבים להגדיר את הסוג במפורש.

מנגנון טיפוסים חזק - אין המרה מרומזת.

דוגמאות לטיפוסיים עיקרייםעריכה

Signed int - i8, i16, i32, i64, i128

Unsigned int - u8, u16, u32, u64, u128

Float - f32, f64

Boolean - bool

Character - char

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

Array - בניגוד ל-Tuple, יכול להכיל סוג טיפוס אחד. בעל אורך קבוע.

Vector  - דומה ל-Array אבל בעל אורך משתנה.

String  - אוסף של בתים.

HashMap  - מיפוי על ידי שימוש ב- key ו- value.

Struct  - מגדירים את שם ה- Struct, שמות השדות והסוג של השדות, ניתן לממש פונקציות.

Struct, trait ופולימורפיזםעריכה

בשפה אין ירושה אך יש מנגנונים אחרים המאפשרים תכנות מונחה עצמים.

Struct - מבנה המאפשר שמירת נתונים והגדרת פונקציות.

Trait - מבנה ייחודי המאפשר להגדיר קבוצה של פונקציות עבור כל סוג.

בשפה אין הורשה או ממשקים, ישנן שתי דרכים ליצור משהו שדומה לאלו:

1 – במקום ירושה פשוטה אפשר להשתמש ב-composition (במקרים שזה מתאים).

2 – אפשר לממש trait אחד עבור כמה struct. זה מאפשר פולימורפיזם כי אפשר להתייחס לאובייקט אחד על פי של-trait שהוא מממש. מימוש trait עבור struct נותן גם יכולת הדומה למימוש ממשק (ניתן להגדיר trait בלי מימוש וניתן לממש trait אחד עבור כמה סוגים).

Option & Resultעריכה

Option & Result – טיפוס העשוי להכיל משתנה ממשי (some) או  None (או OK ו- Err עבור Result), זה מאפשר להתייחס למקרה בו אין את המידע המבוקש (כמו Nullabe ב-C#) ולכן בדרך כלל משמש לבדיקת תקינות הערך המוחזר מפונקציה.

בנוסף בראסט ישנו מנגנון קפדני המונע שגיאות של גישה ל-None – המהדר יוודא שבכל קוד שמשתמש במשתנה מסוג option יהיה match או unwrap ובשתי האפשרויות חייב להיות טיפול למקרה של None.

שתי דרכים לשימוש בערך הפנימי של משתנה מוכמס:

Unwrap – פונקציה זו מחלצת את המשתנה הפנימי מתוך Option & Result במקרה של some – כלומר שקיים ערך ממשי ולא None. הפונקציה מחזירה שגיאה במקרה של None (וחייבים לטפל בו על ידי except).

Match - מספק תבנית התאמה שמשמשת אותי כמו switch ב-C. התבנית מחזירה ערך ו\או מבצעת קוד כתלות בפרמטר. משמש גם לבדיקה האם some וטיפול במקרה של None.

מנגנון ה-Ownershipעריכה

מנגנון הבעלות הוא מנגנון ניהול זיכרון הייחודי לראסט, הוא לא מאפשר להשתמש במשתנה כלשהו לאחר השימוש הראשון בו אלא אם כן משכפלים את הבעלות על ידי clone.

הוא מונע טעויות של 'דליפה' של שאריות מידע שאינן בתוקף ומשימוש במידע שכבר היה בשימוש.

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

מנגנון הבעלות מבוסס על שלושה חוקי יסוד הנותנים לשפה את היכולת לפעול עם יותר ביצועים ולהישאר בטוחה:

  1. לכל ערך בראסט יש משתנה שהוא הבעלים של אותו ערך.
  2. לכל ערך יכול להיות אך ורק בעלים אחד.
  3. כאשר הבעלים יוצאים מתחום ההגדרה הערך נזרק.

בטיחותעריכה

המהדר אוכף סט של חוקים קפדניים המבטיחים במידת האפשר בזמן הידור את שלמות ובטיחות ריצת התוכנית.

בשפה אכיפה של מוסכמות תכנותיות רבות המונעות טעויות של אבטחה וזליגת זיכרון. למשל כאשר מגדירים סתם משתנה הוא יהיה const, אלא אם כן הגדרנו בפירוש - mut.

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

קשה מאוד להגיע למצב של דליפת זיכרון בשפה.

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