Объектно ориентированное программирование на языке ассемблера
Объектно ориентированная парадигма не является полностью областью высокоуровневых языков программирования. Рэнди - разработчик многочисленных программных и аппаратных проектов, в том числе сборщиков для различных систем. Помимо консалтинга, он в настоящее время является преподавателем в области компьютерных наук Калифорнийского политехнического университета в Помоне и в UC Riverside.
Одним из обещаний объектно ориентированной парадигмы является то, что она уменьшит сложность программы и усилия по её реализации для многих различных типов программ. Объектно ориентированное программирование, однако, не является панацеей. Это метод, например рекурсия, который можно применять в некоторых случаях для сокращения усилий по программированию. Хотя существуют определённые типы программ, объектно ориентированная реализация которых лучше, примеров много, когда объектно ориентированные системы программирования (OOPS) ничего не покупают. Тем не менее, объектно ориентированные методы программирования - это ценный инструмент, который можно использовать в военном сундуке.
OOPS ничего нового.
Они существуют с конца 1960-х годов. Тем не менее объектно ориентированная парадигма томилась пока Object Pascal и C ++ не начали массовый интерес. Успех этих языков показывает, ООП не является областью нескольких эзотерических языков программирования. Скорее объектно ориентированное программирование применимо практически к любому языку программирования. Язык ассемблера может не казаться местом применения парадигмы объектно ориентированного программирования. Но имейте в виду, люди говорили то же самое о Паскале и С пять лет назад.
Как выглядит объектно ориентированная ассемблерная программа?
Лучше задаться вопросом: «В чём суть объектно ориентированной программы и как её захватывать в рамках ассемблерной программы?» После того, как вы отмените использование блеска и нотации, предоставляемые такими языками, как C ++, вы обнаружите, что две основные функции объектно ориентированной программы - это полиморфизм и наследование.
Полиморфизм берёт две основные формы в большинстве языков программирования: статические и динамические. Однако общая идея одинаков. Вы вызываете разные подпрограммы с тем же именем. Статический полиморфизм обеспечивает удобство записи в виде перегрузки операторов / функций в языках, как C ++. Статический полиморфизм использует список параметров вместе с именем подпрограммы (вместе они образуют подпись подпрограммы), чтобы определить, какую программу вызывать.
Статическая перегрузка удобная, не добавляет власти к языку ассемблер. Вызовы CmplxAdd вызывают три разные процедуры. CmplxAdd- (C1, C2, C3) вызывает CmplxAddCC, CmplxAdd (C1, C2, R) вызывает CmplxAddCR, а CmplxAdd- (C1, R, C2) вызывает CmplxAddRC. Компилятор C ++ определяет, с какой программой этот код будет вызываться во время компиляции. Статический полиморфизм - это механизм, позволяющий компилятору выбрать одну из нескольких подпрограмм для вызова в зависимости от вызывающей сигнатуры.
Иногда вы сможете использовать одну подпись для вызова разных подпрограмм. Например, у вас есть форма класса, в которой есть три графических объекта: круги, прямоугольники и треугольники. Если есть произвольный объект типа, компилятор не может определить, какую подпрограмму DRAW вызывать. Программа определяет это во время выполнения. Это позволяет одному вызову рисовать круги, прямоугольники, треугольники во время выполнения с теми же машинными инструкциями. Это динамический полиморфизм - определение во время выполнения этой процедуры для вызова. C ++ использует виртуальные функции, а Object Pascal использует переопределённые процедуры или функции динамического полиморфизма.
Наследование позволяет создавать структуры данных в виде надмножеств существующих структур данных. Это обеспечивает механизм, позволяющий обобщать типы данных, позволяя обрабатывать различные объекты независимо от фактического типа. Это позволяет вам определять такие разнообразные формы, как круги, прямоугольники и треугольники, и рассматривать их как совместимые структуры.
Внедрение классов и наследование
Поскольку структуры и классы тесно связаны, может быть поучительным взглянуть на реализацию структур перед просмотром классов. Рассмотрим S, переменную типа в примере 1. Где-то в памяти компилятор должен сгенерировать память для полей S. Традиционно компиляторы распределяют эти поля смежно. Действительно, ассемблер Microsoft (MASM) позволяет вам объявлять структуры аналогичным образом, как показано в примере 2.