Вкр на тему «Компьютерная игра для обучения языку ассемблер школьников старших классов» Введение
Вид материала | Документы |
- Использование элективных курсов как новое направление естественнонаучной подготовки, 949.47kb.
- Учебно-методический комплекс опд. Р. 01. Теория и методика обучения русскому языку, 515.33kb.
- Методика изучения учебной мотивации по итогам обучения в 1-м классе 1 Методика изучения, 417.39kb.
- Обобщение опыта работы по проблеме «Грамматика в курсе интенсивного обучения немецкому, 75.44kb.
- Методика развития деятельностной компоненты медиакомпетентности учащихся старших классов, 402.96kb.
- Учебно-методический комплекс дисциплины введение в методику обучения русскому языку, 266.73kb.
- Методические рекомендации по разработке заданий для школьного и муниципального этапов, 171.25kb.
- Методические рекомендации по разработке заданий для школьного и муниципального этапов, 170.7kb.
- Программа факультативных занятий по французскому языку «введение в мир иностранного, 226.34kb.
- Доклад на педагогических чтениях на тему «Развитие навыков грамотного письма у обучающихся, 63.76kb.
1 2
ВКР на тему «Компьютерная игра для обучения языку ассемблер школьников старших классов»
Введение
На дворе 21й век – век высоких технологий. Сегодня, компьютер уже не роскошь, а средство связи, обучения и развлечения. Причем обучающий потенциал компьютера зачастую используется не полностью. В частности, далеко не всем нравится читать нудную документацию с экрана, всматриваясь в монитор, гораздо проще читать обычную книгу, но такую не скачаешь из интернета, её нужно ещё найти… А для обучения детей использовать кучу книг вообще не рационально, ведь ребенку каждый день приходится их носить в школу и обратно, родителям (или государству) платить за макулатуру, хранить её в библиотеках, а потом утилизировать. К тому же в отпечатанные учебники невозможно внести изменения, придется печатать заново…
Но прогресс не стоит на месте и человек становится все более эффективным, в том числе и в учебе. Теперь на смену учебникам приходят электронные системы обучения, такие как компьютер. Новые технологии позволяют использовать и новые, более эффективные, методики обучения, в частности игры. Ведь желание играть заложено в нас эволюцией не забавы ради. Даже в дикой природе, детеныши млекопитающих через игру познают окружающий их мир. Люди же, своих детей заставляют зубрить формулы и текст, естественно детям это не нравится. Но что, если процесс обучения представить в виде увлекательной игры, где целью было бы выполнение какого-либо учебного задания? Именно для этого и предназначен проект ALG.
Предметом изучения является низкоуровневый язык программирования ассемблер. Этот язык был выбран потому что, как показывает время, меняются технологии и языки программирования, но ассемблер остается неизменным и спрос на него всегда высок. Например, программисты микроконтроллеров, всегда ценились в разы выше, чем программисты прикладного программного обеспечения, использующие языки высокого уровня. Но при этом многим начинающим программистам ассемблер кажется слишком сложным для изучения. Это не так. Основной задачей обучения ставилось показать учащемуся азы программирования на ассемблере, чтобы в будущем у учащегося было объективное представление о том, что это за язык и для чего он нужен. А чтобы обучение проходило более эффективно, задания представлены в игровой форме, что должно заинтересовать учащегося и способствовать лучшему усвоению знаний. Не забыты и традиционные методы обучения, такие как справочная информация.
Глава №1. Концепция
§1. Игры в обучении
Использование игр в обучении
Пожалуй, никакое другое явление культуры так не связано с образованием, как игра. Эта связь прослеживается ещё со времён античности. Слово ludus, которое, как известно, означало у римлян “игра”, имеет и второе значение — “обучение”. Доказывать огромное значение роли и места игры в культуре человека после работы Йохана Хейзинги [1] уже нет необходимости. Также нет необходимости поднимать проблему применения игры в процессе обучения: об этом уже много говорилось и культурологами, и психологами, и педагогами, и методистами, и даже физиологами. Всем известно то место, которое занимает игра у ребёнка. “Что может быть серьёзнее для ребёнка, чем игра?” — задаёт риторический вопрос В.И. Полищук [2]. Игра развивает ребёнка. И более того, нормально развиваются именно те дети, которые играют. И дальше игра продолжает участвовать в процессе обучения, образования: развивающие игры, затем обучающие.
Игры достаточно сильно различаются по многим параметрам: областям деятельности, игровым методикам, характеру педагогического процесса, по игровой среде, целям, существуют различные их классификации. Опираясь на исследования психологов и педагогов (А.Н. Леонтьев, С.Л. Рубинштейн, Ю.К Бабанский, Д.Б. Эльконин, Т.Р. Яновская), можно выделить две большие группы игр: игры с правилами (дидактические) и творческие игры. Компьютерные игры всегда имеют правила, поэтому являются дидактическими, и хотя программирование признано искусством и его можно считать творческим процессом, игры обучающие программированию, в нашем случае, всё же являются дидактическими.
Современные компьютерные игры можно разделить на несколько типов, отличающихся друг от друга игровым процессом:
- Аркада – характеризуется высокой динамичностью происходящего на экране, большой увлекающей способностью и не требует от играющего усидчивости и больших умственных усилий. Хорошо подходит для школьников и детей дошкольного возраста.
- Головоломка – игра, в которой главная цель игрока - решить задачу-головоломку, чтобы продвинуться дальше, и перейти к следующей задаче. Характеризуется низкой динамичностью и увлекает только усидчивых детей.
- Стратегия – в играх этого жанра игрок отождествляется с управляющим некой системой и располагающим ограниченными ресурсами, при этом игрок должен не только использовать, но и развивать систему максимально эффективно.
Т.к. целевой аудиторией проекта ALG являются школьники, то чтобы повысить интерес к игре, необходимо, чтобы игра содержала в себе элементы аркады. В итоге, выбран комбинированный тип игры, а именно аркада + головоломка, чтобы учащегося было легко заинтересовать изучением серьезного предмета, такого как программирование.
§2. Язык программирования ассемблер
Ассемблер — язык программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком.
Машинный код— система команд конкретной вычислительной машины, который интерпретируется непосредственно микропроцессором или микропрограммами данной вычислительной машины. Каждая модель процессора имеет свой собственный машинный язык, хотя во многих моделях эти наборы команд имеют много общего.
«Слова» машинного языка называются машинными инструкциями. Каждая из них описывает элементарное действие, выполняемое процессором, такое как, например, «переслать байт из памяти в регистр». Программа — это просто список инструкций, последовательно выполняемых процессором.
Команды языка ассемблера один в один соответствуют командам процессора и, фактически, представляют собой удобную символьную форму записи (мнемокод) команд и их аргументов. Также язык ассемблера обеспечивает базовые программные абстракции: связывание частей программы и данныx через метки с символьными именами (при ассемблировании для каждой метки высчитывается адрес, после чего каждое вхождение метки заменяется на этот адрес) и директивы.
Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла); повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, отличный от адреса расположения в памяти; менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др.
Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера.
Достоинства языка ассемблера:
- Минимальное количество избыточного кода, то есть использование меньшего количества команд и обращений в память, позволяет увеличить скорость и уменьшить размер программы.
- Обеспечение полной совместимости и максимального использования возможностей нужной платформы: использование специальных инструкций и технических особенностей данной платформы.
- При программировании на ассемблере становятся доступными специальные возможности: непосредственный доступ к аппаратуре, портам ввода-вывода и особым регистрам процессора, а также возможность написания самомодифицирующегося кода (то есть метапрограммирование, причём без необходимости программного интерпретатора).
- Возможность создания самомодифицирующегося кода. Хотя стоит отметить, что последние технологии безопасности, внедряемые в операционные системы, не позволяют делать самомодифицирующегося кода, так как исключают одновременную возможность исполнения инструкций и запись в одном и том же участке памяти (технология WX в BSD-системах, DEP в Windows).
Недостатки языка ассемблера:
- Большие объёмы кода и большое число дополнительных мелких задач, что приводит к тому, что код становится очень сложно читать и понимать, а следовательно усложняется отладка и доработка программы, а также трудность реализации парадигм программирования и любых других соглашений, что приводит к сложности совместной разработки.
- Меньшее количество доступных библиотек, их малая совместимость между собой.
- Непереносимость на другие платформы (кроме двоично совместимых).
Применение ассемблера напрямую вытекает из его достоинств и недостатков.
Поскольку большие программы на ассемблере писать не всегда удобно, их пишут на языках высокого уровня. На ассемблере же пишут небольшие фрагменты или модули, для которых критически важны:
- быстродействие (драйверы);
- размер кода (загрузочные сектора, программное обеспечение для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты);
- специальные возможности: работа напрямую с аппаратурой или машинным кодом, то есть загрузчики операционных систем, драйверы, вирусы, системы защиты.
Поскольку на ассемблере чаще всего пишут лишь фрагменты программы, их необходимо связывать с остальными частями на других языках. Это достигается 2 основными способами:
- На этапе компиляции — вставка в программу ассемблерных фрагментов специальными директивами языка, в том числе написание процедур на языке ассемблера. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода, с данными и подпрограммами, включая подпрограммы с множеством входов и выходов, не поддерживаемых высокоуровневыми языками, с помощью него сделать нельзя.
- На этапе компоновки, или раздельная компиляция. Для взаимодействия скомпонованных модулей достаточно, чтобы связующие функции поддерживали нужные соглашения вызова (англ. calling conventions) и типы данных. Написаны же отдельные модули могут быть на любых языках, в том числе и на ассемблере.
Общепринятого стандарта для синтаксиса языков ассемблера не существует. Однако, существуют стандарты, которых придерживается большинство разработчиков языков ассемблера. Основными такими стандартами являются Intel-синтаксис и AT&T-синтаксис.
К командам языка ассемблер относят (примеры приведены для микропроцессора архитектуры x86):
- Команды пересылания данных (mov, lea т.д.)
- Арифметичекие команды (add, sub, imul и т.д.)
- Логические и побитовые операции (or, and, xor, shr т.д.)
- Команды управления ходом выполнения программы (jmp, loop, ret и т.д.)
- Команды вызова программных прерываний: int, into
- Команды ввода/вывода в порт (in, out)
Кроме инструкций, программа может содержать директивы – команды, не переводящиеся непосредственно в машинные инструкции, а управляющие работой компилятора. Набор и синтаксис их значительно разнятся и зависят не от аппаратной платформы, а от используемого компилятора (порождая диалекты языков в пределах одного семейства архитектур). В качестве "джентельменского набора" директив можно выделить:
- определение данных (констант и переменных)
- управление организацией программы в памяти и параметрами выходного файла
- задание режима работы компилятора
- всевозможные абстракции (т.е. элементы языков высокого уровня) - от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования)
- макросы
Пример программы
Пример простейшей программы «Hello world» для MS-DOS для архитектуры x86 на диалекте TASM:
.MODEL TINY
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 100h
START:
mov ah,9
mov dx,OFFSET Msg
int 21h
int 20h
Msg DB 'Hello World',13,10,'$'
CODE ENDS
END START
Происхождение и критика термина «язык ассемблера»
Данный тип языков получил свое название от названия транслятора (компилятора) с этих языков — ассемблера (англ. assembler — сборщик). Название последнего обусловлено тем, что на первых компьютерах не существовало языков более высокого уровня, и единственной альтернативой созданию программ с помощью ассемблера было программирование непосредственно в кодах.
Язык ассемблера в русском языке часто называют «ассемблером» (а что-то связанное с ним — «ассемблерный»), что, согласно английскому переводу слова, неправильно, но вписывается в правила русского языка. Однако, сам ассемблер (программу) тоже называют просто «ассемблером», а не «компилятором языка ассемблера» и т. п.
Использование термина «язык ассемблера» также может вызвать ошибочное мнение о существовании единого языка низкого уровня, или хотя бы стандарта на такие языки. При именовании языка, на котором написана конкретная программа, желательно уточнять, для какой архитектуры она предназначена и на каком диалекте языка написана.
§3. Обзор аналогов
Среди аналогов наиболее популярно семейство игр, в которых игроку предлагается на каком-либо языке программирования описать модель поведения робота, грубо говоря, его искусственный интеллект. И между различными роботами устраивается соревнование на выживание. Наиболее популярным среди таких игр является проект Мэтью Нельсона из IBM под названием Robocode.
Игра Robocode
Robocode - это игра для программистов, целью которой является написание модели поведения боевого робота (танка) на поле битвы. Для написания модели поведения робота используется язык программирования высокого уровня Java. Игра имеет windows-интерфейс, а для отображения роботов на поле боя используется 2D-графика. Каждый робот может двигаться вперед и назад, поворачивать влево и вправо, нацеливать пушку и радар. Сама модель поведения представляет собой Java-класс, унаследованый от базового класса Robot, который предлагает простейший командный интерфейс боевой машины:
- turnRight(double degree) и turnLeft(double degree) - повернуть танк на заданный угол вправо или влево;
- ahead(double distance) и back(double distance) - задать направление движения вперед или назад с указанием расстояния в пикселях. Если танк столкнется с другим танком или стеной, движение прекратится;
- turnGunRight(double degree) и turnGunLeft(double degree) - повернуть пушку на заданный угол;
- turnRadarRight(double degree) и turnRadarLeft(double degree) - повернуть радар на заданный угол.
Во время боя каждому роботу выделяется отдельный поток виртуальной Java-машины. В пределах данного потока танк может реагировать на различные внешние события, реакцию на которые программисты могут реализовать в соответствующих методах:
- onScannedRobot() - Событие поступает при пеленге противника радаром. В теле этого метода обычно реализуется алгоритм обстрела области, в которой был обнаружен противник
- onHitByBullet() - Событие поступает при попадании снаряда в ваш танк. Здесь программисты должны предусмотреть алгоритм маневрирования танком.
- onHitRobot() - Событие поступает при столкновении с другим танком.
- onHitWall() - Событие поступает при столкновении со стеной.
Игра весьма популярна, а в интернете часто проводятся соревнования, существует рейтинг лучших роботов. Но при этом, игра Robocode не является прямым аналогом проекта ALG, т.к. предназначена не столько для обучения, сколько для развлечения, причем не детей, а состоявшихся программистов.
Преимущества и недостатки игры Robocode относительно ALG
преимущества | недостатки |
не требовательна к ресурсам компьютера | плохо приспособлена для обучения, целевая аудитория – программисты |
| однообразный игровой процесс |
| отсутствует возможность отладки кода |
| графические технологии прошлого века |
| требует наличия на компьютере Java-машины |
В результате исследования, не было обнаружено проектов, которые были бы в состоянии составить серьезную конкуренцию проекту ALG в области игрового обучения программированию неподготовленных людей.
§4. Концепция проекта ALG
Педагог-разработчик
Структура занятий
Язык ассемблер всегда считался сложным как для использования, так и для изучения. Поэтому, для изучения ассемблера школьниками традиционные методы обучения подходят не лучшим образом. Необходим несколько другой подход, попытка реализовать который была предпринята в проекте ALG.
В основу концепции проекта легла с виду простая задача – сделать обучение эффективным. Для этого при разработке программы ALG, упор делается по 3-м направлениям:
- Эффективное взаимодействие учащегося с инструментом обучения
- Игровая форма обучения
- Легко расширяемая структура заданий
Эффективное взаимодействие учащегося с инструментом обучения
При использовании традиционного ассемблера, приходится пользоваться набором разных утилит, чаще всего представляющих собой малопонятные консольные программы, что может быть губительно для процесса обучения неподготовленного школьника старших классов.
Очевидно, что эффективность обучения напрямую зависит от эффективности взаимодействия учащегося с инструментом обучения, в данном случае с программой ALG. На схеме видно, что учащийся взаимодействует лишь с оболочкой программы, со средой разработки. В ней, учащийся выполняет задания, созданные педагогом и получает необходимые знания по предметной области. В результате, на экране нет кучи окон, а учащемуся доступна вся необходимая ему информация в пределах одной программы.
Процесс взаимодействия с программой ALG происходит следующим образом:
- учащийся набирает текст программы на языке ассемблер
- при помощи интерпретатора виртуальной машины, текст программы компилируется и преобразуется в байт-код
- при запуске мини игры, байт-код используется для выполнения каких-либо задач миссии
- учащийся может визуально оценить работу написанной им программы
Взаимодействие учащегося со средой разработки включает в себя, не только написание ассемблерного кода, но и весь спектр действий, используемых в разработке программ на ассемблере:
- написание кода
- компиляция текста программы в байт-код, а также получение подробной информации об ошибках компиляции, если они есть
- полноценная отладка скомпилированного кода во время работы ассемблерной программы
- использование простой и понятной справочной информации на русском языке, доступной прямо из окна программы ALG
Таким образом, учащийся сам проходит все этапы разработки программы, от написания кода до отлова ошибок в работающей программе, и имеет реальный опыт и представление о программировании на ассемблере.
Этот подход гораздо эффективнее традиционных лабораторных работ по простому написанию различных программ. К тому же учащемуся не нужно использовать ничего, кроме одной единственной программной среды, что значительно снижает издержки на обучение учащегося работе с реальными компиляторами, линковщиками и прочими инструментами для работы с ассемблером.
Игровая форма обучения
Для того чтобы процесс обучения был увлекательным, он проходит в игровой форме, то есть каждое занятие представляет собой мини-игру, со своей конечной целью, набором правил, сценарием и окружающей обстановкой. Мини игры могут быть любого жанра, но для обучения наиболее эффективным считается жанр аркады.
Например, автомобилю нужно проехать по конкретному маршруту, но путевые точки перепутаны и без помощи игрока (учащегося) автомобиль двигаться не может. Соответственно нужно написать программу сортировки путевых точек для навигационного компьютера автомобиля. Окружающая обстановка в данном примере может быть в виде леса, автомобиля и маршрута, по которому нужно проехать. Причем, если программа, написанная учащимся, сработает неверно и путевые точки будут отсортированы неправильно, автомобиль доедет до первой неверной точки и подаст визуальный сигнал о том, что дальше ехать нельзя.
Задача учащегося может быть абсолютно любой, но, как правило, она сводится к написанию алгоритма, который как-то используется в мини игре и чья корректная работа необходима для успешного завершения мини игры. То есть учащийся занимается разработкой небольшой части к более крупной системе, при этом результат работы алгоритма влияет на мини игру, отображается визуально в окне программы и учащийся может его оценить.
Таким образом, низкоуровневый код на языке ассемблер, написанный учащимся, влияет на высокоуровневую систему, в данном случае игру, являясь её неотъемлемой частью. И именно такой подход в использовании ассемблера наблюдается сейчас повсеместно. Уже давно никто не пишет программы на ассемблере от начала и до конца. На низкоуровневом языке пишутся лишь некоторые небольшие части программ, критичные к скорости или какой-либо функциональности, а также системное программное обеспечение и драйвера устройств. К тому же создавать какую-либо часть сложной системы (в нашем случае игры) проще и главное понятнее, нежели создавать всю систему, пусть даже простую, но с нуля.
Нужно отметить, что мини игры для занятий могут быть любой сложности, она ограничена лишь вычислительными ресурсами компьютера, фантазией создателя и его умением программировать.
Легко расширяемая структура занятий
Легко расширяемая система занятий значительно повышает эффективность обучения. Эта система основана на том, что логика мини игры каждого занятия находится не в exe-файле программы, а в виде отдельного файла с кодом на высокоуровневом языке программирования (скриптовый язык LUA), свободным для редактирования. Таким образом, педагог, имея навыки программирования, может легко выступать в роли разработчика новых занятий или для изменения существующих. Ведь очевидно, что в разных учебных заведениях разный уровень образования по различным предметам, где-то с ассемблером можно познакомить поверхностно, а где-то нужно провести глубокий курс изучения этого сложного языка. Поэтому расширяемая и легко изменяемая структура занятий является необходимым свойством создаваемой обучающей платформы.
Занятие состоит из задания и мини игры. Мини игра - это программа, описанная во внешнем текстовом файле и реализующая логику проверки выполнения задания к занятию, а также логику работы мини игры. Кроме трехмерной графики в окне мини игры может быть использован стандартный windows-интерфейс, например, кнопка для запуска игрового процесса или надпись для отображения текстовой информации.
Этапы создания занятия:
- Определение предметной области занятия, написание к нему задания
- Создание сценария для мини игры
- Создание графического контента для мини игры
Подключение нового занятия к программе производится путём изменения нескольких строк кода в одном из файлов с логикой загрузки занятий.
Структура занятий
На данный момент, курс обучения состоит из четырех занятий. Сложность занятий и объем кода, который должен написать учащийся, возрастает от первого занятия к последнему. И если на первом занятии изучалась простейшая инструкция сложения двух чисел, то задачей последнего занятия является создание самомодифицирующейся программы, того, на что не способен никакой другой язык программирования, кроме ассемблера. Также будут затронуты почти все ключевые конструкции языка. Для каждого занятия была придумана и реализована соответствующая ему мини игра.
Общий взгляд
В результате мы получили удобную, расширяемую платформу для эффективного обучения программированию на языке ассемблер. В процессе обучения, учащийся в полном объеме использует этот низкоуровневый язык в увлекательных мини играх, как простое решение конкретных задач в рамках высокоуровневой системы. Именно так, как ассемблер используется сегодня в сфере разработки программного обеспечения. При этом сам процесс обучения является увлекательным, а результат работы своей программы ученик сразу же видит на экране.
Глава №2. Формализация
§1. Инструментарий
При создании проекта были использованы следующие инструменты:
- Microsoft Visual Studio 2005 – для написания программного кода, как основная среда разработки;
- Платформа .NET Framework 2.0 – как единая основа всего приложения;
- C++ – как основной язык программирования;
- Скриптовый язык LUA – как вспомогательный язык программирования;
- Библиотека OGRE – как подсистема визулизации 3D графики;
- Пакет Autodesk 3D Studio Max 8 – как средство создания трехмерных сцен.
Microsoft Visual Studio 2005
MS Visual Studio 2005 от компании Microsoft – мощнейший инструмент разработки программного обеспечения любой сложности. Visual Studio – это самодостаточный набор инструментов, объединенных в рамках одной IDE для создания программ для настольного компьютера, мобильных устройств, приложений на основе ASP.NET, XML Web служб и других. Также, Visual Studio содержит средства анализа качества кода и его производительности, что помогает создавать надежные приложения и службы уровня mission-critical (для использования в системах безопасности, здравоохранения и других областях, где к надежности ПО предъявляются особо высокие требования).
Интегрированная среда разработки ПО (англ. IDE, Integrated Development Environment) — система программных средств, используемая программистами для разработки программного обеспечения.
Обычно среда разработки включает в себя текстовый редактор, компилятор, интерпретатор, средства автоматизации сборки и отладчик. Легко интегрируется с системой управления версиями, имеет разнообразные инструменты для упрощения конструирования графического интерфейса пользователя. Также включает в себя браузер классов, инспектор объектов и диаграмму иерархии классов — для использования при объектно-ориентированном программировании.
Microsoft Visual Studio 2005 включает в себя следующие компоненты:
- Visual C++ .NET
- Visual C#
- Visual Basic .NET
- Visual J#
- платформу .NET Framework.
Стоит отметить, что Visual C++ .NET поддерживает разработку приложений как на Managed C++, так и на обычном C++, и тем самым позволяет генерировать код как для платформы .NET Framework, так и для исполнения в среде «чистой» Windows. В этом отношении Visual C++ .NET является уникальным среди других языковых средств, предоставляемых средой Visual Studio, поскольку ни Visual Basic .NET, ни Visual J# .NET не способны генерировать код для чистого Win32, в отличие от предыдущих версий этих компонентов (Visual Basic и Visual J++ соответственно). Одним из важных преимуществ Visual Studio 2005 является возможность одновременного использования этих высокоуровневых языков рамках одного проекта.
Visual Studio 2005 позволяет создавать приложения различных типов, но в данном проекте используется приложение типа Windows Forms, которое построено на классах .NET Framework и представляет собой широкий набор компонентов для создания пользовательского интерфейса. Теперь пользовательский интерфейс можно быстро создать с нуля прямо в IDE, просто перетаскивая на форму приложения нужные элементы интерфейса, располагая их так как нужно, настраивая их свойства и добавляя программный код для реализации заданной логики.
Среди аналогов Visual Studio можно выделить лишь Borland Delphi, но он существенно проигрывает продукту от Microsoft по удобству и функциональности. А в купе с моим большим опытом работы именно с Visual Studio, выбор этого инструмента является наилучшим.
Платформа .NET
Платформа .NET Framework, разработанная и активно продвигаемая компанией Microsoft, в будущем должна стать основой для подавляющего большинства Windows-программ.
.NET Framework – многоязыковая среда для создания, распространения и запуска XML Web служб и приложений. Она состоит из следующих частей:
- Common Language Runtime (CLR) – общий язык исполнения, является компонентом среды, управляет распределением памяти, запуском и остановкой процессов, реализацией политики безопасности, а также удовлетворяет зависимости от других компонентов. В результате существенно сокращается количество кода, который должен написать разработчик для реализации заданной логики;
- Unified programming classes – среда предоставляет разработчику набор единых, объектно-ориентированных, иерархических, расширяемых библиотек классов (APIs). Создавая общий набор API для всех языков программирования, общий язык разрешает наследование классов, написанных на разных языках программирования, а также разрешает обрабатывать ошибки и отлаживать этот код. Все языки программирования, от J# до C++, имеют одинаковый доступ к среде разработки и программисты могут выбрать тот язык, который больше всего подходит для решения поставленной задачи.
Платформа .NET Framework использовалась исключительно ради создания пользовательского интерфейса, т.к. позволяет создавать windows-интерфейсы любой сложности, затрачивая на это минимум времени, а также легко интегрируется со сторонними библиотеками на языке C++.
Язык С++
C++ — компилируемый, строго типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования. Этот язык был выбран за высокую скорость работы, гибкость и хорошую интеграцию с платформой .NET Framework и различными библиотеками, в частности библиотекой OGRE, использующейся для вывода 3D графики. Также важную роль при выборе языка сыграл мой опыт работы с C++.
Язык LUA
Lua ([лу́а], порт. «луна») — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро. Является свободно распространяемым, с открытыми исходными текстами на языке Си. По возможностям, идеологии и реализации язык ближе всего к JavaScript, однако Lua отличается более мощными и гораздо более гибкими конструкциями, спроектирован с целью «не плодить сущности сверх необходимого». Реализуемая модель ООП (как и в JavaScript) — прототипная. Сегодняшняя популярность Lua такова, что Microsoft выделила разработчикам грант на создание .NET-версии языка.
Как и многие интерпретируемые языки программирования, реализация Lua имеет отдельно компилятор с исходного языка в исполняемый байт-код и виртуальную машину для исполнения сгенерированного байт-кода. Причём байт-код — это не команды стековой машины, а команды некоего виртуального процессора с несколькими регистрами, что повышает эффективность исполнения. В стандартной виртуальной машине Lua используется распределение памяти со сборкой мусора (аналогично Java или .NET).
Важно отметить, что текст программы на языке LUA компилируется в байт-код не один раз, при создании exe-файла (как, например, в языке C++), а каждый раз при запуске программы. Таким образом, LUA позволяет создавать и менять логику поведения программы без изменения exe-файла, что позволяет построить гибкую архитектуру и вносить изменения в программу сторонними разработчиками без изменения основного exe-файла.
По сравнению с аналогами, например, с языком Python, у LUA есть важное преимущество – сильная интеграция с кодом C++, т.е. возможность использовать функционал C++ программы из LUA, и наоборот. Также, важную роль в выборе этого инструмента сыграл мой опыт работы с ним.
Библиотека OGRE
В основе системы визуализации лежит графический движок OGRE. Графический движок – программное обеспечение, основной задачей которого является визуализация (рендеринг) двухмерной или трёхмерной компьютерной графики.
OGRE (Object-Oriented Graphics Rendering Engine) — графический объектно-ориентированный движок с открытым исходным кодом, написанный на C++. Автором OGRE является Steve Streeting. Работа над движком, идет с начала 2001 года, после того, как появилась идея создания хорошо слаженного, кроссплатформенного движка с удобным дизайном и архитектурой. Большую популярность движок получил за счет своей гибкости, что позволяет "скрещивать" его со многими другими библиотеками.
К достоинствам этой библиотеки по сравнению с другими можно отнести:
- Бесплатность;
- Наличие большого количества дополнительного инструментария для работы с различными пакетами 3D моделирования, например, плагин к 3DS Max для экспорта данных сцены в формат движка OGRE;
- Понятная и удобная архитектура, облегчающая использование библиотеки;
- Мой опыт работы с этим движком.
Пакет моделирования 3D Studio Max 8
3ds Max - полнофункциональная профессиональная программная система для работы с трёхмерной графикой. 3ds Max располагает обширными средствами по созданию разнообразных по форме и сложности трёхмерных компьютерных моделей реальных или фантастических объектов окружающего мира с использованием разнообразных техник и механизмов, включающих следующие:
- полигональное моделирование;
- моделирование на основе неоднородных рациональных B-сплайнов (NURBS);
- моделирование на основе порций поверхностей Безье;
- моделирование с использованием встроенных библиотек стандартных параметрических объектов (примитивов) и модификаторов.
Методы моделирования могут сочетаться друг с другом.
Моделирование на основе стандартных объектов, как правило, является основным методом моделирования и служит отправной точкой для создания объектов сложной структуры, что связано с использованием примитивов в сочетании друг с другом как элементарных частей составных объектов.
3ds Max был выбран мной потому, что я имею некоторый опыт работы в данном пакете, а также из-за возможности экспортирования данных сцены из 3ds Max в формат, понимаемый библиотекой рендера моего проекта.
§2. Базовая архитектура проекта
Основной задачей проекта было создание платформы для обучения программированию на языке ассемблер в игровой форме.
Т.к. основной задачей проекта является обучение языку ассемблер, то нельзя просто ограничиться справочными материалами по данной теме, необходимо, чтобы учащийся на практике ощутил, что значит писать на низкоуровневом языке ассемблер. Для этого учащемуся нужно дать возможность пройти все этапы разработки программы на ассемблере, от написания кода, до его отладки. Поэтому в программе должна быть возможность писать код, компилировать его, выполнять и отлаживать. При чем, выполнение кода должно быть аналогично выполнению такого кода на процессоре x86. Т.е. нужно реализовать виртуальную машину для языка ассемблер.
Игровая форма обучения была выбрана для того, чтобы заинтересовать учащегося и сделать процесс обучения увлекательным и динамичным. Для этого наиболее хорошо подходят игры, в частности 3d аркады. Поэтому в программе должна быть возможность загрузки и отображения в реальном времени 3d-сцены, а также свободное манипулирование объектами этой сцены.
Процесс обучения будет происходить посредством выполнения учащимся заданий (занятий). Т.к. обучение происходит в игровой форме, то каждый урок представляет собой отдельную мини игру со своими правилами, «сюжетом» и игровым миром. Было бы неразумно и неэффективно программировать каждую такую мини игру на компилируемом языке, типа C++, потому что в таком случае было бы невозможно вносить изменения и создавать новые уроки без перекомплияции всей программы. В итоге, для создания уроков был выбран скриптовый язык (LUA), который не требует компиляции в exe-файл, легок в использовании и удобен при взаимодействии с языком C++. Соответственно, для эффективного использования языка LUA, необходимо наличии в программе специальной скриптовой системы, взаимодействие LUA с кодом основной программы на C++, а также позволяющей легко и быстро создавать уроки любой сложности без изменения основной программы.
Для того чтобы процесс обучения происходил эффективно, необходимо чтобы весь вышеописанный функционал находился в пределах одной программы, с удобным, интуитивно-понятным интерфейсом.
Таким образом, из программной архитектуры проекта можно выделить 4 модуля, необходимые для выполнения описанных выше требований:
- Windows-интерфейс
- Виртуальная машина для языка ассемблер
- Система визуализации 3d сцен
- Скриптовая система
Эти модули тесно взаимодействуют между собой, образуя в конечном счете законченный инструмент для обучения языку ассемблер в игровой форме.
Схема взаимодействия модулей представлена ниже.
Windows-интерфейс
Виртуальная машина
Скриптовая система
Система визуализации
На схеме изображены связи между модулями, точнее от кого и кому модуль может получить/отдавать команды.
Функциональность каждого модуля представлена соответствующим пространством имен (классом) на языке C++.
Диаграмма архитектуры системы представлена ниже.
Как видно из диаграммы архитектура состоит из 3-х уровней.
Верхний уровень
Представлен пространством имён ALG. Здесь реализуется функциональность всего windows-приложения, пользовательский интерфейс, а также логика работы с другими модулями. Так как платформой программы является .NET Framework, то весь верхний уровень написан на управляемом (managed) С++. В других местах программы используется только чистый (native) С++. Также надо отметить, что верхний уровень взаимодействует лишь со средним уровнем архитектуры, не опускаясь до работы со сторонними библиотеками нижнего уровня. На диаграмме верхнего уровня присутствует компонент SyntaxHighlighter, который является сторонним windows-элементом на основе RichTextBox'а (текстовой редактор), но с реализацией подсветки синтаксиса текста. Такая подсветка значительно облегчает работу с кодом ассемблера.
Средний уровень
Содержит модуль виртуальной машины языка ассемблер (пространство имён VM), а также надстройки над библиотеками lua и Ogre, для удобной работы с ними. Надстройками являются скриптовая система (пространство имён script) и функционал для работы с движком OGRE (пространство имён Ogr). Данные настройки обеспечивают простую и понятную связь низкоуровневых специфичных библиотек, с верхним уровнем архитектуры.
Нижний уровень
На этом уровне находятся сторонние библиотеки:
- Lexer – библиотека, содержащая функционал анализирования текста программы. Используется в интерпретаторе виртуальной машины.
- lua – библиотека, содержащая интерпретатор, компилятор и виртуальную машину языка LUA. Написана на языке C, и имеет низкоуровневый интерфейс, поэтому для эффективного использования библиотеки необходима высокоуровневая надстройка над ней (пространство имён script);
- OgreMain – движок (библиотека) OGRE. Содержит весь необходимый функционал для визуализации 3d графики. Написан на C++, но для эффективного использования, а также для возможности использования функционала движка из Lua-скриптов, необходимо наличие надстройки (пространство имён Ogr);
- OgreMax – вспомогательная библиотека для работы с движком Ogre. Содержит плагин к пакету моделирования 3D Studio Max для экспортирования данных сцены в собственный формат, а также содержит функционал для загрузки этих данных в движок OGRE. Использование данной библиотеки значительно упростило создание и использование контента для мини игр.
§3. Детальное проектирование
Как уже было отмечено, система имеет 3х-уровневую архитектуру. Верхний уровень взаимодействует со средним, а средний, в свою очередь, взаимодействует с нижним уровнем архитектуры.
На верхнем уровне, в пространстве имён ALG, происходит создание windows-приложения, обработка пользовательских действий, работа с модулями среднего уровня.
При создании приложения происходит инициализация необходимых модулей программы, а при закрытии приложения происходит освобождение используемых ресурсов.
Т.к. одной из важнейших составляющих процесса обучения является игровой процесс, то необходимо, чтобы игровые данные обновлялись с максимальной скоростью и для этого использовались все доступные вычислительные ресурсы. Для этого после создания приложения, в нём запускается бесконечный цикл, в котором происходит обновление всех ключевых частей программы, таких как:
- Windows-интерфейс
- Игровая логика
- Визуализация 3d графики
Система игровой логики
Вся игровая логика, логика занятий, мини игр, логика их загрузки и выгрузки полностью реализована на языке LUA, а исходный код хранится в соответствующих .lua файлах. А весь необходимый функционал на C++ «вынесен в скрипт», т.е. связан с языком LUA, из которого этот функционал будет доступен.
Общая логика работы с занятиями хранится в файле entry.lua, в частности создание интерфейса для выбора занятия, вызовы функций загрузки выбранного занятия, обновления состояния текущей мини игры, освобождение ресурсов, загрузка стартовой сцены (логотип «ALG») и прочее.
Логика каждого занятия, в том числе мини игры, находится в отдельном .lua файле, которые могут создаваться независимо, сторонними разработчиками. Единственное условие – это наличие определенных функций для каждого занятия, например, функция инициализации, уничтожения и обновления состояния для мини игры, которые вызываются из функций файла entry.lua, а с ним уже взаимодействует windows-приложение.
Также в файле entry.lua в виде таблицы находится информация об доступных занятиях, с указанием названия занятия и соответствующего ему .lua файла.
А так как из языка LUA доступны вызовы любых C++ функций, от создания элемента windows-интерфейса и регистрации обработчиков событий, до загрузки и управления трёхмерной сценой, то в lua-скрипте можно реализовать логику любой сложности и в полном объёме.
Схема работы игровой логики представлена ниже.