Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - X512

Страницы: 1 [2] 3
16
Общий раздел / Re: [CP] Вопрос про Message Bus.
« : Февраль 02, 2013, 07:06:35 am »
Вопрос собственно, наверно к Илье Ермакову: правильно ли я понимаю, что в в случае Message Bus, все сообщения сидят на стеке? Или они все же в массивах где-то в куче обитают?

Интересно сколько существует сообщений одновременно - намного ли их больше чем типов сообщений? И являются ли в твоем случае эти сообщения мутабельными? Могут ли обработчики сообщений напрямую вызывать других обработчиков с параметрами, или же их дергает только некий центральный менеджер?

Вообще, можешь краткий упрощенный пример того как это все используется накидать?
Сообщения хранятся на стеке. Например сообщения ввода выделяются в модуле HostWindows.

Одновременно сообщений не много. Никакой очереди сообщений нет, обработчик сообщения вызывается прямо из процедуры посылки сообщения (поэтому не надо слать сообщения из обработчика; можно получить переполнение стека).

Для сообщений ввода используется очередь сообщений Win32. При принятии сообщения оно конвертируется в родной формат в модуле HostWindows и передаётся в Views.ForwardCtrlMsg, который вызывает обработчики отображений. Можете поставить HALT(0) в какой-нибудь обработчик и посмотреть как происходит доставка сообщения.

Сообщения являются изменяемыми. Это активно используется в сообщениях свойств.

17
Общий раздел / Re: Язык программирования Оно
« : Январь 24, 2013, 10:00:59 am »
Спецификации языка не нашёл также как не нашёл и компилятора, только общие слова. Критиковать пока нечего.

18
При этом заоптимизировали эту поддержку для уменьшения объёма файлов...
Скорее для совместимости со старыми версиями без поддержки юникода так сделали, а не из-за размера. У старых версий BlackBox'а LPiece'ов не было.

19
Короче вот они, последствия преждевременной оптимизации -- стреляют ещё как.
Где тут про преждевременную оптимизацию? Просто криво поддержку юникода ввели...

20
Относительно возможности открытия больших текстов в BlackBox.
BlackBox не загружает содержимое в память, он читает текст из файла используя кеширование. Но Piece'ы загружаются в память полностью. Поэтому текст с большим количеством не Latin-1 символов может забить память Piece'ами и привести к жутким тормозам. Можете открыть HeapSpy и посмотреть как чередуются в памяти Piece и LPiece. Тормоза можно убрать, если отключить генерацию коротких Piece'ов, записывая все символы только в UTF-16. Для этого можно сделать такой хак в модуле TextModels:
PROCEDURE (wr: StdWriter) WriteChar (ch: CHAR);
VAR t: StdModel; u, un: Run; lp: LPiece; pos, spillPos: INTEGER;
fw: Files.Writer; op: EditOp; bunch: BOOLEAN;
BEGIN
IF ch = 200BX THEN wr.WriteChar(zwspace)
ELSIF ch = 2010X THEN wr.WriteChar(hyphen)
ELSIF ch = 2011X THEN wr.WriteChar(nbhyphen)
ELSE
После него BlackBox сразу открывает файлы даже размером в полтора гигабайта (предварительно сконвентированные в ODC; если этого не сделать, то BlackBox будет сам конвертировать при загрузке в %temp%). Ничего не тормозит вообще, только полоса прокрутки глючит. Потребление памяти при этом - около 500 КБ. Очень большие файлы открыть нельзя ввиду того, что для задания позиций и размеров используется INTEGER (в соответствии с сообщением о языке его размер - 4 байта).

Видимо эти LPiece'ы были добавлены бездумно без учёта последствий. К тому же насколько мне известно BlackBox разрабатывали немцы, а им юникод не нужен.

21
Общий раздел / Re: MinGW
« : Январь 14, 2013, 01:44:02 pm »
А что вам на WinApi написать понабилось? Этот API уже морально устарел Microsoft его уже почти не обновляет и потихоньку от него пытается отказаться. Есть C#, Qt и другие современные платформы.

