Subversion Repositories Kolibri OS

Rev

Rev 9577 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
9177 akron1 1
        Компилятор языка программирования Oberon-07/16 для i486
2
                Windows/Linux/KolibriOS.
3
------------------------------------------------------------------------------
4
 
5
        Параметры командной строки
6
 
7
  Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
8
UTF-8 с BOM-сигнатурой.
9
  Выход - испоняемый файл формата PE32, ELF или MENUET01/MSCOFF.
10
  Параметры:
11
  1) имя главного модуля
12
  2) тип приложения
13
      "win32con" - Windows console
14
      "win32gui" - Windows GUI
15
      "win32dll" - Windows DLL
16
      "linux32exe" - Linux ELF-EXEC
17
      "linux32so"  - Linux ELF-SO
18
      "kosexe" - KolibriOS
19
      "kosdll" - KolibriOS DLL
20
 
21
  3) необязательные параметры-ключи
22
      -out  имя результирующего файла; по умолчанию,
23
      совпадает с именем главного модуля, но с другим расширением
24
      (соответствует типу исполняемого файла)
25
      -stk  размер стэка в мегабайтах (по умолчанию 2 Мб,
26
       допустимо от 1 до 32 Мб)
27
      -tab  размер табуляции (используется для вычисления координат в
28
      исходном коде), по умолчанию - 4
29
      -nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже)
30
      -lower разрешить ключевые слова и встроенные идентификаторы в
31
      нижнем регистре
32
      -def <имя> задать символ условной компиляции
33
      -ver  версия программы (только для kosdll)
9577 akron1 34
      -uses вывести список импортированных модулей
9177 akron1 35
 
36
      параметр -nochk задается в виде строки из символов:
37
      "p" - указатели
38
      "t" - типы
39
      "i" - индексы
40
      "b" - неявное приведение INTEGER к BYTE
41
      "c" - диапазон аргумента функции CHR
42
      "w" - диапазон аргумента функции WCHR
43
      "r" - эквивалентно "bcw"
44
      "a" - все проверки
45
 
46
      Порядок символов может быть любым. Наличие в строке того или иного
47
      символа отключает соответствующую проверку.
48
 
49
      Например: -nochk it - отключить проверку индексов и охрану типа.
50
      -nochk a - отключить все отключаемые проверки.
51
 
52
  Например:
53
 
54
  Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -stk 1
55
  Compiler.exe "C:\example.ob07" win32dll -out "C:\example.dll"
56
  Compiler.exe "C:\example.ob07" win32gui -out "C:\example.exe" -stk 4
57
  Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -nochk pti
58
  Compiler.kex "/tmp0/1/example.ob07" kosexe -out "/tmp0/1/example.kex" -stk 4
59
  Compiler.kex "/tmp0/1/example.ob07" kosdll -out "/tmp0/1/mydll.obj" -ver 2.7
60
  Compiler.exe "C:\example.ob07" linux32exe -out "C:\example" -stk 1 -nochk a
61
 
62
  В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
63
При работе компилятора в KolibriOS, код завершения не передается.
64
 
65
------------------------------------------------------------------------------
66
        Отличия от оригинала
67
 
68
1.      Расширен псевдомодуль SYSTEM
69
2.      В идентификаторах допускается символ "_"
70
3.      Добавлены системные флаги
71
4.      Усовершенствован оператор CASE (добавлены константные выражения в
72
        метках вариантов и необязательная ветка ELSE)
73
5.      Расширен набор стандартных процедур
74
6.      Семантика охраны/проверки типа уточнена для нулевого указателя
75
7.      Добавлены однострочные комментарии (начинаются с пары символов "//")
76
8.      Разрешено наследование от типа-указателя
77
9.      Добавлен синтаксис для импорта процедур из внешних библиотек
78
10.     "Строки" можно заключать также в одиночные кавычки: 'строка'
79
11.     Добавлен тип WCHAR
80
12.     Добавлена операция конкатенации строковых и символьных констант
81
13.     Возможен импорт модулей с указанием пути и имени файла
82
14.     Добавлен специальный синтаксис для условной компиляции (см. CC.txt)
83
15.     Имя процедуры в конце объявления (после END) необязательно
84
 
85
------------------------------------------------------------------------------
86
        Особенности реализации
