До сих пор мы рассматривали программный код на примере команд, которые построены на использовании процедур из модулей, оставляя без рассмотрения конструкцию самих модулей. Естественно, команды не позволяют использовать язык в полной мере, они нужны лишь для того, чтобы запускать тот код, что записан в модулях. Самое интересное только начинается.

Начнём с простейшего:

MODULE My; END My.

Этот модуль ничего не предоставляет, но уже правилен с точки зрения языка. Так вводить код в компьютер удобнее всего. Не как последовательность литер от начала до конца, где правильный код появляется только с введением последней литеры, а как пошаговое уточнение, где на каждом минимальном шаге получается код, соответствующий правилам.

My — это имя модуля, MODULE, END — это ключевые слова, которые как и все ключевые слова в Oberon состоят только из заглавных латинских букв. Ключевые слова нельзя использовать в качестве имён.

Добавим процедуру.

MODULE My;

 PROCEDURE Go*; END Go;
 
END My.

Звёздочка после имени обозначает экспорт. Только экспортированные имена могут быть использованы в коде других модулей и команд.

Чтобы объявления модуля могли ссылаться на объявления из других модулей, имена используемых модулей надо перечислить в разделе импорта через запятую. В этом примере мы импортируем лишь один модуль — для вывода.

MODULE My;

 IMPORT Out;

 PROCEDURE Go*; END Go;

END My.

Наконец, добавим оператор в процедуру после ключевого слова BEGIN. Именно операторы производят изменения. Вызов процедуры — это разновидность оператора, уже знакомый по использованию в командах.

MODULE My;

 IMPORT Out;

 PROCEDURE Go*;
 BEGIN
  Out.String("Привет всем!")
 END Go;

END My.