22
Общий раздел / Re: Машинный код x86
« : Январь 14, 2013, 01:40:09 pm »
1. Распоределение регистров - стандартный алгоритм раскраски графов. Ершов в сое время решил эту задачу. Сейчас этот алгоритм применяется везде практически. И даже в учебниках по компиляторам описан.
В книжке Робина Хантера, например: http://www.ozon.ru/context/detail/id/1304237/
Рекомпилятор должен быть простым, поэтому такие сложные оптимизации в нём не допустимы. Допустимы только оптимизации кода стековой машины. Там нет никаких регистров и распределять нечего.

23
Общий раздел / Re: MinGW
« : Январь 14, 2013, 01:22:49 pm »
Например здесь. MS VS видимо знает, под каким Windows'ом она работает.

24
Общий раздел / Re: Машинный код x86
« : Январь 14, 2013, 01:17:13 pm »
Смотрю что выводит GCC и удивляюсь: почему так неэффективно? Или это какая-то магия с выравниванием кода и кэшем? Чувствую, что мой компилятор даже без модуля оптимизации обгонит GCC... А с модулем вообще всё обгонит :)

25
Общий раздел / Re: MinGW
« : Январь 14, 2013, 01:14:34 pm »
Надо указать версию Windows, например:
#define _WIN32_WINNT 0x0501 //Windows XP
#include <windows.h>

26
Общий раздел / Re: Машинный код x86
« : Январь 14, 2013, 12:30:41 pm »
Не дописал последнюю строчку кода:
mov [ebp+x], eax     ; ~ len len& 1 - 2 DIV 4 * a& + ^ x ->

27
Общий раздел / Re: Component Pascal vs Oberon-07
« : Январь 14, 2013, 12:25:52 pm »
Как видишь в C# с модификаторами ни чуть не хуже чем в Component Pascal.
Да, весьма неплохо... Вижу и модульность есть и контроль использования гибкий. Я на C# ничего сложнее Hello, World'а не писал, так что спасибо за информацию.

28
Общий раздел / Re: Машинный код x86
« : Январь 14, 2013, 12:19:41 pm »
Какая-то странная логика у операций деления и умножения. Они почему-то работают с разными размерами и возвращают значение в фиксированные регистры. Как эффективно выделять регистры - непонятно. Посмотрел, что выдаёт GCC на выражение ((a+b+c)/(b-d))/((c-a)/(d*4-a)):
t = dword ptr -8
a = dword ptr  8
b = dword ptr  0Ch
c = dword ptr  10h
d = dword ptr  14h

push    ebp
mov     ebp, esp
push    ebx
sub     esp, 4

mov     eax, [ebp+b] ; EAX := b
mov     edx, [ebp+a] ; EDX := a
add     edx, eax     ; INC(EDX, EAX)
mov     eax, [ebp+c] ; EAX := c
add     eax, edx     ; INC(EAX) + EDX
mov     edx, [ebp+d] ; EDX := d
mov     ecx, [ebp+b] ; ECX := b
mov     ebx, ecx     ; EBX := ECX
sub     ebx, edx     ; DEC(EBX, EDX)
mov     [ebp+t], ebx ; t := EBX
idiv    [ebp+t]      ; EAX := EDX:EAX DIV [ebp+t]; EDX := EDX:EAX MOD [ebp+t];
mov     ecx, eax     ; ECX := EAX
mov     eax, [ebp+a] ; EAX := a
mov     edx, [ebp+c] ; EDX := c
mov     ebx, edx     ; EBX := EDX
sub     ebx, eax     ; DEC(EBX, EAX)
mov     eax, ebx     ; EAX := EBX
mov     edx, [ebp+d] ; EDX := d
shl     edx, 2       ; EDX := EDX*4
mov     ebx, edx     ; EBX := EDX
sub     ebx, [ebp+a] ; DEC(EBX, a)
mov     [ebp+t], ebx ; t := EBX
cdq                  ; EDX:EAX := EAX
idiv    [ebp+t]      ; EAX := EDX:EAX DIV [ebp+t]; EDX := EDX:EAX MOD [ebp+t];
mov     [ebp+t], eax ; t := EAX
mov     eax, ecx     ; EAX := ECX
cdq                  ; EDX:EAX := EAX
idiv    [ebp+t]      ; EAX := EDX:EAX DIV [ebp+t]; EDX := EDX:EAX MOD [ebp+t];

add     esp, 4       
pop     ebx
pop     ebp
retn
Выходит он просто временную переменную заводит. Регистр нельзя?

