Самодокументований асемблер.

Jan 25, 2011 02:21

Коли програмуєш на асемблері, часто буває складно згадати відповідну мнемоніку, а ще частіше - неможливо зрозуміти текст уже написаної програми, навіть якщо цю програму ти сам писав декілька годин тому. Складність виникає з тієї причини, що асемблер традиційно використовує для позначення команд процесора вкрай скорочені кількабуквенні мнемоніки типу mov або add. Але від часів коли виник асемблер випито багато пива, і я маю досить просту ідею, як його можна зробити значно кращим.

Ідея полягає в тому, що інструкції процесора можна позначати не кількабуквеними скороченими мнемоніками, а досить розширеними ідентифікаторами, підібраними згідно з практикою написання ідентифікаторів, що склалася серед програмістів на мовах програмування типу Pascal. Крім того, щоб інструкція процесора, записана на новому асемблері, виглядала подібно до виклику процедури на мові Pascal, параметри інструкції процесора можна записувати в круглих дужках і розділяти комами, а самі команди процесора розділяти крапкою з комою. В результаті, текст програми на новому асемблері почне виглядати значно краще і буде набагато більш самодокументованим. Наприклад, фрагмент програми, що раніше мав вигляд:

mov ax. 3
mov bx. 5
cmp ax, bx

стане виглядати приблизно наступним чином:

MoveToRegister (AX, 3);
MoveToRegister (AX, 5);
CompareRegisters (AX, BX);

Зрозуміло, що в цьому випадку можна буде скористатись і іншими перевагами Pascal - подібної мови програмування, зокрема нові позначення інструкцій процесора можна писати в один рядок, одна за одною через крапку з комою, а Pascal - подібні коментарі можна вставляти всюди де є допустимими пробіли.

Цей новий асемблер може мати переваги для тих застосувань, коли програмування в інструкціях процесора є найкращим вибором, а надійність програми повинна бути високою і забезпечуватися не стільки відладкою, скільки самим способом написання програми, при якому програма документує саму себе і всі помилки в ній стають достатньо очевидними ще на етапі програмування. Наприклад, це можуть бути військові застосування, одним з варіантів є однокристальна ЕОМ що керує ракетою. Крім того, цей асемблер може бути використаний у безлічі інших, зазвичай мирних застосуваннях, наприклад для написання коду контроллерів жорстких дисків, керуючих ЕОМ в мобільних телефонах, драйверів та важливих частин коду операційних систем, та інше.

Ця ідея з'явилася у мене досить давно, і у 2005 році через зраду стала відома досить високопоставленій та вкрай огидній падлюці. Авторство і пріоритет я міг би довести на сучасному варіанті детектора брехні (підпорогові запитання, неусвідомлювані відповіді, але без анінайменшої підконтрольності), те саме що і для інших своїх винаходів.

На цьому можна було би і закінчити, але, за підказкою, ця ідея може бути ще й розвинута. Оскільки між машинним кодом і текстом програми на новому асемблері зберігатиметься взаємно - однозначна відповідність, стає можливим створення дизасемблера - відладчика, котрий представлятиме машинні коди у вигляді нового Pascal - подібного асемблера, що дозволить краще розбирати коди чужих програм і робити там зміни. Крім того, через вищезгадану взаємно - однозначну відповідність, старі тексти на асемблері можна також програмним чином перетворювати в тексти на новому асемблері, і з цієї причини перехід на новий асемблер міг би бути досить швидким. Крім того, ще одна підказка - щоби в такому асемблері влаштувати спосіб декларації макросів, при якому новий макрос по формату не відрізнявся б від нового способу запису однієї інструкції процесора: той самий розширений ідентифікатор, за яким іде список параметрів в дужках через кому, наприклад:

macro AddNumbers(X, Y)
MoveToRegister (AX, X);
MoveToRegister (BX, Y);
AddRegisters (AX, BX)
end;

...

AddNumbers(3, 4); (* let's add 3 and 4 *)

програмування

Previous post Next post
Up