TourRu.odc

 Блэкбокс

	Краткий обзор

	ENGLISH

	Июль 2000

(C) Oberon microsystems, Inc.
(C) Перевод на русский язык: В.В.Лось, 2002.
(C) Редакция перевода: Ф.В.Ткачев, 2010.
Опереводетерминологии.

Краткий обзор основных возможностей системы Блэкбокс (BlackBox Component Builder).

Об этом обзоре
Данный текст представляет собой краткое введение в BlackBox Component Builder (в дальнейшем Блэкбокс). Чтобы представить себе, как работает Блэкбокс, читайте и следите за практическими примерами в тексте.
Обзор системы Блэкбокс
Блэкбокс  это интегрированная среда разработки, оптимизированная для разработки ПО с компонентной структурой. В неё входят: инструменты разработки; библиотека повторно используемых компонентов; каркас приложений, упрощающий создание надёжных пользовательских компонентов и приложений; среда поддержки функционирования компонентов во время исполнения.
	В системе Блэкбокс приложения и их компоненты пишутся на Компонентном Паскале (в дальнейшем КП; см. русскийЏпереводЏописания)  наследнике Паскаля, Модулы-2 и Оберона. Этот язык программирования предоставляет такие современные возможности, как полная защищенность типов (type safety), компоненты (в виде модулей), динамическое связывание компонентов, а также сборка мусора. Сам Блэкбокс целиком написан на КП, включая все компоненты в библиотеке, весь инструментарий разработчика, компилятор КП, и даже низкоуровневую систему поддержки времени исполнения со сборщиком мусора. Несмотря на всю свою мощь, Компонентный Паскаль  маленький язык, легкий для изучения.
	Библиотека компонентов, поставляемая с Блэкбоксом, содержит: 
	компоненты для элементов пользовательского интерфейса (командные кнопки, кнопки-флажки и т.п.); средства обработки текстов (подсистема Text); 
	различные компоненты для управления расположением элементов графического интерфейса пользователя (подсистема Form); 
	компоненты доступа к базам данных (подсистема Sql); коммуникационные компоненты (подсистема Comm); 
	инструменты программирования: компилятор, просмотрщик интерфейсов, отладчик и т.д. (подсистема Dev).
	Взаимодействие между компонентами осуществляется посредством каркасов (Frameworks) системы Блэкбокс. Они состоят из небольшого числа дополняющих друг друга программных интерфейсов. Эти интерфейсы значительно проще и безопаснее базовых API, таких как Windows API, и, кроме того, платформо-независимы. Для интерактивных приложений эти интерфейсы определяют довольно уникальную архитектуру составных документов. Эта архитектура делает возможной быструю разработку приложений (RAD), в том числе быструю разработку новых компонентов интерфейса пользователя. В конструкции каркаса особое внимание уделено безопасному взаимодействию между компонентами. Это условие становится чрезвычайно важным для крупномасштабных программных проектов, характеризующиеся большим временем жизни и содержащие компоненты от различных поставщиков. Сочетание производительности RAD с высоким уровнем надёжности архитектуры было одной из главных целей разработки системы Блэкбокс. Была сделана попытка создать гибкую и нетребовательную к ресурсам среду, не жертвуя ни надёжностью, ни удобством долгосрочного сопровождения проектов, созданных в этой среде. Это было достигнуто благодаря архитектуре, в которой система разделяется на компоненты с четко и строго определёнными интерфейсами. Программное обеспечение развивается эволюционно  через добавление, обновление или удаление отдельных компонентов.
	Среда времени выполнения системы Блэкбокс поддерживает динамическое связывание, загрузку и выгрузку компонентов. За счёт этого система может быть расширена прямо во время выполнения без повторной компиляции, сборки или перезапуска полученного кода. Объекты компонентов (т.е. экземпляры классов, содержащихся в компонентах) автоматически удаляются, когда на них больше нет ссылок. Сборка мусора  ключевой аспект безопасности системы времени выполнения, так как она позволяет предотвратить такие ошибки, как утечки памяти и висячие указатели, которых иначе практически невозможно избежать в среде, столь сильно ориентированной на использование компонентов, как Блэкбокс.
