Friday, July 29, 2016

Програмчлалын гурван ойлголт

Сүүлийн 40 жилд, техник технологи хөгжихийн хэрээр, компьютерийн хүчин чадал арвын 20 зэргээр үржүүлсний дайтай нэмэгдэж, тухайн үедээ тооцооллын мангас гэгдэж байсан 70аад оны фреон хөргүүртэй супер компьютер, одоо бидний алганд багтахаар болчихож. Тэрийг нь бид гар утас болгон ашиглаж, дээр нь Angry Birds (Candy Crash) тоглож байна.

Гэвч энэ 40 жилд, програм хангамжийн салбар тэгтлээ их өөрчлөгдсөнгүй. Бид 60-аад онд ч ашиглаж байсан нөгөө л нэг if нөхцөл, while давталт, утга оноох үйлдлээ одоо ч бичсээр л байна. Хэрэв цаг хугацаагаар аялж 1960 оны үеийн програмистыг одоо үед авчраад laptop бариулан код бич гэвэл, нээх удалгүй бичиж л орхино (яахав шокноосоо гарах гэж хэдэн цаг болох байх л даа). Консепт нь бараг өөрчлөгдөөгүй гэсэн үг.

Харин яг “код бичихтэй” холбоотой гурван янзын өөрчлөлт гарсан байдаг. 40 гаран жилийн өмнө ар араасаа цувран гарч, бидний код бичих аргыг эвдсэн эдгээр өөрлчлөлтүүдийг програмчлалын ойлголт/загвар/парадигм гэж нэрлэж болно.

1968 онд, Structured Programming (SP). Edsger Dijkstra “GoTo илэрхийллээс зайлхий” болон бусад нийтлэлүүдээрээ нэг л зүйлийг санал болгож байв. Тэр нь goto-г ашиглахгүй байх, оронд нь if, while зэргийг ашиглаж програмынхаа урсгалыг хянах юм. (Програмыг тодорхой бүтэцэд оруулж, урсгал нь тэр бүтцийн дагуу явна гэсэн үг)

1966 онд, Object Oriented Programming (OOP). Ole-Johan Dahl, Kristen Nygaard хоёр Algol хэлээр оролдож байгаад, обьект-г “нээн илрүүлж”, улмаар анхны Обьект Хандалтат Хэл болох Simula-67-г зохиосон гэдэг. Хэдий энэ ололт нь олон гүнзгий утга санааг авчирч байгаа ч, үнэндээ кодонд ямар ч шинэ чадвар нэмж өгөөгүй юм. Харин ч эсрэгээрээ функцууд руу шууд заагч ашиглаж хандах боломжийг хааж оронд polymorphism-г санал болгов. (тухайн функцийг шууд дуудаад ажиллуулчихаж болохгүй, ямар class-н instance вэ гэдгээс нь хамаарч тэр функцийнхээ өөр хувилбаруудаас дуудна гэсэн)

1957 онд, Functional Programming (FP). Alonzo Church-н 30-аад онд томъёолсон Lambda Calculus дээр үндэслэж, John McCarthy анхны функиональ хэл болох Lisp-г зохиожээ. FP мөн ялгаагүй олон шинэ утга санаа авчирсан ч бас л нэг хязгаарлалттай. Утга оноох үйлдэлийг ашиглаж болохгүй.

Гурван ойлголт гурван хязгаарлалтыг дагуулна. SP нь goto-г, OOP нь функцуудын заагчийг (function pointer), FP нь утга оноохыг... Гурвуул шинэ юм нэмэхгүй мөртөө ямар нэг юм хасна. Дэг журмыг (сахилга батыг) нь ихэсгэж, боломжийг нь багасгана...

Бидэнд дахиад шинэ ойлголт гарч ирэх болов уу? Өөрөөр хэлбэл одоо хасах юм үлдсэн болов уу? Сүүлийн 40 жилд шинээр ойлголт гарч ирээгүйг бодоход, ер нь л гарч ирэхгүй нь бололтой.

Тэгвэл бид эдгээрийг бүгдийг нь ашиглах ёстой юу? Бүгд тийм хэрэгтэй гэж үү... Шинээр хэлүүд зохиогдохын хэрээр, goto-г халж, функц заагчийн оронд polymorphism-г нэвтрүүлээд эхэллээ. Ингэснээр бид хүссэн хүсээгүй эхний 2ыг аль хэдийн ашиглаад эхэлсэн гэсэн үг.

Үлдэж байгаа нь функциональ програмчлал... Ингэхэд бидэнд нэг ч утга оноохгүйгээр код бичих шаардлага гарах болов уу? Магадгүй... Хэдийн олон-цөмтэй процессор дээр код бичээд эхэлсэнийг харахад тийм л бололтой. Ядаж байхад цөмийнх нь тоо нь туулай шиг үржихийг нь яана... Миний одоо ашиглаж байгаа лаптоп маань 4 цөмтэй, дараагийн авах лаптоп маань бодвол 8 цөмтэй байх боловуу... Тэрний дараагийнх нь 16… Гэх мэтээр явсаар нэг мэдэхэд л бид bus-руу зэрэг зэрэг уралдан хандах 4096 процессор дээр код бичих шаардлагатай болно… Яаж бид үүндээр найдвартай код бичнэ ээ? Хоёрын арван хэдэн зэргээ больё гэхэд зүгээр хоёр thread-г л арай хийж зэрэг ажиллуулж байна шүү дээ...

Эндээс аврах гарц нь функциональ програмчлал юм. Яаж гэж үү? Хариулт нь их энгийн, утга оноох үйлдэл байдаггүй болохоор функциональ проограмчлалд гаж нөлөө (side effect) гэж байдаггүй, гаж нөлөө байхгүй болохоор хоёр өөр thread нэг хувьсагчийг засах тохиолдол (concurrent modification) гарахгүй гэсэн үг. (Ядаж л онолын түвшинд)


Жич: Энэ гурван ойлголт 50 жилийн өмнө гарсан гэхээр гайхалтай биш байна гэж үү? 50 жил шүү дээ...

No comments:

Post a Comment