מבוא לתכנות

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

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

עכשיו במדריך זה כמו שהבנתם או לא הבנתם מקודם אני אנסה לתת בסיס בתכנות!...לא זה לא איך כותבים שלום עולם על המסך או איך מכניסים
ערך למשתנים אלא משהו כללי שיכול להיות מיושם בכול השפות..

תוכן נושאים:
1)מבוא למחשב

2)מבוא לתכנות
-מטרות של תוכנית
-באגים\יעילות
-מושגים בסיסיים בתכנות

3)סקירה קצרה על שפות תכנות יתרונות וחסרונות וכלים ומידע שכול מתכנת מתחיל צריך..
-שפות תכנות
-קישורים שונות

4)סוף דבר

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

טוב עכשיו קטע הבא חשוב איך המחשב עובד בכמה מילים:
אז ככה שאתה "מדבר" עם המחשב אתה מדבר איתו בשפת מכונה(הוא מכונה-הוא מבין שפת מכונה)
שפת מכונה היא בעצם שפה בינארית(שפה על בסיס 2) והיא שפה שיש בה רק אפסים ואחדים והאפסים והאחדים האלה בעצם אומרים דבר פשוט:
0-אין זרם
1-יש זרם

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

*דגש* אסמבלי=שפת התכנות, אסמבלר=האדיטור של השפה מעביר מבינארי לאסמבלר,דיאסמבלר מעביר מבינארי לאסמבלר)**

אחרי שעבדו עם אסבמלי שוב הגיעו למסקנה שגם היא יותר מידי מסובכת ויצרו את השפות העליות,השפה העילית
הראשונה נקראה A (למי שתוהה באה אחריה B וכמובן אחריה C המוכרת)השפות העיליות הן למעשה צעד אחד יותר
לשפת בני האדם צעד די משמעותי יש לומר,ישנם דברים שעדיין בונים באסמבלי כי השפות העליות לא מאפשרות אותן
(מה שנקרא Low level programming))או שמערבבים בין השפות כי לכול שפה יש בדרך כלל אסמבלר בילט אין,
כי מה לעשות כאשר אתה מתרחק מהמכונה יש לך פחות שליטה עליה, לשפת הסף יש גישה מלאה יותר למחשב כי היא יותר קרובה עליו...
אז כדי לסכם יש ככה לפי קירבה לשפת המכונה ושפת האדם

שפת מכונה(בינארי)

שפת סף(אסמבלי)

שפות עליות שונות(דוגמת פסקל סי בייסיק ועוד)

שפת בני האדם

טוב עכשיו שאנחנו יודעים איך המחשב עובד(פחות או יותר) בו נעבור לבסיס בתכנות....

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

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

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

לאחר שאתה לא יושן כמה לילות:) ומשלים סוף סוף את התוכנה שלך יש עוד סדרה של שאלות שאתה צריך לשאול את
עצמך כמו: האם התוכנה עושה מה שהיא יועדה לעשות כלומר משלימה את מטרת התוכנית?
והאם התוכנה מבצעת את המבוקש ממנה בכול מצב?!

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

*ידע כללי* למה קוראים לבאג באג? כי פעם היו מחשבים בגודל של חדרים ושהיה נתקע איזה חרק(באג)בכבלים או קורע אותם
הייתה הפסקת חשמל והיו צריכים לתקן את הבעיה ורק אז להמשיך *סוף ידע כללי*

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

מה היא יעילות?ליעילות יש בעיקרון שני הבטים:
1)יעילות מבחינת זמן
2)יעילות מבחינת משאבים(זיכרון וכו)

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

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

פה כמה מילים שהם דעה שלי:
-------------------------
מתכנת נמדד בכמה יעילה התוכנית שלו למה כול בן אדם יכול לעשות תוכנה שעושה X ו Y אבל מי שיגרום לתוכנה
שלו לעשות את X ו Y ב חצי זמן יקח את כול הקופה(בדולרים) :)

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

זאת למשל דוגמא קטנה לאיך אתה כמתכנת יכול להפוך את התוכנית שלך ליעילה כמובן שפה באה השאלה
רגע אם אני מחפש עמוד 5 אז זה יצא יותר ארוך!כן אבל שאתה מחפש יעילות אתה צריך תמיד
לחשוב על המקרה הגרוע ביותר ומשם לשפר את התוכנית...

דוגמא 2:
--------
זו דוגמא שתיהיה יותר מובנת לאנשים שיותר התעסקו עם תכנות אבל אולי גם למי שלא

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

זאת דוגמא מופשטת מאוד אבל שמתחילים להתעסק עם זה רואים שאפשר לעשות בזה שימוש...בעיקר בתחום של לולאות..
(מה זה לא לולאות?! ראה פרק הבא...)

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

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

מערך(array):אוסף של תאי נתונים בעלי מכנה משותף הטיפוס שלהם.

לולאות(loops):סדרה של אחת או יותר פעולות שמתבצאות פעם אחר פעם באותו סדר..יש לולאות מסוגים שונים אבל
שניים העקריים הם לולאת תנאי ולולאה שמתבצעת מספר פעמים קבוע..בלולאה של מספר קבוע משתמשים כאשר יודעים
את מספר הפעמים שאנחנו רוצים לבצע אותה בלולאת תנאי כאשר לא יודעים ואז משתמשים בתנאי כדי שיעצור את הלולאה.

