* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



MMX и SSE2
Тема третьего урока MMX и SSE2, одновременно будет обсуждена 64-битная математика. И мы впервые обратим внимание на зависимость оптимизации оп процессорам.
Пример выглядит следующим образом.
function AddInt64_1(A, B : Int64) : Int64;
begin
Result := A + B;
end;
Посмотрим теперь ассемблерный код.
function AddInt64_2(A, B : Int64) : Int64;
begin
{
push ebp
mov ebp,esp
add esp,-$08
}
Result := A + B;
{
mov eax,[ebp+$10]
mov edx,[ebp+$14]
add eax,[ebp+$08]
adc edx,[ebp+$0c]
mov [ebp-$08],eax
mov [ebp-$04],edx
mov eax,[ebp-$08]
mov edx,[ebp-$04]
}
{
pop ecx
pop ecx
pop ebp
//ret
}
end;
Первые три строки устанавливают фрейм стека, так же как в предыдущих уроках. В данный момент мы уже знаем, что компилятор самостоятельно добавляет первые две строки. Последние три строки так же хорошо знакомы нам. Опять строку POP EBP компилятор добавляет сам. Теперь посмотри, что же это за восемь строк.
31 марта 2009 | Borland Delphi | vitek | | 4989
 


Программирование с помощью BASM в Delphi
Это вторая глава введения в программирование с помощью BASM в Delphi. В первой главе было короткое введение в целочисленный код, а в этой главе введение в код с плавающей запятой. В нашем примере мы рассчитаем полином второго порядка. Параметры A, B и C, которые определяют полином, закодированы как локальные константы. В функцию передается переменная X типа double и результат также типа double. Функция выглядит так.
function SecondOrderPolynomial1(X : Double) : Double;
31 марта 2009 | Borland Delphi | vitek | | 3347
 


Простая функция Паскаля
Начнем с небольшого примера. Это простая функция Паскаля по умножению целого на константу 2.
function MulInt2(I : Integer) : Integer;
begin
Result := I * 2;
end;
Посмотрим сгенерированный код в окне CPU view. Я компилировал с включенной оптимизацией.
function MulInt2_BASM(I : Integer) : Integer;
begin
Result := I * 2;
{
add eax,eax
ret
}
end;
Здесь мы видим, что параметр передается в функцию в регистре EAX и результат возвращается в том же регистре. Это соглашение по передаче параметров через регистры (register calling convention), которое является соглашением по умолчанию в Delphi. Актуальный код очень простой, умножение на 2 заменяется сложением операнда с самим собой, I + I = 2I. Инструкция RET возвращает управление в строку, следующую за вызовом функции.
31 марта 2009 | Borland Delphi | vitek | | 3220
 


Упрощение интерфейса
Когда я только начинал писать эту статью, основной моей целью было показать, что интерфейс между DBGrid и, например, массивом можно наладить достаточно легко. Но, возможно, для таких простых ситуаций имеет смысл пойти дальше и разработать свой собственный интерфейс как надстройку над классом TDataSet, для обеспечения функционирования которого достаточно будет перекрыть всего десяток методов. Последовав советам, я решил вместо перекрывания методов ввести систему событий.
С учетом сказанного, второй пример будет состоять из двух частей: TMyDataSet – переходник, обеспечивающий упрощенное взаимодействие с методами TDataSet, используя обычный для Delphi механизм событий, и TMyData – класс, содержащий собственно адресную книгу и методы работы с ней, которые и назначаются в качестве реакций на события TMyDataSet.
Эту схему событий я решил основать на принципе обращения к записям по их последовательным номерам, отсчитываемым от единицы. На мой взгляд, это вполне оправданно, т.к. я адаптирую интерфейс TDataSet именно к простым наборам данных (таким, как списки или массивы), а для существенно более сложных наборов целесообразнее, возможно, работать с обычным интерфейсом TDataSet.
31 марта 2009 | Borland Delphi | vitek | | 2921
 


Native-формат данных
Приведу обещанное описание Native-формата данных:
• Данные для поля (каждому полю соответствует экземпляр потомка TField), имеющего DataType=ftInteger или ftLargeint, в Native-формате представлены просто в виде числа типа longint (или, что то же самое, Integer); данные для ftSmallint – числом типа Smallint, ftWord – типа Word.
• Для полей с DataType=ftString данные хранятся в виде последовательности символов, завершающейся #0 (символом с кодом 0); длина последовательности вместе с #0 не должна превышать значение_поля_Size + 1. Если поле Transliterate данного экземпляра TStringField равно True, то потомок TDataSet должен предоставить метод Translate для преобразования данных из кодировки символов, используемой в конкретном наборе данных, в кодировку ANSI (и обратно). В том виде, как он реализован в TDataSet, метод Translate просто возвращает исходную строку.
31 марта 2009 | Borland Delphi | vitek | | 3549
 


