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

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

 נתחיל מהסוף

המיקרו-בקרים שבלב לוחות הארדואינו הנפוצים שייכים למשפחת AVR מתוצרת חברת Atmel. לכן, הפקודות היחידות שהם מכירים ומסוגלים להריץ הן בשפת האסמבלי הייחודית ל-AVR, אוסף של פקודות פשוטות יחסית שנקראות בשם הכללי Instruction Set.

חלק מה-Instruction Set של ATmega328 (מתוך ה-Datasheet)
חלק מה-Instruction Set של ATmega328 (מתוך ה-Datasheet)

כאשר אנחנו כותבים במחשב תוכנה עבור הארדואינו, המהדר (קומפיילר) לוקח את הקוד שלנו ומתרגם אותו ל-Instruction Set של AVR. התוצאה הסופית של התרגום הזה, ורק היא, נשלחת ללוח הארדואינו עצמו. לכן אפשר, בתיאוריה, לכתוב תוכנות לארדואינו בכל שפת תכנות בעולם – ובתנאי שיהיה מישהו משועמם מספיק שיבנה את הקומפיילר המתאים. ואכן, בעולם המיקרו-בקרים הגדול אפשר למצוא קומפיילרים למבחר שפות, ביניהן C, פסקל, בייסיק, C++  ואפילו Ada או פייתון.

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

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

אם תתעמקו קצת בקבצים של התקנת ארדואינו במחשב שלכם, למשל בתיקיה \hardware\arduino\avr\cores\arduino, תגלו שם את קוד המקור של פונקציות רבות ומוכרות מעולם הארדואינו. קובצי הקוד הם בעלי סיומת cpp (כלומר "C Plus Plus"), ואם אפילו זה לא מהווה רמז מספיק עבה, הסתכלו בתוכם ותגלו קוד שהוא C++ במובהק, כמו זה:

קטע מקוד מקור של ארדואינו

קטע מקוד מקור של ארדואינו

וכמובן, לקינוח, אם אתם מכירים את שפת C++, תוכלו לכתוב בה קוד בסביבת הפיתוח של ארדואינו ולראות שהוא מתקבל בלי שום בעיה.

אז למה מדברים גם על שפת C?

אם ההוכחות כל כך חד-משמעיות, מדוע יש אנשים – ואני ביניהם – שממליצים למתכנתי ארדואינו מתחילים ללמוד דווקא את שפת C?

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

רגע, אין לארדואינו שפה משלו?

למרות כל האמור לעיל, אי אפשר להתעלם מכמה סימנים מחשידים. הסיומת של קובצי הקוד שאנחנו כותבים בסביבת הפיתוח של ארדואינו היא לא cpp אלא ino, ובמקום הפונקציה "main" שקיימת בכל קוד C או C++ נורמלי, אנחנו חייבים להגדיר דווקא את "setup" ואת "loop". יותר מזה, אפילו באתר הרשמי של ארדואינו אפשר למצוא הצהרות מבלבלות כמו "The Arduino language is based on C/C++" ("שפת ארדואינו מבוססת על C/C++", ההדגשה שלי). אז מה קורה פה?

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

לעומת זאת, כדי לשמור על ידידותיות למתחילים ולא להפחיד את הצעירים יותר מדי, מפתחי הארדואינו כללו בסביבת הפיתוח שלהם ספריות והגדרות רבות שאינן חלק משפת C++ התקנית (כגון טיפוסי הנתונים byte ו-boolean, או הפונקציה digitalWrite). אלה דברים שחובה להכיר כדי לעבוד בצורה נוחה עם ארדואינו, אבל שוב, אין כאן סטיה מהתקן של השפה עצמה, אלא הרחבות שנבנו במסגרתה. אתם יכולים לחזור לקבצים שהזכרתי למעלה ולראות כיצד כתבו כל אחת ואחת מההגדרות והפונקציות האלה בשפת C++ רגילה. אפרופו, כאשר הקומפיילר מתחיל לעבד קוד שכתבנו בקובץ ino, הוא לוקח את setup ו-loop ומשבץ אותן בתוך קוד משלו, שבו מוגדרת main החיונית – ואפשר לכתוב גם את main לבד, אם רוצים.

אסמבלי, פסיקות ושאר ירקות

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

סיכום

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

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

להרשמה
הודע לי על
2 Comments
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

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

בתודה
תומר