3 min. read

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

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


Zig

https://ziglang.org/

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

ניתן להתנסות בשפה כאן:
https://zig-play.dev/

Hello World

1
2
3
4
5
6
const std = @import("std");

pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print("Hello, {s}!\n", .{"world"});
}

קוד זיג נראה מסובך אך הוא די פשוט.
החסרון הוא הצורך לקבל את ה-writer של הStandard output.
אולם - עבור זיג זהו כוחה כי אין פה שום דבר שנסתר מהעין.

בניית הקוד

קיימים 4 דגלים לבניית הקוד.

  1. דיבאג - כולל בדיקות מקיפות לקוד ללא אופטימיזציות.
  2. ReleaseSafe - אופטימיזציות ובדיקות.
  3. ReleaseFast - אופטימיזציות ללא הבדיקות.
  4. ReleaseSmall - בניית הקוד הכי מהיר.

היחסים של Zig ושפת -C.

אם Rust זה הנמסיס של שפת C++ אז זיג זהו האח החורג של שפת C.

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

אי אפשר להתעלם משגיאות

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

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

Bun

https://bun.sh/

אחד האלטרנטיבות ל npm הוא - bun.
הוא כתוב ב-zig!

והביצועים שלו מרשימים :)


Haskell

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

כמו כן התחביר עובד מאחורי הקלעים בעזרת Lambda calculus.
לכן השפה מתאימה לכל המתמטיקיים שנהנים מפונקציות :)

Hello World

1
2
main :: IO ()
main = putStrLn "Hello, World!"

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

Function applications

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

1
2
3
4
5
6
7
8
9
a b c d =
"Function a called with arguments " ++ b ++ " " ++ c ++ " " ++ d

b = "b"
c = "c"

f = a b c "d"

main = putStrLn f

כדי לקרוא לפונקציה ניתן לכתוב f a b או (f a b).
אבל בהאסקל צריך לשכוח מהצהרות קלאסיות כאלו:
f (a, b). <- זהו תחביר לא טוב!

Currying

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

1
2
3
4
5
MyAddFunction(a,b) => a + b

AddWithFive(a) => MyAddFunction(a, 5)

AddWithFive(2) // Returns 7

דוגמא בפייתון:

1
2
def Add(a,b):
return a + b

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

1
2
3
a = 5
def Add(b):
return a + b

אז נוכל להחזיר פונקציה על מנת לממש את זה:

1
2
3
4
5
6
7
8
9
def Add(a):
def PartialAdd(b):
toTake = a
return toTake + b
return PartialAdd

partAdd = Add(2)
result = partAdd(5)
print(result)
  • למי שזה מזכיר דקורטור אז הוא צודק :)

כעת בהאסקל מגדירים קיורינג בעזרת חצים: [a] -> [a] -> [a]
זהו סוג משתנה המגדיר שני פונקציות, הראשון זהו רשימה שמחזיר [a] -> [a].
והשני מחזיר את התוצאה הסופית [a].

זהו ההגדרה לחיבור מחרוזות למשל, כי מחרוזת זה רשימה של תווים!
זה מה שקורה בעצם כאשר מבצעים חיבור מחרוזות:

1
"A" ++ "B"

ניתן לתאר זאת כך:
"A" -> "B" -> "AB".

בהאסקל:

1
2
3
4
5
6
7
8
9
greetCurried :: String -> String -> String
greetCurried title name
= "Greetings " ++ title ++ " " ++ name

greetMs = greetCurried "Ms"


main :: IO ()
main = putStrLn ( greetMs "Alice")

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


Elixir

שפת תכנות פונקציונלית דינאמית עם יכולות Pipeline.
השפה מתמחה במקביליות, פשטות, הרצה על Earlang VM.
כמו המכונה הווירטואלית של C# - ניתן להריץ כל קוד earlang ביחד עם elixir.

Hello World

1
IO.puts "Hello World"

כפי שרואים השפה מאוד פשוטה, על מנת להדפיס נשתמש ב-IO.puts.

