Форум: "KOL";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизCOLLAPSE Найти похожие ветки
← →
Владимир Кладов (2004-10-22 08:13) [0]Разрабатываю технологию COLLAPSE. Предполагается уменьшение кода еще в несколько раз, на уже готовых проектах,
причем на этот раз можно будет портировать по этой технологии и VCL-проекты, а в перспективе - никаких особых
ограничений на платформу, или язык (и С пойдет, если для С конвертер сделать). Но на этот раз - возможно
замедление выполнения на длительных вычислениях, если их не оптимизировать.
Суть в следующем: уже готов эмулятор форт-подобной виртуальной "машины", занимает 240 байт машинного кода, уже
практически годный к использованию неоптимизирующий макро-компилятор с (уже разработанного) языка П2 и
пошаговый отладчик П2-кода (уровня исходных текстов) в виде dll, который вызывается, если программа была
откомпилирована специально для отладки. Тестовое приложение - exe-файл в формате PE, которое просто вызывает
MessageBoxA (типа hello,world) занимает 1,5К. Процесс разработки сейчас такой: П2-код подается в компилятор П2,
на выходе получается программа на ассемблере (masm32). В этой программе находятся вместе сам эмулятор и код,
который надо эмулировать, включая ассемблерные вставки (П2-программа состоит из П2-процедур и асм-процедур, так
что П2-машина легко расширяется быстрыми ассемблерными процедурами). Далее masm32-программа компилируется и
собирается в нормальный исполнимый файл.
Сейчас я делаю компилятор из Паскаля в П2. Мне не очень хотелось аннонсировать проект, пока не будет пройден
этот этап, но полноценный компилятор с Паскаля - хотя и в реально несуществующую машину - это и правда не очень
быстрый кусок работы. Принципиальных проблем пока не встретилось (разве что то, что при компиляции system.pas
обнаруживается неприятное наличие неких аксиом, в самом system.pas не отраженных. Как например, некоторые типы
данных вроде Longint или констант MaxLongint. Но это все решаемо).
Когда будет пройден этот шаг, можно будет публиковать саму технологию, и заняться оптимизатором П2-кода,
предполагаю делать оптимизатор как отдельную программу (или даже как несколько отдельных), которая принимает
файлы с П2-кодом, и на выходе выдает опять П2-код, но уже оптимизированный. Основная цель оптимизации - это
помимо мелких (локальных) оптимизаций выполнить глобальную оптимизацию, в основном это должно стать вынесение
общих кусков куда в отдельные П2-процедуры и предварительный расчет константных выражений, сбор сведений о том,
какие значеняи могут принимать глобальные/локальные переменные, и за счет этого редуцировать ненужные процедуры
и всегда одинаковые параметры процедур.
← →
ecm (2004-10-22 09:25) [1]Здорово!
И как Вас на все хватает?
Не нужна ли помощь? (Код,Тестирование,Документация) :)
← →
Андрей © (2004-10-22 09:45) [2]Огласите весь список, пожалуйста!
В том смысле, что руки чешутся помочь, и есть немного свободого времени вечерами.
Могу писать на Delphi/Asm, слегка на C
Немножко читал Кнута...:))
Из того, что написано, могу попробовать оптимизацию.
Только нужны примеры П2-программ или средство их делать, пусть даже и ущербное
← →
Владимир Кладов (2004-10-22 11:38) [3]я сначала компилятор доведу до компиляции хотя бы простого KOL-приложения, без оптимизации, но чтобы работало оно при том. Потом опубликую полностью со всеми исходниками, и будем двигаться дальше, уже вместе. У меня есть большие надежды, что замедление будет достаточно мизерно, а может и совсем его не будет. А еще, если вся программа вмещается в кэш процессора, то это может дать еще и плюсы... И еще большие надежды на то, что чем больше исходный код был до коллапсирования, то тем больший процент сжатия будет достигаться. Двух-стековая архитектура П2-машины позволяет делать с кодом чудеса: практически в любых месте можно найти последовательность одинаковых команд, и вынести в общую процедуру, сэкономив тем самым до половины кода. Вообще не будет дублирующихся участков кода, как вам это нравится. Но это работа для одного из оптимизаторов.
← →
dmd (2004-10-22 12:00) [4]Правильно ли понимаю, схема будет такая?:
пишем на языке высокого уровня (получаем си|паскаль|дельфи код) -> компилируем в П2 (получаем неоптимизированный П2-код) -> оптимизируем П2-код (имеем улучшенный П2-код) -> компилируем П2 в асм-код (получаем асм-код с интегрированным эмулятором) -> компилим масмом в исполнимый файл.
И какие части этой схемы нужно будет переделать в случае ее приложения, допустим, к линуксу на не-х86?
← →
Gleb (2004-10-22 12:08) [5]Владимир, я, конечно, понимаю, что вопрос глупый, но есть ли какой-то ориентировочный срок, когда будет что-то опубликовано? Т.е. это вопрос дней, неделей или месяцев?
Если будет уменьшение размеров и незамедление для больших проектов, то это будет чудо. Но всё равно хочется в это верить.
← →
Владимир Кладов (2004-10-22 12:38) [6]все именно так. Могу поправить самый первый пункт: пишем на языке высокого уровня (получаем си|паскаль|дельфи код) или берем готовое отлаженное приложение, написанное на Delphi/Free Pascal/Kylix/CBuilder/MSVC++...
К линкусу, очевидно, надо будет поправить сам эмулятор, переписать несколько системных модулей, изготовленных на П2+асм, прежде всего в части асм. И приложение само уже должно быть написано для линукса, прежде чем его компилировать в П2. Платформенная независимость здесь только в плане реализации исполнителя кода, сам код получается платформенно-зависимый, это все-таки не ява, где исполнитель машины отделен от самого кода и код сам по себе полностью не содержит никакой привязки к платформе. А так, да хоть для Sun или Эльбруса, не предвижу проблем. Программа будет оставаться весьма маленькой, поскольку бОльшая часть кода преобразуется в П2-код, а он на любой машине будет одинаково компактным.
Для знакомых с фортом могу предупредить, что от форта там только идея 2х стеков. Код выглядит совсем не так, я все-таки не настолько извращенец, чтобы отказываться от концепции локальных переменных. По мне, локальные (да и глобальные тоже) переменные - это и удобно, и эффективно, и главное - адекватно модели внутреннего мира ЯВУ, с которых надо компилировать.
Вообще, идея эта у меня возникла еще в 1988 году (я тогда и понятия не имел о языке Форт, тем не менее мозгов догадаться о том, что может дать двух-стековость, хватило), и была мною реализована в виде компилятора с подможества С (С-тран, 1989) в простейшую П-машину, для платформы DEC PDP. Сжатие оказалось не таким большим, как я тогда рассчитывал, всего в 3 раза, но PDP-код сжимать - это вам не с PC, там код получался очень даже компактненький даже при использовании С-компилятора... Да и не все идеи у меня только от тех времен, есть и более свежие. Например, свертка вызовов подпрограмм до 1-байтных (их можно теперь просто считать командами, просто каждая процедура П2-программы имеет как бы 64 своих собственных команды, и 64 таких команд - общие для всей П2-программы). Не было тогда у меня представления о параметрах "непосредственно" в коде, знакомство с Z80 в 199х дало мне понимание того, как этот простой прием позволяет ужать код в "ноль". В П2 этот способ сжатия кода - один из важнейших. Фактически вызов подпрограммы (1байт) + некоторое количество байтов вслед за этим вызовом - получается новая команда с одним или несколькими непосредственными операндами. В итоге, получается "машина" с переменной системой команд, которая гибко подстраивается под нужды данного конкретного приложения/языка программирования/программиста... Ладно, пойду код делать. Будет еще время описания описывать :)
← →
Владимир Кладов (2004-10-24 13:09) [7]progress report. Некоторое продвижение. С интерфейсной частью покончено: завершен разбор семантики и генерация кода для интерфейсных частей в system.pas, types.pas, windows.pas, messages.pas, richedit.pas, kol.pas, err.pas. Т.е. исходный код еще пестрит //todo: сделать то и это, но проскакивает нормально, p2-файлы (исходные для p2-compiler) генерятся успешно, на вид выглядят нормально. Правда, это только интерфейсная часть, самое интересное (генерация кода) - только начинаю делать. Может, неделя, может две, а может, и больше потребуется.....
Код компилятора Паскаль->П2 достиг уже 4945 (отлаженных) строк. Время от момента создания файла = 8 дней (создан 16 октября сего года).
А тот тут про сроки спрашивали :)
← →
Владимир Кладов (2004-10-27 12:48) [8]Прогресс: 5700 строк, приступаю к трансляции базовых конструкций (тело процедуры/функции). Самое интересное так сказать.
← →
SPeller © (2004-10-27 12:57) [9]Ждем результатов с нетерпением!
← →
Владимир Кладов (2004-10-27 15:47) [10]а потерпеть придется :) Я еще даже не знаю, как TRY-FINALLY/EXCEPT реализовывать, и что с потоками делать, даже для CALLBACK-функций еще концепция не реализована. А ведь еще надо с ASM-вставками что-то делать.... Хорошо хоть с вызовом API функций уже все проверено, работает. Генерация кода для вложенных процедур по сравнению с этим - пустячок :)
← →
SPeller © (2004-10-27 16:00) [11]Если понадобятся бета-тестеры, пишите сюда, поможем.
← →
Владимир Кладов (2004-10-28 21:08) [12]7156 строк и чем дальше в лес тем толще партизаны... :)
← →
ecm (2004-10-28 22:10) [13]2Speller & Kladov
Можно и Альфа-тестирование :)
← →
lse (2004-10-29 13:03) [14]можно и пре-alfa :), ... ну дайте ж хоть что-то - поиграться так хочется...
← →
Владимир Кладов (2004-10-29 16:27) [15]http://bonanas.rinet.ru/Collapse.zip
← →
Владимир Кладов (2004-10-29 16:31) [16]Не совсем пойму в чего поиграться хотите? Forth берете и то же самое (почти) получаете. Удобств - никаких, баги лезут из всех дыр, документации море, но мышление с ног на голову все, польская обратная запись, непривычное мышление... Для COLLAPSE - это просто - целевая машина, исполнитель, сталкиваться с ней реально не нужно. Выглядеть все будет как раньше... Только иногда может оказаться медленней. Зато сжатие будет еще раз в 5.
← →
SPeller © (2004-10-29 17:39) [17]Всё хорошо, но ссылка не работает. А на счет играться - лично мне не играться хочется, а посмотреть интересную мне весчь, а если понравится, то и использовать её. Ну и попутно помочь посильно её развитию.
← →
SPeller © (2004-10-29 17:41) [18]А-а, букву "z" забыли :)
← →
_silver © (2004-10-29 17:42) [19]http://bonanzas.rinet.ru/Collapse.zip
← →
_silver © (2004-10-29 17:43) [20]SPeller © (29.10.04 17:41) [18]
Извини, не увидел это сообщение.
← →
SPeller © (2004-10-29 17:45) [21]ВАУ!!! Первый раз вижу программу с одним (!!!!) импортом. Владимир - моё уважение :)
← →
-SeM- (2004-10-29 17:52) [22]P2_tst.exe и test2.exe после ОК - прог-ма ... вызвала ошибку KERNEL32.DLL и будет закрыта (WinMe)
← →
Владимир Кладов (2004-10-29 18:28) [23]Вы перекомпилируйте, оно еще может быть от того, что последний раз я собирал для отладчика, он наверное пробует FreeLibrary вызвать для модуля с хэндлом 0.
← →
Владимир Кладов (2004-10-29 18:33) [24]Кстати, в туториалах Iczelion"а есть описание того как сделать прямой call/jmp без создания еще одной таблицы заглушек. Что-то через _imp_имя функции. У меня не получилось, потому возможно, что я делал для masm32 версии 5, а когда версию 8 скачал, уже некогда было возвращаться. Если кто разберется, милости прошу мне на мыло или даже сюда. Хорошо если на 1 API-функцию будет приходиться только 6 байт jmp-а, а не 11, как сейчас - в таблицах. Или можно даже так, что пусть та таблица будет, но код бы использовал сразу ее, не создавая еще одной своей таблицы переходов, как сейчас...
← →
Gandalf © (2004-10-29 21:02) [25]Действительно впечатляет.
← →
SPeller © (2004-10-29 21:09) [26]Владимир, где-нить лежит KOLFontComboBox, который у вас в отладчике используется? А то не комилится нифига.
← →
Владимир Кладов (2004-10-29 21:28) [27]enchcombos у меня на сайте возьмите. А что я сделал выбор шрифта. надо же, не помню :)
← →
miek © (2004-10-29 21:40) [28]Описание П2 впечатляет! Демо-программы работают без проблем.
Из любопытства посмотрел в код. Сразу вопрос возникает - почему бы не заменить такую конструкцию:
+ PROC ASM ; сложение двух целых на вершине, заменяются результатом
POP EAX
POP EDX
ADD EAX, EDX
PUSH EAX
JMP EBX
END +
на такую:
+ PROC ASM
POP EAX
ADD [ESP], EAX
JMP EBX
END +
Вдвое короче. Или оптимизатор сам такие штуки должен будет делать?
← →
Владимир Кладов (2004-10-29 22:29) [29]потому что важен был принцип, а дополнительно оптимизировать всегда потом можно. Нет, оптимизатор на автомате должен оптимизировать только G2-код. Нет, конечно, если кто напишет автоматический оптимизатор для асм-процедур, то всегда пожалуйста :) Тем более что есть пожелания, чтобы был и обратный инструмент - некоторые процедуры переводить обратно в асм для вящей скорости. После выявления критичных участков, конечно.
← →
SPeller © (2004-10-30 17:59) [30]Владимир, ждем дальнейших результатов! Лично мне ваш проект очень нравится, и когда будет готов конвертер дельфийских исходников - ему цены не будет. Сейчас ещё багово всё, но, я думаю, будущее у этого проекта есть. Я попытался наваять что-нибудь свое, но пока безрезультатно - много непонятно, много ещё не реализовано, много ещё не описано. Буду ждать с нетерпением дальнейших разработок.
← →
Владимир Кладов (2004-10-30 19:30) [31]Вот пропустил в описании П2-кода:
Следующие конструкции П2-языка определены встроенным образом,
аксиоматически:
#...#число или #...#(числовое выражение)
#"символ" или #"символ"
"строка" или "строка"
метка:
IF=0(метка)
IF<>0(метка)
IF>0(метка)
IF>=0(метка)
IF<0(метка)
IF<=0(метка)
GOTO(метка)
IFcond ... [ ELSE ... ] ENDIF (где cond - одно из 6 условий < > <> <= >= = )
процедура
При записи кода никакие разделители (кроме пробелов между отдельными
командами) не требуются. Комментарии могут начинаться с символа ";" до
конца строки или /* ... */ (вложенные, т.е. /* ... /* ... */ ... */,
могут быть многострочными).
← →
SPeller © (2004-10-30 20:51) [32]Я тут всё никак не мог вызвать CreateWindowEx так чтобы нормально. То константы не складываются лигическим "или" (говорит, оператор | должен использоваться с числами, а не с адресами). Но фантазия у меня иссякла в экcпериментах, поэтому буду ждать более подробного описания языка :)
← →
Владимир Кладов (2004-10-31 11:16) [33]Вот еще кусочек описания. По памяти, что-тто может не соответствовать, надо свярять с кодом.
----------------------------------------------------------В числовом выражении можно использовать операции (в порядке
----------------------------------------------------------
приоритета):
- (унарный) ~ NOT
* / MOD DIV
<< >> SHL SHR
+ -
<= >= < > <> =
& | ^ AND OR XOR
Допускается сложение и вычитание адреса (метки, имени статической
переменной или константы с числом, именно в таком порядке - первый
операнд адрес, второй операнд - число) и вычисление разности
однотипных адресов (т.е. можно получать разницу между двумя метками,
или между адресами двух статических переменных или двух констант). В
константном выражении скобки могут использоваться для управления
порядком вычисления, внутри скобок операнды и операции могут
отделяться пробелами. Выражения могут использоваться так же в
параметрах (параметризованные имена процедур, содержащие ( ... )
непосредственно в имени процедуры, например API(%name%).
Вовремя не описал, теперь сам уже точно не помню. Наверное, действительно нельзя | адреса с чсилом. Другое дело, почему константа оказалась адресом. Проще посчитать константы и записать числами, в комментариях оставить как оно должно быть в символическом виде. Если бы кусочек вашего кода, было бы понятнее что не получается.
← →
Владимир Кладов (2004-10-31 11:21) [34]И еще немного:
Кроме хранимой в памяти CONST, которая отличается от переменной
STATIC только тем, что предполагается, что ее нельзя изменять в
программе, могут быть еще EQU-константы вида:
имя EQU числовое выражение
EQU-константы не хранятся в памяти и вводятся для того, чтобы дать
возможность использовать имена флажков (например), вместо
указания непосредственных числовых значений.
Видимо, вы пытались использовать CONST, и тогда это действительно адрес хранимой в памяти константы, а не само значение.
← →
SPeller © (2004-10-31 16:13) [35]Константы описывал так:
CONST WS_EX_TOOLWINDOW: DWORD = $80
CONST WS_BORDER: DWORD = $800000
CONST WS_SYSMENU: DWORD = $80000
CONST WS_POPUP: DWORD = $80000000
CONST WS_VISIBLE: DWORD = $10000000
Ещё была функцияLOADDW(%val%) PROC ASM
;LODSD
PUSH (%val%)
JMP EBX
END LOADDW(%val%)
И при попытке записать например так:LOADDW(WS_BORDER|WS_VISIBLE)
выдавало указанную выше ошибку.
Кроме того я не смог сообразить как использовать DELL - записьDELL(12)
тоже выдает ошибку.
Как правильно использовать эти две вещи?
← →
SPeller © (2004-10-31 16:17) [36]Наверное для меня очень далека идея языка, поэтому я с таким трудом что-то в нем понимаю :). Пока )
← →
Владимир Кладов (2004-10-31 16:34) [37]ясненько написно: CONST - хранимая в памяти константа, ее имя - это адрес в памяти того места, где она лежит. Надо EQU использовать.
← →
SPeller © (2004-10-31 16:34) [38]Баг - отладчик вываливается при развороте во весь экран, либо при ресайзе свыше определенных размеров.
← →
SPeller © (2004-10-31 16:35) [39]А как взять значение указателя?
← →
Владимир Кладов (2004-10-31 16:36) [40]А поглядел бы я как вы в родном Форте бы это описали. Есть правда расширения вроде SP-Forth, наверняка что-то придумано. Но в оригинале EQU-константа, статических переменных и тем более локальных в форте не было вроде. Хотя может я просто ошибаюсь. Насчет локальных точно знаю, что не было, вместо этого они занимались выделением временно памяти на стеке возвратов.
Страницы: 1 2 вся ветка
Форум: "KOL";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.042 c