Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
Следующая версия
Следующая версия справа и слева
|
bb:lessons:first-module [2016/04/07 21:32] prospero78 [Вывод в журнал] |
bb:lessons:first-module [2018/11/30 01:13] 127.0.0.1 внешнее изменение |
| |
===== Модуль ===== | ===== Модуль ===== |
Весь каркас **Блэкбокса** строится из модулей. Модуль, это что-то вроде строительного кирпича, наподобие всем известных кирпичиков конструктора Лего: | |
| Весь каркас Блэкбокса строится из модулей. Модуль, это что-то вроде строительного кирпича, наподобие всем известных кирпичиков конструктора Лего: |
{{ :bb:lessons:lego_color_bricks.jpg?nolink |}} | {{ :bb:lessons:lego_color_bricks.jpg?nolink |}} |
| |
| |
| |
Кстати, //компонент// это более общее понятие, чем //модуль//. Компонентом можно назвать и модуль, и целый комплект модулей. Главное, что компонент - это //часть расширяемой компонентной системы// (расширяется она за счёт добавления новых компонентов). А модуль в **Блэкбоксе** это //единица проектирования, разработки, компиляции и распространения//, то есть, программирование в Блэкбоксе ведётся по-модульно. Вы строите архитектуру вашей системы из модулей, пишете исходный текст программы-модуля, компилируете в исполняемый модуль и его же распространяете. | Кстати, компонент это более общее понятие, чем модуль. Компонентом можно назвать и модуль, и целый комплект модулей. Главное, что компонент - это //часть расширяемой компонентной системы// (расширяется она за счёт добавления новых компонентов). А модуль в Блэкбоксе это //единица проектирования, разработки, компиляции и распространения//, то есть, программирование в Блэкбоксе ведётся по-модульно. Вы строите архитектуру вашей системы из модулей, пишете исходный текст программы-модуля, компилируете в исполняемый модуль и его же распространяете. |
| |
Текст пустого программного модуля выглядит так: | Текст пустого программного модуля выглядит так: |
<code oberon2> | <code>MODULE MyModule; |
MODULE MyModule; | |
END MyModule. | END MyModule. |
</code> | </code> |
В **Компонентном Паскале** операторы разделяются точкой с запятой и только в конце модуля ставится точка. | В Компонентном Паскале операторы разделяются точкой с запятой и только в конце модуля ставится точка. |
| |
===== Компиляция ===== | ===== Компиляция ===== |
| |
Откройте новый документ **<Ctrl+N>**, наберите в нём текст пустого модуля и скомпилируйте нажатием **<Ctrl+K>**/ (или меню //Dev, Compile//): | Откройте новый документ //Ctrl+N//, наберите в нём текст пустого модуля и скомпилируйте нажатием //Ctrl+K// (или меню //Dev, Compile//): |
{{:bb:lessons:bb_first_compile.png?nolink |}} | {{:bb:lessons:bb_first_compile.png?nolink |}} |
| |
| |
Как видите, **Блэкбокс** запрашивает разрешения на создание подкаталога //My\Sym//. Далее он точно так же спросит про подкаталог //My\Code//. И этот момент надо рассмотреть подробнее. | Как видите, Блэкбокс запрашивает разрешения на создание подкаталога //My\Sym//. Далее он точно так же спросит про подкаталог //My\Code//. И этот момент надо рассмотреть подробнее. |
| |
Имя нашего модуля ''MyModule''. Это двойное имя, которое содержит название подсистемы //My// и название модуля в ней, //Module//. Внутри этой подсистемы **Блэкбокс** создаст ещё две папки, одна из которых //Sym// (для символьных файлов), а другая //Code// (для кодовых). Подробнее о подсистемах вы можете узнать в [[http://oberoncore.ru/_media/blackbox/tut-tot.ru.pdf|учебнике]]. | Имя нашего модуля **MyModule**. Это двойное имя, которое содержит название подсистемы //My// и название модуля в ней, //Module//. Внутри этой подсистемы Блэкбокс создаст ещё две папки, одна из которых //Sym// (для символьных файлов), а другая //Code// (для кодовых). Подробее о подсистемах вы можете узнать в [[http://oberoncore.ru/_media/blackbox/tut-tot.ru.pdf|учебнике]]. |
| |
Сохранять документы с исходными текстами следует в папке //Mod// вашей подсистемы, эту папку придётся создать вручную. | Сохранять документы с исходными текстами следует в папке //Mod// вашей подсистемы, эту папку придётся создать вручную. |
Например, если в теле нашего пустого модуля написать что-то, непонятное компилятору, то он сгенерирует сразу два маркера.{{:bb:lessons:bb_error_compile.png?nolink |}} | Например, если в теле нашего пустого модуля написать что-то, непонятное компилятору, то он сгенерирует сразу два маркера.{{:bb:lessons:bb_error_compile.png?nolink |}} |
| |
На картинке первый из них развёрнут (его текст продублирован внизу экрана, в строке статуса) и означает, что после имени модуля и точки запятой компилятор ожидает только объявления раздела констант ''CONST'', или раздела переменных ''VAR'', или объявление процедуры ''PROCEDURE'' или же конец модуля ''END''. Ничего из этого он не видит и поэтому сразу же выдаёт ошибку. | На картинке первый из них развёрнут (его текст продублирован внизу экрана, в строке статуса) и означает, что после имени модуля и точки запятой компилятор ожидает только объявления раздела констант CONST, или раздела переменных VAR, или объявление процедуры PROCEDURE или же конец модуля END. Ничего из этого он не видит и поэтому сразу же выдаёт ошибку. |
| |
А второй маркер стоит после непонятного слова. Компилятор //не понимает//, что это слово означает, потому что его словарь не содержит этого слова. Компилятор понимает только специальные символы и особые зарезервированные слова (всё, что понимает компилятор, перечислено в Сообщении об Языке, см. меню //Help, Contents//, раздел //Component Pascal, Language Report//, пункт //3. Vocabulary and Representation//) | А второй маркер стоит после непонятного слова. Компилятор не понимает, что это слово означает, потому что его словарь не содержит этого слова. Компилятор понимает только специальные символы и особые зарезервированные слова (всё, что понимает компилятор, перечислено в Сообщении об Языке, см. меню //Help, Contents//, раздел //Component Pascal, Language Report//, пункт //3. Vocabulary and Representation//) |
===== Вывод в журнал ===== | ===== Вывод в журнал ===== |
| |
Попробуем теперь написать небольшую программу, выводящую в журнал приветствие "Hello, world!". | Попробуем теперь написать небольшую программу, выводящую в журнал приветствие "Hello, world!". |
| |
<code oberon2> | <code>MODULE MyModule; |
MODULE MyModule; | |
| |
IMPORT Log; | IMPORT Log; |
END Do; | END Do; |
| |
END MyModule. | END MyModule.</code> |
</code> | |
| |
Итак, что же тут написано? | Итак, что же тут написано? |
| |
Со словом ''MODULE'' в первой строчке мы уже знакомы. | Со словом MODULE в первой строчке мы уже знакомы. |
На следующей строчке слово ''IMPORT'' объявляет блок импорта других модулей, а слово ''Log'' означает, что мы будем использовать возможности модуля ''Log''. Это то самое место, где кирпичики Лего соединяются, чтобы работать вместе. | На следующей строчке слово IMPORT объявляет блок импорта других модулей, а слово Log означает, что мы будем использовать возможности модуля Log. Это то самое место, где кирпичики Лего соединяются, чтобы работать вместе. |
| |
Дальше идёт объявление процедуры. Звёздочка после имени ''Do'' означает, что эта процедура будет видна другим модулям. Между словами-скобками ''BEGIN'' и ''END'' находится тело процедуры (отметьте, что после ''END'' продублировано имя процедуры, это нужно для чёткой границы между скобками процедуры и скобками других операторов). | Дальше идёт объявление процедуры. Звёздочка после имени Do означает, что эта процедура будет видна другим модулям. Между словами-скобками BEGIN и END находится тело процедуры (отметьте, что после END продублировано имя процедуры, это нужно для чёткой границы между скобками процедуры и скобками других операторов). |
| |
Ну а внутри процедуры мы видим последовательные вызовы процедур ''String'' и ''Ln'' модуля ''Log''. Обратите внимание, что перед именем каждой процедуры стоит квалификатор модуля ''Log'', это жёсткое правило языка **Компонентный Паскаль** (и, в общем, всех Оберонов). Благодаря //обязательному// квалификатору вы никогда не запутаетесь, откуда вызвана та или иная процедура или переменная. | Ну а внутри процедуры мы видим последовательные вызовы процедур String и Ln модуля Log. Обратите внимание, что перед именем каждой процедуры стоит квалификатор модуля Log, это жёсткое правило языка Компонентный Паскаль (и, в общем, всех Оберонов). Благодаря обязательному квалификатору вы никогда не запутаетесь, откуда вызвана та или иная процедура или переменная. |
| |
===== Команды ===== | ===== Команды ===== |