Решение на Изберете си проект от Асен Леков

Обратно към всички решения

Към профила на Асен Леков

Код

# Описание на проект
# Тема: автоматизирано проверяване на домашни пинали на програмният език С
"""
Идеята е автоматично от някъде да се свалят файловете, да се компилират, да им се подават тестове или tuples от input, output за проверка на функционалността на дадената програма. След това да се направи статичен код анализ и да се върне за всеки човек някакво описание и оценяване от компилацията изпълнението и качеството на кода. Като идеята е да не се замести човешката намеса, ми по-скоро да се подсказва на преподватели какво да гледат и на какво да наблегнат.
"""
# Очакван изход за дадено проверено домашно:
"""
Evaluating Task 1 of {name} {id} {some other info}:
Compiling: OK!
Input/Output: OK!
Check comments: OK!
Check statements: OK!
Check if/else constructions: OK!
Check if/else blocks: OK!
Check indentation: OK!
Check conditions: OK!
Оценка на програмата:
* Кода не е форматиран (липсват табулации/нови редове)
* Липсва конвенция за променливите
* Твърде много if конструкции
* Твърде сложни if условия
* Твърде усложнени функции и стейтмънти
редове от .. до ...
"""
"""
Иска ми се да наблегна на правилното парсване на кода, а функционалността за статичен анализ да са по-скоро плъгини, за да мога в рамките на проекта да направя плъгин архитектура и да демонстрирам с няколко по-прости плъгина.
"""
# Въпроси
"""
* Какво да разгледам за да си имплементирам добър парсър за кода? (Мисля си да го парсвам на блокове със разни стекове)
* Как и къде мога да използвам според вас паралелизъм и дали ще е добра идея?
* Да го направя ли уеб или да се придържам към command line utility? За уеб мисля да ползвам Django
* Какво мога да използвам за фина конфигурация на всяко домашно? (filename pattern, reports output dir etc.., някакви броячи като 'домашно {counter}' и подобни)
"""

История (1 версия и 2 коментара)

Асен обнови решението на 21.04.2015 15:33 (преди около 9 години)

+# Описание на проект
+# Тема: автоматизирано проверяване на домашни пинали на програмният език С
+
+"""
+Идеята е автоматично от някъде да се свалят файловете, да се компилират, да им се подават тестове или tuples от input, output за проверка на функционалността на дадената програма. След това да се направи статичен код анализ и да се върне за всеки човек някакво описание и оценяване от компилацията изпълнението и качеството на кода. Като идеята е да не се замести човешката намеса, ми по-скоро да се подсказва на преподватели какво да гледат и на какво да наблегнат.
+"""
+
+# Очакван изход за дадено проверено домашно:
+
+"""
+Evaluating Task 1 of {name} {id} {some other info}:
+
+Compiling: OK!
+Input/Output: OK!
+
+Check comments: OK!
+Check statements: OK!
+Check if/else constructions: OK!
+Check if/else blocks: OK!
+Check indentation: OK!
+Check conditions: OK!
+
+Оценка на програмата:
+* Кода не е форматиран (липсват табулации/нови редове)
+* Липсва конвенция за променливите
+* Твърде много if конструкции
+* Твърде сложни if условия
+* Твърде усложнени функции и стейтмънти
+редове от .. до ...
+"""
+
+"""
+Иска ми се да наблегна на правилното парсване на кода, а функционалността за статичен анализ да са по-скоро плъгини, за да мога в рамките на проекта да направя плъгин архитектура и да демонстрирам с няколко по-прости плъгина.
+"""
+
+# Въпроси
+"""
+* Какво да разгледам за да си имплементирам добър парсър за кода? (Мисля си да го парсвам на блокове със разни стекове)
+* Как и къде мога да използвам според вас паралелизъм и дали ще е добра идея?
+* Да го направя ли уеб или да се придържам към command line utility? За уеб мисля да ползвам Django
+* Какво мога да използвам за фина конфигурация на всяко домашно? (filename pattern, reports output dir etc.., някакви броячи като 'домашно {counter}' и подобни)
+"""

Интересна идея, но помисли как ще го sandbox-неш цялото това нещо. Не е яко някой да затрие всички файлове и директории, до които има достъп, рестартира машината и т.н. Все пак ще е на C. С него си твърде близо до hardware-а и можеш да нанесеш покъртителен брой щети за отрицателно време.

  • Какво да разгледам за да си имплементирам добър парсър за кода?

Нямам добър отговор на това. Не съм си играл с парсване на код в python

  • Как и къде мога да използвам според вас паралелизъм и дали ще е добра идея?

Ами можеш паралелно да компилираш и изпълняваш няколко решения, но това бих го направил като optional аргумент, тъй като би било полезно, само ако в домашните не се създават нови процеси. Дори и да разпалелиш компилацията е сложно, тъй като могат да се правят магарии в C по това време. В най-лошия случай можеш да разпапелиш само статичния анализ. Пускаш го върху всички решения на толкова нишки, колкото имаш.

  • Да го направя ли уеб или да се придържам към command line utility? За уеб мисля да ползвам Django

За нас по-важното е ядрото на проекта да не е обвързано с UI-а. Т.е. ок сме да минеш само с един UI, но той да бъде заместваем. Аз бих почнал с command line utility. Иначе Django е overkill за нещо такова. Flask би ти бил далеч по-полезен.

  • Какво мога да използвам за фина конфигурация на всяко домашно? (filename pattern, reports output dir etc.., някакви броячи като 'домашно {counter}' и подобни)

Ами избери си формат за дефиниране на домашните. Примерно yaml или toml. Там можеш да конфигурираш тези неща плюс: максимална сложност, брой if-а на функция/решения, максимален брой редове код във функция и т.н. Виж как ние си дефинираме лекциите, които публикуваме в `python-lectures хранилището. Ползваме един yaml, където посочваме дата, име и файл на лекцията.

Между другото като иде реч за C, аз не бих използвал много идеята за максимален брой редове във функция. Има безброй примери за неща, които са далеч по-четими на 100 от колкото на 20 реда. Просто бих го ползвал за някаква абсурдна горна граница като 500 реда код за quick sort примерно. Все пак го смятам за интересна задача.

Здравей,

Възможно ли е да изменя малко идеята си за проекта?

Искам вместо да се концентрирам за статичния код анализ, защото се забатачих с някакви абстрактни синтактични дървета с pycparser и стандартната библиотека, а все пак знания по питон ще демонстрираме...Та дали ще може да се фокусирам върху цялата организация на процеса по предаване и проверяване на домашни, от самото записване за даден курс например.

Записване чрез Google Forms, парсване и създаване на списъци с потребители и техните хранилича. Сваляне на хранилища, проверяване дали последния комит е направен в срок на домашното. Компилация на кода, извеждане на резултата от clang компилацията (тя прави някакъв статичен анализ) нещо в тази насока?

Благодаря!