Использование интерфейсов



Скачать 291.96 Kb.
Pdf просмотр
Дата16.12.2016
Размер291.96 Kb.
Просмотров180
Скачиваний0

Введение
Использование интерфейсов
Заключение
Интерфейсы в программировании
Алексей Островский
Физико-технический учебно-научный центр НАН Украины
2 апреля 2015 г.
1 / 30

Введение
Использование интерфейсов
Заключение
Интерфейсы в программировании
Определение
Интерфейс
связь между двумя отдельными компонентами программной системы,
предназначенная для обмена информацией, а также спецификация этой связи.
Виды интерфейсов:

аппаратные (в т. ч. для периферийных устройств);

программные (англ. software interfaces);

пользовательские.
NB. Software interface
⊃ (application) programming interface.
Направленность передачи данных:

однонаправленные интерфейсы (напр., работа с мышью, микрофоном и другими устройствами);

двунаправленные интерфейсы (напр., большинство программных).
Программная инженерия. Лекция №17
Интерфейсы в программировании
2 / 30

Введение
Использование интерфейсов
Заключение
Аппаратные интерфейсы
Примеры аппаратных интерфейсов: SVGA-вход для подключения видеоустройства и универсальная последовательная шина (USB).
Программная инженерия. Лекция №17
Интерфейсы в программировании
3 / 30

Введение
Использование интерфейсов
Заключение
Аппаратные интерфейсы
Виды: шины, устройства хранения данных, радиоволны, …
Спецификация:

характеристики механических, электрических или логических сигналов, пересылаемых через интерфейс;

последовательность передачи сигналов.
Цель:

унификация связи с базовыми и периферийными устройствами;

большие возможности при конструировании и сборке компьютерных систем.
Программная инженерия. Лекция №17
Интерфейсы в программировании
4 / 30

Введение
Использование интерфейсов
Заключение
Программные интерфейсы
Уровень операционной системы:

связь программ с оборудованием (напр., с помощью драйверов);

связь программ с операционной системой или с другими программами средствами ОС.
Уровень приложения:

связь компонентов системы, написанных на разных ЯП, с помощью вспомогательной среды
(middleware);

связь компонентов распределенных приложений.
Уровень компонента:
связь между базовыми элементами программы (напр., между объектами в ООП; между функциями в функциональном программировании).
Программная инженерия. Лекция №17
Интерфейсы в программировании
5 / 30

Введение
Использование интерфейсов
Заключение
Уровень детализации интерфейса
Двоичные интерфейсы (ABI)
спецификации, связанные с машинным кодом программной системы.
Примеры:

размер в байтах типов данных;

особенности вызовов функций / методов;

формат двоичных исполняемых файлов.
Программные интерфейсы (API)
спецификации, выражающиеся через исходный код программы.
Пример:

сигнатуры задекларированных функций / классов;

протоколы обмена данными.
Программная инженерия. Лекция №17
Интерфейсы в программировании
6 / 30

Введение
Использование интерфейсов
Заключение
ABI
Определение
Двоичный интерфейс приложений (англ. application binary interface, ABI)
программный интерфейс между двумя модулями (чаще всего, ОС или библиотекой и прикладной программой), заданный на уровне машинного кода.
Примеры спецификаций:

вызов функций (порядок аргументов, размещение аргументов в стеке / регистрах);

формат передачи данных (порядок передачи байтов, выравнивание);

системные вызовы;

формат исполняемых файлов, библиотек и т. п.;

обработка исключительных ситуаций.
Программная инженерия. Лекция №17
Интерфейсы в программировании
7 / 30

Введение
Использование интерфейсов
Заключение
ABI
Способы согласования ABI:

(в большинстве случаев) автоматически при компиляции / интерпретации программы;

при помощи специальных средств ЯП (напр., спецификаторы safecall, stdcall и т. п.
для функций в C/C++);

явно при использовании низкоуровневых средств взаимодействия между программами на разных ЯП или при работе с оборудованием (напр., чтение / запись данных в память видеоускорителя).
Программная инженерия. Лекция №17
Интерфейсы в программировании
8 / 30

Введение
Использование интерфейсов
Заключение
Примеры ABI

Спецификация операционных систем: Linux (
Linux Standard Base
), Windows, Mac OS;

спецификация виртуальных машин и сред выполнения, напр., Java Virtual Machine:

общая для всех имплементаций (напр., формат .class-файлов JVM);

особенности имплементации в различных средах (напр., размеры указателей JVM и принципы сборки мусора).

спецификация языков программирования (напр., размер, двоичное представление и выравнивание типов данных);

EABI (embedded-application binary interface)
ABI для встроенных в микропроцессор
программ.
Программная инженерия. Лекция №17
Интерфейсы в программировании
9 / 30

