חשוב שנדע להבדיל בין סינתקס של שפה לבין שמייצג את המבנה של השפה, סדר מילים וסימנים והרכבת משפטים שמהווים תוכנית מבחינת נכונות שלהם בסדר המילים.
הסמנטיקה היא המשמעות של אותם המילים, מה הן אומרות מבחינת התוכנית שלנו.
למשל נסתכל על הקוד הבא:
מבחינת ניתוח סינתקס של התוכנית נוכל להבין שיש כאן 3 הצהרות (לפי ההפרדה של התו ;). כל אחת מהן מכילה משתנה בצד אחד עם אופרטור = ולאחר מכן מה שנראה כ expression שהוא בעצמו משתנה.
הסמנטיקה מתעסקת עם המשמעות הדקדוקית והנכונות הדקדוקית של תוכניות. כלומר, הסמנטיקה תבין שהמשמעות של התוכנית היא החלפת הערכים
ישנם מספר דרכים לפרמל את ההצהרה הנ״ל בגדול יש 3 דרכים עיקריות
- סמנטיקה תפעולית (Operational Semantic): המשמעות של מבנה מוגדרת על ידי החישוב שלו כאשר הוא מורץ על ידי מחשב.
- _סמנטיקה דנוטציונית משמעויות מעוצבות על ידי אובייקטים מתמטיים המייצגים את ההשפעה של ביצוע המבנים (למשל על ידי פונקציות).
- סמנטיקה אקסיומטית: מושפעת מ assertions. התוכנית יכולה להיות נכונה באופן חלקי אבל מוסיפים לה תכונות של preconditions ו postconditions כך שאם התוכנית מסתיימת אנחנו יודעים שהתנאים האלו התקיימו וקיבלנו תוצאה רצויה.
מעבר לפאן התאורטי שהיא נותנת לנו את היכולת לתת משמעות לתוכניות היא גם נותנת לנו כלי פרקטי לכתוב כלים שמפרשים שפות תכנות (interpreters)
שפה אימפרטיבית פשוטה שעוזרת להדגים ולהסביר עקרונות סמנטיים כפי שציינו למעלה.
התחביר האבסטרקטי של while מחולק לקטגוריות הבאות
- Num- קבוצת המספרים השלמים
- Var- קבוצת המשתנים
- Aexp- קבוצת הביטויים האריתמטיים
-
-
-
- Bexp- קבוצת המשתנים הבוליאנים נגדיר ביטוי בוליאני להיות
- Stm- קבוצת הפקודות
- אם
-
-
- if b then S1 else S2.
- while b do S
הערה: בזכות הסעיף השלישי Stm זאת קבוצת התוכניות.

חשוב לשים לב שזהו סינתקס אבל את הסמנטיקה אנחנו יכולים לקבוע, למשל יכלנו לקבוע ש
התחביר האבסטרקטי מתאר איך לבנות expressions בשפה מבלי לרדת לפרטים של keywords , הזחות וכו׳. מתחביר אבסטרקטי אפשר לבנות Abstract Syntax Trees שמייצג את המבנה הבסיסי ביותר של התוכנית. אפשר לבנות אותו מבלי לבדוק כל פרט שרלוונטי ל concrete syntax אם כי יכול להיות מצב שיווצרו לנו שתי AST מאותה תוכנית והסינתקס הקונקרטי יצטרך להכריע.

בגלל שלא נרצה לכתוב עצי סינתקס לכל תוכנית (ראו איך התוכנית הבסיסית הנ״ל יצרה עץ די גדול יחסית) נרצה לייצג אותם באמצעות תחביר ליניארי לשם כך נשתמש ב סוגריים. למשל
יבטא את העץ השמאלי בתמונה ו
יבטא את העץ הימני.
לדוגמה, נבנה עת סינתקס עבור התוכנית הבאה:
y:=1;
while not(x=1) do (
y:=y*x;
x:=x-1;
)

