Subversion Repositories Kolibri OS

Rev

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

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