Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

COLLAPSE [COLLAPSE, Windows]


Страницы:   1 2 3

Владимир Кладов ©   (2004-10-22 08:13:00) 

Разрабатываю технологию 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-процедуры и предварительный расчет константных выражений, сбор сведений о том,

какие значеняи могут принимать глобальные/локальные переменные, и за счет этого редуцировать ненужные процедуры

и всегда одинаковые параметры процедур.


Андрей   (2004-11-13 18:08:00) [1]

И вот еще, вдогонку...

3. Имя процедуры/модуля после END сделать необязательным. А можно и вовсе исключить.

4. Отказаться (временно) от вложенности комментариев, ввиду замороченности реализации


Андрей   (2004-11-13 18:02:00) [2]

2 Владимир Кладов

Владимир, предлагаю на обсуждение некоторые уточнения:

1. Считать двоеточие специальным символом, невозможным
в идентификаторе.

Например A:Bинтерпретировать не как вызов процедуры с таким именем, а как последовательность из метки A, спецсимвола ":", и вызова процедуры B.

Соответственно, метка и ":" могут быть разделены пробелом

2. Разделить как-либо в процедуре секцию локальных переменных и код.

Например, в коде


D2 PROC P2
VAR
V1: BYTE
V2: MYTYPE

END D2


V2 может быть интерпретирована либо как переменная типа MYTYPE
либо как метка, и тогда MYTYPE - не тип а вызов процедуры

Или это специально задумано, и тип V2 надо определять именно исходя из типа MYTYPE?


Владимир Кладов   (2004-11-05 18:11:00) [3]

Я не в MS VS брал. Хотя они скорее всего совместимы, по крайней в той части, что нам сейчас нужна. Тем более у меня нет особо большого интереса к VS чтобы доставать версию будущего года :)

Не тот что был - ну совсем не тот. Хотя кое-какие идеи остались. В общем работа над коллапсом мне поможет во многом и его доработать.


Андрей   (2004-11-05 13:08:00) [4]

Владимир Кладов
//Инструментарий: masm32 (для компиляции использовалась версия 5,
//но без проблем должно работать и в версии 8 с сервис-паком 1),

Давненько не брал я в руки masm32...

Что есть версия 8?

Это то, что предлагается на wasm.ru, masm.com под названием masm8.2 (ml.exe версии 6.14) или надо вырвать кусок из MS Visual Studio 2005 (ml.exe версии 8.0)?


lse   (2004-11-04 11:17:00) [5]

"уже не тот, что был вначале" - это как ?


Владимир Кладов   (2004-11-03 17:41:00) [6]

в том числе и разработка П2. В том числе и попытка оценить свои тямы по поводу компилятора на примере Паскаля. Если честно, я не ожидал, что этот язык окажется таким сложным и много-вариантным. Слишком много встроенных синтаксических форм. Компилятор уже достиг 8100 строк, и все еще не близко к финишу. Хотя и ближе, чем раньше.

А маленькие - очень хочется. Есть у меня приложеньице (EmuZWin), сделано на KOL. Размер 1,5 Мбайта, жмется UPX-ом до 450К (если бы на VCL, боюсь и представить, сколько было бы , наверное, все 4 метра). И как бы я его выкладывал на тырнете делая по версии каждую неделю. А если его удастся ужать хотя бы еще впятеро, насколько облегчится мой труд по выкладыванию версий. И насколько упростится разработка асм-частей, если будет не BASM, а нормальный MASM32, с макросами. И можно будет все архивы с собранными приложениями уменьшить как минимум втрое, надолго отпадут проблемы с увеличением хостингового пространства. И конечно - желание получить свой компилятор и дальше делать с ним что угодно. Ждем-сс от Борланда мультиплатформенности который год, дождались какого-то суррогата в виде kylix (суррогата, потому что даже VCL-совместимость относительная). Для WinCE (даже) и то видимо не дождемся. Но ведь и PC тоже может когда-нибудь уступить свое место другим платформам. Я пытаюсь решить проблему платформенной независимости через компиляцию в промежуточный язык (П2), который хотя и не 100% мультиплатформенный, но достаточно простой, чтобы сделать компилятор с него за неделю - для любой платформы, и за месяц довести до ума. За полгода вылизать дочиста. А компилятор с Паскаля или гудвела (на самом деле, он "уже не тот, что был вначале" (пардон за цитату Рильке), и по простоте может сравниться с тем же фортом или П2)) - его один раз надо сделать. И больше не переделывать. Вот и мультиплатформенность получится. В плане машинного кода - не путать с платформенностью под ОС. ОС - это немного другое.


lse   (2004-11-03 10:42:00) [7]

