Возобновил своё увлечение МАДЛом!
Перечитал тему. Что я могу сказать...
"Цельной" готовой программы (компилятора) я не смогу его написать НИКОГДА!
Поэтому и проходится идти таким путём как "установленный Дельфи".
Хотя по сути, можно обойтись без УСТАНОВЛЕННОГО дельфи, а просто использовать утилиты (файлы из Дельфи)
Например:
из Дельфи 2, - DCC32.EXE, SYSTEM.DCU
или
из Дельфи 7, - dcc32.exe, activex.dcu, classes.dcu, messages.dcu, RTLConsts.dcu, SysConst.dcu, SysInit.dcu, system.dcu, sysutils.dcu, Types.dcu, typinfo.dcu, variants.dcu, varutils.dcu, windows.dcu
или
из Борланд Паскаля, - BPC.EXE, RTM.EXE, TURBO.TPH, TURBO.TPL
или
из Free Pascal, - fpc.exe ....и т.д.
или..
или..
(можно перечислять долго и нудно)
"наковырять" или найти в инете это всё несложно! Вот только было бы желание! А желания я так понял из-за ненависти к Паскалям и Дельфям (и ко мне тоже), просто нет!
Конечно есть вариант который можно попробовать... "подточить" это всё под такие же утилиты из СИ или еще из чего-то... но опять же вряд ли это что решит по поводу желания использовать мой компилятор!
Zelya, попытаюсь объяснить.
ЧАСТЬ 1.
Существует транслятор, в виде библиотеки DDL (можно сделать и в виде других библиотек *.TPU, *.O, *.ВСU, и т.д. это не проблема)
И вот если написать на простейших командах-КР580-в-мнемонике-паскаля программу....
Code:
program primer;
Begin
.....
jnz(m93);
.....
movAL;
.....
CPI(0);
....
Comiling;
end.
а далее прикрутить библиотеки, воспользоваться утилитой DCC32.EXE из Дельфи, (или BPC.EXE из Паскаля или fpc.exe
из Free Pascal или ... или ... да хоть самого чёрта "прикрутить"
) чтобы из этого получилось primer.exe, который когда запустишь, - создаст LVT или SAV для ПК-01!....
А теперь внимание.
ЧАСТЬ 2.
Создаю МАДЛ, который будет написанное на Паскале генерировать в "program primer;", который в свою очередь должен компилироваться и запускаться чтобы создавался LVT или SAV для ПК-01!....
Понимаешь, это не просто "компоновка кода до кучи" (как наверняка у тебя в Львов Студии),
необходимо код-который-для-ПК-01 чтобы был запущен среди другого вспомогательного кода... который в свою очередь должен компилироваться и запускаться чтобы создавался LVT или SAV для ПК-01!....
Зачем всё так сложно ?
Пишется программа для ПК-01 на паскале, (точнее говоря на МАДЛе который очень похож на паскаль
)
там например процедуры
Code:
Procedure p1;
var a,b,c: byte;
begin
......
a:=a+1;b:=a;
......
end;
Procedure p2;
var d,r,t: byte;
begin
......
p1;// использует процедуру p1;
end;
Procedure p3;
begin
......
p1;// использует процедуру p1;
end;
BEGIN {старт программы}
p2;// старт программы с процедуры p2;
END;
Все это МАДЛом обрабатывается и генерируются процедуры (и паралельные с ними процедуры с приставкой например "с_" или "use_" или.. или.. ) таким образом, чтобы добавлялись разные технические флаги и код обрабытывающий процедуры для ПК-01 (и их данные тоже) чтобы это всё сгенерировалось в "program primer;".
Ну вот допустим из примера выше МАДЛ снегерировал бы следующее:
Code:
Procedure С_p1; { процедура генерирующая код-процедуры-p1-для-ПК-01. Если процедура p1-для-ПК-01 используется, надо запустить С_p1 и начнётся генерация кода для ПК-01}
var a,b,c: byte;
begin
......
a:=a+1;b:=a;
......
end;
Procedure С_p2; { процедура генерирующая код-процедуры-p2-для-ПК-01. Если процедура p2-для-ПК-01 используется, надо запустить С_p2 и начнётся генерация кода для ПК-01}
var d,r,t: byte;
begin
......
p1;// использует процедуру p1;
end;
Procedure С_p3; { процедура генерирующая код-процедуры-p3-для-ПК-01. Если процедура p3-для-ПК-01 используется, надо запустить С_p3 и начнётся генерация кода для ПК-01}
begin
......
p1;// использует процедуру p1;
end;
{КО ВСЕМУ НАПИСАННОМУ ВЫШЕ ТАКЖЕ генерируется мадлом на основе содержимого процедуры p1}
Procedure use_p1; { процедура для проверки используется ли процедура p1 и нужно ли её компилировать}
Begin
f_use_p1:=1; {когда зупустится процедура use_p1; установится флаг f_use_p1 что её надо компилировать, так как она используется }
end;
{генерируется мадлом на основе содержимого процедуры p2}
Procedure use_p2; { процедура для проверки используется ли процедура и нужно ли её компилировать}
Begin
f_use_p2:=1;{когда зупустится процедура use_p2; установится флаг f_use_p2 что её надо компилировать, так как она используется }
use_p1;{запустить процедуру которую использует (вызывает) процедура p2 (для установки флага об использовании её) }
end;
{генерируется мадлом на основе содержимого процедуры p3}
Procedure use_p3; { процедура для проверки используется ли процедура и нужно ли её компилировать}
Begin
f_use_p3:=1;{когда зупустится процедура use_p3; установится флаг f_use_p3 что её надо компилировать, так как она используется }
use_p1;{запустить процедуру которую использует (вызывает) процедура p2 (для установки флага об использовании её) }
end;
BEGIN
use_p2; {запуск "процедур-установки-флагов"}
if f_use_p1=1 then С_p1; {если запуск "процедур-установки-флагов" установил флаг f_use_p1=1, процедура используется программой и её надо компилировать, для этого запускаем С_p1, т.е. процедуру компилирующую p1-для-пк-01; }
if f_use_p2=1 then С_p2; {если запуск "процедур-установки-флагов" установил флаг f_use_p2=1, процедура используется программой и её надо компилировать, для этого запускаем С_p2, т.е. процедуру компилирующую p2-для-пк-01; }
if f_use_p3=1 then С_p3; {если запуск "процедур-установки-флагов" установил флаг f_use_p3=1, процедура используется программой и её надо компилировать, для этого запускаем С_p3, т.е. процедуру компилирующую p3-для-пк-01; }
END.
Из примера видно что процедура p3; (и её данные тоже не будут скомпилированы в LVT, так как после запуска "процедур-установки-флагов" use_p2;, не был установлен флаг f_use_p3=1 указывающий на необходимость компилирования процедуры
p3 и её данных(!) тоже.
Определение компилирования данных размеченных в процедурах тоже по по подобному принципу,- в САМОЙ компилирующей-процедуре, например "С_p1;" "возле" использования данных "a:=a+1;b:=a;" прописывается МАДЛом "f_use_a:=1;f_use_b:=1;", а в конце процедуры "С_p1" ,- " if f_use_a=1 then... if f_use_и=1 then..." и после каждей "then" прописываются действия которые (при необходимости) выделят место в памяти под "a" или "b" для процедуры ""С_p1"" и т.д.
И вот представь себе сколько всего можно "начудить"
если совсместно кодом-которой-для-ПК-01 генерировать код который регулирует компиляцию того кода, для каждой конкретной программы, в которой процедуры, данные и т.д! Есть случаи в которых можно передавать конструкции МАДЛ в "program primer;" "напрямую", проверяя МАДЛом лишь синтаксис!
И самое главное, что этап компиляции "МАДЛ-в-program primer" можно ведь просмотреть "невооружённым глазом" в сненерированном primer.dpr, можно также корректировать его, "прокуртить" пошагово и т.д. Для работы над разработкой МАДЛа это очень немаловажно! По другому я врядле создам хоть какой-то компилятор! МАДЛ (аналог Паскаля) это же не какой-то там ассемблер-компановщик, в нём "такие номера" как обычная компановка кода (блоков кода) НЕ ПРОЙДУТ! Тут анализ получше надо (это я об оспользовании процедур и данных и т.д.). А если еще при этом добавить и возможность создания модуле (unit) ?!.... то что будет если в программу будет "прицеплено" 50 модулей содержащих сотни процедур ?!... как тут без анализа "нужности" процедур и данных какого-то модуля для данной программы ?!
И напоследок. Понимаешь, у меня почему-то такая ненависть к мнемонике КР580... что даже если мой МАДЛ (надеюсь напишу его когда-то) тебя рассмешит с своим "rgA:=rgA+rgB;" (в МАДЛ такое тоже будет), в том смысле, что это почти асм.... то мне всё равно лучше МАДЛ, чем асм-КР580, который я постоянно забываю, как только перестаю заниматься им!
В МАДЛе будут простейшие конструкции в мнемонике паскаля, - "var... ...Byte ...Word... array of byte.. array of word".... "Procedure..." для начала без параметров.... также будут ест-но "плюсы" "минусы", но скорее всего "в одно действие" и конструкции и без скобок и прочих "наворотов"!... и т.д.
Усложняет, а заодно и упрощает реализацию МАДЛа, пример "Лабиринт", который я поКонструкциям "перевожу" на "явный" паскаль и проверяю работоспособность МАДЛа. Сейчас пример "Лабиринт" выглядит как "гремучая смесь"
- некоторые команды в мнемонике КР580, некоторые, - в мнемонике МАДЛ, а некоторые вообще в виде "ой, это я не туда пошёл, что так делал!"...
Я думаю, конце-концов, если я создам МАДЛ и выложу в пример в "Лабиринт" , это будет достаточным агрументом, чтобы убедить себя и других, что МАДЛ вполне можно использовать для написания чего либо! И это реально!
Понятное дело, что реализовать всё что хочется и жизни не хватит, но основное вполне возможно! Ведь так хочется увидеть что-то подобное МАДЛу, где, пусть с мизерными возможностями, (не отличающимися от асма), но программа будет выглядеть на "человеческом языке", (т.е. на паскале), а не мнемоникой асма!
=========
Zelya, если ты правильно понял меня и выбранный "мой путь", то вот скажи мне, какого чёрта мне "отрекаться" от Дельфи и dcc32.exe которая мне "в помощь", и использовать что-то другой из С, С++ какую-то там подобную dcc32.exe ? Тем более я С++ не знаю! Его еще изучать надо. Может есть еще какие-то предложения для реализации "по моему пути" ?
Пиши. Рассмотрю.
Как ты понял, мне нужно из МАДЛа генерировать в "человеческую мнемонику" (program primer;) котороя обладает возожностями ЯВУ(типа Паскаля) и может запускаться как программа (EXE) для дальнейшей генерации.