Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 22 авг 2019, 18:05

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Часть третья. Быть или не быть?
СообщениеДобавлено: 03 апр 2012, 02:41 
Не в сети
Администратор
Аватара пользователя

Сообщения: 187
Часть третья. Быть или не быть?
Оглавление
'Быть или не быть?' - сказал он как то не уверенно.
В первой и второй части я подробно описал компилятор и линкёр Оберона,
пришло время активных действий. Давайте попробуем сделать пустое приложение скомпилировать
и слинковать его.

Создаем в нашей корневой папке пару пустых файлов Program1.mod и Program1.Link
что бы получилось нечто похожее

Изображение

открываем Program1.mod и вбиваем код
Код: "OBERON"
  1. MODULE Program1;
  2.  
  3. BEGIN
  4.  
  5. END Program1.

Это пустое приложение которое мы скомпилируем изменив и запустив файл CompileAndLink.bat
Код: "LINK"

Ну что компилируем запускаем и видим примерно следующее

Изображение

то есть компиляция прошла нормально, и у нас появился файлик Program1.Obj
Это объектный файл для Оберон компилятора (не надо путать с Windows coff или ofm файлами)
который мы сейчас и попытаемся слинковать.
Так как не импортируемых модулей не экспорта у нас нет, то в Program1.Link вбиваем код
с единственным модулем Program1
Код: "LINK"

и сохраняем файл.

Открываем наш системный сценарий CompileAndLink.bat и меняем код на следующий
Код: "BAT"
Bin\O2ETHCLL.EXE Program1.Link
 
pause

Пробуем слинковать всё наше хозяйство! И............................

Изображение

У кого не появилось данной картинки, тот видимо что то в этой жизни сделал правильно,
но в коде ошибся.

Жесткий облом в виде нецензурного выражения операционной системы.!!!

Ну что же, на этом бы можно было и закончить если бы не одно но!
Вспомним что же такое Оберон компилятор.

Оберон компилятор - это компилятор, в котором всё венесено в модули (даже RTL и сборщик мусора),
а раз так, то естесственно без RTL с грехом пополам (хотя почему?) он работать должен, а вот без сборщика нет!!!

И где же брать такое чудо, как сборщик мусора?
Так в исходниках компилятора тут Оберон 2 и называется он Kernel.mod.
Не буду вас мучить кучей файлов которые нужны для его работы, просто приаттачу сюда файлик скомпилированый,
который не требует для себя дополнительных файлов вроде Kernel32.mod.
Вложение:
Комментарий к файлу: Сборщик мусора (скомпилированый модуль)
Kernel.zip [6.24 КБ]
Скачиваний: 589


Теперь для корректной работы папочка наша выглядит вот так

Изображение

И нам осталось прописать опции линкёра (ведь сборщик мусора импортирует же какие то функции) и компилятора в
нашем Link и BAT файле а так же (для надёжности, потом мы всё это пропишем в другом файле)
написать код запуска сборшщика в пустом приложении

Код: "OBERON"
  1. MODULE Program1;
  2.  
  3. IMPORT
  4. Kernel;
  5.  
  6. BEGIN
  7. IF Kernel.call = 0 THEN
  8. INC(Kernel.call);
  9. Kernel.Init();
  10. ELSIF Kernel.ExitProc # NIL THEN
  11. Kernel.Shutdown(0);
  12. END;
  13. END Program1.

ВНИМАНИЕ!!! ЭТОТ Link ФАЙЛ ВКЛЮЧАЕТ В СЕБЯ RTL СБОРЩИКА, ПОЭТОМУ ПОСЛЕДУЮЩИЕ ПРОЕКТЫ
БУДУТ ТОЛЬКО ДОПОЛНЯТСЯ, БЕЗ ПОЛЕЙ ИМПОРТА НИ ОДНО ПРИЛОЖЕНИЕ НЕ БУДЕТ РАБОТАТЬ КОРРЕКТНО!

Код: "LINK"

Код: "BAT"
Bin\O2ETHCLC.EXE Program1.mod
Bin\O2ETHCLL.EXE Program1.Link
 
pause


Запускаем CompileAndLink.bat и о чудо!!!

Изображение

Все скомпилировалось и слинковалось без вопросов и в папке появился файлик Project.EXE именно такой, каким
мы его и обозвали в Program1.Link файле в поле PROGRAM

При запуске он естественно ничего не покажет, может просто моргнёт на секунду консольное окно
Windows, и завершится, и что самое главное, не останется висеть в диспетчере задач освободив память!

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

Вложение:
Комментарий к файлу: Сборщик мусора (скомпилированый модуль)
Kernel.zip [6.24 КБ]
Скачиваний: 589


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Часть третья. Быть или не быть?
СообщениеДобавлено: 16 ноя 2013, 13:35 
Не в сети