ДОБАВЛЕНИЕ ВОЗМОЖНОСТЕЙ РЕДАКТИРОВАНИЯ
Разумеется, чаще возникают ситуации, когда необходимо обеспечить возможность редактирования данных, в т.ч. удаления записей и добавления новых. Определенные сложности при этом могут возникать лишь при добавлении новых записей, в то время как редактирование и удаление достаточно тривиальны.
Рассмотрим более сложный и более приближенный к реальности пример потомка TDataSet. Наш класс TMyDataSet будет предоставлять доступ для чтения/изменения/удаления/добавления записей в адресную книгу, представляющую собой список (обычный TList), содержащий указатели на записи, состоящие из двух строковых компонентов: имени и электронного адреса. Кроме того, TMyDataSet будет поддерживать работу с закладками.
Итак, какие действия предпринимает TDataSet при редактировании, добавлении и удалении записей?
Самая простая операция – удаление. Вызов общедоступного метода Delete приводит (если TDataSet не находится в состоянии вставки записи, в противном случае Delete просто вызывает Cancel) к вызову InternalDelete, на который возлагается обязанность удалить запись из набора. Работа завершается вызовом Resync, так что InternalDelete может поместить физический курсор на любую запись по своему усмотрению.
31 марта 2009 | Borland Delphi | vitek | | 3917
 


ПРОСТЕЙШИЙ DATASET
Есть такое хорошее правило – прежде чем переходить к программированию, четко определить круг задач, которые обязательно должны быть решены. Давайте ему последуем. Я хочу создать потомка TDataSet, работающего с набором данных, содержащим два столбца: целое число и его квадрат. Для простоты этот набор данных будет содержать лишь 20 записей – для чисел от 1 до 20. Borland выдвигает еще одно требование: каждый потомок TDataSet должен поддерживать работу с закладками. Однако я позволю себе пока его проигнорировать – тем более, что и без этого получается практически вполне работоспособный класс. Желающие могут добавить в этот пример поддержку закладок, предварительно ознакомившись с механизмом закладок в следующем разделе.
ПРИМЕЧАНИЕ
О терминологии: в дальнейшем я буду использовать название TDataSet для обозначения программного кода и классов, тогда как под набором данных буду понимать сам набор данных, доступ к которому обеспечивает конкретный потомок TDataSet.
Чтобы создать потомка TDataSet, нужно понять, как TDataSet выполняет доступ к данным. Общедоступный (public) интерфейс полностью реализуется средствами самого TDataSet; на плечи конкретных потомков ложится лишь обеспечение средств коммуникации общедоступных методов с набором данных. В основном, коммуникация осуществляется методами InternalXXX, часть из которых в TDataSet объявлена пустыми, а часть – и вовсе абстрактными.
Эти методы можно разделить по их назначению на три группы: навигация (перемещение) по набору и чтение записи из БД в кэш-буфер (а также запись из кэш-буфера в набор данных), вставка/удаление записей, чтение/изменение значений полей записи, прочие методы (открытие и закрытие TDataSet, закладки, выделение и освобождение памяти).
31 марта 2009 | Borland Delphi | vitek | | 7977
 


Панель View
Панель просмотра содержит пиктограммы, предназначенные для создания новых
модулей, просмотра форм и редакторов кода, а также для переключения между фор-
мой и редактором кода.
31 марта 2009 | Borland Delphi | vitek | | 2774
 


Панель Standard
Стандартная панель меню содержит пиктограммы общих задач, таких как откры-
тие, сохранение и создание проектов Delphi, и ассоциированных с ними файлов.
31 марта 2009 | Borland Delphi | vitek | | 2736
 


Delphi 8
Современные технологии программирования развиваются очень быстро. И вот на
смену Delphi 7 пришел новый инструментарий программиста — пакет Delphi 8. Хотя
это не взаимоисключающие пакеты. Delphi 7 рассчитан для создания программ, рабо-
тающих на платформе Win32, а пакет Delphi 8 рассчитан на программирование для но-
вой платформы .NET, созданной фирмой Microsoft. Новая платформа имеет множество
достоинств, о которых будет сказано в соответствующих главах. Платформа .NET уже
доказала свою надежность и устойчивость в работе, а благодаря удачным технологиче-
ским решениям она привлекает внимание все большего числа программистов и ме-
неджеров. Можно с уверенностью сказать, что за этой платформой будущее, хотя
платформа Win32 не сдает свои позиции и будет использоваться еще довольно долго.
Работая в среде программирования Delphi, можно создавать программы как для плат-
формы Win32, так и для платформы .NET. С новым инструментарием Delphi 8 можно
использовать все написанные ранее программы для Delphi 7, и во многих случаях не
потребуется никаких изменений. Но, например, если ранее вы писали программы для
работы с Internet, то без изменений уже не обойтись.
31 марта 2009 | Borland Delphi | vitek | | 4251
 


Пн Вт Ср Чт Пт Сб Вс
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | 31 марта 2009. Регион сайта: Москва и Санкт-Петербург