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

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

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

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

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

השפה זכתה בתואר "שפת התכנות האהובה ביותר" לשנים 2016, 2017, 2018 ו-2019 בסקר קהילת המתכנתים של StackOverflow.

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

Hello Worldעריכה

דוגמה לתוכנית Hello world הכתובה בראסט. המאקרו println! מדפיס הודעה ל standard output.

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 ופולימורפיזםעריכה

בשפה אין ירושה אך יש מנגנונים אחרים המאפשרים OOP.

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

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

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

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

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

Option & Resultעריכה

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

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

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

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

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

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

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

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

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

Safetyעריכה

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

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

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

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

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

  ערך זה הוא קצרמר בנושא תוכנה. אתם מוזמנים לתרום לוויקיפדיה ולהרחיב אותו.