קונספט ה-Pipeline

חלקינו מכירים את הקונספט מפקודות לינקוס:
cat result.txt | grep "Name"

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

באליקסיר הקונספט גם עובד כך:

1
2
name = "Bob Alice The Great"
name |> String.trim() |> String.downcase() |> String.replace(" ", "-") |> IO.puts

ניתן לקרוא לזה ככה אך זה מגושם יותר:

1
2
name = "Bob Alice The Great"
IO.puts(String.replace(String.downcase(String.trim(name))," " ,"-"))

Dart

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

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

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

אחד הכלים הפופולריים הוא Flutter - המאפשרת לכם לבנות אפליקציות מאוד בקלות.

Hello World

1
2
3
void main() {
print('Hello, World!');
}

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

Flutter

https://flutter.dev/

אחת הסיבות לפופולריות של השפה היא הספרייה Flutter.
כלי עוצמית וקל לפיתוח אפליקציות!
אה כן, אמרתי כבר שזה Open source?


ELM

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

השפה הזו מתקמפלת ל-ג’אווה סקריפט ומאפשרת לכתוב ממשקי משתמש אינטרנטיים בקלות יתרה!

Hello World

1
2
3
4
5
import Html exposing (text)


main =
text "Hello!"

התכנית פשוטה - מייצאת טקסט שכתוב בו Hello!.

קיימות הרבה דוגמאות, ניתן למצוא את חלקן כאן:
https://elm-lang.org/try

ניתן לשלוח בקשות Http:

1
2
3
4
5
getRandomQuote =
Http.get
{ url = "https://elm-lang.org/api/random-quotes"
, expect = Http.expectJson GotQuote quoteDecoder
}

ככה שזו שפה פשוטה מאוד לממשקי משתמש, זה מה שהופך את זה לעוצמתי!

תכונות של פיתוח ווב

כמו כל פלטפורמה לפיתוח ווב גם elm יודעת לעשות:

  • ראוטינג
  • ניווט
  • טעינה עצלנית
  • שליחת בקשות http
  • מודולים

Love - Game dev Engine

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

https://love2d.org/

Hello World

1
2
3
function love.draw()
love.graphics.print("Hello World!", 400, 300)
end

ציור:

1
2
3
4
5
6
function love.load()
whale = love.graphics.newImage("whale.png")
end
function love.draw()
love.graphics.draw(whale, 300, 200)
end

שפות נוספות שכדאי להכיר

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

הנה כמה שפות נוספות שהייתי ממליץ להכיר:

  • Rust: שפה המתחרה ב-C++, מהירה ובטוחה.
    הקונספט בראסט שהיא שפה בטוחה מבחינת שימוש בזיכרון אך ללא GC.

  • Ruby: רובי זו שפה כיפית!
    במיוחד בשילוב Ruby on Rails הפלטפורמה מעדיפה קונבנציות ע”פ קונפיגורציה.
    הקונספט הזה חשוב מאוד כאשר בונים אפליקציות גדולות.

  • TypeScript: מימוש המייקרוסופטי לשפת טייפים במקום ג’אווה סקריפט.

  • Racket: שפת תכנות ל…שפות תכנות! משונה? כן גם אני חושב.
    ארצה לכתוב עליה בעתיד אז לא אדבר עליה יותר מדי כרגע :)

  • C++ : זו שפה שכולם מכירים אך לא כולם מפתחים בה.
    יש שני קונספטים שהייתי רוצה שעולם הפיתוח יילמד ממנה, ולמה היא כזו עוצמתית.
    הקונספט הראש הוא Compile Time.
    ניתן לבצע הרבה מאוד חישובים ואפילו דברים כמו Conditional Inheritance בזמן הקומפילציה!
    הקונספט השני הוא חופשיות - ניתן בשפה לתכנת כל דבר, זה מאפשר גמישות רבה, אך עם כל כך הרבה כח גם מגיעה הרבה אחריות :)


תודה על הקריאה!


אהבתם? מוזמנים להביע תמיכה כאן: כוס קפה