אך אליה וקוץ בה, התאמת התוכנית למערכת מסוימת תוך ניצול תכונותיה המסוימות והייחודיות משמעה שלא ניתן אחר-כך, או לפחות קשה, להעביר את התוכנית למערכת אחרת. בנוסף, בשל הסירבול ואי-הקריאות של שפות אלו, תחזוקת הקוד ושינויו בזמן מאוחר יותר הן מטלות מסובכות והסיכוי שתיווצר שגיאה גדול. לכן, לתכנות מערכות גדולות נוטים להשתמש בשפות עיליות כמו 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 &lt; 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)
התפתחותן של שפות התכנות.
צעד ראשון להתנתקות מהכורח לכתוב תוכניות בשפת מכונה נעשה עם יצירת האסמבלי. מרבית שפות התכנות הן שפות עיליות, שבהן לפקודות דמיון מסוים לשפה טבעית. כל פקודה בשפה עילית מתורגמת על ידי המהדר לסדרה ארוכה של פקודות בשפת מכונה. בשפת אסמבלי, לעומתן, כל פקודת אסמבלי מתורגמת לפקודה אחת בשפת מכונה (אך למען נוחות הקריאה, לעיתים מתאימות לפקודת מכונה אחת פקודות אסמבלר שונות, המייצגות פונקציות שונות של אותה פקודת מכונה).
בתחילת שנות ה-50 נעשו צעדים ראשונים ביצירת מהדרים, כלומר כלים שיאפשרו כתיבת תוכניות בשפה קרובה יותר לשפת אנוש. בשנת 1952 יצרה גרייס הופר את המהדר הראשון, שנקרא A. בשנת 1953 החל צוות בראשותו של ג'ון באקוס מחברת IBM לפתח את שפת FORTRAN, וצעד זה הושלם בשנת 1957. FORTRAN (ושפת ALGOL שפותחה בעקבותיה בשנת 1958) התאימו במיוחד למשימות מדעיות (שהן תוכניות בתחומי הפיזיקה, המתמטיקה וכדומה) אך התאימו פחות למשימות של עיבוד נתונים. למטרה זו באה לעולם בשנת 1960 שפת COBOL, השונה מ-FORTRAN במידה רבה, ובעלת תחביר המזכיר את השפה האנגלית. היוזמה לפיתוח COBOL באה ממשרד ההגנה האמריקני, ובפרויקט השתתפו נציגים של הממשל האמריקני ויצרני המחשבים. שתי שפות אלה, FORTRAN ו-COBOL, זכו לתפוצה רחבה, והן בשימוש עד עצם היום הזה.
בתחילת שנות ה-60 פותחה שפת LISP, על ידי ג'ון מקארתי מאוניברסיטת MIT. שפה זו יעילה במיוחד בטיפול בטקסטים הכתובים בשפת אנוש, ולכן זכתה להצלחה בקרב חוקרי בינה מלאכותית. מספר שנים לאחר מכן פיתחה חברת IBM את שפת PL/I, שנועדה לשלב את התכונות של FORTRAN ו-COBOL גם יחד, כך שתתאים למשימות תכנות עסקיות ומדעיות כאחד. השפה שפותחה הגשימה יעד זה, וכללה מאפיינים נוספים שנבעו מהניסיון שנצבר בפיתוח שפות תכנות, אך לא זכתה להצלחה שלה זכו שתי קודמותיה. אחד מהפרויקטים הראשונים שפותחו בשפת PL/I הוא מערכת ההפעלה Multics. שפת PL/I נלמדה באוניברסיטאות בישראל (אלה שהעמידו מחשב IBM לרשות תלמידיהן) עד אמצע שנות ה-80. PL/I לא נחשבת לשפה מוצלחת, והלקח שנלמד מהשפה היא שהעמסת פיצ'רים בלבד איננה ערובה להצלחה של שפת תכנות; בעת תכנון השפה ההחלטות החשובות ביותר הן אילו פיצ'רים מוטב להותיר מחוץ לשפה, על מנת ליצור שפה עקבית וקלה ללמידה ופיתוח.
בשנות השישים פיתח קנת' אייברסון את שפת התכנות APL, זאת בחברת IBM. השפה איפשרה ביצוע פעולות מתמטיות מורכבות (כגון מתמטיקה של וקטורים, מטריצות ומספרים מרוכבים) על ידי אופרטורים יחידים. לצורך תכנות בשפה זו נדרשה מקלדת מותאמת שאיפשרה הקשת האופרטורים הייחודיים של השפה.
בסוף שנות ה-60 פיתח סימור פאפרט את שפת לוגו (LOGO). שפה זו התפתחה משפת LISP, אך התחביר שלה פשוט יותר, כך שתתאים לשימושם של ילדים. שפת BASIC, שפותחה באמצע שנות ה-60 בקולג' דרטמות, נועדה במיוחד לשימושם של תלמידים הכותבים תוכניות באמצעות מסופים. בסוף שנות ה-70 זכתה שפה זו להצלחה רבה על ראשוני המחשבים האישיים, והפכה לכלי פיתוח מקובל למחשבים אישיים.
בשנת 1968 התפרסם מאמרו של א. וו. דייקסטרה, שיצר תפנית בתחביר של שפות תכנות, בהסבו את תשומת הלב לקושי שגורם השימוש בפקודת goto לקריאותן של תוכניות. בעקבות מאמר זה נוצר התכנות המובנה, שבו יש מבני בקרה המאפשרים קריאות גבוהה. שפות קיימות, כגון PL/I, הורחבו כך שיטפלו גם במבני בקרה אלה.
בשנות ה-70 פותחה שפת Prolog, שהיא השפה המובילה בתחום של תכנות לוגי, שבו מתמקדות התוכניות ביחסים בין עצמים. שפה זו משמשת לפיתוח תוכנה בתחומים של לוגיקה מתמטית ובינה מלאכותית: פתרון בעיות מופשטות, פתרון משוואות, הבנת שפות טבעיות וכדומה.
בתחילת שנות ה-70 יצר ניקלאוס וירת, במטרה להקל על לימוד תכנות את שפת Pascal, שמימשה היטב את העקרונות של התכנות המובנה, וזכתה לפופולריות רבה באוניברסיטאות. גרסה מסחרית שלה, Turbo Pascal של חברת בורלנד, זכתה להצלחה רבה ככלי לפיתוח תוכנה למחשבים אישיים. השפה נחשבת קלה יחסית ללמידה, אך יש לה חסרונות הנוגעים ליכולת לכתוב באמצעותה מערכות-תוכנה בקנה מידה גדול. זמן מה לאחר מכן פיתח דניס ריצ'י ממעבדות בל את שפת C, והשתמש בה לפיתוח מערכת ההפעלה UNIX. שפה זו פופולרית לתכנות מערכות הפעלה ולפיתוח יישומים והפכה לשפת תכנות נפוצה ביותר. שפה זו השפיעה רבות על פיתוחן של שפות תכנות אחדות, שהבולטת בהן היא C++.
בשפת הסימולציה Simula 67, המתבססת על ALGOL, מומשו לראשונה רעיונות של תכנות מונחה עצמים, פרדיגמה שהבשילה בשפת Smalltalk, שפותחה בשנות ה־70 במעבדות זירוקס פארק. לתפוצה רחבה זכתה מתודולוגיה זו החל משנות ה־90, תחילה בשפת התכנות C++ (שפותחה בשנות ה-80), ולאחריה בשפת Java.
שפת פייתון נוצרה על ידי גואידו ואן רוסום בתחילת שנות התשעים, פייתון פותחה מתוך רצון להגיע לשפה פשוטה ומובנת, נוחה לקריאה וקלה לתחזוקה. שפת רובי נוצרה בשנת 1993 בידי יוקיהירו מאטסומוטו שניסה ליצור שפה חדשה שתאזן בין תכנות פונקציונלי ותכנות אימפרטיבי. מאטסומוטו אמר "רציתי שפת סקריפטים עם יותר כוח מפרל ויותר מונחת עצמים מפייתון".
במקביל לפיתוח שפות אלו חברת סאן מיקרוסיסטמס פיתחה את שפת Java, בין השנים 1991 ל-1995. מפתחי השפה הקפידו שלשפה זו לא יהיו ניבים, כך שתוכנית שנכתבה באמצעותה תוכל להתבצע על כל מחשב התומך בשפה, אפילו ללא צורך בהידור נפרד. לתכונה זו חשיבות מיוחדת בסביבת האינטרנט, שבה תוכנה הנשלחת לדפדפן עשויה להתבצע על מחשבים מדגמים שונים.
בשנת 2000 פותחה השפה #C על ידי צוות מחברת מיקרוסופט שבראשו עמד אנדרס הילסברג. שפה זו נבנתה עבור תפיסת .NET אשר ראתה אור בשנת 2002. שפה זו מבוססת על השפות Java ו ++C, ועוצבה במטרה ליצור שפה מונחית-עצמים פשוטה, מודרנית וכללית.
כאנטיתזה למורכבותן ועושרן ההולכים וגדלים של שפות התכנות, יצר אורבן מולר, בערך בשנת 1993, את שפת התכנות BF, שבה שמונה פקודות פשוטות בלבד, והיא למעשה מימוש של מכונת טיורינג.
רשת האינטרנט נתנה דחיפה לפיתוחן של שפות תכנות אחדות:
שפת תכנות אזוטרית.