Subversion Repositories Kolibri OS

Rev

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