יום שני, 15 ביולי 2013

קצת סדר בבלגן - שפות תכנות

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

שפת המכונה

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


שפות הסף

שפות הסף או Asm (קיצור של Assembly ) הינה קבוצה של שפות הקרובות מאוד לשפת המכונה, אך בכל זאת לוקחות את התכנות שלב אחד קדימה. בASM כבר כותבים באנגלית מקוצרת, וכל שורה בתוכנית מורכבת בד"כ מ-3 איברים. בשפה זו משתמשים בזיכרון הכונן הקשיח, וישירות באוגרי זיכרון מהיר (AX BX DX וכו'...). גודל האוגרים תלוי במספר הביטים של המחשב: 32, 64 וכדומה.

לדוגמה השורה: MOV AX, BX 
מעבירה את התוכן של האוגר BX לאוגר AX. הפקודה MOV הינה קיצור של המילה האנגלית move. וכך ע"י פקודות קצרות ניתן לכתוב תוכניות בשפה היותר דומה לאנגלית לעומת שפת המכונה, ובכך להקל על המתכנת.

אבל אמרנו קודם שהמחשב מבין רק 1 או 0, אז איך הוא יבין את שפות הסף? זה פשוט מאוד. קוד הASM עובר תהליך של פיענוך ישיר לשפת מכונה בתוכנה שנקראת Assembler. לאחר התרגום, המחשב יוכל להבין את התוכנית. דוגמת קוד בASM:


השפות העליות

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

שפות עליות "מתקמפלות"

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

קטע הקוד הבא בשפת ++C, מדפיס את הספרה 8:

int number = 6;
number = number + 2;
cout << number;

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


שפות עליות "לא מתקמפלות" - שפות סקריפט (תסריט)

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

כמו שאמרתי, לשפות התסריט תפקידים שונים ומגוונים. PHP למשל נוסדה במיוחד כדי לתפעל שרתי HTTP (אתרי אינטרנט) .
דוגמת קוד PHP: 

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

מקווה שנהנתם לקרוא!


יום שבת, 13 ביולי 2013

מערכת אזעקה ביתית

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

הנה סרטון הדגמה למערכת:



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

להלן המעגל החשמלי של המערכת:

ולהלן הקוד בשפת C שמתפעל את המערכת:

#define HIGH_TONE 1000
#define LOW_TONE 500

#define NO_ALARM_LIGHT 50
#define ALARM 1
#define OFF 0
#define ON 1

const int sensorPin = 0;
const int ledPin = 9;
const int buzzerPin = 8;
const int buttonPin = 3;

int buzzer_val = LOW_TONE;
int light_val = LOW;

int button_p = HIGH;

int alarm_state = !ALARM;
int program_state = OFF;

void setup()
{
  Serial.begin(9600);
  
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  
}

void loop()
{

  int light_lvl = analogRead(sensorPin);
  int button_state = digitalRead(buttonPin);
  
  
  if(button_state == LOW && button_p == HIGH) {
    button_p = LOW;
    program_state = !program_state;
    if(program_state == ON) {
        digitalWrite(ledPin, HIGH); // Time to get ready
        delay(20000); // 20 seconds
    }
  }
  if(button_state == HIGH && button_p == LOW) {
    button_p = HIGH;
  }
  if(program_state == OFF)
    alarm_state = !ALARM;
    
  if(!alarm_state) {
    Serial.println(0);
    if(program_state == ON)
      check_alarm(light_lvl);
    
    noTone(buzzerPin);
    digitalWrite(ledPin, LOW);
  }
  else {
    Serial.println(1);
    set_light_buzzer();
    
    tone(buzzerPin, buzzer_val);
    digitalWrite(ledPin, light_val);
    delay(250);
  }
}

void check_alarm(int light_lvl)
{

  if(light_lvl > NO_ALARM_LIGHT) {
    alarm_state = ALARM;
  }
}

void set_light_buzzer()
{
     if(light_val == HIGH)
      light_val = LOW;
     else
      light_val = HIGH;
      
    if(buzzer_val == LOW_TONE)
      buzzer_val = HIGH_TONE;
    else
      buzzer_val = LOW_TONE;
} 
  

להלן הקוד בשפת Perl ששולח אמייל ברגע שמופעלת אזעקה:
#!/usr/bin/perl




use Device::SerialPort;
use Email::Send;
use Email::Send::Gmail;
use Email::Simple::Creator;

my $port = Device::SerialPort->new("/dev/ttyACM0");
$port->databits(8);
$port->baudrate(9600);
$port->parity("none");
$port->stopbits(1);

system "clear";

while(1) {
 ($count, $string_in) = $port->read(1);

 if($string_in eq "1") {
  print "alarm";

  my $email = Email::Simple->create (
      header => [
   From    => 'felixkor@gmail.com',
   To      => 'felixkor@gmail.com',
   Subject => 'Alarm',
      ],
      body => 'Alarm at: '.localtime,
  );

  my $sender = Email::Send->new ({
      mailer      => 'Gmail',
      mailer_args => [
   username => 'Gmail username',
   password => 'Gmail Pwd',
      ]
  });

  $sender->send ($email);

  exit;
 }
} 
 
את הרכיבים ניתן לרכוש באתר http://www.4project.co.il
תודה על קריאתכם, אשמח לתגובות. 

יום שישי, 12 ביולי 2013

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