Сообщения: 114
Откуда: Каменск-Уральский
S.Atan писал(а):
Код: "OBERON"
  1. IF Kernel.call = 0 THEN
  2. INC(Kernel.call);
  3. Kernel.Init();
  4. ELSIF Kernel.ExitProc # NIL THEN
  5. Kernel.Shutdown(0);
  6. END;


Поясните код запуска сборщика мусора, с комментариями, пожалуйста.

Что делает команда INC и что значит # NIL?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Часть третья. Быть или не быть?
СообщениеДобавлено: 16 ноя 2013, 22:20 
Не в сети

Сообщения: 67
Len писал(а):
S.Atan писал(а):
Код: "OBERON"
  1. IF Kernel.call = 0 THEN
  2. INC(Kernel.call);
  3. Kernel.Init();
  4. ELSIF Kernel.ExitProc # NIL THEN
  5. Kernel.Shutdown(0);
  6. END;


Поясните код запуска сборщика мусора, с комментариями, пожалуйста.

Что делает команда INC и что значит # NIL?


# - не равно (!= в Си или <> в Паскале)
NIL - пустой (null) указатель
INC - инкремент величины (a:=a+1 или в Си a++)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Часть третья. Быть или не быть?
СообщениеДобавлено: 17 ноя 2013, 13:00 
Не в сети

Сообщения: 114
Откуда: Каменск-Уральский
S.Atan писал(а):
Код: "LINK"

Откуда взялся модуль KERNEL32, если его нигде явно не импортируют?
S.Atan писал(а):
Код: "OBERON"
  1.  
  2. IF Kernel.call = 0 THEN
  3. INC(Kernel.call);
  4. Kernel.Init();
  5. ELSIF Kernel.ExitProc # NIL THEN
  6. Kernel.Shutdown(0);
  7. END;
  8.  

Что значат переменные Kernel.call и Kernel.ExitProc?
Что делают функции Kernel.Init и Kernel.Shutdown?
Почему функция Kernel.Init вызывается без аргумента?
Почему аргумент функции Kernel.Shutdown 0?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Часть третья. Быть или не быть?
СообщениеДобавлено: 03 дек 2013, 20:26 
Не в сети
Администратор
Аватара пользователя

Сообщения: 187
Last_Alien писал(а):
Откуда взялся модуль KERNEL32, если его нигде явно не импортируют?

KERNEL32 это не модуль :) , это библиотека Windows "kernel32.dll"

Kernel.DeleteCriticalSection = KERNEL32.DeleteCriticalSection

Означает, что функция DeleteCriticalSection в модуле Kernel.Mod импортируемая из динамической библиотеки kernel32.dll c таким же названием.

При линковке, для удобства можно написать (на пример модуль Test.Mod)
Test.MessageBox = USER32.MessageBoxA - для ANSI строк
Test.MessageBox = USER32.MessageBoxW - для UTF строк
если вы используете, допустим API функцию Windows MessageBox.
Last_Alien писал(а):
Что значат переменные Kernel.call и Kernel.ExitProc?
Что делают функции Kernel.Init и Kernel.Shutdown?
Почему функция Kernel.Init вызывается без аргумента?
Почему аргумент функции Kernel.Shutdown 0?


Эти функции описаны в модуле Kernel.Mod
Смысл тут в подсчете запускаемого модуля Kernel (ведь он может импортироваться многими другими модулями, а так как он включает в себя сборщик мусора, то достаточно одного экземпляра его в приложении.)
Так же и ExitProcess достаточен в одном экземпляре...


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Часть третья. Быть или не быть?
СообщениеДобавлено: 04 дек 2013, 06:56 
Не в сети

Сообщения: 13
Len писал(а):
Откуда взялся модуль KERNEL32, если его нигде явно не импортируют?
Очень резонный вопрос. Ибо, это шаманство.

S.Atan писал(а):
KERNEL32 это не модуль :) , это библиотека Windows "kernel32.dll"
...
Это всё понятно, но где об этом сказано в языке? На этот вопрос можно не отвечать, но есть повод задуматься.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Часть третья. Быть или не быть?
СообщениеДобавлено: 04 дек 2013, 07:04 
Не в сети
Администратор
Аватара пользователя

Сообщения: 187
S.Atan писал(а):
Это всё понятно, но где об этом сказано в языке?


А причем здесь язык? Это скрипт линкёра для связки и компоновки скомпилированых модулей.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Часть третья. Быть или не быть?
СообщениеДобавлено: 04 дек 2013, 08:09 
Не в сети

Сообщения: 13
S.Atan писал(а):
А причем здесь язык? Это скрипт линкёра для связки и компоновки скомпилированых модулей.
А, тогда беру свои слова обратно. :) Невнимательно взглянул на код.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Тех.поддержка phpBB