SlideShare a Scribd company logo
1 of 57
Системное программное обеспечение
Лекция 4
Тема 1. Системное программное обеспечение
План лекции:
 Соглашения по оформлению программного кода
 Win API и типы данных
 Разработка DLL в Lazarus
 Статическое связывание DLL
 Динамическое связывание DLL
Соглашения по идентификаторам. Подбор
идентификаторов
 Все идентификаторы должны выбираться из соображений
читаемости и максимальной семантической
нагрузки.
Плохо Хорошо
const UU = 0.0001;
var Kk : Integer;
Zz : String;
const
Eps = 0.0001; { точность }
var
Sum : Integer;{ сумма }
Message: String; { сообщение }
Соглашения по идентификаторам. Подбор
идентификаторов
 Идентификаторы рекомендуется подбирать из слов
английского языка.
Плохо Хорошо
procedure Zvuk(Chast,
Dlit: Word);
procedure Beep(Hertz, MSec:
Word);
Соглашения по идентификаторам. Написание
идентификаторов
 Зарезервированные слова языка Free Pascal писать только
маленькими буквами:
type, var, const; procedure, function; begin, end; if,
then, else; repeat, until; case; while; and, not, or; unit,
uses, interface, implementation.
 В любых идентификаторах каждое слово, входящее в
идентификатор, писать, начиная с большой
буквы, остальные буквы -- маленькие. Не использовать
символ подчеркивания "_".
var
NextX, LastX: Real;
BeepOnError: Boolean;
Соглашения по идентификаторам. Написание
идентификаторов
 Идентификаторы, состоящие из одной буквы, писать
большой буквой, если они
не являются счетчиками циклов.
A := A + B;
B := A - B;
A := A - B;
{ удалить звено c номером I из списка L }
procedure DeleteNode(var L: List; I: Word);
for i := 1 to N do
for j := 1 to N do
A[i, j] := (i + j) / 2;
Структура программы
 Пролог, директива подключения внешних модулей, блоки
объявления и основной блок программы начинаются на одном
уровне по вертикали, то есть первые символы ключевых слов
program, uses, type, const, var и begin/end основного блока
должны располагаться друг под другом.
program ИмяПрограммы;
uses
{ Перечисление подключаемых модулей здесь }
type
{ Типы объявляются здесь }
const
{ Константы объявляются здесь }
var
{ Переменные объявляются здесь }
begin
{ Операторы программы здесь }
end.
Объявление переменных
 В одной синтаксической конструкции объявления
переменной нужно объявлять одну переменную.
Плохо Хорошо
var
a, b: Integer;
var
a: Integer;
b: Integer;
Соглашения по читаемости программ
 "Лесенка" должна отражать структурную вложенность
языковых конструкций. Рекомендуется отступ не менее
2-х и не более 8-и пробелов. Принятого отступа нужно
придерживаться во всем тексте программы.
Правила написания
конструкции if then
if <условие> then
begin
<операторы>
end;
if <условие> then <оператор>;
if <условие> then
<оператор>;
if <условие> then
begin
<операторы>
end
else
begin
<операторы>
end;
Правила написания
конструкции while do
while <условие> do
begin
<операторы>
end;
while <условие> do <оператор>;
while <условие> do
<оператор>;
Правила написания
конструкции for
for <счетчик> := <нач. знач.> to <конеч. знач.> do
begin
<операторы>
end;
for <счетчик> := <нач. знач.> to <конеч. знач.> do
<оператор>;
Правила написания
конструкции case
case <выражение> of
<выражение> : <оператор>;
…
end;
case <выражение> of
<выражение> : <оператор>;
…
else
<оператор>
end;
case <выражение> of
<выражение> :
begin
<операторы>
end;
end;
Другие соглашения
 Операнды бинарных операций (+, := и т.п.) отделять от знака
операции одним пробелом " ".
Например: Sum := A + B;
 При перечислении идентификаторов после запятой ","
ставить один пробел " ".
WriteLn('Сумма: ', A + B, ';', 'Разность: ', A - B,
'.');
Всегда писать символ-разделитель операторов ";" (сразу же
после оператора).
После символа-спецификатора типа ":" ставить один пробел " ".
var
i: Integer;
Спецификация процедур и функций
 Для каждой пользовательской процедуры или функции
должна быть описана в виде комментария
спецификация, содержащая следующую информацию:
а) назначение процедуры или функции;
б) описание семантики параметров-значений (параметров,
передаваемых по значению), если она неочевидна;
в) описание семантики параметров-переменных
(параметров, передаваемых по ссылке), если она
неочевидна.
г) для функции: описание семантики возвращаемого
значения, если она неочевидна.
Спецификация процедур и функций
 семантика параметров и возвращаемого значения очевидна
function IsLeapYear(Y: Word): Boolean;
{ возвращает True, если год Y -- високосный }
 семантика параметров очевидна, семантика возвращаемого
