Форум: "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-константа, статических переменных и тем более локальных в форте не было вроде. Хотя может я просто ошибаюсь. Насчет локальных точно знаю, что не было, вместо этого они занимались выделением временно памяти на стеке возвратов.
← →
Владимир Кладов (2004-10-31 16:38) [41]вопрос не понял. Что где взять?
← →
SPeller © (2004-10-31 16:40) [42]Владимир, не надо мне фортрана :) Я лучше П2 разучу на collapse :)
← →
SPeller © (2004-10-31 16:41) [43]
> Владимир Кладов (31.10.04 16:38) [41]
Ну вот есть константа, такая как я описал, имя которой фактически является указателем. Как мне взять значение, на которое указывает этот указатель?
← →
Владимир Кладов (2004-10-31 17:12) [44]Указать это имя в виде
####Имя
- будет абсолютный адрес. Или##(Имя-$CONST)
- будет 2-х-байтное смещение от начала констант.
DELL берет параметр с вершины стека. Если бы было слово DELL(%n%), тогда можно было бы к нему обращаться. А так -BYTE #n DELL
Это не фортран. Это Форт. Forth в оригинале. Вообще другой язык и другая машина. Даже был спор, что же такое Форт - язык программирования, операционная система, компьютер, или что-то еще :)
← →
lse (2004-11-03 10:42) [45]Владимир, один вопрос покоя мне не дает: Зачем это всё? зачем делать суб-маленькие приложения ? или это просто разработка п-2 для goodwell-a ?
← →
Владимир Кладов (2004-11-03 17:41) [46]в том числе и разработка П2. В том числе и попытка оценить свои тямы по поводу компилятора на примере Паскаля. Если честно, я не ожидал, что этот язык окажется таким сложным и много-вариантным. Слишком много встроенных синтаксических форм. Компилятор уже достиг 8100 строк, и все еще не близко к финишу. Хотя и ближе, чем раньше.
А маленькие - очень хочется. Есть у меня приложеньице (EmuZWin), сделано на KOL. Размер 1,5 Мбайта, жмется UPX-ом до 450К (если бы на VCL, боюсь и представить, сколько было бы , наверное, все 4 метра). И как бы я его выкладывал на тырнете делая по версии каждую неделю. А если его удастся ужать хотя бы еще впятеро, насколько облегчится мой труд по выкладыванию версий. И насколько упростится разработка асм-частей, если будет не BASM, а нормальный MASM32, с макросами. И можно будет все архивы с собранными приложениями уменьшить как минимум втрое, надолго отпадут проблемы с увеличением хостингового пространства. И конечно - желание получить свой компилятор и дальше делать с ним что угодно. Ждем-сс от Борланда мультиплатформенности который год, дождались какого-то суррогата в виде kylix (суррогата, потому что даже VCL-совместимость относительная). Для WinCE (даже) и то видимо не дождемся. Но ведь и PC тоже может когда-нибудь уступить свое место другим платформам. Я пытаюсь решить проблему платформенной независимости через компиляцию в промежуточный язык (П2), который хотя и не 100% мультиплатформенный, но достаточно простой, чтобы сделать компилятор с него за неделю - для любой платформы, и за месяц довести до ума. За полгода вылизать дочиста. А компилятор с Паскаля или гудвела (на самом деле, он "уже не тот, что был вначале" (пардон за цитату Рильке), и по простоте может сравниться с тем же фортом или П2)) - его один раз надо сделать. И больше не переделывать. Вот и мультиплатформенность получится. В плане машинного кода - не путать с платформенностью под ОС. ОС - это немного другое.
← →
lse (2004-11-04 11:17) [47]"уже не тот, что был вначале" - это как ?
← →
Андрей © (2004-11-05 13:08) [48]Владимир Кладов
//Инструментарий: masm32 (для компиляции использовалась версия 5,
//но без проблем должно работать и в версии 8 с сервис-паком 1),
Давненько не брал я в руки masm32...
Что есть версия 8?
Это то, что предлагается на wasm.ru, masm.com под названием masm8.2 (ml.exe версии 6.14) или надо вырвать кусок из MS Visual Studio 2005 (ml.exe версии 8.0)?
← →
Владимир Кладов (2004-11-05 18:11) [49]Я не в MS VS брал. Хотя они скорее всего совместимы, по крайней в той части, что нам сейчас нужна. Тем более у меня нет особо большого интереса к VS чтобы доставать версию будущего года :)
Не тот что был - ну совсем не тот. Хотя кое-какие идеи остались. В общем работа над коллапсом мне поможет во многом и его доработать.
← →
Андрей © (2004-11-13 18:02) [50]2 Владимир Кладов
Владимир, предлагаю на обсуждение некоторые уточнения:
1. Считать двоеточие специальным символом, невозможным
в идентификаторе.
НапримерA:B
интерпретировать не как вызов процедуры с таким именем, а как последовательность из метки A, спецсимвола ":", и вызова процедуры B.
Соответственно, метка и ":" могут быть разделены пробелом
2. Разделить как-либо в процедуре секцию локальных переменных и код.
Например, в коде
D2 PROC P2
VAR
V1: BYTE
V2: MYTYPE
END D2
V2 может быть интерпретирована либо как переменная типа MYTYPE
либо как метка, и тогда MYTYPE - не тип а вызов процедуры
Или это специально задумано, и тип V2 надо определять именно исходя из типа MYTYPE?
← →
Андрей © (2004-11-13 18:08) [51]И вот еще, вдогонку...
3. Имя процедуры/модуля после END сделать необязательным. А можно и вовсе исключить.
4. Отказаться (временно) от вложенности комментариев, ввиду замороченности реализации
Страницы: 1 2 вся ветка
Форум: "KOL";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.038 c