Введение
Использование интерфейсов
Заключение
API
Определение
Программный интерфейс приложений (англ. application programming interface, API)
спецификация утилит, протоколов и инструментов для интеграции компонентов приложений.
Примеры спецификаций:

характеристики компонентов повторного использования (операции, входные и выходные данные);

точки входа для расширения функциональности существующих приложений (плагины);

программные «обертки» для доступа к оборудованию и источникам данных (напр., СУБД).
Программная инженерия. Лекция №17
Интерфейсы в программировании
10 / 30

Введение
Использование интерфейсов
Заключение
API
Формы API:

Библиотека, содержащая функции / объекты, структуры данных, константы и переменные.
Примеры:
STL
для С++; Java API.

Протокол для передачи данных.
Примеры: протоколы SOAP и REST для реализации веб-сервисов.
Формы спецификации:

международный стандарт (напр.,
POSIX
);

документация производителя, независимая от ЯП + привязки к ЯП (напр., Windows API,
OpenGL);

встроенная / подключаемая библиотека на определенном ЯП (STL, Java APIs).
Программная инженерия. Лекция №17
Интерфейсы в программировании
11 / 30

Введение
Использование интерфейсов
Заключение
Сравнение API и ABI
API и ABI в C:
1
# include < stdio .h >
2 3
/ * Определение функции printf в stdio.h часть API
* /
4
/ * и одинаково для всех режимов компиляции. * /
5
/ * int printf(const char* format, ...); * /
6 7
/ * Определение размеров типов данных часть ABI.
* /
8 9
int main () {
10
pr in t f ( " s i z eo f ( int ) == % zd \ n " , si z eo f ( int ));
11
pr in t f ( " s i z eo f ( long ) == % zd \ n " , si ze o f ( long ));
12
pr in t f ( " s i z eo f ( long d o u bl e ) == % zd \ n " , si z eo f ( long do u bl e ));
13
pr in t f ( " s i z eo f ( void *) == % zd \ n " , s iz e of ( void *));
14
re tu r n 0;
15
}
Программная инженерия. Лекция №17
Интерфейсы в программировании
12 / 30

Введение
Использование интерфейсов
Заключение
Сравнение API и ABI

GCC с опцией -m32 (32-битный код для архитектуры i386):
sizeof(int) == 4
sizeof(long) == 4
sizeof(long double) == 12
sizeof(void*) == 4

GCC с опцией -mx32 (32-битный код для архитектуры x86_64):
sizeof(int) == 4
sizeof(long) == 4
sizeof(long double) == 16
sizeof(void*) == 4

GCC с опцией -m64 (64-битный код для архитектуры x86_64):
sizeof(int) == 4
sizeof(long) == 8
sizeof(long double) == 16
sizeof(void*) == 8
Программная инженерия. Лекция №17
Интерфейсы в программировании
13 / 30

Введение
Использование интерфейсов
Заключение
Использование интерфейсов
Варианты использования:

Интеграция компонентов, реализованных с помощью одного ЯП.
Реализация:

спецификация типов данных;

контрактное программирование (напр., с помощью интерфейсов ЯП или утиной типизации);

инверсия управления.

Интеграция компонентов, реализованных в разных ЯП.
Реализация:

использование общей исполняемой среды (виртуальной машины);

вызов внешних функций;

использование посредников (middleware).
Программная инженерия. Лекция №17
Интерфейсы в программировании
14 / 30

Введение
Использование интерфейсов
Заключение
Пример: использование интерфейсов ЯП
Процедурный подход
Интерфейсы ЯП определяются как спецификация структур данных и функций для работы с ними.
Пример (C):
1
/ * Файл заголовков math.h определяет интерфейсы математических функций. * /
2
# i n c l u d e < math .h >
3 4
/ * Функция sqrt определена в math.h декларацией * /
5
/ * double sqrt(double X); * /
6 7
int main () {
8
do ub l e s = sqrt ( 9 .0 ) ;
9
/ * другой код * /
10
}
Программная инженерия. Лекция №17
Интерфейсы в программировании
15 / 30

Введение
Использование интерфейсов
Заключение
Пример: использование интерфейсов ЯП
Объектно-ориентированный подход
Интерфейсы собраны в методах (конструкторах, свойствах и т. п.) объектов и классов,
содержащих в себе данные и зачастую скрывающих их.
Пример (Java)
1
/ *
2
* Класс java.math.BigInteger определяет интерфейсы методов
3
* для работы с произвольными целыми числами.
4
* /
5
im po r t java . math . B i g I n t e g e r ;
6 7
/ * в функции main * /
8
B i g I n t e g e r num = new B i g I n t e g e r ( " 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 " );
9
num = num . m u l t i p l y ( num );
Программная инженерия. Лекция №17
Интерфейсы в программировании
16 / 30

Введение
Использование интерфейсов
Заключение
Инверсия управления
Определение
Инверсия управления (англ. inversion of control)
принцип проектирования приложений,
позволяющий передавать управление коду приложения во время выполнения сторонних библиотек.
Библиотека func1
func2
Приложение func1();
func2();
Традиционный подход к работе с библиотеками. Библиотека определяет интерфейсы реализованных функций, которые вызываются приложением.
Синим обозначен поток выполнения.
Программная инженерия. Лекция №17
Интерфейсы в программировании
17 / 30

Введение
Использование интерфейсов
Заключение
Инверсия управления
Определение
Инверсия управления (англ. inversion of control)
принцип проектирования приложений,
позволяющий передавать управление коду приложения во время выполнения сторонних библиотек.
Библиотека event1
event2
Приложение onEvent1
onEvent2
Инверсия управления. Основной код выполняется библиотекой; передача управления приложению происходит с помощью точек расширения.
Программная инженерия. Лекция №17
Интерфейсы в программировании
17 / 30

Введение
Использование интерфейсов
Заключение
Применение инверсии управления

Обработка событий, в частности при конструировании пользовательского интерфейса;

расширение функциональности приложений (плагины);

упрощение построения приложений на основе готовых каркасов (например, JavaBeans;
аннотации в JUnit);

наследование в ООП, когда контроль выполнения задан в родительском классе (точки входа абстрактные виртуальные методы).
Программная инженерия. Лекция №17
Интерфейсы в программировании
18 / 30

Введение
Использование интерфейсов
Заключение
Пример: инверсия управления в DOM
Инверсия контроля основной метод создания интерактивных HTML-документов с помощью
JavaScript.
1
var d o c B o d y = d o c u m e n t . g e t E l e m e n t s B y T a g N a m e ( ' body ' )[0];
2
/ * Добавление обработчика события с помощью * /
3
/ * метода addEventListener * /
4
d o c B o d y . a d d E v e n t L i s t e n e r ( ' load ' , f u n c t i o n () {
5
f u n c t i o n o n B t n C l i c k () {
6
/ * код, выполняемый при нажатии кнопки * /
7
s e t T i m e o u t ( f u n c t i o n () {
8
/ * код, выполняемый с задержкой в две секунды * /
9
alert ( ' N o t i f i c a t i o n ' );
10
} , 2 00 0 ) ;
11
}
12 13
/ * код, выполняемый при загрузке HTML-страницы * /
14
d o c u m e n t . g e t E l e m e n t B y I d ( ' some - bu t t on ')
15
. a d d E v e n t L i s t e n e r ( ' click ' , o n B t n C l i c k );
16
});
Программная инженерия. Лекция №17
Интерфейсы в программировании
19 / 30

Введение
Использование интерфейсов
Заключение
Взаимодействие разноязыковых программ
Методы взаимодействия (по возрастанию усилий для реализации):

вызов функций / методов в пределах одной среды выполнения (JVM, CLR);

использование интерфейса внешних функций;

использование распределенных систем (CORBA, RMI)
рассматриваются в отдельной лекции.
Проблемы (следуют из различия ABI для разных ЯП):

трансляция типов данных;

различающиеся среды выполнения (напр., принципы сбора мусора);

работа с разделяемой памятью.
Программная инженерия. Лекция №17
Интерфейсы в программировании
20 / 30

Введение
Использование интерфейсов
Заключение
Виртуализация
Определение
Виртуальная машина (англ. virtual machine)
программная среда для эмуляции вычислительной системы с заданной конфигурацией и интерфейсом.
Цели:

унификация доступных для программ интерфейсов в различных окружениях, улучшение переносимости;

повышение отказоустойчивости и надежности;

упрощение взаимодействия между программами в пределах ВМ;

тестирование поведения ПО при заданной архитектуре или конфигурации оборудования.
Программная инженерия. Лекция №17
Интерфейсы в программировании
21 / 30

Введение
Использование интерфейсов
Заключение
Спецификация ВМ

Модель вычислений:
стековая
,
регистровая
;

управление памятью: автоматическое, вручную, смешанное, принцип работы сборщика мусора;

метод выполнения кода: интерпретация,
JIT
, компиляция); принципы комбинирования различных методов;

взаимодействие модулей: трансляция типов данных для различных ЯП, совместимость объектов в различных языках, работа с нативными библиотеками;

безопасность: возможность ограничений на выполняемые инструкции.
Программная инженерия. Лекция №17
Интерфейсы в программировании
22 / 30

Введение
Использование интерфейсов
Заключение
Примеры ВМ

Java Virtual Machine
ЯП: Java, Groovy, Scala, Clojure, Jython, JRuby, …

Dalvik; Android Runtime (ART)
ЯП: поддерживаемые JVM (вход байткод для JVM).
Примечание: Dalvik / ART и JVM почти совместимы на уровне API, но используют разные
ABI (регистровая машина в Dalvik / ART против стековой в JVM).

Common Language Runtime; Mono
ЯП: C#, F#, Visual Basic .NET, IronPython, …

LLVM (Low Level Virtual Machine)
ЯП: C, C++, D, Objective-C, Ada, Fortran
Примечание: часто используется в качестве компилятора.
Программная инженерия. Лекция №17
Интерфейсы в программировании
23 / 30

Введение
Использование интерфейсов
Заключение
Пример ВМ: Java Virtual Machine
Загрузчики байткода
(напр., из файлов *.class)
Классы
Методы
Куча
Стек JVM
Стек нативных методов
Память
Интерпретатор
JIT-компилятор
Машинный код
Java Native Interface
Нативные библиотеки
Выполнение
Программная инженерия. Лекция №17
Интерфейсы в программировании
24 / 30

Введение
Использование интерфейсов
Заключение
Пример: взаимодействие программ в JVM

Языки, созданные с расчетом на JVM (Groovy, Scala) поддерживают импорт произвольных классов Java (из стандартной библиотеки и сторонние).

Версии адаптированных для JVM языков (Jython, JRuby) поддерживают классы Java с определенными предостережениями из-за различия спецификаций.
Например, конфликты между Java и Jython:

кодировки строк;

области видимости;

названия переменных и методов класса, совпадающие между собой или с ключевыми словами Python.

Использование языков JVM из Java возможно за счет увеличения сложности структуры программ (напр., применение фабрик объектов или
Java Scripting API
для Jython).
Программная инженерия. Лекция №17
Интерфейсы в программировании
25 / 30

Введение
Использование интерфейсов
Заключение
Интерфейс внешних функций
Определение
Интерфейс внешних функций (англ. foreign function interface)
механизм поддержки вызова программой, написанной на одном ЯП, функций, реализованных на других ЯП.
Цели:

повышение производительности;

вызов специфичных для платформы функций.
Программа на высокоуровневом
ЯП
Библиотека
FFI
Программа на низкоуровневом
ЯП (C, C++, ASM)
API
ABI
Типичная архитектура интерфейса внешних функций
Программная инженерия. Лекция №17
Интерфейсы в программировании
26 / 30

Введение
Использование интерфейсов
Заключение
Примеры FFI

Директивы extern "C" в С++ для вызова C-функций.

Java Native Interface, Java Native Access.

Модуль ctypes в Python для вызова функций C:
1
im po r t ct y p es
2 3
# Загрузка базовой библиотеки C
4
libc = c ty p e s . CDLL ( ' libc . so .6 ')
5
# Вызов функции C time
6
# Эквивалентный вызов в C: t = time(NULL);
7
t = libc . time ( None )
8
print t
Программная инженерия. Лекция №17
Интерфейсы в программировании
27 / 30

Введение
Использование интерфейсов
Заключение
Выводы
1.
Интерфейсы необходимая часть системы, составленной из разнородных компонентов.
Интерфейс определяет способ обмена данными между компонентами программной системы.
2.
Выделяют два типа программных интерфейсов: определяющие характеристики данных на уровне машинного кода (ABI) и на уровне языков программирования (API).
3.
Интерфейсы применяются для связи компонентов в пределах одного ЯП (за счет спецификации типов данных, протоколов работы с ними, инверсии управления и т. д.)
или для связи разноязычных компонентов.
4.
Основные способы взаимодействия ЯП: общая среда выполнения (виртуальная машина);
интерфейсы внешних функций; протоколы передачи данных с помощью посредников.
Программная инженерия. Лекция №17
Интерфейсы в программировании
28 / 30

Введение
Использование интерфейсов
Заключение
Материалы
Лавріщева К. М.
Програмна інженерія (підручник).
К., 2008.
319 с.
Bloch, Joshua
Руководство по написанию API.
http://lcsd05.cs.tamu.edu/slides/keynote.pdf
Fowler, Martin
Inversion of Control http://martinfowler.com/bliki/InversionOfControl.html
Программная инженерия. Лекция №17
Интерфейсы в программировании
29 / 30

Введение
Использование интерфейсов
Заключение
Спасибо за внимание!
Программная инженерия. Лекция №17
Интерфейсы в программировании
30 / 30

Document Outline

  • Введение
    • Аппаратные интерфейсы
    • Программные интерфейсы
    • ABI
    • API
    • Сравнение API и ABI
  • Использование интерфейсов
    • Интерфейсы ЯП
    • Инверсия управления
    • Виртуализация
    • Интерфейс внешних функций
  • Заключение
    • Выводы
    • Материалы


Поделитесь с Вашими друзьями:


База данных защищена авторским правом ©nethash.ru 2017
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал