იმედია ჩემს ქვემორე მონათხრობს მკითხველი რაიმე იდეის მიკერძოებას, ვიწრო სფეროთი დაინტერესებასა ან C++-ის მიმართ ფანატიკურად შეყვარებულობას არ მიაწერს, რადგან ამ საკითხის განხილვა, სხვადასხვა წყაროებიდან ცალკეული ფრაზების ამოღება და აქ განთავსება მაიძულა იმან, რომ მე როგორც ამჟამად პროგრამისტი C++-ში, რა თქმა უნდა დაინტერესებული ვარ შესაბამისი ენის ისტორიით, მაგრამ რატომღაც ჩამოყალიბებული და დალაგებული სახით, ისე რომ გულს ესიამოვნოს, თითქოსდა არსად არ არსებობს(ყოველ შემთხვევაში მე ვერ ვნახე).
დარწმუნებული ვარ რომ იმ კატეგორიის პროგრამისტებისათვის , რომლებიც პროგრამირების ენებს უფრო კრიტიკული თვალით და როგორც იტყვიან სპორტული ინტერესით უყურებენ (და არა მარტო როგორც ფულის საკეთებელ ინსტრუმენტს), ეს სტატია საინტერესო და რამდენადმე პროვოკოციულიც იქნება.
მაშ, დავიწყოთ ცოტა შორიდან.
დავიწყოთ იმ დროიდან, როცა “ჩვენი დიდი წინაპრები” (ჯონ-ფონ ნეიმანის ჩათვლით) “მოაზროვნე არსების” შექმნის საწყისებთან უკვე საკმაოდ ახლოს იყვნენ. თუ რა მეცნიერული საფუძვლები დაედო თვით კომპიუტერის, როგორც ფიზიკური სისტემის შექმნას, ამის განხილვას აქ არ შევუდგები და საკითხს შევეხები როგორც პროგრამისტი.
როგორი იყო პირველი პროგრამები? ლაპარაკია 30-40-იან წლებზე. საერთოდ პროგრამირების საკითხი ძალიან ზოგადია(თუ გავითვალისწინებთ ასე გახმაურებულ ფსიქოლოგიური ზემოქმედების მეცნიერულ მიმდინარეობებსაც). მისი გამოწვლილვით შესწავლა ფილოსოფიაში გადაგვაგდებს და ბატონ ბლეზ პასკალსაც კი შეიძლება შეგვახვედროს(როგორც წესი პასკალი ითვლება პირველი გამომთვლელი მანქანის გამომგონებლად), ამიტომ წინასწარ დავაზუსტოთ, რომ ჩვენ საქმე გვაქვს იმ დროსთან როცა კომპიუტერული პროგრამირება ახლოს იყო თუნდაც ყველაზე დაბალი დონის პროგრამირების ენა Assembler-ზე პროგრამირებასთან.
ალბათ გაგიგიათ, რომ პირველი კომპიუტერები ზომებში გაცილებით აღემატებოდნენ თავიანთ დღევანდელ შთამომავლებს, იკავებდნენ რა არა ერთ ან ორ მაგიდას არამედ ერთ ან ორ ოთახს და დარბაზებსაც კი. ასეთი ზომის კომპიუტერებს, დევისა და ნაცარქექიასი არ იყოს არც თუ ისე დიდი ტვინი ჰქონდათ მაგრამ გარკვეულ ოპერაციებს, რომლებსაც თამამად შეგვიძლია ვუწოდოთ მონაცემთა დამუშავების სისტემა ანუ პროგრამა, ისინიც ასრულებდნენ.
თუმცა იმ დროინდელი პროგრამისტი, მართალია თავისუფლდებოდა დღევანდელი Windows-ის მსგავს ფანჯრებში ხეტიალისაგან, მაგრამ არანაკლებ შრომას მოითხოვდა გადამრთველებთან, “რელეებთან” და ისეთ მილაკებთან მუშაობა, რომლებიც თავისი ენერგიის ხარჯვის ტემპით, დღევანდელ ელექტრო ღუმელს არაფრით არ ჩამოუვარდებოდნენ.
მოკლედ ასეთი ნათურებიანი და “ცხელი” გიგანტები უკვე დიდი ხანია ისტორიას ჩაბარდნენ და მათი გახსენება მე პირადად დიდ სიამოვნებას არ მგვრის.
მაშ, რა ხდება შემდეგ? უკვე 40-იანი წლების პირველ ნახევარში გაჩნდა ისეთი მაქანები, რომლებზეც შესაძლებელი იყო გარკვეული პროგრამის შენახვა და მისი მრავალჯერადი გამოყენება მონაცემთა დამუშავების მიზნით. შეიქმნა შესაბამისი პროგრამირების ენა რომელსაც Assembler-იუწოდეს მისმა შემქმნელებმა. ეს ენა წარმოადგენს გარკვეული რაოდენობის ბრძანებათა ნაკრებს, რომელთაც ავალიათ გარკვეული ოპერაციების შესრულება პროცესორის, რეგისტრების, მეხსიერების უჯრედების და გარე მოწყობილობებთან დამაკავშირებელი პორტების დონეზე. ეს ენა თავისი სიმარტივის, მოქნილობის და HardWare-სთან დიდი სიახლოვის წყალობით, რა თქმა უნდა დღესაც ფართოდ გამოიყენება რთული პროგრამული სისტემების შესაქმნელად.
მაგრამ, მთელი პრობლემა იყო სწორედ იმაში, რომ ეს ჩვენი Assembler-ი მიეკუთვნება ე.წ. დაბალი დონის ენების კატეგორიას. ეს ტერმინი(’დაბალი დონე’) მცდარად არ უნდა გავიგოთ; საქმე იმაშია, რომ ენის დონე განისაზღვრება იმისდა მიხედვით თუ რამდენად უადვილებს იგი ადამიანს დიდი ზომის პროგრამული უზრუნველყოფის შექმნას; მოვიყვანოთ ერთი მაგალითი:
mov BX , 5
აქ mov, div, in წარმოადგენენ ბრძანებებს , ხოლო ყველა დანარჩენი კი პარამეტრებს(რეგისტრის სახელები, მესიერების უჯრედები და სხვ.), ენაში საკმაოდ მოუხერხებელი იყო ციკლების და გადასვლების რეალიზება, მაგრამ მოხერხებულიც, რომ ყოფილიყო ადვილი გასაგებია რომ ასეთ ენაზე პროგრამების წერა არც თუ ისე სასიამოვნო პროცედურა იქნებოდა და ალაბათ იმ დროინდელ პროგრამისტებს თუნდაც 100 და ნაკლებ სტრიქონიანი პროგრამის დამთავრების და გაშვების შემდეგ კომპიუტერის ორობით ელემენტების მაგიერ ტვინის ორობითი ელემენტების გაწითლებასთან უნდა ჰქონოდათ საქმე.
ჭეშმარიტად გენიოსი უნდა ყოფილიყავი, რომ ზუსტად დაგემახსოვრებინა თვითოეული რეგისტრის, ფლაგის თუ მეხსიერების უჯრედის მნიშვნელობა, რათა უზარმაზარ წრფივ განტოლებათა სისტემის ამოსახსნელი პროგრამის შემოქმედი გამხდარიყავი.
სამწუხაროდ თუ საბედნიეროდ ადამიანის შესაძლებლობები შეზღუდულია ხოლო სურვილები კი ყოველთვის აღემატება ჩვენს შესაძლებლობებს და ამ აქსიომამ ცხადია პროგრამირებაშიც იჩინა თავი.
გაჩნდა მოთხოვნები დიდ პროგრამებზე (ძირითადად სამხედრო და სამეცნიერო მიზნებით) და შესაბამისად გაჩნდა თავსატეხი პროგრამისტებისათვისაც. აი აქ უკვე უნდა ვახსენო ტერმინი მაღალი დონის ენა.
. . . და იშვა ენა ForTran-ი (Formula Translation).
ეს ენა იყო პირველი მაღალი დონის პროგრამირების ენა რომლითაც Assembler-თან შედარებით გაცილებით უფრო ადამიანურ ენაზე შეიძლებოდა ლაპარაკი კომპიუტერთან.
ბევრს აღარ გავაგრძელებ და ვიტყვი რომ უკვე 50-იან წლების ბოლოს უამრავი სხვადასხვა დანიშნულების და შესაძლებლობების მქონე მაღალი დონის ენა არსებობდა. მათ შორის იყო ასეთიც BCPL, რომელიც შეიქმნა მარტინ რიჩარდსის მიერ. როგორც ცნობილია ეს ენა ძირითადად ორიენტირებული იყო ელექტრული მოწყობილობების მართვაზე (ტელეფონური ქსელების მსგავსი სისტემები).
როცა ენის წარმოშობაზე ლაპარკობენ ყოველთვის მიუთითებენ იმ თვისებებს რაც ამ ენამ მიიღო თავისი წინამორბედებისგან. თვით BCPL–ზე გავლენა მოახდინა ენამ სახელით B, რომელიც შეიქმნა კენ ტომპსონის მიერ,ხოლო განვითარების შემდეგი ეტაპი იყო პროგრამირების ენა C (1970 წ.), რომლის ავტორიც იყო იგივე პიროვნება და რომელსაც სისტემურ პროგრამირებაზე ორიენტაციის თვისება სწორედ BCPL-სგან გადმოჰყვა. მისი შექმნის ძირითადი მიზანი იყო PDP-11 ტიპის კომპიუტერებისათვის ოპერაციული სისტემების შექმნა.
C (სი) მიეკუთვნება ე.წ. სტრუქტურული პროგრამირების ენებს. მასში რეალიზებულია პროგრამის სტრუქტურული წყობის ყველა აუცილებელი ელემენტი: ციკლები, ქვეპროგრამები და გადასვლის ოპერატორი. სხვათაშორის არსებობს ასეთ გამოთქმაც, რომ ეს პროგრამირების ენა საკმაო დონის კონკურენციას უწევდა Assembler-ს თავისი შესაძლებლობებით სისტემური პროგრამების შექმნაში. ამავდროს C-ს გამოჩენა იყო სტრუქტურიზირებული, ეფექტური და მაღალი დონის ენაზე არსებული მითხოვნილების პირდაპირი შედეგი.
ერთიმხრივ, სწორედ იმის გამო, რომ ეს ენა იძლევა პრაქტიკულად ყველაფრის შესაძლებლობას, იგი არ შეიძლება ჩაითვალოს საიმედო პროგრამირების ენად და მასზე შექმნილი პროგრამის საიმედოობაზე პასუხისმგებლობა მთლიანად ეკისრება ამ პროგრამის ავტორს! (ეს უკანასკნელი მოსაზრება ეხება C++-სა და თქვენ წარმოიდგინეთ Java-საც).
მოკლედ, ბაზარზე დიდი პროგრამული პროდუქტისადმი მოთხოვნა თანდათან იზრდებოდა და შედეგმაც არ დააყოვნა: მართალია C-ში უკვე იყო ჩადებული ყველა ის რესურსი რომელიც გაცილებით უადვილებდა პროგრამისტებს დიდ პროექტებზე მუშაობას მაგრამ აღმოჩნდა, რომ უკვე 25000-100000 სტრიქონიანი პროგრამა ხდებოდა იმდენად რთული, რომ მისი მთლიანობაში აღქმა ფაქტიურად შეუძლებელი იყო.
გარდა ამისა შემჩნეულ იქნა ერთი საინტერესო და პარადოქსული ფაქტი: პროგრამას, რომლის შექმნასაც ერთი პროგრამისტი ანდომებდა ერთი წელი, ორი პროგრამისტი იგივე პროგრამას ვერ წერდა ნახევარი წლის განმავლობაში; ესე იგი საქმე გვქონდა არსებითად კომპიუტერულ ბარიერთან და არა ადამიანურ მომენტებთან.
. . . და იშვა ოოპ-ი.
- ანუ იგივე ობიექტურად-ორიენტირებული პროგრამირება.
იგი თავის თავში გულისხმობს მონაცემთა ისეთ სტრუქტურას, როდესაც პროგრამისტს აღარ სჭირდება გარკვეული პროცედურების არა თუ ხელახლა აღწერა არამედ ხელახლა გამოძახება და ერთხელ შექმნილი ესა თუ ის კოდი ავტომატურად გამოიყენება უამრავი ინტერფეისისათვის(მემკვიდრეობა). გარდა ამისა მონაცემთა ასეთი სტრუქტურა ძალიან ეფექტურად ამცირებს პროგრამულ კოდში შეცდომების დაშვების ალბათობას(ინკაფსულაცია).
ოოპ-ი დამყარებულია შემდეგ 3 ძირითად პარადიგმაზე: ინკაფსულაცია, მემკვიდრეობა და პოლიმორფიზმი. ამ ყველაფრის აქ განხილვა სცილდება ჩვენი თემის საზღვრებს, როგორც გადატანითი ასევე პირდაპირი მნიშვნელობით J.
მოკლედ, ამ მოვლენებთან ერთად გაჩნდა იმის მოთხოვნილებაც, რომ ოოპ-ის პრინციპები რეალიზებულიყო პროგრამირების ენებშიც. ასეთი, ერთ-ერთი პირველი ენათაგანი გახდა ეს ჩვენი ლეგენდარული C++.
აი რას წერენ ამ საკითხში ჩემზე გაცილებით უფრო ბევრად გათვითცნობიერებული პროგრამისტები:
- C++ არის უნივერსალური პროგრამირების ენა და მოფიქრებულია იმ მიზნით, რომ პროგრამირება სერიოზული პროგრამისტისათვის გახდეს უფრო სასიამოვნო. მეორეხარისხოვანი დეტალების გარდა C++ არის C-ს ზესიმრავლე, ესე იგი C++ თავის თავში მოიცავს C-ს.
- C++ ჩაფიქრებულ იქნა ისეთ ენად, რომელიც:
1. იქნება C-ზე უკეთესი
2. განახორციელებს მონაცემთა აბსტრაქციას
3. განახორციელებს ოოპ-ის პრინციპებს.
ამ ენის ავტორი არის ბატონი ბიარნ სტრაუსტრუპი. მან ეს საქმე ჩაიდინა 1979 წელს, მაგრამ გაგიკვირდებათ და სახელად მისთვის C++ არ დაურქმევია არამედ უწოდა “C კლასებით”. ამ სახელიდან ცხადია რომ ლაპარაკია პროგრამირების ენა C-ზე, რომელსაც დაემატა რაღაც კლასები (ბევრი სხვა რამეც შეიცვალა, მაგრამ ამ შემთხვევაში მთავარი სწორედ ეს არის), თვითონ კლასი კი წარმოადგენს საბაზისო მცნებას C++-ში. სხვათაშორის კლასის კონცეფცია მან მიიღო ასეთი ენისაგან Simula67.
ხოლო თანამედროვე სახელი (C++) დაერქვა ვინმე რიკ მასსიტის მიერ 1983 წელს. ეს სახელი ასახავს C-ს ევოლუციურ ხასიათს. დასახელება C+ იქნებოდა სინტაქსური შეცდომა (გასაგებია იმათთვის ვინც C++-ს იცნობს), გარდა ამისა ეს სახელი უკვე ჰქვია სხვა ენას. ენამ არ მიიღო დასახელება D, რადგან იგი წარმოადგენს C-ს გაფართოებას და მასში არ წყდება ზემოთ ნახსენები პრობლემები C-ს შესაძლებლობების უარყოფის ხარჯზე.
1980 წლის შემდეგ გამოვიდა C++-ის ორი არსებითად მოდერნიზირებული ვარიანტი, 1985 და 1990 წლებში. მისი სტანდარტი დადგინდა 1997 წელს ANSI და ISO-ს ორგანიზაციების მიერ.
შეგვიძლია დავასკვნათ, რომ პროგრამირების ენა C++ თავის თავში შეიცავს გარკვეული რაოდენობის პროგრამირების ენების ევოლუციას და იგი წარმოადგენს მრავალმხრივი დანიშნულების ენას; რამდენადაც ეს ენა თავისის საფუძველი ენით-C-თი ახლოს არის კომპიუტერის HardWare ნაწილთან, იმდენად იგი თავისი ობიექტურად-ორიენტულობით ახლოა ამ თუ იმ ამოცანის ეფექტურ გადაწყვეტასთან. მაგრამ, რა თქმა უნდა C++-მა აუცილებლად “იზრუნა” იმაზე რომ ამის საფასურად ადამიანისთვის რაღაც წაერთმია და გააკეთა კიდეც ეს – ის სხვა ენებთან შედარებით ნაკლებათ იწუხებს თავს და ნაკლებად გამოაქვს შეტყობინება შეცდომის შესახებ მაგალითად მაშინ, როდესაც მის ცვლადს მივაყენებთ შეურაწყოფას და გადავაჭარბებთ მისთვის გამოყოფილ მეხსიერების განსაზღვრის არეს. ასე, რომ პროგრამის მთელი პატიოსანი ყოფაქცევა გადადის პროგრამისტის ნერვებზე.
აი, სულ ეს იყო რისი თქმაც მინდოდა.
ცხადია არ მაქვს იმის პრეტენზია რომ სტატიაში მოყვანილი ინფორმაცია ამომწურავია, მაგრამ ნამდვილად საკმარისია იმისათვის, რომ გავიგოთ თუ რას გვიპირებს ეს ენა თუკი დავიწყებთ კომპიუტერთან მისი საშუალებით ლაპარაკს; აი თქვენ ციტატაც:
“ენა აყალიბებს ჩვენი აზროვნების წესს და განსაზღვრავს იმას თუ რაზე შეიძლება ვიფიქროთ!”- ვინმე ბ.ლ. ვორფი.
რეზიუმე
C -> C++
ავტორი: გიორგი ბაწაშვილი (G3B)
აღდგენილია სტატიის საწყისი ვარიანტი