יש עוד הרבה דברים שיכולים להכנס לחלק זה אבל כמו שכתוב בכותרת אלה המושגים הבסיסיים:)..

חלק 3:סקירה קצרה על שפות תכנות יתרונות וחסרונות וכלים ומידע שכול מתכנת מתחיל צריך:
----------------------------------------------------------------------------------
**הבהרה קטנה לפני שמתחילים...html זה לא שפת תכנות וכול ידע בא לא יתן לכם כלום בתכנות..**

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

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

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

מהדרים (Compilers) שהקלט להם הוא תוכנית בשפת תכנות, והפלט הוא תרגומה של התוכנית לשפת מכונה, שמוכנה לביצוע על-ידי המעבד.

מפרשים או מפענחים (Interpreters), הקוראים את התוכנית בשפת תכנות, ומבצעים באופן מיידי את הכתוב בה.
שפות מסוג זה קרויה גם שפות תסריט (scripting programming language).

(מתוך ויקיפדיה, האנציקלופדיה החופשית)

שפות תכנות יש הרבההה מאוד שפות תכנות בדרך כלל מאחורי המצאת שפת תיכנות חדשה יש רעיון חדש ,או שמרגישים
שאין לו ישום מתאים בשפה קיימת,כדי להשיג יעוד מסויים וכו לדוגמא שפת סי (המפורסמת) פותחה בתחילת שנות השבעים
ע"י דניס ריצ'י ממעבדות בל (AT&T Bell Labs), הם השתמשו בה לפיתוח מערכת ההפעלה UNIX,הם כתבו אותה כי הם מצאו
את השפות האחרות "לא טובות" למטרתם (עוד על נושא זה במאמר UnixHist של Hell-Shooter בגליון הקודם(4#)).

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

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

טוב עכשיו שאתם יודעים מה זה שפה ומה הבדלים בין שפות שונות נעבור להצגת השפות המוכרות ביותר שנחשבות
גם שפות טובות להתחלה למתחילים:
פסקל(pascal)-לדעתי שפה טובה למתחילים...(כי היא קרובה מאוד לשפת בני האדם..תחביר פשוט וכו)
קופיילרים:borland turbo pascal (שבע)
Dev-Pascal
יש גם את דלפי שהוא קומפיילר לתוכנות בעלות GUI (graphical user interface) כלומר ממשק ויזואלי
בניגוד לקודמים שהם בדוס

סי\סיפיפי (c\c++) - יש האומרים שדווקא צריך להתחיל עם סי..אני חולק אבל אם אתם חושבים שאת יכולים נסו..
בעיקרון יש בזה משהו כי כיום משתמשים הרבה הרבה יותר בסי לכן אם התחלתם פה אל יהיה לכם בעיות של לעבור שפה...
צד שני תמיד טוב לדעת כמה שיותר שפות..(יותר על בין סי ופסקל בסוף חלק זה)
קומפיילרים: tc-lite
Bloodshed Dev-C++
אלא חינמים
ויש גם את visual c++ מבית מיקרוסופט..חלק מvisual studio .. פה זה כבר עולה כסף:\

ויסואל בייסיק: שפה מבית מיקרוסופט..הרבה אנשים אומרים שלא כדאי להתחיל איתה ...
הורס את הצורה של התכנות .. (אני מסכים בהחלט) הקומפיילר שלה גם בא כחלק מ-visual studio ($$$)

אלה "השפות של המתחילים" ..יש עוד מלא שפות כמובן שיש את אסמבלי שהזכרתי למעלה
(קומפיילרים tasm nasm masm וכו)
...לא מומלץ להתחיל איתה..אבל כול מי שמחשיב את עצמו מתכנת חייב לדעת אסמבלי לפחות בסיס!
היא מעמיקה את הידע ואת ההבנה של איך מחשב עובד איך אתה כמתכנת צריך לדעת איתו ולהשתמש בו..

על C ופסקל: טוב הדעה שלי היא שכדאי להתחיל עם פסקל כי היא קרובה יותר לשפת בני האדם וגם התחביר שלה יותר פשוט...
לא צריך ללמוד מצביעים על ההתחלה בשביל פרוצדורות...תסכימו איתי ש write and read יותר קרוב לאדם מאשר scanf printf
והצורה שצריך להכניס את הנתונים להדפסה לדוגמא.. זיהוי הטעויות בקומפילציה יותר פשוט
(זה לא זורק אותך באמצע קובץ ענקי שאתה לא יודע איפה אתה!) ועוד הרבה...אבל אם אתם ממש רוצים התחילו בסי:)
לדעתי הכי טוב לדעת את שניהן לא משנה באיזה סדר בכלל כמו שאמרתי הכי טוב לדעת כמה שיותר שפות!(שפות=ידע=כוח)

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

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

בנוסף אני מקווה שיום אחד אני אוכל להרחיב את כול הדברים שאמרתי שאני לא אעסוק בהם פה... (פשי לאיזה בור הכנסתי את עצמי חח).

מי שצריך עזרה עם מציאת קומפיילרים או מדריכים על שפות וכו שיחפש ברשת יש הרבה מקורות (google!)