Макрокоманды или макро

Во-первых. Слово.

Нет такого слова “макрос”. Есть слово “макро”, которое является калькой с английского слова “macro”. Англиское слово “macros” – это множественное число от “macro”, а по законам русского языка слово “макро” не имеет множественного числа, вернее оно такое же (как “пальто” и “метро”). Более правильно употреблять слово “макрокоманда”.
Хотя можно смириться с этой данностью, ведь в русском уже много таких примеров прижилось, что наше единственное число происходит от множественного английского числа, а потом наш русский ещё и дополнительно отдельно ему собственное множественное добавляет:

Rail – Rails – Рельс – Рельсы

 

Во-вторых. История.

Под “макросами” обычно понимаются макро из пакета MS Office. Однако это не совсем верно. Когда-то в прошлом веке это действительно были макрокоманды, однако со временем они трансформировались в подпрограммки VBA (Visual Basic for Applications) с горячими клавишами. И последние к макрокомандам уже не относятся: вывеска осталась, но работает всё совсем иначе.

Настоящие макрокоманды – это гораздо более старинный способ сокращения рутинной работы, когда вы нажимаете одну горячую клавишу, которая вызывает последовательное нажатие других горячих клавиш. Условный пример: на горячую клавишу Ctrl+W вешается последовательность ( Ctrl+Вправо, Ctrl+Shift+Влево, Del ), которая вызывает удаление текущего слова в текстовом редакторе. 

Именно такие макрокоманды сейчас есть во многих навороченных текстовых редакторах.

В-третьих. Программирование.

В программировании тоже есть понятие о макрокомандах. Это особая форма организации программного кода. Так сложилось, что все современные языки программирования не поддерживают концепцию макрокоманд. Отчасти потому, что имеют более высокоуровневые парадигмы (подпрограммы, методы, функции), а отчасти и потому, что такой код может быть сочтён “небезопасным”.

В-основном, макрокоманды существуют в ассемблерных языках, также как и операторы безусловного перехода (стиль GOTO). 

Принцип следующий: вы определяете последовательность команд и присваиваете ей имя, и когда имя встречается данное имя в тексте программы на ассемблере, то сначала “в уме” имя заменяется на последовательность команд, и лишь потом компилируется машинный код.

Файл “на руках”:

macro swap_ab = ( dx = ax; ax = bx; bx = dx;  );

ax = 1; bx = 2; swap_ab;

ax = 3; bx = 4; swap_ab;

Файл “в уме”:

ax = 1; bx = 2; dx = ax; ax = bx; bx = dx;

ax = 3; bx = 4; dx = ax; ax = bx; bx = dx;

Просто с первым файлом удобнее работать программисту.

Однако, макро не имеет никакого отношения к процедурному программированию, которое идеологически идёт из реальных конструкций ассемблера JUMP/GOTO.

Макро – это только замена текста со всеми вытекающими последствиями.

 

В-четвёртых. ABAP.

В языке ABAP макросы абсолютно реальны, и работают по вышеописанной схеме.

Иногда их использовать действительно удобно , хотя на практике есть определённые сложности (например: отладка или журнал использования). И эти сложности происходят из-за разрыва между файлом “на руках” и “файлом в уме”, а не из-а того что “макросы плохие”.

Занятный пример:

define show_alv.
  data gt_ztmp_&1 like ztmp_&1 occurs 0 with header line.
  select * from ztmp_&1 into table gt_ztmp_&1 where bukrs = p_bukrs.

  call method cl_salv_table=>factory
    importing r_salv_table = gr_table
    changing  t_table      = gt_ztmp_&1[].

  gr_table->display( ).
end-of-definition.

Для данного макро работоспособным является вызов в стиле:

show_alv mytable.

И неработоспособным будет вызов:

show_alv ‘mytable’.

А вот это уже совсем странный компот:

data: mytable(30) type C.

mytable = ‘myanothertable’.

show_alv mytable.

Глупость ситуации в том, что в этих строках слово mytable при вызове макроса не имеет никакого отношения к переменной mytable. Никакого!

В-пятых. Жизнь.

Моё мнение и рекомендации следующие:

  • Используйте макро только тогда, когда использование процедурного подхода или ООП получается гораздо более громоздким и менее прозрачным
  • Не используйте макро вместо подпрограмм или методов
  • Используйте в теле макро только небольшие куски текста (1-10 строк)
  • Код макро должен быть абсолютно прозрачным и надёжным
  • Используйте макро только при большом постоянном использовании

 

А напоследок я скажу.

TRMAC

Добавить комментарий

Ваш адрес email не будет опубликован.