Объекты изображения (вьюшки)
А теперь посмотрим на некоторые стандартные компоненты Блэкбокса. Наиболее интересными объектами, реализуемыми компонентами Блэкбокса, являются объекты изображения или вьюшки (views; см. Опереводетерминологии); они могут быть вставлены в документы и в другие вьюшки. Вьюшки могут быть отредактированы, их размеры можно изменять прямо в месте их расположения. Текст данной экскурсии содержит несколько встроенных вьюшек. Вот первая из них: вьюшка с картинкой без возможности редактирования; ее размеры можно изменять, щёлкнув по картинке и затем перетаскивая появившиеся метки-манипуляторы размера.

	
	
	Объект изображения (вьюшка) с картинкой как пример объекта-компонента, помещенного в составной документ.

	Другими примерами вьюшек являются элементы управления, такие как командные кнопки, флажки, индикаторы ошибок, индикаторы уровня масла и т.д. Более сложные вьюшки могут реализовывать полнофункциональные редакторы, такие как электронная таблица или графический редактор. Наиболее сложными вьюшками в Блэкбоксе являются вьюшки-контейнеры, то есть объекты-вьюшки, которые могут содержать другие вьюшки. Текстовые вьюшки  важный пример вьюшек-контейнеров Блэкбокса. Сейчас вы смотрите именно на такую текстовую вьюшку. Далее внизу вставлена текстовая вьюшка, содержащая маленькую программу.
	Дальнейшие разделы показывают, как могут быть написаны и протестированы простые программы и как можно создавать элементы графического интерфейса пользователя.
Разработка программ
Приведенный ниже код  редактируемый текст, показывающий законченную реализацию маленького модуля, написанного на КП. Чтобы скомпилировать его, установите фокус на эту вьюшку, щёлкнув по ней (например, щёлкните по слову PROCEDURE), и затем вызовите в меню Dev команду Compile. В результе модуль скомпилируется в быстрый исполняемый машинный код и будет сохранён на диске (в файле Obx/Code/Hello0).
	MODULE ObxHello0;

	IMPORT StdLog;

	PROCEDURE Do*;
	BEGIN
		StdLog.String("Hello World"); StdLog.Ln
	END Do;

END ObxHello0.

	ObxHello0  традиционная минимальная программа "hello world" на КП. (На самом деле возможен ещё более краткий вариант, см. Опроцедурахимодулях.  прим. ФТ.) Эта программа записывает единственную строку в рабочий журнал (system log). Чтобы открыть рабочий журнал (если он по какой-то причине не виден) выполните команду меню Info->OpenLog.
	Чтобы указать, что какой-то элемент экспортируется из данного модуля, после имени элемента в его объявлении ставится звёздочка; никаких отдельных заголовочных файлов, модулей определений и т.п. создавать не требуется. Компилятор полностью проверяет согласованность интерфейсов и реализаций, а динамический загрузчик  согласованность версий.
	Модуль ObxHello0 экспортирует единственную команду Do. Команды  экспортированные процедуры КП, которые могут выполняться пользователем напрямую, средствами пользовательского интерфейса. Нет необходимости в особой главной процедуре или модуле верхнего уровня. Команды могут быть добавлены в меню, связаны с командной кнопкой или выполнены прямо из текста. Выделите стоящую ниже строку ObxHello0.Do и выполните пункт меню Dev>Execute.
	ObxHello0.Do
	Когда компилятор находит синтаксические ошибки, он отмечает их прямо в тексте. Например, следующая версия модуля импортирует несуществующий модуль StdLok вместо StdLog. Попробуйте скомпилировать этот модуль  компилятор вставит специальные маркеры, отмечающие ошибки, которые он обнаружил. Компилятор также выводит отчёт в системный журнал. 
	MODULE ObxHello0;

	IMPORT StdLok;

	PROCEDURE Do*;
	BEGIN
		StdLog.String("Hello World"); StdLog.Ln
	END Do;

END ObxHello0.

Двойной щелчок по отметке об ошибке высвечивает короткое сообщение об ошибке в строке состояния. Исправьте ошибку (замените k в IMPORT StdLok на g) и скомпилируйте ещё раз. Модуль успешно скомпилируется и отметки исчезнут.
	Посмотреть весь набор модулей, загруженных в память, можно с помощью команды меню Info>LoadedModules. Интерфейсы модулей (загруженных или нет) можно посмотреть просмотрщиком интерфейсов: выделите имя модуля и затем выполните команду меню Info>ClientInterface. Например, попробуйте узнать интерфейс следующего модуля:
	 Math
	Всякий модуль остаётся загруженным до тех пор, пока его явно не выгрузят (unload) или не перезапустят BlackBox Component Builder. Для явной выгрузки модуля выделите имя модуля и выполните Dev>UnloadModuleList. Например, для выгрузите ObxHello0, измените строку "Hello world", перекомпилируйте ObxHello0 и снова запустите ObxHello0.Do. Обратите внимание, что новые изменения никак не затронули программы, уже находящиеся в памяти, пока вы не выгрузили старый модуль. Этот механизм явной выгрузки очень полезен, когда нужно сделать значительные изменения в нескольких модулях, в то время как предыдущие версии всё еще используются в работе. Для простых модулей высшего уровня (не импортированных другими модулями), существует пункт Скомпилировать и Выгрузить (Dev->CompileAndUnload).

