Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.041 c
4-1114439503
BorisMor
2005-04-25 18:31
2005.06.14
Взять отрисовку полностью на себя


1-1117381279
Serg1981
2005-05-29 19:41
2005.06.14
Отдельный hint для каждого элемента ListView


1-1117180990
pavel_guzhanov
2005-05-27 12:03
2005.06.14
создание и уничтожение компонентов в Run-Time


14-1116828369
vidiv
2005-05-23 10:06
2005.06.14
Перекомпилировать весь VCL


8-1109343555
Pers
2005-02-25 17:59
2005.06.14
Изображения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский