שתף קטע נבחר
 

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

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

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

 

עוד איך זה עובד ב-ynet מדע:

 

ברז לוגי

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

 

הפרדה מושגית בין ביט "מידע" לביט "שסתום (איור: עידו גנדל )
הפרדה מושגית בין ביט "מידע" לביט "שסתום(איור: עידו גנדל )

 

השער הלוגי משמאל הוא שער AND, שמקבל שני ביטים (ערך כל אחד מהם יכול להיות 0 או 1). אם ורק אם שני הביטים בקלט הם 1, הוא מוציא 1 כפלט – אחרת הוא מוציא 0. מבחינתו, הביטים האלה יכולים לייצג כל דבר שבעולם, זה לא משנה. אבל לנו זה כן משנה, כי סימנו את אחד הביטים כ"מידע" ואת השני כ"שסתום". השסתום משמש אותנו כדי לנטרל, כביכול, את הפלט ולמנוע מעבר של נתונים. כאשר ערך ביט השסתום 0, פלט השער הלוגי (Y) יהיה בהכרח 0 בלי קשר לקלט המידע. לעומת זאת, כאשר השסתום פתוח עם ערך 1, אז הפלט ישחזר במדויק את הקלט שמגיע מהקו "מידע". הביט שאנחנו שולחים לשסתום הוא בעצם פקודה: "חסום את המידע" או "תן למידע לעבור".

 

בורר דו-מצבי 

נמשיך לשרטוט מורכב יותר שמתבסס על אותו עיקרון. כאן יש לנו שני קווי קלט, שבאים מימין ומתפלגים לשני שערים לוגיים שונים – שער XOR (שמוציא 1 רק כשהקלטים שלו שונים זה מזה) ושער AND. השער האנכי שבאמצע השרטוט הוא שער NOT, שהופך את הקלט שמגיע אליו. כלומר, אם הפקודה C היא 0, שער ה-AND משמאל למטה יקבל את הפקודה 0 וינטרל את מעבר המידע, ואילו שער ה-AND משמאל למעלה יקבל את הפקודה 1 ויתיר מעבר מידע. זה מה שהופך את ביט הפקודה כאן ליותר מסתם שסתום: הוא למעשה משמש כבורר. פקודה 0 פירושה "תן לי את ה-XOR של שני הביטים של המידע", ופקודה 1 היא "תן לי את ה-AND שלהם". השער שקרוב לפלט הסופי Y הוא שער OR, ש"מאחד" את הפלטים. בעיקרון, אפשר לוותר עליו ופשוט לחבר את שני הקצוות יחד.

 

ביט פקודה בורר בין תוצאות שני עיבודים שונים  (איור: עידו גנדל ) (איור: עידו גנדל )
ביט פקודה בורר בין תוצאות שני עיבודים שונים (איור: עידו גנדל )

 

בעצם, מה שיצרנו כאן הוא מעין "שפת תכנות" בעלת שתי פקודות בלבד, שלכל אחת מהן מצורפים שני ערכי קלט. לדוגמה, בקריאה לפי הסדר ABC, הפקודה 110 היא "תן לי את ה-XOR של 1 ו-1", ואילו 011 היא "תן לי את ה-AND של 1 ו-0".

 

ברירה מרובה

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

פקודות שפת מכונה כבוררות בין פעולות סימולטניות  (איור: עידו גנדל ) (איור: עידו גנדל )
פקודות שפת מכונה כבוררות בין פעולות סימולטניות (איור: עידו גנדל )

 

נשאלת השאלה, מאיפה מגיעים הנתונים אותם אנו מעבדים, ולאן הם הולכים? חלקם יכולים להגיע ממקור קלט חיצוני, כגון מקלדת או עכבר. חלקם באים מאמצעי אחסון – דיסק קשיח, תקליטור או זיכרון ה-RAM של המחשב. הפלט יכול להגיע לאמצעי פלט כמו מסך, יציאת USB וכדומה, או להיות מאוחסן בחזרה בדיסק/RAM. המעבדים המודרניים מציעים אמנם המון "מעקפים" מכל מיני סוגים, אך בארכיטקטורה הבסיסית ביותר, כל הקלט והפלט מתווך על ידי "רגיסטרים" – תאי זיכרון ספורים ממש, שמחזיקים זמנית במידע ומתחברים ישירות לכניסות וליציאות של המעגלים הלוגיים.

 

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

 

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

 

להסברים נוספים בנושאי חומרה ותוכנה, אייטמים מעניינים וכו', הנכם מוזמנים לבלוג "הבייט הלבן", לדף שלי בפייסבוק ו/או לדף המקביל בגוגל+.

 

 

 


פורסם לראשונה 09/04/2012 13:02

 

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