שפת תכנות

המונח שפת תכנות אוגד בתוכו מספר שפות מחשב שהן תמיד לוגיות, ומשמשות לבניית תוכנה. זאת להבדיל מסידור או עיצוב תוכנה - מה שנעשה עם שפות מחשב אחרות שאינן מוגדרות באופן מסורתי, כ"שפות תכנות", ואלה יהיו למשל שפות תגיות או שפות עיצוב.
בניסוח אחר, שפת תכנות היא אוסף של חוקים תחביריים (Syntax) וסמנטיים (Semantic) המגדירים שפה פורמלית. תוכנית הנכתבת בשפת תכנות מגדירה ביצוע תהליך אלגוריתמי. שפת התכנות קובעת את הכלים העומדים לרשות מחבר התוכנית כדי לבצע הגדרות כאלו.

ריבוי שפות התכנות

במהלך השנים פותחו מאות שפות תכנות, שלכל אחת מהן יתרונות וחסרונות משלה, וכל אחת מהן מתאימה באופן מיטבי למשימות מסוימות. יש שפות קלות ללימוד, שנועדו לחובבים או למתחילים, ויש שפות מורכבות שנועדו למומחים. יש שמתאימות במיוחד לתוכניות מדעיות, ואחרות טובות יותר לפיתוח מערכות מידע. יש שנועדו ליצירת ממשקי משתמשים ויש שנועדו לכתוב אלגוריתם מופשט. יש שנועדו למחשב האישי ויש שנועדו במיוחד להרצה על שרתי אינטרנט. יש שנועדו למשימות בתחום מצומצם, ויש שנועדו לתת מענה לטווח רחב של משימות. לפיכך, קודם לתחילת כתיבתה של תוכנית חדשה, יש לבחור את שפת התכנות שבאמצעותה תיכתב התוכנית.
אחד היעדים של מעצביה של שפת תכנות חדשה, הוא שלא להיות תלויים במכונה מסוימת או במערכת הפעלה מסוימת, כך שניתן יהיה להעביר בקלות את התוכנית לכל סביבה רצויה. יעד זה נמצא בסתירה ליעד של יצרני מחשבים ומערכות הפעלה קנייניות, שלהם עניין לקשור את הלקוח דווקא למוצר שלהם. כתוצאה מכך נוצרות לשפת תכנות פופולרית גרסאות שונות. ניסיון לעצור את ההתפצלות הזו נעשה על ידי גופי תקינה, כגון ANSI או ISO, המגדירים גרסה תקנית של השפה.
הבחירה באיזו שפה להשתמש תלויה בטבע המשימה שיש לבצע, כישורי המתכנתים, הכלים המצויים, המערכת לה מיועדת התוכנה ולעיתים אף דרישות מצדו של הלקוח (צבא ארצות הברית, למשל, דרש לעיתים קרובות שהתוכניות שביקש יתוכנתו בשפת עדה). התפיסה המקובלת גורסת כי ככל ששפת תכנות קרובה יותר לשפת המכונה, כך היא קרובה יותר למערכת המסוימת עליה עובדים, יודעת לנצל יותר טוב את יתרונותיה והמבנה הייחודי שלה, וכן המתכנת יכול לשלוט בדיוק יתר על התהליכים ולהתאים אותם לצרכיו האישיים ולכן השימוש בשפה שכזו יניב מהירות רבה יותר. מסיבה זו, משתמשים לעיתים קרובות בשפת סף וב-C לתוכניות שבהן זמן הוא גורם מכריע, למשל מערכות הפעלה, מערכות זמן אמת, או בהן יש צורך בנגיעה בפרטי מערכת מסוימים מאוד, למשל מערכות משובצות מחשב.
אך אליה וקוץ בה, התאמת התוכנית למערכת מסוימת תוך ניצול תכונותיה המסוימות והייחודיות משמעה שלא ניתן אחר-כך, או לפחות קשה, להעביר את התוכנית למערכת אחרת. בנוסף, בשל הסירבול ואי-הקריאות של שפות אלו, תחזוקת הקוד ושינויו בזמן מאוחר יותר הן מטלות מסובכות והסיכוי שתיווצר שגיאה גדול. לכן, לתכנות מערכות גדולות נוטים להשתמש בשפות עיליות כמו C++, Java, או #C. התכנות בשפות אלה עלול ליצור תוכניות איטיות יותר, אך הוא בטוח יותר, ברור יותר, אמין יותר וקל בהרבה לשינוי בזמן מאוחר יותר.

גרסאות, ניבים ותקן

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

דוגמה לתוכנית

התוכנית המופיעה להלן כתובה בשפת פייתון, והיא בודקת האם מספר שהועבר אליה הוא מספר ראשוני. התוכנית כוללת פונקציה שמקבלת כפרמטר מספר שלם ומחזירה את המחלק הגבוה ביותר שלו. גוף התוכנית מקבל קלט מהמשתמש ובודק האם המחלק הגבוה ביותר שלו הוא אחד. אם כן, זהו מספר ראשוני. אם לא, המספר איננו ראשוני. הטקסט האפור הוא הערות עבור הקורא, ואיננו חלק מהתוכנית.
from math import sqrt #מייבאים" פונקציה שתחשב [[שורש ריבועי]] של מספר"def getHigherDivisor(num): # נגדיר פונקציה שמוצאת את המספר השלם הגדול ביותר המחלק ללא שארית
 for d in range(round(sqrt(num)),0,-1): # עבור כל המספרים מהשורש עד 1, נבדוק את השארית בחלוקה
 if num % d == 0: # אם השארית (%) היא 0, סימן שמצאנו את המחלק הגבוה ביותר
     return d # אנו "מחזירים" את המחלק אל התוכנית הראשית':זהו גוף התוכנית'num = int(input("Enter positive integer:")) # פקודה זו מקבלת את הקלט מהמשתמש אל תוך משתנהif num < 1: # בדיקת שגיאות: הקלט חייב להיות מספר הגדול מאפס
 print("The number should be positive")higherDivisor = getHigherDivisor(num) # בדוק מהו המחלק הגבוה ביותר של המספר שהתקבל כקלטif higherDivisor == 1: # אם המחלק הגבוה ביותר הוא 1, המספר ראשוני
 print(num, " is a prime number.")else: # אחרת, המספר איננו ראשוני
 print(num, " is not a prime number.")
 print(num, "=", higherDivisor, "x", num/higherDivisor)