Часть вторая. Два сапога пара.Оглавление"Вова и Дима - два сапога пара" (Булочник)В
прошлой части я немного описал компилятор
Оберон. Но не описал его возможности. Этим мы займёмся в этот раз.
Давайте внимательно взглянем на нашу директорию
binВ ней мы видим три исполняемых файла и два текстовых.
После непродолжительных (или философских затяжных) умозаключений приходим к выводу, что
OP2.Errors и
OPA.Data нам нужны для отображения ошибок и считывания каких то данных для работы
компилятора.
Файлы
O2ETHCLC.exe и
O2ETHCLL.exe в принципе это компилятор и линкёр (отличаются последней буквой)
O2ETHCLC.exe - компилятор
O2ETHCLL.exe - линкер
Stub.exe - это DOS заголовок PE файла Windows который можно посмотреть в любом
HEX редакторе.
Возникает логичный вопрос, почему произошло разделение компилятора на компилятор и линкер?
Давайте обратимся к истории и вспомним, что Оберон был разработан не только для системного программирования,
но и для написания операционных систем. А тут без бинарных файлов без заголовков и секций не обойтись.
Поэтому роль компилятора делать объектные файлы в чистом виде (формать внутренний обероновский),
а линкера - собирать из этих файлов уже либо исполняемые файлы для конечной платформы, либо другое, например загрузчик.
С компилятором мы вроде разобрались, давайте посмотрим на опциональный файл линкера.
Это простой текстовый документ (обычно с расширением
*.Link)
Привожу примеры и расшифровки полей файла.
PROGRAM - поле названия программы для линковки (конечный файл будет называться именно так.
Цитата:
PROGRAM Program1
После линковки в Windows мы получим файл
Program1.exeLIBRARY - поле названия динамической библиотеки
Цитата:
LIBRARY MyDLL
После линковки в Windows мы получим файл
MyDLL.dllSTUB - поле внешнего файла заголовка
DOS, по умолчанию
Stub.exeHEAPSIZE - размер кучи
STACKSIZE - размер стека
BASE - базовый адрес загрузки
Спецефические поля которые опущены по умолчанию.
Цитата:
HEAPSIZE 010000H
BASE 04000000H
IMGVERSION - версия компилятора в имидже
Цитата:
IMGVERSION 2.5
Означает что минимальная версия линкера 2 максимальная 5.
В PE файле поля
MajorImageVersion и
MinorImageVersionVERSION - создание ресурса в файле с данными о вас, компании и т.д.
Цитата:
VERSION
CompanyName = "Institute for Computer Systems of ETH Z…rich - compiler & linker; E.V. Shcherbatyuk - wrapper",
FileDescription = "ETH PlugIn Oberon Compiler & Linker",
FileVersion = "Release 2.5",
LegalCopyright = "(c) 2004 Team of the Institute for Computer Systems of ETH Z…rich",
LegalTrademarks = '"Oberon" and "Gadgets" are trademarks of Eidgen„ssische Technische Hochschule, Z…rich (ETHZ)',
OriginalFilename = "Program1.EXE"
SUBSYSTEM - интерфейс выходного файла
GUI - Оконный интерфейс
CUI - Консольный
NATIVE - внутренний формат Bluebottle системы (или вашей ОС допустим WinCE).
Цитата:
SUBSYSTEM CUI
Означает что
Program1.exe запустится в консольном режиме
IMPORTS - поле импортируемых функций
EXPORTS - поле экспортируемых функций
Цитата:
IMPORTS
Kernel.bootHeapAdr = HeapAdr,
Kernel.bootHeapSize = HeapSize,
Kernel.hInstance = hInstance
MODULES - поле подключаемых модулей
Цитата:
MODULES
Kernel32, Kernel, Modules, Objects, Reals, Dates, Strings
И на конец ресурсные поля
ICONS
CURSORSКоторые определяют иконку приложения (обязательно одна в файле
*.ico и не более 32 бит) и курсор
Цитата:
ICONS
Icon = Oberon.ico
CURSORS
Cursor = Arrow.cur
И на конец содержание примерного файла
Код: "LINK"
PROGRAM Project
SUBSYSTEM CUI
IMGVERSION 2.4
HEAPSIZE 100000H
MODULES
Kernel, Windows, SysUtils, Console, Module1
IMPORTS
Kernel.bootHeapAdr = HeapAdr,
Kernel.DeleteCriticalSection = KERNEL32.DeleteCriticalSection,
Kernel.EnterCriticalSection = KERNEL32.EnterCriticalSection,
Kernel.InitializeCriticalSection = KERNEL32.InitializeCriticalSection,
Kernel.LeaveCriticalSection = KERNEL32.LeaveCriticalSection,
Kernel.GetModuleHandle = KERNEL32.GetModuleHandleA,
Kernel.getProcAddress = KERNEL32.GetProcAddress,
Kernel.GetVersion = KERNEL32.GetVersion,
Kernel.LoadLibrary = KERNEL32.LoadLibraryA,
Kernel.ExitProcess = KERNEL32.ExitProcess,
Kernel.VirtualAlloc = KERNEL32.VirtualAlloc,
Kernel.VirtualFree = KERNEL32.VirtualFree,
Kernel.TryEnterCriticalSection = KERNEL32.TryEnterCriticalSection
ICON
Oberon = Oberon.ico
Ну вот пожалуй и все в этой части.
В
следущей части мы попытаемся скомпилировать минимальное приложение, посмотрим что из этого получится,
и рассмотрим сборщик мусора компилятора!