კომპილატორი vs ინტერპრეტატორი
ხო, რა, მარტივი კითხვა მაქვს. A კოდი პითონზეა დაწერილი, ხოლო მეორე C-ზე. კითხვა ასე ჟღერს: ამ ორი კოდიდან რომელი გაეშვება შესრულებაზე? (სპოილერი: ორივე კოდი შეცდომიანია).
მოდი სანამ სწორ პასუხს გავიგებდეთ ვისაუბრებ პროგრამაზე. პროგრამა არის ადამიანის მიერ დაწერილი ინსტრუქცია. ამ ინსტრუქციებს ადამიანები პროგრამულ ენებზე წერენ. მაგრამ არის ერთი პრობლემა. ადამიანებს არ შეუძლიათ მანქანურ ენაზე პროგრამის წერა, ხოლო კომპიუტერები ადამიანის მიერ დაწერილ კოდს ვერ გაბულობენ. ამიტომ საჭიროა პროგრამისტის მიერ დაწერილი კოდის მანქანურ ენაზე გადაყვანა.
ამისთვის არსებობს რამდენიმე მეთოდი: ერთ მეთოდს ინტერპრეტაცია ქვია, მეორეს კი კომპილირება.
როდესაც პროგრამისტი დაწერს print("გამარჯობა სამყარო"), ეს კოდი გადაეცემა (ვთქვათ) პითონის ინტერპრეტატორს, ანუ პროგრამას python.exe. ინტერპრეტატორი კითხულობს პროგრამას სტრიქონ-სტრიქონ ზევიდან ქვევით და სათითაოდ თარგმნის მას. ასე სათითაოდ უგზავნის პროცესორს...
როდესაც პროგრამა (ინტერპრეტატორი) მიადგება სტრიქონს სადაც წერია print("გამარჯობა სამყარო"), პითონის იცის ფუნქცია print() დანიშნულება. ის ხვდება რომ მომხმარებელს ეკრანზე ტექსტის გამოტანა უნდა. ხოდა სწორედ ამ ინფორმაციას თარგმნის მანქანურ ენაზე და გადასცემს პროცესორს. შედეგად კომპიუტერიც ეკრანზე გამოიტანს შესაბამის ტექსტს. შემდეგ კი გადადის მომდევნო სტრიქონზე... და ა.შ. კოდის დასრულებამდე.
თუ რომელიმე სტრიქონზე შეცდომიანი კოდი შეხვდება, პროცესი შეჩერდება და ტერმინალში შესაბამისი შეტყობინება გამოვა.
ყოველ ჯერზე, როცა პროგრამის შესრულება გვინდა, ეს პროცესი თავიდან იწყება.
ინტერპრეტირებადი ენებია: პითონი, PHP, ჯავასკრიპტი, Ruby
რაც შეეხება კომპილატორს, კომპილატორი სხვანაირად მუშაობს. კომპილატორიც სტრიქონ სტრიქონ კითხულობს კოდს. მოცემულ მაგალითში (B) როგორც კი მიადგება printf("%d", x); სტრიქონს, ნახავს რომ printf(); უცნობი სიტყვაა. გაჩერდება და დაწერს:
error: call to undeclared function 'prntf'; ისაო და ბატონო ჩემო, მე-5 ხაზზე რომ გიწერია prntf, ეგ არაა დეკლარირებული ფუნქციაო. მე ეგ არ ვიციო. იქნებ printef გულისხმობო :) და. ა.შ. მერე სხვა სტრიქონებსაც გადახედავს და მოკლედ, სანამ ამ შეცდომებს არ გამოვასწორებთ, ისე როგორც მას მოეპრიანება, მანამდე გაჯორდება.
მხოლოდ ყველა შეცდომას გასწორების შემდეგ დაიწყება პროგრამული კოდის მანქანურ ენაზე თარგმნა. ამ დროს კომპილატორი შესაბამისი ბიბლიოთეკებიდან (ანუ .h ტიპის ფაილებიდან) ამოიღებს კოდში მითითებული ფუნქციების კოდებს, ყველაფერს გადათარგმნის მანქანურ კოდში და შექმნის ახალ შესრულებად (.exe, .dll, .bib, .so, .dylib, .bundle, .app) ფაილს*.
ანუ კომპილატორი სტრიქონ-სტრიქონ, მაგრამ თავიდან ბოლომდე კითხულობს კოდს და თუ შეცდომაა არაა, დაიწყება კომპილირების პროცესი. მხოლოდ ამის შემდეგ არის შესაძლებელი პროგრამის შესრულებაზე გაშვება.
ამ შემთხვევაში, ყოველ ჯერზე, როცა პროგრამის შესრულება გვინდა, სრულდება უკვე კომპილირებული ფაილი და არა პროგრამული კოდი. კომპილაციის შემდეგ პროგრამაში ცვლილებებს თუ შევიტანთ, ეს გავლენას ვერ მოახდენს უკვე კომპილირებულ ფაილზე. იმისთვის რომ კოდში შეტანილი ცვლილებები აისახოს პროგრამაში, კოდი თავიდან უნდა დაკომპირდეს.
კომპილირებადი ენებია: C, C++, Rust, Go, Swift...
| კომპილატორი | ინტერპრეტატორი |
როგორ თარგმნის? | თავიდან ბოლომდე | სტრიქონ-სტრიქონ |
სიჩქარე | 🚀 სწრაფი | 🐢 ნელი |
შეცდომების პოვნა | კომპილირებამდე | სტრიქონის გაშვების დროს |
მიზანშეწონილია | თამასები, ოპერაციული სისტემა, ვიდეოს დამუშავება | სწავლება, ვები |
ენები | C, C++, Rust, Go, Swift | Python, PHP, ჯავასკრიპტი, Ruby |
უარყოფითი | თუ შესწორება დაგჭირდა, თავიდან აკომპილირებ | ყოველი გაშვებისას მუშაობ უშუალოდ კოდთან, რაც შასაძლებელს ხდის (თუნდაც) შემთხვევით შეცდომის შეტანას |
ამ ინფორმაციის საფუძველზე შეგვიძლია ქვიზს ვუპასუხოთ, რომ სწორი პასუხია (A) ვარიანტი. ანუ პირველი სტრიქონი გადაითარგმნება მანქანურ ენაზე, ხოლო მეორე სტრიქონი შეცდომას გამოიტანს და პროგრამის შესრულებაც შეწყდება.
შეიძლება იკითხოთ, ჩამონათვალში Java რატომ არააო, მაგრამ Java არ არის თლათ კომპილირებადი ენა, მაგრამ მას აქვს ინტერპრეტირებადი ენის მახასიათებლებიც. ამიტომ Java, C#, კოტლინ, სკალა არის ჰიბრიდული ტიპის ენები.
კიდევ რამდენიმე დამატებითი ინფორმაცია კომპილატორის და ინტერპრეტატორის შესახებ:
როდესაც კოდის წერას მოვრჩებით და კოდს დავაკომპილირებთ, ეს პროგრამა შეგვიძლია გადავიტანოთ სხვა კომპიუტერებზე და იქ უკვე კიდე არაფერია საჭირო.** მაგრამ ინტერპრეტირებად ენებზე კოდის გასაშვენად საჭიროა შესაბამის პროგრამული ენის ინტერპრეტატორი. აი პითონის შემთხვევაში როცა ვწერთ pythoh hello.py ნიშნავს რომ გვინდა პროგრამა python.exe გაშვება და მას გადაეცემა კოდის ფაილი hello.py. შესაბამისად ორივე ფაილი ხელმისაწვდომი უნდა იყოს ოპერაციული სისტემისთვის. პითონის ინტერპრეტატორი კი დაინსტალირებული და დაკონფიგურირებული უნდა იყოს. შესაძლებელი კოდის რედაქტორიც დაგჭირდეთ. მოკლედ კოდთან მუშაობისთვის მინიმალური ტექნიკური ცოდნა მაინც გჭირდებათ
სად გამოიყენება კომპილირებადი ენები? იქ სადაც მაღალი სიჩქარეა საჭირო, ეს შეიძლება იყოს ოპერაციული სისტემები, თამაშები, ვიდეოს ან 3დ გამოსახულების დამუშავება, დრაივერების შექმნა, ისეთი პროგრამები, როგორიცაა ჩვენთვის კარგად ცნობილი საოფისე პროგრამები ან ბრაუზერები და ა.შ. იგივე პითონის ინტერპრეტატორიც C-ში, ანუ კომპილირებად ენაზეა შექმნილი
ხოლო ინტერპრეტირებად ენებს იყენებენ ისეთი პროგრამების შესაქმენლად, სადაც სისწრაფე არც თუ ისე მნიშვნელოვანია, მაგალითად ვებ საიტების შექმნა, ჩაშენებული სისტემები, IoT და ა.შ.
იმის გამო რომ ინტერპრეტირებად ენაზე დაწერილი კოდის გასაშვებად საჭიროა კიდევ სხვა პროგრამული უზრუნველყოფა, ინტერპრეტირებად ენებზე ოპერაციული სისტემის შექმნა შეუძლებელია. (შეგიძლიათ უპასუხოთ კითხვას, რატომაა შეუძლებელი ინტერპრეტირებად ენაზე ოპერაციული სისტემის შექმნა? პასუხი: თუ ჩვენ ინტერპრეტირებად ენაზე დავწერდით ოპერაციული სისტემის კოდს, ამ კოდის რომელიმე კომპიუტერზე გასაშვებად უნდა ჩაგვეწერა ინტერპრეტატორი. კომპიუტერის ყოველ ჩატვირთვაზე ჯერ ეს ინტერპრეტატორი უნდა გაეშვას და შემდეგ შესაძლებელი იქნება ჩვენს მიერ დაწერილი (ოპერაციული სისტემის) კოდის გაშვება. მაგრამ ოპერაციული სისტემის აზრი ისაა, რომ ის დამოუკიდებლად უნდა გაეშვას....
მ პოსტის მოკლე კოდი: mokle.ge/qcpy005
პითონს ტრენინგის პირობები ნახეთ აქ
შენიშვნა: *. რადგანაც მასალა განკუთვნილია მეექვსე კლასი მოსწავლეებისთვის, ზოგიერთი ნაწილი გამოტოვებულია. კომპილაციის პროცესი ცალკე პოსტსაც კი იმსახურებს
**. ზოგიერთ შემთხვევაში საჭირო ხდება დამატებითი მოდულების დაყენება. მაგალითად .NET ან Microsoft Visual C++, მაგრამ ამ ბიბლიოთეკებს ბევრი პროგრამა იყენებს. მაგალითად თამაშები.
Comments
კომენტარი