Algoritmlashga kirish

Dasturlash musobaqalari uchun eng yaxshi tillar.

"It matters little how much equipment we use; it matters much that we be masters of all we do use." - Sam Abell.
"Muhimi qancha uskuna ishlatishimizda emas; muhimi - biz o'zimizdagi uskunalarni qanchalik yaxshi ishlata olishimizda" - Sam Abell.

Hozirgi kunga kelib, dasturlash musobaqalarida qatnashishda yoki biror algoritmni o'rganishda, albatta, dasturlash tili u darajada katta ahamiyat kasb etmasligi mumkin. Chunki hozirgi paytda aynan shunday musobaqalarni o'tkazuvchi Codeforces yoki TopCoder kabi platformalar 10 dan ortiq turli tillarni va ularning har versiyalarini ishlatishga imkon yaratib qo'ygan. Lekin shunday bo'lsada, bunday musobaqalarda ba'zi bir tillar boshqalariga qaraganda yaqqol ko'proq ishlatiladi. Biz ham "Ish quroling soz bo'lsa, mashaqqating oz bo'lur" maqoliga amal qilgan holda o'z darslarimizda qaysi tillardan foydalanishni va nima uchun aynan ularni tanlaganimizga to'xtalib o'tmoqchimiz.

I. C/C++

Shak-shubhasiz birinchi o'rinda C va C++ tillari birgalikda. Ular alohida tillar hisoblansada, amalda ular aralash holda ishlatiladi. C++ tili C ustiga qurilgan, shuning uchun uning sintaksisi va kutubxonalarini bemalol C++ da ishlatish mumkin. Dasturlash musobaqalarida C++ tili eng ko'p ishlatiladigan dasturlash tili hisoblanadi (ishlatilish ko'rsatkichi 79% atrofida).

C++ ning kuchli taraflarini keltirib o'tamiz:

  • Asosiy algoritmlar uchun judayam keng tayyor kutubxonalar mavjudligi (Standard Template Library yoki qisqacha STL). lower_bound, binary_search, max_element, distance kabi tayyor funksiyalar dasturchilar hayotini ancha yengillashtiradi va dasturlash olimpiadalarida yozilishi kerak bo'lgan kod hajmini sezilarli hajmda kamaytiradi.
  • C++ tili yuqori darajali dasturlash tillari ichida eng tezi hisoblanadi. Kontestlarda tuzilgan dastur tez ishlashi va javob chiqarishi juda muhim, buning uchun o'rtacha 1 sekund (ba'zan 2 sekund) vaqt beriladi. Ba'zida Pythonda yozilgan kod vaqt limitiga javob berolmagan holatda, huddi shu kodni C++ dagi varianti testlardan o'tib ketish holatlari kuzatiladi. C++ bu borada Javani ham ortda qoldiradi.

Bundan tashqari C va C++ tillari ko'p boshqa tillar yaratilishida (Java va Python ham shu qatorda) asos bo'lib xizmat qilgan. Shularni inobatga olgan holda biz ham darslarimizda C++ dan asosiy realizatsiya tili sifatida foydalanamiz.

II. Java

Javani 2-o'ringa joylashtirganim uchun balki Pythondan uzr so'rashim kerakdir. Lekin bunga bir qancha sabablar bor albatta. Java ham C/C++ ga o'xshab kompilyatsiya bo'ladigan tillar sirasiga kiradi va shu sababli u ham interpretatsiya bo'ladigan Pythondan ko'ra tezroq ishlaydi.