значения неочевидна
function DayOfWeek(D, M, Y: Word): Byte;
{ Возвращает день недели даты D/M/Y;
год Y должен быть в отрезке 1582..4902;
результат: ВСК = 0, ПНД = 1, ВТР = 2, ... СБТ = 6 }
Спецификация процедур и функций
const
MaxN = 10;
type
Matrix = array [1..MaxN, 1..MaxN] of Real;
Vector = array [1..MaxN] of Real;
procedure Gauss(A: Matrix;
B: Vector;
Eps: Real;
var X: Vector;
var HasSolution: Boolean;
var NumOfRoots: Integer;
var Det: Real;
var AForReverse: Matrix;
var BForReverse: Vector);
Спецификация процедур и функций
Спецификация пользовательского
программного файла или модуля
Программный файл или модуль (unit) должен начинаться со
спецификации в виде комментария, содержащего
следующую информацию:
а) идентификация (имя) файла;
б) фамилия автора;
в) дата написания файла;
г) версия языка компилятора Pascal и -- если требуется --
замечания по компиляции программы (модуля) в других
версиях языка;
д) назначение программы (модуля);
Домашнее задание
 Оформить код лабораторной работы №1 согласно
соглашениям, распечатать и сдать на проверку.
 + титульный лист, где ФИО, группа, название
дисциплины
 + исходное задание.
 Код вставлять в виде скриншотов (открыть .pas в
блокноте) достаточного для комфортного просмотра
разрешения.
Соответствие типов в системном
программировании
 При разработке системных программ от программиста
требуется четкое и правильное понимание представления
каждого типа в памяти компьютера, умение
преобразовывать типы данных и заранее прогнозировать
результаты таких преобразований.
 Наиболее эффективным с точки зрения быстродействия и
экономии памяти являются типы данных, размер которых
равен разрядности процессора и операционной системы.
 При разработке системных программ, библиотек, модулей
под управлением 32-х разрядных операционных систем
семейства Microsoft Windows практически всегда
используются 32-х битные (4 байта) переменные.
Логические типы в Free Pascal
Логические типы в Free Pascal
Логические типы в Free Pascal
Логический тип при вызове функций API
 Логические переменные представляются в подавляющем
большинстве случаев четырехбайтовой переменной,
нулевое значение которой трактуется как «ложь»,
ненулевое – как «истина».
 В языке Free Pascal для описания таких переменных
предназначен тип LongBool.
 Тип Boolean тоже может быть использован, но следует
помнить, что он является однобайтовым.
Числовые типы Free Pascal
Числовые типы Free Pascal
Числовые типы Free Pascal
Числовой тип при вызове функций API
 Числовые значения также в большинстве случаев хранятся
в четырёхбайтовых переменных.
 В языке Free Pascal для описания таких переменных
предназначены два типа: Integer и Cardinal –
соответственно знаковое и беззнаковое 32-рарядное
целое число.
 Иногда в некоторых функциях API используются
двухбайтовые значения, для них также есть соответствия в
Free Pascal.
 Выбор конкретного типа зависит от требований к
диапазону значений и занимаемой памяти.
 При необходимости возможно преобразование типов.
Тип указатель при вызове функций API
 Указатели на объекты, структуры, значения обычно
представляются типами, различными по описанию, но
общими по представлению в памяти.
 Базовым типом для хранения указателей в Free Pascal
является тип Pointer.
 Также определены большое количество различных
типизированных указателей, таких как PAnsiString, PString,
PByteArray, PCurrency, PExtended, PShortString и другие.
 В 32-хразрядных операционных системах Microsoft
Windows используется линейная модель памяти, где адрес
ячейки памяти является 32-хразрядным значением.
Следовательно, любой указатель можно рассматривать как
четырехбайтовую переменную, хранящую значение
адреса.
Тип строка при вызове функций API
 Строки при вызове функций API практически всегда
передаются в формате с завершающим нулевым
символом.
 Для описания таких строк в языке Free Pascal
предназначены типы PChar, PansiChar и PWideChar.
 Эти типы являются обычными указателями и к ним
применимо все, написанное выше.
Тип PChar
 Поскольку нам придется иметь дело со строками, то
следует иметь в виду вот что: в динамических библиотеках
рекомендуют применять строковый тип PChar.
 Это связано с тем, что вашей DLL могут пользоваться
программисты, создающие приложения на других
платформах. В среде Windows тип PChar считается
"родным", все WinAPI-функции используют этот тип.
 Внутри DLL-файла можно использовать
любой строковый тип, но для передачи параметров и для
получения результатов лучше использовать PChar.
Преобразование типов: из String в PChar
var
MyString : String;
AnotherString: PChar;
…
MyString := String(AnotherString);
AnotherString := PChar(MyString);
Дескрипторы при вызове функций API
 Дескрипторы различных объектов представляются типами,
