<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3890098994885199392</id><updated>2012-02-16T19:47:01.702+07:00</updated><category term='Основы языка'/><category term='Новости'/><title type='text'>Блог о языке программирования Modula-3</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-8473226158719452714</id><published>2009-05-13T13:04:00.001+07:00</published><updated>2009-05-14T07:56:37.091+07:00</updated><title type='text'>Настоящие ассоциативные массивы в Модуле-3</title><content type='html'>&lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;В предыдущей заметке я описал пример некоторого подобия ассоциативных массивов. Здесь я опишу пример работы с настоящим ассоциативным массивом.&lt;/span&gt;&lt;/p&gt; &lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;Модула-3 имеет в стандартной библиотеке параметризованный модуль &lt;span lang="en-US"&gt;Table, &lt;/span&gt;который реализует ассоциативные массивы. Модуль имеет два параметра: тип ключа и тип значения. Для примера, сделаем массив, ключами которого будут строки, а значениями — целые числа. Для этого нужно создать интерфейс и модуль, производные от &lt;span lang="en-US"&gt;Table.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;dl align="justify"&gt;   &lt;dt&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;(* &lt;span lang="ru-RU"&gt;Файл     &lt;/span&gt;TextTable.i3 *)&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;INTERFACE TextTable = Table(Text, Integer) END TextTable.&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;br /&gt;  &lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;(* &lt;span lang="ru-RU"&gt;Файл     &lt;/span&gt;TextTable.m3 *)&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;MODULE TextTable = Table(Text, Integer) END TextTable.&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;br /&gt;  &lt;/dt&gt; &lt;/dl&gt; &lt;p align="justify"&gt;Теперь можно импортировать этот модуль и использовать его. Для перебора всех элементов массива можно использовать тип &lt;span lang="en-US"&gt;Iterator, &lt;/span&gt;&lt;span lang="ru-RU"&gt;описанные в модуле &lt;/span&gt;&lt;span lang="en-US"&gt;Table&lt;/span&gt;&lt;span lang="ru-RU"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;dl align="justify"&gt;   &lt;dt&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;(* &lt;span lang="ru-RU"&gt;Файл     &lt;/span&gt;Main.m3 *)&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;MODULE Main;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;IMPORT TextTable, IO, Fmt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;VAR&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; t:=NEW(TextTable.Default);&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; i: TextTable.Iterator;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; k: TEXT;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; v: INTEGER;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; t:=t.init();&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; EVAL t.put("a", 1);&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; EVAL t.put("b", 3);&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; EVAL t.put("c", 5);&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; i:=t.iterate();&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; (* Перебор всех элементов массива *)&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; WHILE i.next(k, v) DO&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; IO.Put("Key: " &amp;amp; k &amp;amp; ", Value: " &amp;amp; Fmt.Int(v) &amp;amp; "\n")&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt; END&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="font-size:100%;"&gt;END Main.&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt; &lt;/dl&gt; &lt;p lang="ru-RU" align="justify"&gt; &lt;span style="font-size:100%;"&gt;Чтобы сбросить итератор, нужно использовать метод &lt;span lang="en-US"&gt;init().&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;Методы &lt;span lang="en-US"&gt;put, get &lt;/span&gt;и &lt;span lang="en-US"&gt;delete &lt;/span&gt;возвращают значение типа &lt;span lang="en-US"&gt;BOOLEAN, &lt;/span&gt;поэтому вместо &lt;span lang="en-US"&gt;EVAL &lt;/span&gt;можно делать проверку, насколько успешно прошла операция, с помощью &lt;span lang="en-US"&gt;IF. &lt;/span&gt;Значение элемента можно получить через второй параметр метода &lt;span lang="en-US"&gt;get.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-8473226158719452714?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/8473226158719452714/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/05/3.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/8473226158719452714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/8473226158719452714'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/05/3.html' title='Настоящие ассоциативные массивы в Модуле-3'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-3130209089397974762</id><published>2009-03-31T09:46:00.000+07:00</published><updated>2009-03-31T10:47:46.965+07:00</updated><title type='text'>Ассоциативные массивы (словари) в Модуле-3</title><content type='html'>&lt;p align="justify"&gt;Переводя спецификацию языка на русский язык, узнаю новые вещи, о которых и не догадывался. Например, оказывается, Модула-3 поддерживает массивы, индексы которых могут быть не только числовыми или символьными, но и любыми другими, по желанию пользователя (в Смолтоке такие массивы называются словарями). Сразу оговорюсь, что в стандартной библиотеке libm3 есть шаблонный (или обощённый) модуль, который называется Table. Он вводит примерно то же, о чём я сейчас напишу. Но, на мой взгляд, если что-то нужно сделать на скорую руку, то описанный мной способ будет быстрее. Итак, рассмотрим пример. Нужно создать массив, из трёх элементов, который бы имел индексы First, Second и Third. Для этого, нужно задать тип - перечисление:&lt;/p&gt;&lt;p align="justify"&gt;TYPE Indexes = {First, Second, Third};&lt;/p&gt;&lt;p align="justify"&gt;Затем, содаём массив целых чисел, использующий эти индексы:&lt;/p&gt;&lt;p align="justify"&gt;Dic= ARRAY [Indexes.First .. Indexes.Third] OF INTEGER;&lt;/p&gt;&lt;p align="justify"&gt;Собственно, всё. Можно работать с массивом:&lt;/p&gt;&lt;div align="justify"&gt;VAR dic: Dic;&lt;br /&gt;...&lt;br /&gt;a[Indexes.First]:=3;&lt;br /&gt;a[Indexes.Second]:=5;&lt;br /&gt;a[Indexes.Third]:=2;&lt;br /&gt;&lt;/div&gt;&lt;p align="justify"&gt;С такими индексами допускается работать и в цикле:&lt;/p&gt;&lt;div align="justify"&gt;VAR a: Dic; k: INTEGER;&lt;br /&gt;...&lt;br /&gt; k:=1;&lt;br /&gt; FOR i:=Indexes.First TO Indexes.Third DO&lt;br /&gt;  a[i]:=k;&lt;br /&gt;  INC(k)&lt;br /&gt; END&lt;br /&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;Иногда может возникнуть необходимость в доступе к элементам массива по числовым индексам. Для этого можно использовать встроенные функции ORD, VAL и NUMBER. ORD возвращает порядковый номер элемента в перечислении. VAL возвращает имя элемента по порядковому номеру.  NUMBER возвращает количество элементов в перечислении.&lt;/p&gt;&lt;p align="justify"&gt;Выражение ORD(Indexes.Second) вернёт 1 (индексация элементов в перечислениях начинается &lt;strong&gt;строго с нуля&lt;/strong&gt; и заканчивается значением &lt;strong&gt;NUMBER(имя_типа)-1&lt;/strong&gt;). Выражение VAL(3, Indexes) вернёт Third.&lt;/p&gt;&lt;p align="justify"&gt;Пример работы в цикле:&lt;/p&gt;&lt;p align="justify"&gt;VAR a: Dic;&lt;br /&gt;...&lt;br /&gt; FOR i:=0 TO NUMBER(Indexes)-1 DO&lt;br /&gt;  a[VAL(i, Indexes)]:=i+1;&lt;br /&gt;  IO.Put(Fmt.Int(a[VAL(i, Indexes)]) &amp;amp; "\n")&lt;br /&gt; END;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-3130209089397974762?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/3130209089397974762/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/03/3_30.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/3130209089397974762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/3130209089397974762'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/03/3_30.html' title='Ассоциативные массивы (словари) в Модуле-3'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-6015807551798239983</id><published>2009-03-25T12:12:00.000+06:00</published><updated>2009-03-25T12:44:04.990+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Новости'/><title type='text'>Статья в Wikipedia</title><content type='html'>Недавно разместил  &lt;a href="http://ru.wikipedia.org/wiki/Модула-3"&gt;перевод&lt;/a&gt; англоязычной статьи в Википедии. Думаю, это послужит популяризации языка среди русскоговорящего населения :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-6015807551798239983?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/6015807551798239983/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/03/wikipedia.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/6015807551798239983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/6015807551798239983'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/03/wikipedia.html' title='Статья в Wikipedia'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-4337814515380791099</id><published>2009-03-20T09:43:00.000+06:00</published><updated>2009-03-20T09:45:06.645+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Новости'/><title type='text'>Русская группа, посвящённая Модуле-3</title><content type='html'>Сегодня я открыл группу, посвящённую Модуле-3. Все, кому интересен этот язык, могут писать туда.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-4337814515380791099?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/4337814515380791099/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/03/3.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/4337814515380791099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/4337814515380791099'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/03/3.html' title='Русская группа, посвящённая Модуле-3'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-5206573766190279401</id><published>2009-03-17T08:31:00.000+06:00</published><updated>2009-03-17T10:53:19.685+06:00</updated><title type='text'>Отладка программ.</title><content type='html'>&lt;div align="justify"&gt;Обычно, с большинством компиляторов поставляется отладчик. У компилятора CM3 тоже имеется отладчик, построенный на основе GNU gdb. Называется он m3gdb. Особенность его заключается в том, что работает он, мягко говоря, неудовлетворительно. А версия для NT386MINGNU вообще отсутствует. Надо сказать, что паскаль-подобным языкам редко везёт на отладчики. Например, компилятор FPC пытается использовать всё тот же GNU gdb, но тоже безрезультатно. Большинство программ, написанных на паскале, вызывают у gdb SIGSEGV.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Вообще-то, проблемы в этом нет. Программируя на Паскаль-подобных языках редко возникает надобность использовать указатели. Гораздо чаще используются ссылки, которые не являются потенциально опасными объектами. Поэтому, вполне можно обойтись простым выводом сообщений на экран и проверкой простых условий. Хотя, такая практика принуждает писать лишний код.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Как раз, для этого, в большинстве языков программирования имеется конструкция ASSERT, в которой проверяется некоторое условие. В среде BlackBox Component Builder, если условие отрицательно, появляется окно, под названием Trap. В этом окне, помимо прочей информации, перечислены все переменные и их значения, видимые в блоке, в котором произошло исключение.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;В Модуле-3 тоже имеется конструкция ASSERT, которая реализована в виде прагмы. Общий вид такой: &lt;* ASSERT i&lt;5&gt;. Если условие становится ложным, программа аварийно останавливается. При этом, появляется сообщение:&lt;/div&gt;&lt;blockquote align="justify"&gt;&lt;div&gt;runtime error:&lt;/div&gt;&lt;div&gt; &lt;*ASSERT*&gt; failed.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;file "..\Main.m3", line 6&lt;/div&gt;&lt;/blockquote&gt;&lt;div align="justify"&gt;Прямо скажем, не густо. Но всё-таки, временами пригождается и это.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Но что делать, если нужно отследить все изменения значений некоторой переменной? Для этого есть прагма &lt;*TRACE*&gt;, которая помогает отслеживать значения переменной всякий раз, когда эти значения изменяются. После слова TRACE указывается имя процедуры, которая будет вызываться. Процедура должна быть такого типа:&lt;/div&gt;&lt;div align="justify"&gt;PROCEDURE (name: TEXT; t: Type),&lt;/div&gt;&lt;div align="justify"&gt;где Type - тип переменной, за которой будет вестись наблюдение; name - это имя переменной, за которой будет вестись наблюдение.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Рассмотрим небольшой пример. Предположим, необходимо отследить изменения значений переменной целого типа. Для этого, нужно сделать небольшой модуль, содержащий процедуру вывода значения на экран.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;INTERFACE Debug;&lt;/div&gt;&lt;div align="justify"&gt;PROCEDURE Int(t: TEXT; i: INTEGER);&lt;/div&gt;&lt;div align="justify"&gt;END Debug.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;MODULE Debug;&lt;/div&gt;&lt;div align="justify"&gt;IMPORT IO, Fmt;&lt;/div&gt;&lt;div align="justify"&gt;PROCEDURE Int(t: TEXT; i: INTEGER) =&lt;/div&gt;&lt;div align="justify"&gt;BEGIN&lt;/div&gt;&lt;div align="justify"&gt;IO.Put("Debug: " &amp;amp; t &amp;amp; " = " &amp;amp; Fmt.Int(i) &amp;amp; "\n")&lt;/div&gt;&lt;div align="justify"&gt;END Int;&lt;/div&gt;&lt;div align="justify"&gt;BEGIN&lt;/div&gt;&lt;div align="justify"&gt;END Debug.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;В отлаживаемой программе мы просто укажем инструкцию &lt;* TRACE Debug.Int *&gt; после переменной, за которой нужно наблюдать.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;MODULE Program;&lt;/div&gt;&lt;div align="justify"&gt;IMPORT Debug; &lt;span style="color:#009900;"&gt;&lt;em&gt;(*импортируем отладочный модуль*)&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;VAR x: INTEGER &lt;span style="color:#000000;"&gt;&lt;* TRACE Debug.Int *&gt;&lt;/span&gt;; &lt;span style="color:#009900;"&gt;&lt;em&gt;(* устанавливаем наблюдение за значениями x *)&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;BEGIN&lt;/div&gt;&lt;div align="justify"&gt;x:=0;&lt;/div&gt;&lt;div align="justify"&gt;FOR i:=1 TO 5 DO&lt;/div&gt;&lt;div align="justify"&gt;IF i=3 THEN x:=i END&lt;/div&gt;&lt;div align="justify"&gt;END;&lt;/div&gt;&lt;div align="justify"&gt;END Program.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Теперь, во время исполнения программы, на экране будут появляться сообщения:&lt;/div&gt;&lt;div align="justify"&gt;Debug:  Program.x = 0&lt;/div&gt;&lt;div align="justify"&gt;Debug:  Program.x = 3&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;В завершении этой заметки, хочу добавить, что прагму &lt;*TRACE*&gt; можно использовать не только для отладки программ, но и для реализации событий.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-5206573766190279401?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/5206573766190279401/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/03/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/5206573766190279401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/5206573766190279401'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/03/blog-post.html' title='Отладка программ.'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-7650974819510878131</id><published>2009-03-01T12:22:00.000+06:00</published><updated>2009-03-01T21:50:34.287+06:00</updated><title type='text'>Архитектура компилятора CM3 и установка дополнительных компонентов</title><content type='html'>&lt;div align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Дерево каталогов компилятора &lt;/span&gt;&lt;span lang="en-US"&gt;CM3 &lt;/span&gt;&lt;span lang="ru-RU"&gt;имеет примерно следующий вид (в зависимости от комплектации могут быть незначительные отличия):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul align="justify"&gt;   &lt;li&gt;     &lt;p lang="en-US"&gt;&lt;span style="font-size:100%;"&gt;bin – &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;исполняемые файлы компилятора и динамические библиотеки &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;(&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;верно для платформы     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;windows);&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p lang="en-US"&gt;&lt;span style="font-size:100%;"&gt;lib —&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt; в &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;unix-like &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;системах в этом каталоге лежат динамические и статические библиотеки;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p lang="en-US"&gt;&lt;span style="font-size:100%;"&gt;pkg —&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt; каталог, содержащий модули и статические библиотеки. Все они распределены по так называемым пакетам.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;Те, кто работал со средой &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;BlackBox Component Builder, м&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;огли заметить, что так называемые подсистемы среды (или компоненты) находятся в персональных каталогах. Для добавления подсистемы нужно скопировать в каталог со средой подкаталог нужной подсистемы. Чтобы удалить подсистему, нужно просто удалить её подкаталог. На мой взгляд, такое устройство среды очень удобно, т. к. без всяких последствий можно настроить среду под любые нужды.&lt;/span&gt;&lt;/p&gt; &lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;Примерно такое же устройство имеет компилятор &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;CM3. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;В каталоге &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;pkg &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;находятся подкаталоги с библиотеками (далее, для понятности я буду называть их пакетами). Например, в подкаталоге &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;libm3 &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;содержатся модули и файлы, которые входят в стандартную библиотеку Модулы-3. Теперь поговорим, как работать с этими подкаталогами.&lt;/span&gt;&lt;/p&gt; &lt;p lang="en-US" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Как говорилось в одной из предыдущих заметок, для построения готового программного продукта используется сборочный файл &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;m3makefile&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;. В той же заметке я рассказывал, как собрать приложение, используя &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;m3makefile. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Чтобы вместо приложения собрать библиотеку, в сборочном файле нужно перечислить все интерфейсы, если они не имеют реализации, а также, все модули. Слово &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;implementation, &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;при этом, не используется. А вместо слова &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;program &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;должно быть указано слово &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;library &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;с именем библиотеки. Теперь, после запуска команды &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;cm3, &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;в каталоге &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;NT386MINGNU, &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;помимо прочих,&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;будут лежать два файла с именем, которое было указано в аргументе команды &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;library &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;в &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;m3makefile&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;. Один из них — динамическая библиотека с расширением &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;dll&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;, а второй — статическая библиотека с расширением &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;lib&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;. Статическая библиотека не содержит ничего, кроме ссылок на динамическую библиотеку. Теперь, если собранную только что библиотеку планируется использовать в других проектах, нужно дать команду &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;cm3 -ship&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;. Эта команда установит только что созданную библиотеку в каталог &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;pkg &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;в виде пакета&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;А динамическая библиотека &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;dll &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;будет скопирована в каталог &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;bin.&lt;/span&gt;&lt;/p&gt; &lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;Чтобы собрать приложение, использующее данный пакет, нужно просто импортировать модули этого пакета в модулях приложения &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;c &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;помощью ключевого слова &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;IMPORT&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;. А при сборке приложения в &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;m3makefile &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;нужно импортировать сам пакет командой import("имя_пакета").&lt;/span&gt;&lt;/p&gt; &lt;p lang="en-US" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Если в какой-то момент возникнет необходимость удалить пакет из состава компилятора, сделать это так же просто, как удалить подсистему из среды &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;BlackBox. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Просто удаляем подкаталог с ненужным пакетом из каталога &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;pkg. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Также, не забываем удалить &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;dll-&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;библиотеку из каталога &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;bin &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;(или &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;lib &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;в &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;unix&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p lang="en-US" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Хочется ещё обратить внимание на одну особенность компилятора &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;CM&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;3, которой так не хватает компилятору &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Free Pascal.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt; Динамические библиотеки, созданные описанным выше способом, имеют общий менеджер памяти с программой, которая их вызывает. Это чем-то похоже на динамически загружаемые пакетные библиотеки в &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Delphi. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Очень полезное свойство, которое позволяет не лепить весь код приложения в единый исполняемый файл, а разместить часть кода в динамически загружаемых библиотеках. Только, перед распространением готового программного продукта нужно будет не забыть про эти &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;dll, &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;и скопировать их в каталог с программой. Это же касается и библиотек &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;m3.dll &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;и &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;m3core.dll.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;Все вопросы пишите в комментарии. Всем всего доброго!&lt;/span&gt;&lt;/p&gt; &lt;p lang="en-US" align="justify"&gt;&lt;span style="font-size:100%;"&gt;PS. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Мой вопрос по поводу группы, посвящённой Модуле-3, остаётся в силе.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-7650974819510878131?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/7650974819510878131/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/02/cm3_28.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/7650974819510878131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/7650974819510878131'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/02/cm3_28.html' title='Архитектура компилятора CM3 и установка дополнительных компонентов'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-2677396717543948477</id><published>2009-02-26T21:51:00.000+06:00</published><updated>2009-02-27T09:20:22.940+06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Основы языка'/><title type='text'>Объектно-ориентированное программирование в Модуле-3</title><content type='html'>&lt;p style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Язык Модула-3 создавался как объктно-ориентированный язык программирования. В дополнение к составному типу &lt;span lang="en-US"&gt;RECORD &lt;/span&gt;(запись), был введён расширяемый тип &lt;span lang="en-US"&gt;OBJECT. &lt;/span&gt;В этом состоит отличие Модулы-3 от языков семейства Оберон, в которых расширяемым типом является &lt;span lang="en-US"&gt;RECORD. &lt;/span&gt;Особенностью типа &lt;span lang="en-US"&gt;OBJECT &lt;/span&gt;(в этом заключается ещё одно отличие от Оберона) является то, что этот тип — ссылочный. Аналогом этого типа может быть тип &lt;span lang="en-US"&gt;POINTER TO RECORD &lt;/span&gt;в Обероне&lt;span lang="en-US"&gt;. &lt;/span&gt;Не знаю, хорошо ли это, что объектные типы являются ссылочными, ведь это лишняя нагрузка на сборщик мусора.&lt;/span&gt;&lt;/p&gt; &lt;dl&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Наследование реализуется так:&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="en-US" style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;TYPE &lt;span lang="ru-RU"&gt;&amp;lt;название_типа&amp;gt; = &lt;/span&gt;&amp;lt;&lt;span lang="ru-RU"&gt;название_типа_предка&lt;/span&gt;&amp;gt; OBJECT … END;&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Аналогичный тип в Обероне это выглядел бы так:&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="en-US" style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;TYPE &lt;span lang="ru-RU"&gt;&amp;lt;название_типа&amp;gt;     &lt;/span&gt;= POINTER TO RECORD (&amp;lt;&lt;span lang="ru-RU"&gt;название_типа_предка&lt;/span&gt;&amp;gt;) … END;&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Методы для объектного типа перечисляются после ключевого слова &lt;span lang="en-US"&gt;METHODS. &lt;/span&gt;Поля — сразу после слова &lt;span lang="en-US"&gt;OBJECT.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;TYPE T = OBJECT&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;field: INTEGER; &lt;span style="color:#008080;"&gt;&lt;i&gt;(* &lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span lang="ru-RU"&gt;&lt;i&gt;это поле &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;i&gt;*)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;METHODS&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;method() := Method;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;function(x: INTEGER): INTEGER = Function;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;END&lt;span lang="ru-RU"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="en-US" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Далее в программе идёт реализация процедуры &lt;/span&gt;Method, &lt;span lang="ru-RU"&gt;являющейся телом для &lt;/span&gt;method&lt;span lang="ru-RU"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;PROCEDURE Method(t: T) =&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;BEGIN&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;(* &lt;span lang="ru-RU"&gt;реализация&lt;/span&gt; *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;(* &lt;span lang="ru-RU"&gt;переменная     &lt;/span&gt;t &lt;span lang="ru-RU"&gt;здесь является ссылкой на объект,&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="ru-RU"&gt;в контексте которого находится метод.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="ru-RU"&gt;Она является аналогом &lt;/span&gt;self &lt;span lang="ru-RU"&gt;в &lt;/span&gt;Delphi &lt;span lang="ru-RU"&gt;или &lt;/span&gt;this &lt;span lang="ru-RU"&gt;в &lt;/span&gt;C++ *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;END Method;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;br /&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;PROCEDURE Function(t: T; x: INTEGER): INTEGER =&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;BEGIN&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;(* &lt;span lang="ru-RU"&gt;реализация&lt;/span&gt; *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;(* наличие &lt;span lang="en-US"&gt;t &lt;/span&gt;обязательно, даже если&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;она не будет использована.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;Она говорит о принадлежности метода объекту! *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;RETURN &lt;span lang="ru-RU"&gt;&amp;lt;результат&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;END Function;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;То, что стоит после имени метода — называется сигнатурой. В сигнатуре метода не указывается контекстная переменная. Но в сигнатруре реализующей процедуры она обязательна!&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;Переопределение методов реализуется в блоке &lt;span lang="en-US"&gt;OVERRIDES. &lt;/span&gt;При этом, сигнатура переопределяемого метода не указывается. Указывается только имя метода&lt;span lang="en-US"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;TYPE NewT = T OBJECT&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;OVERRIDES&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;method:=NewMethod;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;END;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;br /&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;PROCEDURE NewMethod(nt: NewT) =&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;BEGIN&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;(* &lt;span lang="ru-RU"&gt;Новая реализация &lt;/span&gt;*)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;END NewMethod;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Нужно отметить, что переопределяемые методы являются виртуальными.&lt;/span&gt;&lt;/p&gt;&lt;p lang="ru-RU" style="text-align: justify;"&gt;Кстати, если проводить аналогию между Модулой-3 и С++, то бросается в глаза одно различие. Компилятор С++ автоматически видоизменяет имена методов, благодаря чему становится возможной их перегрузка. Компилятор Модулы-3 никаких видоизменений не производит. Это ему просто не нужно. Программист сам присваивает имени метода имя процедуры, реализующей этот метод.&lt;/p&gt;   &lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;Теперь переходим к самому интересному. Сокрытие данных и методов в объекте. В качестве примера я приведу программу &lt;span lang="en-US"&gt;"Hello World" &lt;/span&gt;(а как же иначе? :-). Она проста и понятна. Программа состоит из двух модулей и одного интерфейса. Начнём с описания интерфейса.&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;(* файл Objs.i3 *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;INTERFACE Objs;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;TYPE&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;Obj &amp;lt;: Public; &lt;span style="color:#008080;"&gt;&lt;i&gt;(* Obj открывает только методы,&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color:#008080;"&gt;&lt;i&gt;перечисленные в Public. Знак &lt;/i&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span lang="en-US"&gt;&lt;i&gt;&amp;lt;: &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;i&gt;означает создание&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color:#008080;"&gt;&lt;i&gt;прозрачного типа, который будет реализован&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color:#008080;"&gt;&lt;i&gt;и экспортирован в теле модуля *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;Public = OBJECT &lt;span style="color:#008080;"&gt;&lt;i&gt;(* абстрактный тип, показывающий,&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color:#008080;"&gt;&lt;i&gt;какие поля будут экспортированы *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;METHODS&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;setName(name: TEXT);&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;hello();&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;END;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;br /&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;END Objs.&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Теперь опишем модуль &lt;span lang="en-US"&gt;Objs. К&lt;/span&gt;лючевое слово &lt;span lang="en-US"&gt;REVEAL &lt;/span&gt;(&lt;i&gt;англ.&lt;/i&gt; — открывать) служит для объявления реализации прозрачного типа.&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;(* файл Objs.m3 *)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;MODULE Objs;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;IMPORT IO;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;br /&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;REVEAL&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;Obj = Public BRANDED OBJECT &lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span lang="en-US"&gt;&lt;i&gt;(* Obj представлен как расширение типа Public *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt; &lt;span style="font-size:100%;"&gt;&lt;i&gt;(* что означает слово     &lt;span lang="en-US"&gt;BRANDED, &lt;/span&gt;я так и не понял.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt; &lt;span style="font-size:100%;"&gt;&lt;i&gt;Но без него программа не компилируется *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;name: TEXT; &lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span lang="en-US"&gt;&lt;i&gt;(* Скрытое поле *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;OVERRIDES&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;setName:=SetName; &lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span lang="en-US"&gt;&lt;i&gt;(* переопределение методов из типа Public *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;hello:=Hello; &lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span lang="en-US"&gt;&lt;i&gt;(* при переопределении сигнатура процедуры не указывается *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;END;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;br /&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;(* Эти процедуры не видны &lt;/span&gt;в&lt;span lang="en-US"&gt;не этого модуля *)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;PROCEDURE SetName(self: Obj; name: TEXT) =&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;self.name:=name;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;END SetName;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;br /&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;PROCEDURE Hello(self: Obj) =&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;IO.Put("Hello " &amp;amp; self.name &amp;amp; "!\n");&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;END Hello;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;br /&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;(* слово BEGIN обязательно пишется,во всех модулях.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt; &lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;* здесь можно инициализировать локальные переменные&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt; &lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;* и объекты *)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;END Objs.&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;В главном модуле &lt;span lang="en-US"&gt;(Main)     &lt;/span&gt;реализуется сама программа. Для начала импортируется модуль &lt;span lang="en-US"&gt;Objs. &lt;/span&gt;Затем, создаётся переменная &lt;span lang="en-US"&gt;&lt;i&gt;o&lt;/i&gt;&lt;/span&gt; объектного типа &lt;span lang="en-US"&gt;&lt;i&gt;Objs.Obj&lt;/i&gt;&lt;/span&gt;&lt;span lang="en-US"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;(* файл Main.m3 *)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;MODULE Main;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;IMPORT Objs;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;br /&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;VAR o: Objs.Obj; &lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span lang="en-US"&gt;&lt;i&gt;(* объявлние переменной-объекта *)&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;o:=NEW(Objs.Obj); &lt;/span&gt;&lt;span style="color:#008080;"&gt;&lt;span lang="en-US"&gt;&lt;i&gt;(* тип OBJECT является ссылочным, &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt; &lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;поэтому необходимо выделить для него память *)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;o.setName("World");&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;o.hello();&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="color:#008080;"&gt; &lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;(* по завершении программы объектная переменная o &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;   &lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt;&lt;span style="color:#008080;"&gt; &lt;span style="font-size:100%;"&gt;&lt;i&gt;&lt;span lang="en-US"&gt;* будет автоматически удалена сборщиком мусора *)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt style="text-align: justify;"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;END Main.&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Если бы мы попытались полю &lt;span lang="en-US"&gt;&lt;i&gt;name&lt;/i&gt;&lt;/span&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;объекта &lt;span lang="en-US"&gt;&lt;i&gt;o&lt;/i&gt;&lt;/span&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;присвоить значение напрямую (&lt;span lang="en-US"&gt;&lt;i&gt;o.name&lt;/i&gt;&lt;/span&gt;&lt;span lang="en-US"&gt;:="World"&lt;/span&gt;), это вызвало бы ошибку. Для того, чтобы создать открытые поля в объектном типе, их нужно указать в абстрактном типе &lt;span lang="en-US"&gt;Public.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt;   &lt;dt&gt;     &lt;p lang="ru-RU" style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Вот, собственно, и всё. Если возникнут вопросы, пишите их в комментарии. Всем всего доброго!&lt;/span&gt;&lt;/p&gt;   &lt;/dt&gt; &lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-2677396717543948477?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/2677396717543948477/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/02/3.html#comment-form' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/2677396717543948477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/2677396717543948477'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/02/3.html' title='Объектно-ориентированное программирование в Модуле-3'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-3267218430798350428</id><published>2009-02-26T19:42:00.000+06:00</published><updated>2009-02-26T19:50:46.012+06:00</updated><title type='text'>Работа с компилятором CM3</title><content type='html'>&lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;Для компиляции программ, написанных на языке &lt;span lang="en-US"&gt;Modula&lt;/span&gt;-3 могут использоваться различные компиляторы. Это может быть &lt;span lang="en-US"&gt;PM3, HM3, EZM3 &lt;/span&gt;и, лучший из всех возможных — &lt;span lang="en-US"&gt;CM3. Л&lt;/span&gt;учшим он является потому, что до сих поддерживается и развивается. Последние его версии поддерживают 64-битные платформы.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p align="justify"&gt;&lt;span style="font-size:100%;"&gt;Теперь, поговорим о том, какие версии компилятора &lt;span lang="en-US"&gt;CM3 &lt;/span&gt;для &lt;span lang="en-US"&gt;Windows &lt;/span&gt;имеются на сайте. Их может быть три, и каждая из них использует определённые наборы инструментов (самое главное — это ассемблер и компоновщик) для построения приложения:&lt;/span&gt;&lt;/p&gt; &lt;ul align="justify"&gt;   &lt;li&gt;     &lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;NT386&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;–&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt; компилятор, использующий в набор инструментов &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;MS Visual C++&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p lang="en-US"&gt;&lt;span style="font-size:100%;"&gt;NT386GNU – &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;компилятор, использующий инструменты &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;CYGWIN (&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;раньше работал с &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;MinGW);&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p lang="en-US"&gt;&lt;span style="font-size:100%;"&gt;NT&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;386&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;MINGNU –&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt; компилятор, работающий с &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;MinGW.&lt;/span&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;p lang="en-US" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;У меня &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;MS Visual C++ &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;нет, т. к. он большой и стоит немалых денег. Можно скачать &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Express-&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;версию, но для этого нужен «толстый» канал в интернет, которого у меня тоже нет.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p lang="en-US" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;&lt;/span&gt;CYGWIN &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;меня не устраивает по двум причинам. Во первых, он &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;GPL&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;-ный (а значит, нельзя создавать закрытые платные программы). Во вторых, программы, созданные с его помощью зависят от библиотеки &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;cygwin1.dll.&lt;/span&gt;&lt;/p&gt; &lt;p lang="ru-RU" align="justify"&gt;&lt;span style="font-size:100%;"&gt;А вот &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;MinGW – &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;это самый лучший вариант. Он не требует наличия дополнительных библиотек, создаёт компактный и быстрый код, и его лицензия не запрещает создавать с его помощью закрытое ПО. Правда, нужно оговориться, что &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;MinGW &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;должен быть не очень старым. В старой версии компоновщик &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;ld &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;не поддерживает опцию &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;@, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;которую &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;cm3 &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;активно использует. Лично я использую &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;current-&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;версию &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;gcc &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;3.4.5.&lt;/span&gt;&lt;/p&gt; &lt;p lang="en-US" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Теперь нужно решить, какую комплектацию &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;CM3 &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;использовать. Для компиляции простых программ можно обойтись минимальной комплектацией. Скачиваем архив &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;cm3-min-NT386MINGNU-X.X.X.tar.gz &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;и распаковываем его куда-нибудь. После этого в переменной &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;PATH &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;указываем путь к каталогу &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;bin. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Если &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;mingw &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;уже установлен на Вашем компьютере, то всё готово, и можно приступать к работе.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p lang="en-US" align="justify"&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;Напишем простейшую программу, которая будет выводить на экран все переменные среды и их значения:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;dl align="justify"&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;MODULE Main; (* Имя файла должно совпадать с именем модуля! *)&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;IMPORT IO, Env;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;br /&gt;  &lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;PROCEDURE PrintVars() =&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;VAR name, val: TEXT;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;BEGIN&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;FOR i :=0 TO Env.Count-1 DO&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;(* Обратите внимание, циклическая переменная i не описана в VAR *)&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;Env.GetNth(i, name, val);&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;IO.Put(name &amp;amp; " = " &amp;amp; val &amp;amp; "\n");&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;END; (* конец цикла *)&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;END PrintVars;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;br /&gt;  &lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;BEGIN&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;PrintVars();&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt; &lt;span style="font-size:100%;"&gt;END Main.&lt;/span&gt;&lt;/dt&gt;   &lt;dd&gt;&lt;br /&gt;  &lt;/dd&gt; &lt;/dl&gt; &lt;p align="justify"&gt;&lt;span style="font-size:100%;"&gt;Многие (в том числе и я) поначалу думают, что &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;cm3cg.exe&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; — это компилятор&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;На самом деле этот так называемый &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;back-end, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;т. е. кодогенератор. Об этом говорят буквы &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;cg.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="justify"&gt; &lt;span style="font-size:100%;"&gt;Теперь, когда модуль создан, просто даём в командной строке команду &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;в том же каталоге, где лежит исходник&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;dl align="justify"&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;&gt; cm3&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt; &lt;/dl&gt; &lt;p align="justify"&gt;&lt;span style="font-size:100%;"&gt;Знак &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;«&gt;» &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;- это приглашение командной строки. Собранная программа будет лежать в подкаталоге &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;NT386MINGNU.&lt;/span&gt; Пример программы, состоящей из двух модулей можно посмотреть &lt;a href="http://www.opencm3.net/doc/help/cm3/example.html"&gt;здесь&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;div align="justify"&gt; &lt;span style="font-size:100%;"&gt;Приведённая выше программа была очень простой, и не требовала никаких библиотек, кроме &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;libm3. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Для компиляции более сложной программы необходимо создать сборочный файл &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;m3makefile. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Рассмотрим пример. Предположим, нам надо собрать программу для работы с базой данных, которая использует пакет &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;odbc &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;(библиотеки у Модулы-3 объединены в пакеты)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Сборочный файл будет иметь такой вид:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;dl align="justify"&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;% это комментарий&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;% &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;символ «;» в конце строки НЕ СТАВИТСЯ. Его наличие — ошибка!&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;import("libm3")&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;import("odbc")&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;% &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;перечисляем все модули и интерфейсы&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;interface("InterfaceName")&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;module("ModuleName")&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;% &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;главный модуль записывается в слове &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;implementation&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;implementation("Main")&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;% &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;задаём имя программы&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="ru-RU"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;program("myprog")&lt;/span&gt;&lt;/dt&gt;   &lt;dt&gt;&lt;span style="font-size:100%;"&gt;Всё, сборочный файл готов. Даём команду:&lt;/span&gt;&lt;/dt&gt; &lt;/dl&gt; &lt;p align="justify"&gt;&lt;span style="font-size:100%;"&gt;&gt; cm3&lt;/span&gt;&lt;/p&gt;&lt;div align="justify"&gt; &lt;span style="font-size:100%;"&gt;и если не было ошибок в текстах модулей, то программа соберётся.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;span style="font-size:100%;"&gt;Для дальнейшего изучения языка можно почитать документацию &lt;a href="http://sites.google.com/site/voronovrn/Home/modula-3/dokumentacia-po-module-3"&gt;отсюда&lt;/a&gt;, а также, исходники компилятора. Язык очень простой, и исходные тексты читаются очень легко &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;не в пример языку Си :-&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Также, можно посмотреть &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;&lt;a href="http://www.opencm3.net/doc/tutorial/m3/m3_toc.html"&gt;tutorial&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;и &lt;a href="http://www.opencm3.net/doc/help/cm3/quake.html"&gt;Quake Language Reference&lt;/a&gt; &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;язык программирования, на котором пишется &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;m3makefile).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="justify"&gt; &lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;p align="justify"&gt;&lt;span style="font-size:100%;"&gt;На этом всё. Все вопросы пишите в комментариях. В ближайшее время я планирую написать статью с примером объектно-ориентированного программирования. В ней будет рассказано, как реализуется сокрытие данных и методов в объекте.&lt;/span&gt;&lt;/p&gt;&lt;div align="justify"&gt; &lt;span style="font-size:100%;"&gt;И ещё, вопрос ко всем, кто заинтересовался языком Модула-3. Может быть стоит создать группу (наподобие форума) на &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span lang="en-US"&gt;Google Groups, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;посвящённую Модуле-3? Ответ пишите в комментариях.&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-3267218430798350428?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/3267218430798350428/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/02/cm3.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/3267218430798350428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/3267218430798350428'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/02/cm3.html' title='Работа с компилятором CM3'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-7651057609482697954</id><published>2009-02-14T08:32:00.000+06:00</published><updated>2009-04-10T08:14:26.396+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Основы языка'/><title type='text'>Отличия Модулы-3 от Оберона-2</title><content type='html'>Языки Модула-3 и Оберон-2 являются родственными языками. Это и не удивительно, ведь во время разработки Модулы-3 велись консультации с Никлаусом Виртом, который в это время занимался разработкой языка Оберон-2. Цитата:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;The Modula-3 project started in November 1986 when Maurice Wilkes wrote to Niklaus Wirth with some ideas for a new version of Modula. &lt;...&gt; Wirth had already moved on to &lt;a href="http://en.wikipedia.org/wiki/Oberon_(programming_language)" title="Oberon (programming language)"&gt;Oberon&lt;/a&gt;, but had no problems with Wilkes's team continuing development under the Modula name.&lt;/blockquote&gt;&lt;br /&gt;Хотелось бы представить некоторые отличия между двумя этими языками. Основное отличие Модулы-3 от Оберона-2 заключается в том, что расширяемым типом является не запись (&lt;span style="font-weight: bold;"&gt;RECORD&lt;/span&gt;), а объект (&lt;span style="font-weight: bold;"&gt;OBJECT&lt;/span&gt;). Причём, объект является ссылочным типом. Работать с ним можно так же, как и с записями в Обероне (первой версии) и Ada95, а можно и по-своему:&lt;br /&gt;&lt;blockquote&gt;TYPE&lt;br /&gt;Obj = OBJECT&lt;br /&gt;METHODS&lt;br /&gt;some() = Some;&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;PROCEDURE Some(o: Obj) =&lt;br /&gt;BEGIN&lt;br /&gt;(* Что-то *)&lt;br /&gt;END Some;&lt;/blockquote&gt;&lt;br /&gt;То есть, раздел METHODS в объекте можно и не указывать, а пользоваться процедурой Some, как это принято в Аде95 и Обероне-1.&lt;br /&gt;&lt;br /&gt;Указатель на тип в Модуле-3 записывается так:&lt;br /&gt;&lt;blockquote&gt;TYPE A = REF ARRAY OF INTEGER;&lt;/blockquote&gt;вместо&lt;br /&gt;&lt;blockquote&gt;TYPE A = POINTER TO ARRAY OF INTEGER;&lt;/blockquote&gt;в Обероне.&lt;br /&gt;&lt;br /&gt;Статические массивы создаются так же, как это принято в Паскале и Модуле-2:&lt;br /&gt;&lt;blockquote&gt;TYPE A = ARRAY [1..10] OF INTEGER;&lt;/blockquote&gt;&lt;br /&gt;В описании процедуры, после её сигнатуры ставится знак "=" вместо ";".&lt;br /&gt;&lt;br /&gt;Чтобы узнать длину массива, нужно использовать функцию NUMBER(a) вместо LEN(a). Причём, чтобы узнать длину динамического массива, нужно использовать разыменование указателя - NUMBER(a^), иначе будет ошибка.&lt;br /&gt;&lt;br /&gt;При описании модуля в Модуле-3 используется интерфейс модуля и его тело. Это качество было позаимствовано из Модулы-2 (DEFINITION MODULE).&lt;br /&gt;&lt;br /&gt;В Модуле-3 имеется поддержка обобщённого программирования (Generics). Как и у Ады95, обобщения реализованы на уровне модуля, а не на уровне расширяемого типа, как это сделано в C++, Java или Delphi.&lt;div&gt;&lt;br /&gt;&lt;div&gt;Также, в Модуле-3 имеются исключения. Внешне они похожи на исключения в Delphi. Основное отличие заключается в том, что объект исключения не является переменной расширяемого типа. Для описания исключений имеется ключевое слово &lt;span class="Apple-style-span" style="font-style: italic;"&gt;EXCEPTION&lt;/span&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-7651057609482697954?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/7651057609482697954/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/02/3-2.html#comment-form' title='Комментарии: 17'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/7651057609482697954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/7651057609482697954'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/02/3-2.html' title='Отличия Модулы-3 от Оберона-2'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3890098994885199392.post-7615697729942999814</id><published>2009-02-13T18:05:00.000+06:00</published><updated>2009-02-13T18:34:17.404+06:00</updated><title type='text'>Начало</title><content type='html'>&lt;p align="justify"&gt;В этом блоге я планирую писать статьи о замечательном языке программирования Modula-3. Так случилось, что при всех его достоинствах, этот язык был практически забыт. Сейчас он используется преимущественно в зарубежных университетах, как инструмент для обучения студентов основам программирования. Если этот блог хоть как-то повлияет на популярность Модулы-3, хотя бы на территории России, я буду только рад. Ведь, исторически сложилось, что в России и, возможно, на территории стран бывшего СССР, языки Pascal-семейства пользуются популярностью.&lt;/p&gt;&lt;p align="justify"&gt;Примечательно, что к разработке Модулы-3 приложил руку и сам отец языков славного Pascal-семейства - профессор университета в Цюрихе, Никлаус Вирт. И, как и положено языкам этого семейства, Модула-3 отличается мощью, не уступающей (а в чём-то и превосходящей) языкам семейства Си, и простотой, сравнимой с языками Оберон/Оберон-2.&lt;/p&gt;&lt;p align="justify"&gt;В ближайшее время я постараюсь опубликовать краткую историю создания Модулы-3 на русском языке. Где-то в обозримом будущем, также, планирую выложить в свободный доступ компилятор &lt;a href="http://www.opencm3.net"&gt;CM3&lt;/a&gt; в стандартной редакции для платформы Win32.&lt;/p&gt;&lt;p align="justify"&gt;Пока же, если кто-то интересуется этим языком, пишите комментарии. Буду только рад!&lt;/p&gt;&lt;p align="justify"&gt;PS. CM3 - это открытый и свободный даже для коммерческого использования, полнофункциональный компилятор Модулы-3. Поставляется с большим количеством библиотек.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3890098994885199392-7615697729942999814?l=modula3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modula3.blogspot.com/feeds/7615697729942999814/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://modula3.blogspot.com/2009/02/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/7615697729942999814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3890098994885199392/posts/default/7615697729942999814'/><link rel='alternate' type='text/html' href='http://modula3.blogspot.com/2009/02/blog-post.html' title='Начало'/><author><name>Roman</name><uri>http://www.blogger.com/profile/03876152634032744442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