Владимир, один вопрос покоя мне не дает: Зачем это всё? зачем делать суб-маленькие приложения ? или это просто разработка п-2 для goodwell-a ?


Владимир Кладов   (2004-10-31 17:12:00) [8]

Указать это имя в виде ####Имя- будет абсолютный адрес. Или ##(Имя-$CONST)- будет 2-х-байтное смещение от начала констант.

DELL берет параметр с вершины стека. Если бы было слово DELL(%n%), тогда можно было бы к нему обращаться. А так -   BYTE #n DELL

Это не фортран. Это Форт. Forth в оригинале. Вообще другой язык и другая машина. Даже был спор, что же такое Форт - язык программирования, операционная система, компьютер, или что-то еще :)


SPeller   (2004-10-31 16:41:00) [9]


> Владимир Кладов   (31.10.04 16:38) [41]

Ну вот есть константа, такая как я описал, имя которой фактически является указателем. Как мне взять значение, на которое указывает этот указатель?


SPeller   (2004-10-31 16:40:00) [10]

Владимир, не надо мне фортрана :) Я лучше П2 разучу на collapse :)


Владимир Кладов   (2004-10-31 16:38:00) [11]

вопрос не понял. Что где взять?


Владимир Кладов   (2004-10-31 16:36:00) [12]

А поглядел бы я как вы в родном Форте бы это описали. Есть правда расширения вроде SP-Forth, наверняка что-то придумано. Но в оригинале EQU-константа, статических переменных и тем более локальных в форте не было вроде. Хотя может я просто ошибаюсь. Насчет локальных точно знаю, что не было, вместо этого они занимались выделением временно памяти на стеке возвратов.


SPeller   (2004-10-31 16:35:00) [13]

А как взять значение указателя?


SPeller   (2004-10-31 16:34:00) [14]

Баг - отладчик вываливается при развороте во весь экран, либо при ресайзе свыше определенных размеров.


Владимир Кладов   (2004-10-31 16:34:00) [15]

ясненько написно: CONST - хранимая в памяти константа, ее имя - это адрес в памяти того места, где она лежит. Надо EQU использовать.


SPeller   (2004-10-31 16:17:00) [16]

Наверное для меня очень далека идея языка, поэтому я с таким трудом что-то в нем понимаю :). Пока )


SPeller   (2004-10-31 16:13:00) [17]

Константы описывал так:
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)тоже выдает ошибку.

Как правильно использовать эти две вещи?


Владимир Кладов   (2004-10-31 11:21:00) [18]

И еще немного:
Кроме хранимой в памяти CONST, которая отличается от переменной
STATIC только тем, что предполагается, что ее нельзя изменять в
программе, могут быть еще EQU-константы вида:

имя EQU числовое выражение

EQU-константы не хранятся в памяти и вводятся для того, чтобы дать
возможность использовать имена флажков (например), вместо
указания непосредственных числовых значений.


Видимо, вы пытались использовать CONST, и тогда это действительно адрес хранимой в памяти константы, а не само значение.


Владимир Кладов   (2004-10-31 11:16:00) [19]

Вот еще кусочек описания. По памяти, что-тто может не соответствовать, надо свярять с кодом.
----------------------------------------------------------
В   числовом   выражении   можно   использовать  операции  (в  порядке
приоритета):

- (унарный) ~ NOT
* / MOD DIV
> SHL SHR
+ -
= < > =
& | ^ AND OR XOR

Допускается  сложение  и  вычитание  адреса  (метки, имени статической
переменной  или  константы  с  числом, именно в таком порядке - первый
операнд   адрес,   второй  операнд  -  число)  и  вычисление  разности
однотипных  адресов  (т.е. можно получать разницу между двумя метками,
или  между  адресами двух статических переменных или двух констант). В
константном  выражении  скобки  могут  использоваться  для  управления
порядком   вычисления,   внутри   скобок  операнды  и  операции  могут
отделяться  пробелами.  Выражения  могут  использоваться  так  же    в
параметрах  (параметризованные  имена  процедур,  содержащие  (  ... )
непосредственно в имени процедуры, например API(%name%).
----------------------------------------------------------
Вовремя не описал, теперь сам уже точно не помню. Наверное, действительно нельзя | адреса с чсилом. Другое дело, почему константа оказалась адресом. Проще посчитать константы и записать числами, в комментариях оставить как оно должно быть в символическом виде. Если бы кусочек вашего кода, было бы понятнее что не получается.


SPeller   (2004-10-30 20:51:00) [20]

Я тут всё никак не мог вызвать CreateWindowEx так чтобы нормально. То константы не складываются лигическим 'или' (говорит, оператор | должен использоваться с числами, а не с адресами). Но фантазия у меня иссякла в экcпериментах, поэтому буду ждать более подробного описания языка :)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо