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 жил шүү дээ...

Friday, July 22, 2016

Амьдрал дээр хэзээ ч хэрэглэхгүй геометр, утга зохиол (шекспир) гэхмэт хичээлүүдийг яагаад үзэх ёстой гэж?

Хэдэн жилийн өмнө би олны танил нэгэн эмэгтэй жүжигчний оролцсон ярилцлагыг үзэж байсан юм. Тэрээр цөмийн эрчим хүчийг буруушааж, 3-Mile Island-д болсон явдалтай холбоотой хэдэн баримт дэлгэж байв. Хэсэг сонсож байгаад сэтгүүлч түүний яриад байгаа баримтууд нь ямар ч үнэний оргүй гэдгийг нь хэлэхэд бүсгүй ихэд дургүйцэж “Үнэн худал нь биш, төрсөн сэтгэгдэл нь чухал шд” гэж байж билээ.

Олон хүн (бараг ихэнх хүмүүс) амьдралд иймэрхүү байдлаар ханддаг. Энэний талаар Alan Cromer “Uncommon Sense” номондоо гайхамшигтайгаар тодорхойлсон байдаг. Хүмүүс ихэвчлэн, тооцоолж бодсон шинжилгээнд биш, төрсөн сэтгэгдэл мэдрэмжиндээ тулгуурлаж шийдвэр гаргадаг. Үнэндээ “сайн шийдвэр гаргах”-тай, “зөн билэгтээ найдах” шиг их зөрчилддөг зүйл гэж үгүй.

Миний бодлоор, хүнийг үр бүтээлтэй амжилттай амьдрахад, Геометр Шекспир 2 л хамгийн чухал хичээлийг заадаг мэт. Хэрэв зөв заавал, эдгээр хичээлүүд нь чамайг яаж бодоход, яаж өгөгдөл цуглуулахад, яаж тэднийгээ шинжлэхэд мөн яаж дүгнэлт хийхэд сургадаг юм. Berkeley Их сургуулийн Проф. Hugh Richmond-н заадаг Шекспир-н хичээл миний хувьд хамгийн соонирхолтой нь байлаа. Хэдий би Berkeley-д Физик-н Ph.D-р сурч байсанч энэ хичээл надад маш чухал байсан учир, би бүх лекцэнд нь сууж, бүх унших даалгаварыг гүйцээсэн юм. Тиймдээ ч би профессор Richmond-г харах бүрдээ түүний энэ хичээлд нь баярлаж явдагаа хэлдэг байлаа. Хүний ертөцийн талаар эсвэл биднийг итгүүлэн, даган биширтэл бичих Шекспирын энэ арга барилын талаар өөр ямар ч хичээл надад ийм гүнзгий ойлголтыг өгөөгүй юм.

Антонийн алдартай яриа-г сана л даа, яаж тэр үгээрээ үймсэн олныг өөрийнхөө араас дагуулж байлаа? Өөр ямар хичээл чамд ийм юм зааж байв? Энэ чиний ирээдүйд хэрэг болох чадвар биш гэж үү? Өөрөөр асууя л даа, энэнээс илүү чухал чадвар бий гэж үү?

Антоний яаж тэгж байгаа нь ч биш, ерөөсөө тэгж чадаж байгаа гэдэг нь л өөрөө гайхамшигтай юм. Энийг тогтоож аваарай, тэгвэл физик эсвэл инженерийн ангиас хэзээ ч олж авахгүй амьдралын тэр л талыг мэдэж авах болно.

Бичиглэлийн хувьд… Шекспир энэ салбарын стандартыг тогтоосон юм… Зүгээр нэг уран цэцэн үгсээр биш, харин чамд юу ойлгох ёстойг чинь шууд л ойлгуулах тийм тодорхой оновчтой үгсээр. Тийм ч учраас яг эх хувилбарыг нь олж унших (жүжгийг нь үзэх) хэрэгтэй юм. Зүгээр шалгалтын асуултанд зориулж товчилсон тойм, сурах бичигүүдийг биш шүү, яг эх хувилбарыг нь...

Амьдралын тухай, хайрын тухай “Much Ado About Nothing”-с юу сурснаа сана даа? Яаж бие бие үздэггүй байсан хоёр хүн өөрчлөгдөж, нэг нэгнээ гүн гүнзгий мэдэрч хайрлан дурлаж байгааг… гэх зэргээр бичээд байвал бичээд л байна… Хэрэв Шекспирийнхээ хичээлд сайн суусан бол чи ч бас ойлгож л байгаа байх. Шекспирийнхтэй харьцуулах хэмжээний бусад алдартай зохиолууд ч бас бий. Жишээ нь би “Дайн ба Энх” гэх мэт Оросын зохиолуудад дуртай. Заримдаа “Moby Dick”-г дахин нээж умбах үе ч байна.

Геомтер биднийг логик сэтгэлгээнд сургадаг, дүгнэлт гаргана гэж яадгийг, үнэн гэж юуг хэлэх, зөв буруу гэдгийг нь яаж шалгах талаар. Бодит амьдрал дээрх зүйлс тэр болгон бидний геометрт хэрэглэдэг шиг энгийн теоремд буух боломжгүй байдаг. Гэхдээ энэ ухаанд суралцснаар бид, зарим зүйлс үнэн байдгийг, зарим таамаг худлаа гэдгийг мөн анхааралтай сэтгэж шинжилсний дүнд үнэн худлын ялгааг олох боломжтойг (байнга биш ч) мэдэж авдаг.

Мэдээж энэ хичээлүүдээс тодорхой хэмжээнд л юм сурна. Энэ хичээлүүд нь логик сэтгэлгээний талаар, утга зохиолын талаар, тууж жүжгийн талаар, хүмүүсийн болон итгэл үнэмшлийн талаар, баримтад суурилсан мэдлэгийн талаар амьдралынхаа туршид суралцахад, амьдралынхаа туршид хөгжиж боловсроход хөшүүргийн л үүрэгтэй юм. Хорь гучин жил ингээд суралцчих, дараа нь чи өөрөө ойлгоод ирнэ. Бас хүрээлэн байгаа ертөнцөөө хянах нөлөөлөх чадвартай болоод ирнэ ...

Дээр хэлсэн эмэгтэй хэрэв геометр үзсэн байсан бол, тэр үнэн худлын талаар ингэж дураараа ярихгүй л байсан байх. Хэрэв тэр шекспирийг судалсан бол, төрсөн сэтгэгдэлдээ бүрэн найдах талаар тэгж хамаагүй ярихгүй л байсан байх.

Нас дээр гарчихсан хойно хорвоо чамд ойлгомжгүй санагдаж байгаа бол, чи өөрөө ямар ч хүч чадалгүй мэт, яг л амьдрал чамаар тохуурхаад байгаа мэт санагдаж байгаа бол, магадгүй чи залуудаа шекспир юм уу геометрийг судлаагүйнх байх. Эсвэл чи тунгааж өөрийн болголгүй зүгээр л нэг чихээрээ оруулаад нөгөө чихээрээ гаргасных байх.

Эх хувилбар:
http://qr.ae/1ZD2bt