Demak, Javaning ustunliklari:

  • Judayam keng Ma'lumotlar tuzilmalari. C++ ham bu borada Javadan qolishmasada, Java - bu birinchi to'laqonli Obyektga yo'naltirilgan dasturlash tili. Ya'ni Javadagi barcha narsalar klasslar va obyektlar orqali ifoda qilinadi. Bu narsa esa dasturchiga tayyor holdagi Ma'lumotlar tuzilmalaridan (List, Map, Tree va hokazolar) tashqari o'zi erkin tarzda qo'shimcha qo'shishlari mumkin.
  • Run time paytidagi xatolarni oson aniqlashtira olish imkoniyati. Dastur ishlash paytidagi xatolarni (Run Time Exceptions) Javaning xatolarni ushlash uchun ishlab chiqilgan StackTrace mexanizmi orqali kodning aynan qaysi qismida bo'layotganini aniq bilish mumkin. Bu narsa hatto C++ dan ham yaxshiroq ishlaydi.
  • BigInteger klassi. Bu klass imkoniyatlari bilan uzun sonlarga oid masalalarni (masalan, 100! ni hisoblashni) osongina hal qilish mumkin. Lekin, ba'zi mutaxassislar bu klass funksiyalari yetarli darajada tez ishlamaydi deb hisoblashadi.
  • Geometriya masalalarini yechishdagi qulayliklar. Javadagi java.awt.geom paketi har-xil geometrik shakllar bilan bog'liq masalalarni yechishda qo'l keladi.

III. Python

So'nggi yillarda judayam tez rivojlanib, o'z soddaligi bilan dasturchilar mehrini qozongan bu tilni bu ro'yhatga qo'shmaslik katta xato bo'ladi albatta. Oddiy sintaksisga ega bo'lishiga qaramasdan hozirda matematik va sun'iy intellekt masalalarini yechishda Python oldiga tushadigani topilmaydi. Boz ustiga Pythondan hozirda dasturlash olimpiadalarida Javadan ko'ra ham ko'proq foydalanilmoqda.

Pythonning afzalliklarini ham keltirib o'tamiz:

  • Judayam ko'p tayyor funksiyalar. Pythonning o'zida ham ko'plab tayyor funksiyalar bo'lishiga qaramasdan, bu borada C++ ga teng kelolmaydi. Ammo, agar Pythonning NumPy kutubxonasini ishlatish imkoni bo'lsa, bu bilan u hatto C++ dan ham o'tib ketadi. Lekin, aksariyat musobaqalarda bu kutubxona ishlatishga yo'l qo'yilmaydi (oddiygina u bilan tuzilgan dastur ishlamaydi).
  • Kodning judayam qisqa ko'rinishda yozish mumkinligida. C++ da 3-4 qator, Javada 5-6 qator bo'lib ketadigan kodlarni Pythonda 1 yoki 2 qatorda yozib yuborish mumkin. Albatta, bu vaqt muhim bo'lgan dasturlash musobaqalarida juda qo'l keladi, ammo hayotiy dasturiy ta'minotlar tuzishda haddan ortiq kodni qisqartirish uni o'qib tushunishni va undagi xatoni topishni qiyinlashtirib yuborishi aniq.
  • Katta butun sonlar uchun hech qanday ortiqcha narsa kerak emasligi. Pythonda qo'rqmasdan 100! ni yoki 2 ning 100 darajasini hisoblash hech qanday qo'shimchasiz hisoblash mumkin. Albatta, faqat butun sonlar uchun. Buni hisoblashda u hatto Javaning BigInteger klassidan ham tezroq ishlaydi.

Pythondagi asosiy muammo uning ishlash tezligida, bu borada u C++ yoki Javadan yaqqol ortda qolib ketadi va buning unda ma'lumotlar tipizatsiyasi yo'qligi sababli, ya'ni dinamik til bo'lganligi uchun ba'zi dasturchilar undagi xatolarni topish qiyin bo'lib ketadi deb hisoblashadi.

Shaxsan men ham biror kimga Pythonni birinchi til sifatida o'rganishni tavsiya etmagan bo'lardim. Ammo, u istalgan dasturchi uchun eng yaxshi qo'shimcha til bo'la oladi.

Eng asosiysini esdan chiqarmang, dasturlash tili - bu vosita. Qanday til ishlatishingizdan qat'iy nazar eng muhim omil - bu siz, ya'ni dasturchi. O'z ustingizda ishlashdan to'xtab qolmang.

Qo'shimcha ma'lumot uchun ushbu maqolani ham o'qishingiz mumkin.

Keyingi postimizda yuqoridagi tillar uchun eng ko'p qo'llaniladigan IDElar va Matn muharrilari (Text editors) haqida gaplashamiz.