Писал съм близко до 900 думи, а в Google Forms не може да имаш нови редови и някакви специални форматирания (или поне самия въпрос не приема). Предоставям линк от който може да се чете приятно: [e55.syndamia.com/compilers-form.html](e55.syndamia.com/compilers-form.html). Също anonymity be damned, на края съм поставил връзки, предпочитам да продължим дискусия върху тези неща, отколкото да остане като случайно реещо се мнение. Ще разделя мнението си на две теми: относно курса като избираема, и относно самата материя в курса. ## Относно избираемата Курсът ще остане като един от най-добрите, които съм посещавал във ФМИ. Сравнявайки с други предмети които съм имал, намирам това да се дължи на няколко ключови характеристики, всички от които едновременно присъстват. ### 1) Активност на преподаване Имал съм предмети, чиято тема ме интересува много, обаче материалът се преподава твърде бавно, твърде тегаво, понякога даже самата материя клони към неща, които не са супер релевантни (все едно по компилатори да бяхме отделили половината курс върху асмебли и как процесорите работят). Това имам предвид под ниска активност на преподаване: самия преподавател колко се стреми да ти обясни темата. Обаче в компилатори си се движехме смело през материала, винаги on the point. Самия стил на преподаване беше повече "искам да ви обясня това нещо" отколкото "това е материала, който трябва да научите". Това за мен е висока активност на преподаване. ### 2) Практическа насоченост ФМИ, може би като повечето университети по света, има много добри дисциплини и много добри преподаватели, свързани с теоретични теми, обаче от към гледна точка на практика е доста слабо положението. Не че не може да научиш никакво програмиране, напротив, обаче според мен университета е в перфектната позиция да изучаваме конкретни "програмирания", които изискват теоретическа основа. Увод в програмирането, обектно ориентирано програмиране, Java, Swift, за тези теми си има безброй безплатни курсове онлайн, има си платени в SoftUni, Telerik Academy (да, ясно че във ФМИ ги разглеждаме по по-различен начин, ама пак). Компилаторите като тема е перфектна за университет, когато се разгледа приблизително 50/50 теория и практика, който баланс според мен тази избираема успя да спази през повечето време. ### 3) Подбран материал и материали Структурата на изучаване материал беше супер: минахме през най-важните компоненти на един компилатор, всичко си беше в реда в който очакваш и преминаването между теми беше плавно (смислово). Имал съм предмети, чиято тема също е огромна, обаче изолирано се фокусираме върху 1-2 аспекта, и накрая оставаме с големи дупки във фундамента на предмета (все едно по компилатори да бяхме отделили 75% от курса върху всевъзможни парсъри, и последните 25% да говорим за GC). Също съм имал предмети, чиито материали (записки/презентации от лекции) са твърде неточни за самоподготовка, или пък имат огромни грешки в тях (които на лекции не присъстват). Може би съм разглезен от много и добри лекционни записки, които доста преподаватели правят, имайки предвид че в други университети/факултети това не присъства под никаква форма, но все пак си ги искам. Разбира се, в тази избираема даже бих казал, че се престарахте ("как да започнем" е божествен материал). ### Бонус) Упражненията Макар че това е повече част от "активността на преподаване" и не бих казал, че всяка дисциплина се нуждае от това, според мен упражненията бяха доста специални. В повечето предмети упражнение означава "ето ви 10 задачи да решавате, до къде сте, това ти е грешката тука, чао", докато при компилатори имаше доста повече дискусии и разглеждане на свързани теми. ## Относно материала Сега, относно самата материя, която вземахме. Като теми беше супер, може би щеше да е готино да говорим за интерпретатори, just in time compilation, някакви конкретики при чисто функционално програмиране или други парадигми, но не виждам много място, където да се поберат. Самият език COOL е доста интересен като идея, но сякаш не беше винаги добър избор, особено когато трябваше да се занимаваме с операционна семантика. Самото количество писане беше твърде много като стигнахме до 3та и 4та част от курсовата (за 3тата съм чувал колеги да се оплакват от решения, чиито размер приближава 1000 реда). Струва ми се по-продуктивно курсовите да наблягат до нещо, което сам трябва да се сетиш, отколкото до машинално писане, примерно да бяха направени всички правила, без 5 много сложни, и да се налага ние сами да измислим правилото и да го имплементираме. Обаче повече бих казал, че това е повече проблем на ООП-то като парадигма, отколкото на конкретния език. Вече доколко това е вярно, какви други парадигми са по-добри и такива подробности, не мога да кажа, минал съм само въведение в компилаторите :) ## Относно "Ако можехте да изберете език който да използвате вместо C++ за реализация на курсовата работа, кой бихте избрали?" Като цяло езикът за програмиране не е от голямо значение, Java/Go/Rust ми се струват същата боза, с доста малки технически плюсове и минуси. Python/JavaScript са интерпретирани езици и са твърде high-level. Има аргумент, че ще улесни разработката на компилатора, ще остави повече да се мисли върху него, отколкото как да се справим с езика, ама ми се струва твърде далече от есенцията на писане на компилатор, все едно да разработвахме драйвър за Линукс ядрото, обаче чрез WSL на Windows. Haskell е интересна идея, проблемът е че при него се изисква твърде много разбиране в езика и твърде много (математическо) теоретично познание, за да може да си направиш ефективно задачите. Интересен е разговорът за други по-обикновени функционални езици, като Racket/Scheme, или дори по-итеративни варианти на Lisp като Common Lisp, ама доколкото виждам на практика никой не ги ползва за такива цели, така че може би е тема за друга избираема. С++ изглежда да е перфектната опция, все пак почти всички компилатори са написани на него. Единствения опонент може да бъде C, но със сигурност ще е по-трудно и ще изисква повече писане на него, така че предполагам е по-лошия вариант. --- От Камен, връзки на [syndamia.com/about/](https://syndamia.com/about/) Направено с [pandoc](https://pandoc.org/), защото няма удобно място да го сложа на самия сайт.