Связывание программ с документами форм
Кроме подсистем Text и Dev, с Блэкбоксом поставляется также подсистема форм (Form), которая включает в себя визуальный дизайнер пользовательских интерфейсов. Формы могут использоваться для ввода данных или быть диалоговыми окнами.
	Следующий модуль определяет запись для использования в форме ввода данных.
MODULE ObxAddress1;

	IMPORT Views, TextModels, TextMappers, TextViews;

	VAR
		adr*: RECORD
			name*:		ARRAY 64 OF CHAR;
			city*:		ARRAY 24 OF CHAR;
			country*:		ARRAY 16 OF CHAR;
			customer*:		INTEGER;
			update*:		BOOLEAN
		END;

	PROCEDURE OpenText*;
		VAR t: TextModels.Model; f: TextMappers.Formatter; v: Views.View;
	BEGIN
		t := TextModels.dir.New();	(* создать новый объект-текст *)
		f.ConnectTo(t);		(* подключить форматер к этому объекту *)
		f.WriteString(adr.name); f.WriteTab;
		f.WriteString(adr.city); f.WriteTab;
		f.WriteString(adr.country); f.WriteTab;
		f.WriteInt(adr.customer); f.WriteTab;
		f.WriteBool(adr.update); f.WriteLn;
		v := TextViews.dir.New(t);	(* создать объект-вьюшку для текстового объекта *)
		Views.OpenView(v)	(* открыть эту вьюшку в ее собственном окне*)
	END OpenText;

END ObxAddress1.

После компиляции этого модуля можно использовать команду меню Новая Форма... (Controls>NewForm...), чтобы создать диалоговое окно для экспортирующихся элементов ObxAddress1. Просто введите имя ObxAddress1 в поле Связан с (Link) и затем нажмите кнопку OK. Информация о типах, полученная компилятором, доступна Блэкбоксу и используется для автоматического создания формы ввода данных для записи, объявленной выше. При создании формы элементы размещаются в них по некоторым простым предопределённым правилам. Форму можно отредактировать, а затем открыть командой Controls->Open as Aux Dialog.
	Поля ввода текста и флажки в форме напрямую связываются с полями name, city, country, customer  и update записи ObxAddress1.adr. Кнопка связывается с командой OpenText, то есть с процедурой, экспортированной модулем ObxAddress1. Нажатие на эту кнопку вызывает исполнение процедуры. В результате создаётся новый текст; туда пишется текстовый отчёт, основанный на данных из переменной adr; создаётся новое текстовое изображение; это изображение открывается в окне, показывая отчёт.
	У полей ввода текста, флажков и других элементов управления имеются свойства, которые можно посмотреть и отредактировать в т.наз. инспекторе. Вместо той последовательности действий, которую мы только что продемонстрировали (сначала был написан модуль, потом создавалась форма), мы можем сначала построить форму, и только потом написать соответствующий модуль. Диалог в Блэкбоксе не обязан соответствовать единственной переменной-записи. Разные элементы управления в диалоге могут подключаться к записям в различных модулях. Кроме того, диалоги могут содержать другие вьюшки наряду с элементами управления, например, картинки или текст.
	Форма может быть сохранена прямо из визуального редактора; затем ее можно связать с пунктом меню или с кнопкой какого-нибудь другого диалога. Диалоговые окна сохраняются в стандартном формате документов, независящим от платформы. Такой подход устраняет необходимость иметь генератор промежуточного кода и позволяет в дальнейшем изменять диалоговые окна без какого-либо перекомпилирования.

Что дальше ...
Получив первые впечатления, вы можете воспользоваться документацией для более глубокого изучения Блэкбокса. Выберите пункт меню Help->Contents для обзора документации. Отсюда через гиперссылки вы сможете получить доступ к полной документации.
	Как лучше знакомиться с Блэкбоксом? Мы советуем начать с вводных текстов КраткаяисторияПаскаля и Путеводитель (см. также Полезныесведения прим. ред.)
	Документация делится на четыре большие части:
 Руководствопользователя описывает интерфейс пользователя и наиболее важные команды Блэкбокса.
 Учебник объясняет основные шаблоны проектирования Блэкбокс (главы с 1-й по 3-ю). В главе4 обсуждается графический интерфейс пользователя, формы и управляющие элементы. Текстовая подсистема описывается в главе5. Последняя глава6 знакомит с программированием объектов изображения (вьюшек, views).
  Примеры  богатый набор примеров с исходными текстами, упорядоченных по категориям и сложности.
 Руководство программиста содержит по одному файлу документации на каждый программный модуль. В каждой подсистеме имеется документ с названием Sys-Map, содержащий ссылки на тексты для отдельных модулей.