87
 
88
1.      Основные типы
89
 
90
          Тип              Диапазон значений               Размер, байт
91
 
92
        INTEGER       -2147483648 .. 2147483647                 4
93
        REAL          4.94E-324 .. 1.70E+308                    8
94
        CHAR          символ ASCII (0X .. 0FFX)                 1
95
        BOOLEAN       FALSE, TRUE                               1
96
        SET           множество из целых чисел {0 .. 31}        4
97
        BYTE          0 .. 255                                  1
98
        WCHAR         символ юникода (0X .. 0FFFFX)             2
99
 
100
2.      Максимальная длина идентификаторов - 255 символов
101
3.      Максимальная длина строковых констант - 511 символов (UTF-8)
102
4.      Максимальная размерность открытых массивов - 5
103
5.      Процедура NEW заполняет нулями выделенный блок памяти
104
6.      Глобальные и локальные переменные инициализируются нулями
105
7.      В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
106
        модульность отсутствуют
107
8.      Тип BYTE в выражениях всегда приводится к INTEGER
108
9.      Контроль переполнения значений выражений не производится
109
10.     Ошибки времени выполнения:
110
 
111
 1      ASSERT(x), при x = FALSE
112
 2      разыменование нулевого указателя
113
 3      целочисленное деление на неположительное число
114
 4      вызов процедуры через процедурную переменную с нулевым значением
115
 5      ошибка охраны типа
116
 6      нарушение границ массива
117
 7      непредусмотренное значение выражения в операторе CASE
118
 8      ошибка копирования массивов v := x, если LEN(v) < LEN(x)
119
 9      CHR(x), если (x < 0) OR (x > 255)
120
10      WCHR(x), если (x < 0) OR (x > 65535)
121
11      неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
122
 
123
------------------------------------------------------------------------------
124
        Псевдомодуль SYSTEM
125
 
126
  Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
127
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
128
повреждению данных времени выполнения и аварийному завершению программы.
129
 
130
        PROCEDURE ADR(v: любой тип): INTEGER
131
                v - переменная или процедура;
132
                возвращает адрес v
133
 
134
        PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
135
                возвращает адрес x
136
 
137
        PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
138
                возвращает адрес x
139
 
140
        PROCEDURE SIZE(T): INTEGER
141
                возвращает размер типа T
142
 
143
        PROCEDURE TYPEID(T): INTEGER
144
                T - тип-запись или тип-указатель,
145
                возвращает номер типа в таблице типов-записей
146
 
147
        PROCEDURE INF(): REAL
148
                возвращает специальное вещественное значение "бесконечность"
149
 
150
        PROCEDURE MOVE(Source, Dest, n: INTEGER)
151
                Копирует n байт памяти из Source в Dest,
152
                области Source и Dest не могут перекрываться
153
 
154
        PROCEDURE GET(a: INTEGER;
155
                VAR v: любой основной тип, PROCEDURE, POINTER)
156
                v := Память[a]
157
 
