Subversion Repositories Kolibri OS

Rev

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