такими как HWnd, THandle, HMenu, HINST и др.
 По сути это обычные 32-хразрядные числовые
переменные.
Предпосылки появления DLL
 Современное программирование стало достаточно
сложным, уже написаны километры строк кода, и
некоторые его части время от времени приходится
дублировать в разных программах.
 Если бы каждый программист в каждой новой программе
заново писал весь необходимый код, языки
программирования никогда бы не получили такого
стремительного развития.
 Однако мы в своих проектах можем использовать
инструменты, созданные другими программистами - типы,
процедуры, функции… Мы уже неоднократно подключали
к нашим проектам различные модули и пользовались
описанными в них средствами.
Вопросы
 Какими модулями Вы пользовались при написании
программ?
 Как модули включаются в программах на языке Free
Pascal?
Пример программы
 Подсчет количества цифр в числе.
 Исходный код: DigitCount.pas
Вопрос
 Как мы можем дать возможность другим
программистам использовать функции разработанные
в нашей программе?
Ответ
 Пишем модуль!
 Исходный код: DigitModule.pas
Недостатки модульного подхода
 при использовании модульного подхода, в момент
компиляции проекта в него внедряется весь тот код,
который был описан в модуле => увеличение .exe
файла + загрузка оперативной памяти
 Зависимость от языка - мы можем использовать чужой
код, только если он написан на таком же языке
программирования, каким пользуемся мы.
Выход есть – пишем DLL !!!
 DLL (англ., Dynamic Link Library - Динамически
Подключаемые Библиотеки) - универсальный
механизм внедрения в программу функций и
процедур, написанных другими программистами, и
возможно, на другом языке программирования.
Внедрение происходит не в момент компиляции
проекта, как в случае модулей, а в момент загрузки
готовой программы в оперативную память.
DLL в различных ОС
 В нашем курсе подразумевается, что мы используем
операционную систему семейства Windows, однако
механизм динамически подключаемых библиотек
существует во всех современных операционных
системах.
 В Windows такая библиотека представляет
собой файл *.dll, в Linux и Unix -
*.so (Shared Object Library), а в MacOS X -
*.dylib (Dynamic Shared Library).
 И все эти библиотеки можно создавать с помощью
Lazarus. Учитывая, что мы используем ОС Windows, мы
будем рассматривать создание dll-файлов.
Разработка DLL в Lazarus
 Пример программы
 Исходный код: Digit.pas
Соглашения по вызову процедур
 Чтобы в программе можно было использовать
инструменты из динамических библиотек сторонних
разработчиков, были разработаны специальные
соглашения по вызову процедур. Эти соглашения
определяют различные правила вызова подпрограмм:
как будут передаваться параметры - через стек, через
регистры, через динамическую память; кто
ответственный за очистку стека - вызывающая или
вызываемая программа и т.д. Так, если
используется стек, то чтение будет происходить
справа налево. То есть, последние загруженные
данные будут считаны первыми.
Сведения по соглашениям вызова подпрограмм
Команда вызова
Обработка
параметров
Ответственный за
очистку стека
Разрешена ли
передача
параметров через
регистры
Register Слева-направо Подпрограмма Да
Pascal Слева-направо Подпрограмма Нет
Cdecl Справа-налево Вызывающая
программа
Нет
Stdcall Справа-налево Подпрограмма Нет
Соглашения по вызову процедур
 Для программ на Windows чаще всего используют
соглашение stdcall. А если вы создаете DLL, которую
затем могут использовать Си-программисты, то
указывайте соглашение cdecl.
Вызов DLL из внешней программы
 Библиотеку DLL можно связать с приложением двумя
способами:
 статическим связыванием
 динамическим связыванием
Вызов DLL из внешней программы
 Библиотеку DLL можно связать с приложением двумя
способами:
 статическим связыванием
 динамическим связыванием
Вызов DLL из внешней программы
 Библиотеку DLL можно связать с приложением двумя
способами:
 статическим связыванием
 динамическим связыванием
Статическое связывание
 Статическое связывание самое простое, оно
подразумевает, что DLL будет загружена сразу, как
только приложение начнет выполняться. Это самый
простой способ использования DLL, обращение к
процедурам и функциям динамической библиотеки
такое же, как к обычным процедурам и функциям.
Статическое связывание. Недостатки
 при загрузке программы должны подгружаться и все
используемые DLL, а это увеличивает время загрузки
 чтобы пользователь мог работать с программой, он
должен иметь все эти используемые DLL
 при статическом связывании все
загруженные DLL занимают память всё время, что
работает программа, вне зависимости от того,
использует ли она эти DLL в настоящее время, или нет.
Статическое связывание. Пример программы
 Пример программы
 Исходный код: StaticDLL.pas
Динамическое связывание
 Динамическое связывание подразумевает, что
