Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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