158
        PROCEDURE GET8(a: INTEGER;
159
                       VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
160
                Эквивалентно
161
                SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
162
 
163
        PROCEDURE GET16(a: INTEGER;
164
                        VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
165
                Эквивалентно
166
                SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
167
 
168
        PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
169
                Эквивалентно
170
                SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
171
 
172
        PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
173
                Память[a] := x;
174
                Если x: BYTE или x: WCHAR, то значение x будет расширено
175
                до 32 бит, для записи байтов использовать SYSTEM.PUT8,
176
                для WCHAR -- SYSTEM.PUT16
177
 
178
        PROCEDURE PUT8(a: INTEGER;
179
                       x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
180
                Память[a] := младшие 8 бит (x)
181
 
182
        PROCEDURE PUT16(a: INTEGER;
183
                        x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
184
                Память[a] := младшие 16 бит (x)
185
 
186
        PROCEDURE PUT32(a: INTEGER;
187
                        x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
188
                Память[a] := младшие 32 бит (x)
189
 
190
        PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER)
191
                Копирует n байт памяти из Source в Dest.
192
                Эквивалентно
193
                SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n)
194
 
195
        PROCEDURE CODE(byte1, byte2,... : INTEGER)
196
                Вставка машинного кода,
197
                byte1, byte2 ... - константы в диапазоне 0..255,
198
                например:
199
                SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *)
200
 
201
  Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не
202
допускаются никакие явные операции, за исключением присваивания.
203
 
204
  Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
205
 
206
------------------------------------------------------------------------------
207
        Системные флаги
208
 
209
  При объявлении процедурных типов и глобальных процедур, после ключевого
210
слова PROCEDURE может быть указан флаг соглашения о вызове: [stdcall],
9847 akron1 211
[cdecl], [fastcall], [ccall], [windows], [linux], [oberon]. Например:
9177 akron1 212
 
213
        PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER;
214
 
215
  Если указан флаг [ccall], то принимается соглашение cdecl, но перед
216
вызовом указатель стэка будет выравнен по границе 16 байт.
217
  Флаг [windows] - синоним для [stdcall], [linux] - синоним для [ccall].
218
  Знак "-" после имени флага ([stdcall-], [linux-], ...) означает, что
219
результат процедуры можно игнорировать (не допускается для типа REAL).
220
  Если флаг не указан или указан флаг [oberon], то принимается внутреннее
221
соглашение о вызове.
222
 
223
  При объявлении типов-записей, после ключевого слова RECORD может быть
224
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей
225
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть
226
базовыми типами для других записей.
227
  Для использования системных флагов, требуется импортировать SYSTEM.
228
 
229
------------------------------------------------------------------------------
230
        Оператор CASE
231
 
232
  Синтаксис оператора CASE:
233
 
234
        CaseStatement =
235
                CASE Expression OF Case {"|" Case}
236
                        [ELSE StatementSequence] END.
237
        Case = [CaseLabelList ":" StatementSequence].
238
        CaseLabelList = CaseLabels {"," CaseLabels}.
239
        CaseLabels = ConstExpression [".." ConstExpression].
240
 
241
  Например:
242
 
243
        CASE x OF
244
        |-1:    DoSomething1
245
        | 1:    DoSomething2
246
        | 0:    DoSomething3
247
        ELSE
248
                DoSomething4
249
        END
250
 
251
  В метках вариантов можно использовать константные выражения, ветка ELSE
252
необязательна. Если значение x не соответствует ни одному варианту и ELSE
253
отсутствует, то программа прерывается с ошибкой времени выполнения.
254
 
255
------------------------------------------------------------------------------
256
        Тип WCHAR
257
 
258
  Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
259
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
260
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
261
только тип CHAR. Для получения значения типа WCHAR, следует использовать
262
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
263
исходный код в кодировке UTF-8 с BOM.
264
 
265
------------------------------------------------------------------------------
266
        Конкатенация строковых и символьных констант
267
 
268
  Допускается конкатенация ("+") константных строк и символов типа CHAR:
269
 
270
  str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
271
 
272
  newline = 0DX + 0AX;
273
 
274
------------------------------------------------------------------------------
275
        Проверка и охрана типа нулевого указателя
276
 
277
  Оригинальное сообщение о языке не определяет поведение программы при
278
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
279
Oberon-реализациях выполнение такой операции приводит к ошибке времени
280
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
281
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
282
значительно сократить частоту применения охраны типа.
283
 
284
------------------------------------------------------------------------------
285
        Дополнительные стандартные процедуры
286
 
287
        DISPOSE (VAR v: любой_указатель)
288
                Освобождает память, выделенную процедурой NEW для
289
                динамической переменной v^, и присваивает переменной v
290
                значение NIL.
291
 
292
        COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
293
                v := x;
294
                Если LEN(v) < LEN(x), то строка x будет скопирована
295
                не полностью
296
 
297
        LSR (x, n: INTEGER): INTEGER
298
                Логический сдвиг x на n бит вправо.
299
 
300
        MIN (a, b: INTEGER): INTEGER
301
                Минимум из двух значений.
302
 
303
        MAX (a, b: INTEGER): INTEGER
304
                Максимум из двух значений.
305
 
306
        BITS (x: INTEGER): SET
307
                Интерпретирует x как значение типа SET.
308
                Выполняется на этапе компиляции.
309
 
310
        LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
311
                Длина 0X-завершенной строки s, без учета символа 0X.
312
                Если символ 0X отсутствует, функция возвращает длину
313
                массива s. s не может быть константой.
314
 
315
        WCHR (n: INTEGER): WCHAR
316
                Преобразование типа, аналогично CHR(n: INTEGER): CHAR
317
 
318
------------------------------------------------------------------------------
319
        Импорт модулей с указанием пути и имени файла
320
 
321
Примеры:
322
 
323
    IMPORT Math IN "./lib/math.ob07"; (* относительно текущего модуля *)
324
 
325
    IMPORT M1 IN "C:\lib\math.ob07"; (* абсолютный путь *)
326
 
327
------------------------------------------------------------------------------
328
        Импортированные процедуры
329
 
330
  Синтаксис импорта:
331
 
332
  PROCEDURE [callconv, library, function] proc_name (FormalParam): Type;
333
 
334
  - callconv -- соглашение о вызове
335
  - library -- имя файла динамической библиотеки (строковая константа)
336
  - function -- имя импортируемой процедуры (строковая константа), если
337
  указана пустая строка, то имя процедуры = proc_name
338
 
339
  например:
340
 
341
  PROCEDURE [windows, "kernel32.dll", ""] ExitProcess (code: INTEGER);
342
 
343
  PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN);
344
 
345
  В конце объявления может быть добавлено (необязательно) "END proc_name;"
346
 
347
  Объявления импортированных процедур должны располагаться в глобальной
348
  области видимости модуля после объявления переменных, вместе с объявлением
349
  "обычных" процедур, от которых импортированные отличаются только отсутствием
350
  тела процедуры. В остальном, к таким процедурам применимы те же правила:
351
  их можно вызвать, присвоить процедурной переменной или получить адрес.
352
 
353
  Так как импортированная процедура всегда имеет явное указание соглашения о
354
  вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием
355
  соглашения о вызове:
356
 
357
  VAR
358
      ExitProcess: PROCEDURE [windows] (code: INTEGER);
359
      con_exit:    PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
360
 
361
  В KolibriOS импортировать процедуры можно только из библиотек, размещенных
9577 akron1 362
  в /sys/lib. Импортировать и вызывать функции инициализации библиотек
9177 akron1 363
  (lib_init, START) при этом не нужно.
364
 
365
  Для Linux, импортированные процедуры не реализованы.
366
 
367
------------------------------------------------------------------------------
368
        Скрытые параметры процедур
369
 
370
  Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
371
формальных параметров, но учитываются компилятором при трансляции вызовов.
372
Это возможно в следующих случаях:
373
 
374
1.      Процедура имеет формальный параметр открытый массив:
375
                PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL);