בסופו של דבר הסינתקס האבסטרקטי מורכב מexpressions אבל המשמעות של ביטוי כזה נקבע לפי הערך של המשתנים שנמצאים בתוך הביטוי הזה.
לשם כך נגדיר states שזאת תהיה פונקציה ממשתנה לערך שלו
אם
סמנטיקה של ביטויים אריתמטיים:
כעת, בהינתן ביטוי אריתמטי
נגדיר פונקציה שלמה
a)
b)
c)
d) כפל וחיסור דומה לסעיף הקודם.
נשים לב להבדלה בין הסימנים בצד שמאל ולסימנים האריתמטיים בצד ימין. צד שמאל הם סימנים של חלק מהסינתקס האבסטרקטי ובצד ימין זה ביטויים אריתמטיים כפי שאנחנו מכירים.
דוגמה:
נניח שיש מצב
סמנטיקה של ביטויים בוליאנים:
נגדיר אותה כפונקציה
a)
b)
c)
d)
e)
f)
סמנטיקה טבעית היא אחת הדרכים לתאר סמנטיקה של פקודות. בסמנטיקה של פעולות אנחנו מתעניינים בשינויי המצבים במהלך הרצה של תוכנית. הסמנטיקה הטבעית שמה בחשיבות עליונה את התוצאה הסופית של הריצה של התוכנית שלנו ואיך תוצאה זאת מושגת.
המטרה של statements ב while זה לשנות את הstates. למשל אם
בסמנטיקה טבעית מתעניינים בקשר בין המצב ההתחלתי של תוכנית למצב הסופי שלה.
נגדיר כמה כללים של סמנטיקה של פקודות (Operational Semantic)
יהי
המשמעות הסמנטית היא כאשר המשתנה
זה מבוסס על עקרון ההחלפה. זה בעצם

הסמנטיקה התפעולית מבוססת על היגדים מהצורה
נגדיר מספר כללי היסק עבור היחס

נוכל להוסיף כללים חדשים לסמנטיקה שלנו, למשל נגדיר if(x:=e) then S1 else S2 ככלל חדש ונוכל לכלול אותו בסמנטיקה שלנו כך :

נוסיף כלל נוסף גם case(b1:S1),(b2:S2),(else:S3)

לחוק (כפי שרשום למעלה) יש את התצורה הכללית :

כאשר
לכלל יש הנחות (מה שרשום מעל הקו) ומסקנה אחת (מתחת לקו) כמו כן יכול להיות לכללים גם תנאים בוליאנים. אפשר להסתכל על החלק העליון כגזירה של החלק התחתון. בעצם if, while, comp הם כללי גזירה ו ass, skip הם אקסיומות.
כללים ללא הנחות נקראים אקסיומות למשל
נגדיר את עץ הגזירה של
עצים גזירה מציירים כאשר השורש למטה.
הגדרה: ההיגד
נסתכל על הדוגמה הבאה:
יהי
נרצה להראות שזאת תוביל אותנו ל
נבנה עץ גזירה

משפט: אם
הוכחה:
אפשר לעשות את זה ב אינדוקציה על מבנה עץ הגזירה של
בסיס: נבדוק על כל אחת מהאקסיומות.
a) אם הגזירה הנ״ל מובילה אותנו ל skip לאחר הפעלה יחידה, זה אומר ש
b) אם
נשים לב ש
צעד 1:
ל
עבור
כלומר קיימים
כעת נניח ש
עבור
מהנחת האינדוקציה נוכל להסיק ש כיוון ש
נשים לב שההנחה היא רק על עץ הגזירה הראשונה ולא השני.
יתר הכללים עובדים בצורה דומה.
בגדול המשמעות של האינדוקציה היא לסקור את כל המבנים האפשריים החל מהאקסיומות ועד לכללים, אם נראה על כל האקסיומות והכללים הבסיסיים שמפורטים בטבלה למעלה שהמשפט מתקיים, אז הוא כמובן מתקיים על כל צירוף שלהם.
לסיכום:
כדי להוכיח שמתקיימת תכונה מסוימת על סמנטיקה נשתמש באינדוקציה על צורת העץ כאשר הבסיס הוא התכונה המתקימת על האקסיומות ובצעד האינדוקציה לכל כלל גזירה נניח שמתקיימת התכונה ונוכיח למסקנה של הגזירה שהתכונה מתקיימת.
נרצה להראות שקילות סמנטית בין שני קטעי קוד בשפת while
while b do S ~ if b then (S; while b do S) else skip
לשם כך נצטרך להוכיח את שתי הטענות הבאות :

מזכיר הוכחה של שיוויון על ידי הכלה דו כיוונית. נרצה להראות שאם אחד נגזר למצב
נעשה כיוון אחד, הכיוון השני דומה. מתקיים אם כן,
a) אם

כאשר
נוכל לבצע comp על T1,T2 ונקבל :

כעת בגלל ש

שמנו skip כי אין לו חשיבות כיוון ש
b) כאשר
במצב זה אנחנו נשארים באותו מצב ולכן נגדיר
ֿ