требуемая DLL будет подгружаться только тогда, когда
требуется выполнить какую-то процедуру или
функцию из неё. После чего DLL можно выгрузить,
освободив память.
Динамическое связывание. Достоинства и
недостатки
 Плюсы в том, что программу можно использовать, не
имея всех DLL. Загрузка программы будет
осуществляться быстрее, поскольку DLL будут
подгружаться по мере необходимости, а не вместе с
программой.
 Минусы же в том, что из-за необходимости
подгружать и выгружать библиотеку, будет
увеличиваться время обращения к её функциям и
процедурам. Кроме того, само обращение к ним будет
намного сложнее.
Динамическое связывание. Пример программы
 Пример программы
 Исходный код: DynamicDLL.pas
Спасибо за внимание!
Вопросы?

More Related Content

What's hot

Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...corehard_by
 
Презентация. Основы Pascal
Презентация. Основы PascalПрезентация. Основы Pascal
Презентация. Основы PascalEvgen67
 
Язык программирования Pascal
Язык программирования PascalЯзык программирования Pascal
Язык программирования PascalSchool 242
 
Функции в языке программирования QBasic
Функции в языке программирования QBasicФункции в языке программирования QBasic
Функции в языке программирования QBasickvlar
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
паскаль язык структурного программирования
паскаль   язык структурного программированияпаскаль   язык структурного программирования
паскаль язык структурного программированияЕлена Ключева
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2Technopark
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6Technopark
 
Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.YakubovichDA
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsSergey Schetinin
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеYakubovichDA
 
введение
введениевведение
введениеAndEdr
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.Igor Shkulipa
 

What's hot (20)

лек5 6
лек5 6лек5 6
лек5 6
 
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
 
Презентация. Основы Pascal
Презентация. Основы PascalПрезентация. Основы Pascal
Презентация. Основы Pascal
 
Язык программирования Pascal
Язык программирования PascalЯзык программирования Pascal
Язык программирования Pascal
 
Функции в языке программирования QBasic
Функции в языке программирования QBasicФункции в языке программирования QBasic
Функции в языке программирования QBasic
 
паскаль
паскальпаскаль
паскаль
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
паскаль язык структурного программирования
паскаль   язык структурного программированияпаскаль   язык структурного программирования
паскаль язык структурного программирования
 
D²NA
D²NAD²NA
D²NA
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
 
Java - основы языка
Java - основы языкаJava - основы языка
Java - основы языка
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
 
лек13 4
лек13 4лек13 4
лек13 4
 
Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.
 
8 3-1
8 3-18 3-1
8 3-1
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocols
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программирование
 
введение
введениевведение
введение
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 

Viewers also liked

อุปกรณ์พื้นฐานคอมพิวเตอร์
อุปกรณ์พื้นฐานคอมพิวเตอร์อุปกรณ์พื้นฐานคอมพิวเตอร์
อุปกรณ์พื้นฐานคอมพิวเตอร์Jaewave Tidchu
 
العمليات الجبرية
العمليات الجبريةالعمليات الجبرية
العمليات الجبريةealjelani
 
อุปกรณ์คอมพิวเตอร์
อุปกรณ์คอมพิวเตอร์อุปกรณ์คอมพิวเตอร์
อุปกรณ์คอมพิวเตอร์Jaewave Tidchu
 
อุปกรณ์เครือข่ายคอมพิวเตอร์
อุปกรณ์เครือข่ายคอมพิวเตอร์อุปกรณ์เครือข่ายคอมพิวเตอร์
อุปกรณ์เครือข่ายคอมพิวเตอร์Jaewave Tidchu
 
الدوال والاعداد
الدوال والاعدادالدوال والاعداد
الدوال والاعدادealjelani
 
HISTORIA DE LA INFORMÁTICA
HISTORIA DE LA INFORMÁTICAHISTORIA DE LA INFORMÁTICA
HISTORIA DE LA INFORMÁTICAaidajurado
 
อุปกรณ์การเชื่อมต่อคอมพิวเตอร์
อุปกรณ์การเชื่อมต่อคอมพิวเตอร์อุปกรณ์การเชื่อมต่อคอมพิวเตอร์
อุปกรณ์การเชื่อมต่อคอมพิวเตอร์Jaewave Tidchu
 
Disclosure - Voorstellen voor meer transparantie over herkomst van geleverde ...
Disclosure - Voorstellen voor meer transparantie over herkomst van geleverde ...Disclosure - Voorstellen voor meer transparantie over herkomst van geleverde ...
Disclosure - Voorstellen voor meer transparantie over herkomst van geleverde ...Katrien Verwimp
 
Familia simpson
Familia simpsonFamilia simpson
Familia simpsonPAMODIJU
 
Disclosure in Flanders - Groencheck
Disclosure in Flanders - Groencheck Disclosure in Flanders - Groencheck
Disclosure in Flanders - Groencheck Katrien Verwimp
 