Я предполагал такую архитектуру компилятора: сначала компилятор в лоб в один проход генерирует модуль с процедурами в формате стековой машины. Кроме процедур компилятор генерирует таблицу символов и метаинформацию. Потом этот модуль даётся оптимизатору. Он выдаёт эквивалентный модуль в том же формате, но оптимизированный. Оптимизатор платформо-независим и прозрачно интегрируется в цепочку компиляции и может быть убран или заменён при необходимости. Пока оптимизатора не будет. Затем оптимизированный модуль даётся "рекомпилятору", который конвертирует процедуры из стековой машины в машинный код i386.

Рекомпилятор поддерживает стек регистров примерно так:
stack machine program:
1 2 3 4 5 6 7 + + + + + +

x86 code:
mov  eax, 1 ; eax
mov  ebx, 2 ; eax, ebx
mov  ecx, 3 ; eax, ebx, ecx
mov  edx, 4 ; eax, ebx, ecx, edx
push eax
mov  eax, 5 ; s[0], ebx, ecx, edx, eax
push ebx
mov  ebx, 6 ; s[0], s[1], ecx, edx, eax, ebx
add  ebx, 7 ; s[0], s[1], ecx, edx, eax, ebx
add  eax, ebx ; s[0], s[1], ecx, edx, eax
add  edx, eax ; s[0], s[1], ecx, edx
add  ecx, edx ; s[0], s[1], ecx
pop  ebx ; s[0], ebx, ecx
add  ebx, ecx ; s[0], ebx
pop  eax ; eax, ebx
add  eax, ebx ; eax
Понятно, что исходная программа легко оптимизируется перестановкой и перегруппировкой слагаемых, но она специально составлена для демонстрации переполнения регистрового стека.

Но операции умножения и деления ломают этот механизм.

Также рекомпилятор должен уметь распознавать режимы адресации, используемые в x86:
stack machine
len& 1 - 2 DIV 4 * a& + ^ x ->

C:
x = a[(len-1)/2];

direct recompilation:
mov eax, [ebp+len]   ; len len&
dec eax              ; len len& 1 -
shr eax, 1           ; len len& 1 - 2 DIV
shl eax, 2           ; len len& 1 - 2 DIV 4 *
mov ebx, [ebp+a]     ; len len& 1 - 2 DIV 4 * a&
add eax, ebx         ; len len& 1 - 2 DIV 4 * a& +
mov eax, [eax]       ; len len& 1 - 2 DIV 4 * a& + ^
mov [ebp+x], eax     ; ~ len len& 1 - 2 DIV 4 * a& + ^ x ->

addressing modes detection:
mov eax, [ebp+len]   ; len len&
dec eax              ; len len& 1 -
shr eax, 1           ; len len& 1 - 2 DIV
mov ebx, [ebp+a]     ; len len& 1 - 2 DIV &a
mov eax, [eax*4+ebx] ; len len& 1 - 2 DIV 4 * a& + ^

29
Общий раздел / Re: Component Pascal vs Oberon-07
« : Январь 14, 2013, 07:54:56 am »
А теперь я прошу доказать тезис, что любой Обероновский (в том числе любого Оберона) код будет гарантированно работать и работать везде одинаково.
А чего тут доказывать; спецификация оберонов чётко описывает все детали, критичные для исполнения. В отличии от Си там нет "undefined behavior". Другое дело, что не каждый компилятор соответствует спецификации. Например компилятор BlackBox'а содержит несколько критичных для безопасности багов и некорректно реализует логику оператора WITH.
Да нифига подобного. UB в Обероне КУЧА. Ну, для примера: что будет в обероне, если поделить на ноль? А что будет если разименовать NIL? Для простоты давай возьмем Oberon-07/11.
Про Oberon-07/11 не знаю, но в Component Pascal программа должна прерваться, если поделить на 0 или разыменовать NIL.
Цитировать
the result of a real operation is too large to be represented as a real number, it is changed to the predeclared value INF with the same sign as the original result. Note that this also applies to 1.0/0.0, but not to 0.0/0.0 which has no defined result at all and leads to a run-time error.

30
Общий раздел / Re: Машинный код x86
« : Январь 14, 2013, 07:45:22 am »
Помнится лет 5 назад я пытался туда перетащить Pow!, но не осилил.
Это что? Google не умеет индексировать восклицательные знаки, так что не нашёл...

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