376
        Вызов транслируется так:
377
                Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x))
378
2.      Процедура имеет формальный параметр-переменную типа RECORD:
379
                PROCEDURE Proc (VAR x: Rec);
380
        Вызов транслируется так:
381
                Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x))
382
 
383
  Скрытые параметры необходимо учитывать при связи с внешними приложениями.
384
 
385
------------------------------------------------------------------------------
386
        Модуль RTL
387
 
388
  Все программы неявно используют модуль RTL. Компилятор транслирует
389
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об
390
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
391
следует вызывать эти процедуры явно.
392
  Сообщения об ошибках времени выполнения выводятся в диалоговых окнах
393
(Windows), в терминал (Linux), на доску отладки (KolibriOS).
394
 
395
------------------------------------------------------------------------------
396
        Модуль API
397
 
398
  Существуют несколько реализаций модуля API (для различных ОС).
399
  Как и модуль RTL, модуль API не предназначен для прямого использования.
400
Он обеспечивает связь RTL с ОС.
401
 
402
------------------------------------------------------------------------------
403
        Генерация исполняемых файлов DLL
404
 
405
  Разрешается экспортировать только процедуры. Для этого, процедура должна
406
находиться в главном модуле программы, и ее имя должно быть отмечено символом
407
экспорта ("*"). Нельзя экспортировать процедуры, которые импортированы из
408
других dll-библиотек.
409
 
410
  KolibriOS DLL всегда экспортируют идентификаторы "version" (версия
411
программы) и "lib_init" - адрес процедуры инициализации DLL:
412
 
413
        PROCEDURE [stdcall] lib_init (): INTEGER
414
 
415
Эта процедура должна быть вызвана перед использованием DLL.
8859 leency 416
Процедура всегда возвращает 1.