Presentation of MEGACERT and AVS Logistik group of companies
Presentation of MEGACERT and AVS Logistik group of companiesPresentation of MEGACERT and AVS Logistik group of companies
Presentation of MEGACERT and AVS Logistik group of companiesNatalia Isachenko
 
محاضرات في رياضيات الأعمال
محاضرات في رياضيات الأعمالمحاضرات في رياضيات الأعمال
محاضرات في رياضيات الأعمالealjelani
 
Confidentiality manager training mha 690
Confidentiality manager training mha 690Confidentiality manager training mha 690
Confidentiality manager training mha 690nikki1919
 

Viewers also liked (18)

อุปกรณ์พื้นฐานคอมพิวเตอร์
อุปกรณ์พื้นฐานคอมพิวเตอร์อุปกรณ์พื้นฐานคอมพิวเตอร์
อุปกรณ์พื้นฐานคอมพิวเตอร์
 
العمليات الجبرية
العمليات الجبريةالعمليات الجبرية
العمليات الجبرية
 
อุปกรณ์คอมพิวเตอร์
อุปกรณ์คอมพิวเตอร์อุปกรณ์คอมพิวเตอร์
อุปกรณ์คอมพิวเตอร์
 
อุปกรณ์เครือข่ายคอมพิวเตอร์
อุปกรณ์เครือข่ายคอมพิวเตอร์อุปกรณ์เครือข่ายคอมพิวเตอร์
อุปกรณ์เครือข่ายคอมพิวเตอร์
 
الدوال والاعداد
الدوال والاعدادالدوال والاعداد
الدوال والاعداد
 
лекция 5
лекция 5лекция 5
лекция 5
 
HISTORIA DE LA INFORMÁTICA
HISTORIA DE LA INFORMÁTICAHISTORIA DE LA INFORMÁTICA
HISTORIA DE LA INFORMÁTICA
 
อุปกรณ์การเชื่อมต่อคอมพิวเตอร์
อุปกรณ์การเชื่อมต่อคอมพิวเตอร์อุปกรณ์การเชื่อมต่อคอมพิวเตอร์
อุปกรณ์การเชื่อมต่อคอมพิวเตอร์
 
Disclosure - Voorstellen voor meer transparantie over herkomst van geleverde ...
Disclosure - Voorstellen voor meer transparantie over herkomst van geleverde ...Disclosure - Voorstellen voor meer transparantie over herkomst van geleverde ...
Disclosure - Voorstellen voor meer transparantie over herkomst van geleverde ...
 
лекция 1
лекция 1лекция 1
лекция 1
 
Familia simpson
Familia simpsonFamilia simpson
Familia simpson
 
Disclosure in Flanders - Groencheck
Disclosure in Flanders - Groencheck Disclosure in Flanders - Groencheck
Disclosure in Flanders - Groencheck
 
Presentation of MEGACERT and AVS Logistik group of companies
Presentation of MEGACERT and AVS Logistik group of companiesPresentation of MEGACERT and AVS Logistik group of companies
Presentation of MEGACERT and AVS Logistik group of companies
 
محاضرات في رياضيات الأعمال
محاضرات في رياضيات الأعمالمحاضرات في رياضيات الأعمال
محاضرات في رياضيات الأعمال
 
Confidentiality manager training mha 690
Confidentiality manager training mha 690Confidentiality manager training mha 690
Confidentiality manager training mha 690
 
Krv
KrvKrv
Krv
 
Moss pp
Moss ppMoss pp
Moss pp
 
8 logika predikat
8  logika predikat8  logika predikat
8 logika predikat
 

Similar to лекция 4

язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
Общие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальОбщие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальAndrey Dolinin
 
Vba программы
Vba программыVba программы
Vba программыLidiKashka
 
Cреда программирования
Cреда программированияCреда программирования
Cреда программированияirina8682
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел СычевYandex
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETGoSharp
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
тема 1.введение в pascal
тема 1.введение в pascalтема 1.введение в pascal
тема 1.введение в pascaldasha2012
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeGetDev.NET
 

Similar to лекция 4 (20)

язык програмирования
язык програмированияязык програмирования
язык програмирования
 
10 инф
10 инф10 инф
10 инф
 
Общие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальОбщие сведения о языке программирования Паскаль
Общие сведения о языке программирования Паскаль
 
Vba программы
Vba программыVba программы
Vba программы
 
Cреда программирования
Cреда программированияCреда программирования
Cреда программирования
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложений
 
C++ теория
C++ теорияC++ теория
C++ теория
 
C++ теория
C++ теорияC++ теория
C++ теория
 
C++ теория
C++ теорияC++ теория
C++ теория
 
Step 1
Step 1Step 1
Step 1
 
тема 1.введение в pascal
тема 1.введение в pascalтема 1.введение в pascal
тема 1.введение в pascal
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программ
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
C# 3.0
C# 3.0C# 3.0
C# 3.0
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 

