Розробка модульної системи програмування

Створення власної мови програмування — бажання багатьох програмістів. Зараз дана задача нескладно здійсненна. Справа в тому, що викладання програмування у фізико-математичних СУЗах має високий рівень. Не можу не відзначити методику В. Р. Дединского і його графічну бібліотеку TXLib(Dump The Artist Lobrary). Вона має сугубий мінімалізм і подтолкновение людини на do-it-yourself.

Але перейдемо до системи. Вона включає:

1) Графічний движок(спочатку хотів використовувати TXLib;
2) Стек даних;
3) Числову систему команд;
4) Виконавець програми;
5) Парсер;
6) Середовище.

Система розроблена на C++(Середа — на C#).

Перейдемо до першого модулю.

Графічний движок. Самі розумієте, що найкраще використовувати OpenGL, але моя суворість не знала спокою і я написав її, використовуючи вектори і WinAPI.

Для початку треба розробити 2D-графічний движок, потім можна додати ще один шар на вікні і фактично 3D готово. Конкретно движок включає в себе досить багато структур для спрощення життя вам же самим. Раджу зробити структури:

а) Структура вікна. Повинна містити дескриптор графічного вікна, полотна, id вікна;
б) Структура малювання. Вона в основному складається з ручки(HPEN), кисті(NBRUSH) і так званої старої кисті і ручки(HGDIOBJ);
в) Структура даних модуля(версія, ревізія і т. д.)

Раджу до движка зробити функцію Update(оновлює вікна).

Пропозиція по реалізації:

Зробити вектор memory(невизначеного розміру), константные коди примітивів графіки (кола, еліпса, лінії, прямокутника і багатокутника). При виклику функції відтворення або перемикання на інше вікно зберігати в пам'яті. А в функції update читати код операції, дивитися, скільки у неї параметрів, отримувати їх і потім відтворювати з отриманими аргументами.

На цьому закінчу говорити про движок графіки.

Тепер поговоримо про стек.

Отже, в моєму компіляторі є клас Stack, в приватних змінних — вектор команд, аргументів, вектор рядків і лічильники збереження. Так як я не довіряю штатним функцій, окремо зроблені (в паблике, звичайно) push, pop, dump, pushString, popSring.

Тепер розповім, як вони працюють.

Push присвоює елементу вектора з id push_count значення введене в аргумент функції. (І, звичайно збільшує push_count на 1).
Pop присвоює останнього елемента значення 0, і зменшує push_count на 1.
Dump виводить стан стека і всі його змінні.
pushString і popString працюють анологично push і pop, але тільки з вектором рядків.

Про стек ще додам, що всі поміщено в привіт, щоб не можна було, скажімо, так попсувати стек, створити константну область, з можливістю зміни штатними функціями класу.

Тепер скажу про команди.

Це просто константи, які зберігаються в стек і мають чисельний вид.
Далі все працює як з графічним update, робимо в стеку функцію get з аргументом id, яка повертає об'єкт data (пам'ять стека) з номером id.

Про виконавець.
Беремо функцією get перший елемент стека, отримуємо аргументи і переходимо до наступного аргументу.

Парсер читає з файлу команду, pushит в стек код операції, бере аргументи. Якщо команди немає, то відправляє в лог помилку про відсутність команди і завершує процес компіляції. Додам лише про створення окремої змінної: пушим команду створення, зберігаємо ім'я, перевіряємо наступний знак, якщо це '=', то присвеваем наступне за знаком значення, якщо ',', то зберегти тип, зберегти ім'я і так поки знак не дорівнює ';'.

Фактично все про парсере.

Про середовищі скажу тільки, що там дуже багато всього і пишеться це на іншій мові. Не хочу сьогодні середовищем плавити мозок, про неї буде розказано в другій частині статті.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.