שפת מכונה

שפת מכונה היא אוסף של הוראות המובן בצורה ישירה (ללא כל תרגום) על ידי המעבד של המחשב, ומבוצע על ידיו בעת פעולת המחשב.
הוראות (פקודות) שפת המכונה הן רצף של סיביות. לסיבית שני מצבים אפשריים ועל כן ערכה מיוצג באמצעות הספרות אפס ואחת. כך למשל, רצף הסיביות 10001001110110000000000111010000 מהווה למעשה זוג פקודות בשפת המכונה של מעבדים מסדרת x86 של אינטל, המורה למעבד בן 16bit לחבר את המספרים המאוחסנים בשניים מהאוגרים הפנימיים של המעבד הנקראים BX ו-DX ולהציב את הסכום באוגר AX (הפקודה הראשונה מעתיקה את המידע מ־BX ל־AX, והשנייה מחברת אליו את המידע שב־DX).
בשל הקושי של בני אדם לפענח ולזכור את משמעותם של רצפים ארוכים של סיביות, יצירת תוכניות שימושיות בשפת מכונה כמעט ואינה מעשית. לצורך כך נוצר ייצוג של כל פקודה בשפת מכונה בעזרת רצף תווים נהיר יותר, בדרך כלל רצף אותיות היוצר מילה שמשמעותה מרמזת על הפקודה בשפת מכונה שאותה היא מייצגת. ייצוג כזה נקרא שפת סף (Assembly) והוא הקרוב ביותר לשפת המכונה. אסמבלר הוא מהדר המתרגם פקודות משפת סף אל שפת מכונה על מנת שיהיה ניתן להריצן על ידי מעבד. תכנות בשפת מכונה או בשפת סף נקרא תכנות low-level ובראשית ימי המחשוב התכנות נעשה בצורה זו. החל משנות ה-50 של המאה ה-20 החלו ליצור שפות תכנות היוצרות אבסטרקציה גבוהה יותר, זאת באמצעות פקודות הדומות יותר לשפת בני אדם וניתוק הקשר בין פקודה יחידה בשפת מכונה לפקודה יחידה בשפת התכנות, כך שפקודה אחת בשפת התכנות עשויה להיות מתורגמת בזמן ההידור לרצף פקודות בשפת מכונה. שפות כאלו נקראות שפות תכנות עיליות ועיקר התכנות כיום מתבצע בעזרתן.
מעבדים מדגמים שונים נבדלים בפקודות שכל אחד מהם יכול לבצע. הפקודות שיודע לבצע מעבד מושפעות בין היתר מאופן מימושו הפיזי, למשל מכמות האוגרים שהוא מכיל ומגודלם. אוסף ההוראות בשפת מכונה שמעבד מסוים מסוגל לבצע ואופן ייצוגן הבינארי נקרא סט פקודות. גם אם שני מעבדים יודעים לבצע פקודה מסוימת, רצף הסיביות המייצג את הפקודה עשוי להיות שונה בסט הפקודות של כל אחד מהם. שני מעבדים שקולים זה לזה מבחינה פונקציונלית כאשר יש להם אותה שפת מכונה, ללא תלות באופן המימוש האלקטרוני של שפה זו. בשל השוני בסט פקודות של מעבדים שונים, תוכנית מחשב בשפת מכונה של מעבד אחד לא יכולה להיות מבוצעת על ידי מעבד עם שפת מכונה שונה. תכנות בשפת תכנות עילית מצמצם קושי זה: אין צורך לכתוב את התוכנית לכל מעבד בנפרד בשפת המכונה שלו, אך יש צורך בהידור הקוד מהשפה העילית לשפת המכונה של כל מעבד. בעת יצירת דור חדש של מעבד, משתדל היצרן שסט הפקודות של המעבד החדש יכיל את כל סט הפקודות של המעבד הקודם ("תאימות לאחור"), כדי לאפשר הפעלה של תוכנות שפותחו או הודרו עבור המעבד הקודם גם באמצעות המעבד החדש.
בעשרות השנים הראשונות לקיום המחשב המגמה הייתה להרחיב את אוצר ההוראות של המעבד, כך שניתן יהיה לבצע פעולות מורכבות יותר באמצעות הוראה בודדת. מעבדים בעלי אוצר הוראות מורחב מכונים מעבדי CISC (כלומר: Complex Instruction Set Computer). למגמה זו היה יתרון בולט בעת תכנות בשפת סף, אך בעת המעבר לתכנות בשפות עיליות יתרון זה מתגמד.]
מניתוח כמותי של התפלגות הפקודות הנוצרות על ידי המהדרים, בין אם בשל מבנה המהדר ובין אם בשל נוהגי כתיבת התוכנה, נמצא כי רפרטואר הפקודות של המעבד אינו מנוצל, וכי במרבית המקרים (כ־80 אחוז) מנוצל אך מעט (כ־20 אחוז) מרפרטואר הפקודות של המעבד. כתוצאה מכך חל מהפך מחשבתי בכל הנוגע לעיצוב ארכיטקטורת המעבד הרצויה, אשר הוביל לפיתוח מעבד בעל מספר הוראות מצומצם (RISC - Reduced Instruction Set Computer). מספר ההוראות המצומצם, הביא להקטנת שטח הפיסה, להגברת יעילות המיתוג הפנימי ולמהירות ביצוע גבוהה מאוד של כל הוראה, כך שבמבחני השוואת ביצועים, ובעיקר במבחני יחס תועלת, עשויים ביצועיו של מעבד זה להיות טובים מאלה של מעבד בעל מספר הוראות רב. כיום הבדל זה זניח כי מצד אחד גם מעבדי CISC ממירים את הפקודות לפקודות מיקרוקוד פשוטות ומצד שני התגלה כי היתרון מבחינת התכנון של המעבד של RISC איננו משמעותי (את רוב התוצאות החיוביות ניתן לממש גם ב־CISC), כתוצאה מכך ההבדל המעשי בין שני הסוגים נעלם כמעט לחלוטין.]
במעבדי RISC לכל ההוראות בשפת המכונה אורך אחיד, ואילו במעבדי CISC קיימות הוראות באורכים אחדים (לפי קוד ההוראה יודע המעבד את אורכה).