лекция 4

  • 2. Тема 1. Системное программное обеспечение
  • 3. План лекции:  Соглашения по оформлению программного кода  Win API и типы данных  Разработка DLL в Lazarus  Статическое связывание DLL  Динамическое связывание DLL
  • 4. Соглашения по идентификаторам. Подбор идентификаторов  Все идентификаторы должны выбираться из соображений читаемости и максимальной семантической нагрузки. Плохо Хорошо const UU = 0.0001; var Kk : Integer; Zz : String; const Eps = 0.0001; { точность } var Sum : Integer;{ сумма } Message: String; { сообщение }
  • 5. Соглашения по идентификаторам. Подбор идентификаторов  Идентификаторы рекомендуется подбирать из слов английского языка. Плохо Хорошо procedure Zvuk(Chast, Dlit: Word); procedure Beep(Hertz, MSec: Word);
  • 6. Соглашения по идентификаторам. Написание идентификаторов  Зарезервированные слова языка Free Pascal писать только маленькими буквами: type, var, const; procedure, function; begin, end; if, then, else; repeat, until; case; while; and, not, or; unit, uses, interface, implementation.  В любых идентификаторах каждое слово, входящее в идентификатор, писать, начиная с большой буквы, остальные буквы -- маленькие. Не использовать символ подчеркивания "_". var NextX, LastX: Real; BeepOnError: Boolean;
  • 7. Соглашения по идентификаторам. Написание идентификаторов  Идентификаторы, состоящие из одной буквы, писать большой буквой, если они не являются счетчиками циклов. A := A + B; B := A - B; A := A - B; { удалить звено c номером I из списка L } procedure DeleteNode(var L: List; I: Word); for i := 1 to N do for j := 1 to N do A[i, j] := (i + j) / 2;
  • 8. Структура программы  Пролог, директива подключения внешних модулей, блоки объявления и основной блок программы начинаются на одном уровне по вертикали, то есть первые символы ключевых слов program, uses, type, const, var и begin/end основного блока должны располагаться друг под другом. program ИмяПрограммы; uses { Перечисление подключаемых модулей здесь } type { Типы объявляются здесь } const { Константы объявляются здесь } var { Переменные объявляются здесь } begin { Операторы программы здесь } end.
  • 9. Объявление переменных  В одной синтаксической конструкции объявления переменной нужно объявлять одну переменную. Плохо Хорошо var a, b: Integer; var a: Integer; b: Integer;
  • 10. Соглашения по читаемости программ  "Лесенка" должна отражать структурную вложенность языковых конструкций. Рекомендуется отступ не менее 2-х и не более 8-и пробелов. Принятого отступа нужно придерживаться во всем тексте программы.
  • 11. Правила написания конструкции if then if <условие> then begin <операторы> end; if <условие> then <оператор>; if <условие> then <оператор>; if <условие> then begin <операторы> end else begin <операторы> end;
  • 12. Правила написания конструкции while do while <условие> do begin <операторы> end; while <условие> do <оператор>; while <условие> do <оператор>;
  • 13. Правила написания конструкции for for <счетчик> := <нач. знач.> to <конеч. знач.> do begin <операторы> end; for <счетчик> := <нач. знач.> to <конеч. знач.> do <оператор>;
  • 14. Правила написания конструкции case case <выражение> of <выражение> : <оператор>; … end; case <выражение> of <выражение> : <оператор>; … else <оператор> end; case <выражение> of <выражение> : begin <операторы> end; end;
  • 15. Другие соглашения  Операнды бинарных операций (+, := и т.п.) отделять от знака операции одним пробелом " ". Например: Sum := A + B;  При перечислении идентификаторов после запятой "," ставить один пробел " ". WriteLn('Сумма: ', A + B, ';', 'Разность: ', A - B, '.'); Всегда писать символ-разделитель операторов ";" (сразу же после оператора). После символа-спецификатора типа ":" ставить один пробел " ". var i: Integer;
  • 16. Спецификация процедур и функций  Для каждой пользовательской процедуры или функции должна быть описана в виде комментария спецификация, содержащая следующую информацию: а) назначение процедуры или функции; б) описание семантики параметров-значений (параметров, передаваемых по значению), если она неочевидна; в) описание семантики параметров-переменных (параметров, передаваемых по ссылке), если она неочевидна. г) для функции: описание семантики возвращаемого значения, если она неочевидна.
  • 17. Спецификация процедур и функций  семантика параметров и возвращаемого значения очевидна function IsLeapYear(Y: Word): Boolean; { возвращает True, если год Y -- високосный }  семантика параметров очевидна, семантика возвращаемого значения неочевидна function DayOfWeek(D, M, Y: Word): Byte; { Возвращает день недели даты D/M/Y; год Y должен быть в отрезке 1582..4902; результат: ВСК = 0, ПНД = 1, ВТР = 2, ... СБТ = 6 }
  • 18. Спецификация процедур и функций const MaxN = 10; type Matrix = array [1..MaxN, 1..MaxN] of Real; Vector = array [1..MaxN] of Real; procedure Gauss(A: Matrix; B: Vector; Eps: Real; var X: Vector; var HasSolution: Boolean; var NumOfRoots: Integer; var Det: Real; var AForReverse: Matrix; var BForReverse: Vector);
  • 20. Спецификация пользовательского программного файла или модуля Программный файл или модуль (unit) должен начинаться со спецификации в виде комментария, содержащего следующую информацию: а) идентификация (имя) файла; б) фамилия автора; в) дата написания файла; г) версия языка компилятора Pascal и -- если требуется -- замечания по компиляции программы (модуля) в других версиях языка; д) назначение программы (модуля);
  • 21. Домашнее задание  Оформить код лабораторной работы №1 согласно соглашениям, распечатать и сдать на проверку.  + титульный лист, где ФИО, группа, название дисциплины  + исходное задание.  Код вставлять в виде скриншотов (открыть .pas в блокноте) достаточного для комфортного просмотра разрешения.
  • 22. Соответствие типов в системном программировании  При разработке системных программ от программиста требуется четкое и правильное понимание представления каждого типа в памяти компьютера, умение преобразовывать типы данных и заранее прогнозировать результаты таких преобразований.  Наиболее эффективным с точки зрения быстродействия и экономии памяти являются типы данных, размер которых равен разрядности процессора и операционной системы.  При разработке системных программ, библиотек, модулей под управлением 32-х разрядных операционных систем семейства Microsoft Windows практически всегда используются 32-х битные (4 байта) переменные.
  • 26. Логический тип при вызове функций API  Логические переменные представляются в подавляющем большинстве случаев четырехбайтовой переменной, нулевое значение которой трактуется как «ложь», ненулевое – как «истина».  В языке Free Pascal для описания таких переменных предназначен тип LongBool.  Тип Boolean тоже может быть использован, но следует помнить, что он является однобайтовым.
  • 30. Числовой тип при вызове функций API  Числовые значения также в большинстве случаев хранятся в четырёхбайтовых переменных.  В языке Free Pascal для описания таких переменных предназначены два типа: Integer и Cardinal – соответственно знаковое и беззнаковое 32-рарядное целое число.  Иногда в некоторых функциях API используются двухбайтовые значения, для них также есть соответствия в Free Pascal.  Выбор конкретного типа зависит от требований к диапазону значений и занимаемой памяти.  При необходимости возможно преобразование типов.
  • 31. Тип указатель при вызове функций API  Указатели на объекты, структуры, значения обычно представляются типами, различными по описанию, но общими по представлению в памяти.  Базовым типом для хранения указателей в Free Pascal является тип Pointer.  Также определены большое количество различных типизированных указателей, таких как PAnsiString, PString, PByteArray, PCurrency, PExtended, PShortString и другие.  В 32-хразрядных операционных системах Microsoft Windows используется линейная модель памяти, где адрес ячейки памяти является 32-хразрядным значением. Следовательно, любой указатель можно рассматривать как четырехбайтовую переменную, хранящую значение адреса.
  • 32. Тип строка при вызове функций API  Строки при вызове функций API практически всегда передаются в формате с завершающим нулевым символом.  Для описания таких строк в языке Free Pascal предназначены типы PChar, PansiChar и PWideChar.  Эти типы являются обычными указателями и к ним применимо все, написанное выше.
  • 33. Тип PChar  Поскольку нам придется иметь дело со строками, то следует иметь в виду вот что: в динамических библиотеках рекомендуют применять строковый тип PChar.  Это связано с тем, что вашей DLL могут пользоваться программисты, создающие приложения на других платформах. В среде Windows тип PChar считается "родным", все WinAPI-функции используют этот тип.  Внутри DLL-файла можно использовать любой строковый тип, но для передачи параметров и для получения результатов лучше использовать PChar.
  • 34. Преобразование типов: из String в PChar var MyString : String; AnotherString: PChar; … MyString := String(AnotherString); AnotherString := PChar(MyString);
  • 35. Дескрипторы при вызове функций API  Дескрипторы различных объектов представляются типами, такими как HWnd, THandle, HMenu, HINST и др.  По сути это обычные 32-хразрядные числовые переменные.
  • 36. Предпосылки появления DLL  Современное программирование стало достаточно сложным, уже написаны километры строк кода, и некоторые его части время от времени приходится дублировать в разных программах.  Если бы каждый программист в каждой новой программе заново писал весь необходимый код, языки программирования никогда бы не получили такого стремительного развития.  Однако мы в своих проектах можем использовать инструменты, созданные другими программистами - типы, процедуры, функции… Мы уже неоднократно подключали к нашим проектам различные модули и пользовались описанными в них средствами.
  • 37. Вопросы  Какими модулями Вы пользовались при написании программ?  Как модули включаются в программах на языке Free Pascal?
  • 38. Пример программы  Подсчет количества цифр в числе.  Исходный код: DigitCount.pas
  • 39. Вопрос  Как мы можем дать возможность другим программистам использовать функции разработанные в нашей программе?
  • 40. Ответ  Пишем модуль!  Исходный код: DigitModule.pas
  • 41. Недостатки модульного подхода  при использовании модульного подхода, в момент компиляции проекта в него внедряется весь тот код, который был описан в модуле => увеличение .exe файла + загрузка оперативной памяти  Зависимость от языка - мы можем использовать чужой код, только если он написан на таком же языке программирования, каким пользуемся мы.
  • 42. Выход есть – пишем DLL !!!  DLL (англ., Dynamic Link Library - Динамически Подключаемые Библиотеки) - универсальный механизм внедрения в программу функций и процедур, написанных другими программистами, и возможно, на другом языке программирования. Внедрение происходит не в момент компиляции проекта, как в случае модулей, а в момент загрузки готовой программы в оперативную память.
  • 43. DLL в различных ОС  В нашем курсе подразумевается, что мы используем операционную систему семейства Windows, однако механизм динамически подключаемых библиотек существует во всех современных операционных системах.  В Windows такая библиотека представляет собой файл *.dll, в Linux и Unix - *.so (Shared Object Library), а в MacOS X - *.dylib (Dynamic Shared Library).  И все эти библиотеки можно создавать с помощью Lazarus. Учитывая, что мы используем ОС Windows, мы будем рассматривать создание dll-файлов.
  • 44. Разработка DLL в Lazarus  Пример программы  Исходный код: Digit.pas
  • 45. Соглашения по вызову процедур  Чтобы в программе можно было использовать инструменты из динамических библиотек сторонних разработчиков, были разработаны специальные соглашения по вызову процедур. Эти соглашения определяют различные правила вызова подпрограмм: как будут передаваться параметры - через стек, через регистры, через динамическую память; кто ответственный за очистку стека - вызывающая или вызываемая программа и т.д. Так, если используется стек, то чтение будет происходить справа налево. То есть, последние загруженные данные будут считаны первыми.
  • 46. Сведения по соглашениям вызова подпрограмм Команда вызова Обработка параметров Ответственный за очистку стека Разрешена ли передача параметров через регистры Register Слева-направо Подпрограмма Да Pascal Слева-направо Подпрограмма Нет Cdecl Справа-налево Вызывающая программа Нет Stdcall Справа-налево Подпрограмма Нет
  • 47. Соглашения по вызову процедур  Для программ на Windows чаще всего используют соглашение stdcall. А если вы создаете DLL, которую затем могут использовать Си-программисты, то указывайте соглашение cdecl.
  • 48. Вызов DLL из внешней программы  Библиотеку DLL можно связать с приложением двумя способами:  статическим связыванием  динамическим связыванием
  • 49. Вызов DLL из внешней программы  Библиотеку DLL можно связать с приложением двумя способами:  статическим связыванием  динамическим связыванием
  • 50. Вызов DLL из внешней программы  Библиотеку DLL можно связать с приложением двумя способами:  статическим связыванием  динамическим связыванием
  • 51. Статическое связывание  Статическое связывание самое простое, оно подразумевает, что DLL будет загружена сразу, как только приложение начнет выполняться. Это самый простой способ использования DLL, обращение к процедурам и функциям динамической библиотеки такое же, как к обычным процедурам и функциям.
  • 52. Статическое связывание. Недостатки  при загрузке программы должны подгружаться и все используемые DLL, а это увеличивает время загрузки  чтобы пользователь мог работать с программой, он должен иметь все эти используемые DLL  при статическом связывании все загруженные DLL занимают память всё время, что работает программа, вне зависимости от того, использует ли она эти DLL в настоящее время, или нет.
  • 53. Статическое связывание. Пример программы  Пример программы  Исходный код: StaticDLL.pas
  • 54. Динамическое связывание  Динамическое связывание подразумевает, что требуемая DLL будет подгружаться только тогда, когда требуется выполнить какую-то процедуру или функцию из неё. После чего DLL можно выгрузить, освободив память.
  • 55. Динамическое связывание. Достоинства и недостатки  Плюсы в том, что программу можно использовать, не имея всех DLL. Загрузка программы будет осуществляться быстрее, поскольку DLL будут подгружаться по мере необходимости, а не вместе с программой.  Минусы же в том, что из-за необходимости подгружать и выгружать библиотеку, будет увеличиваться время обращения к её функциям и процедурам. Кроме того, само обращение к ним будет намного сложнее.
  • 56. Динамическое связывание. Пример программы  Пример программы  Исходный код: DynamicDLL.pas