



                        ПРИЛОЖЕНИЕ А

                Сравнение версии 5.0 языка
               Турбо-Паскаль с ANSI-Паскалем

     В данном приложении сравниваются алгоритмические  языки
Турбо-Паскаль  и  ANSI-Паскаль,  как он определен стандартом
ANSI/IEEE770X3.97-1983 в книге  American  National  Standart
Pascal  Computer Programming Language (Американский стандар-
тный   язык   программирования   на   ЭВМ   Паскаль)   (ISBN
0-471-88944-X,  опубликованной  The  Institute of Electrical
and Electronics Engineers in New  York  (Институтом  инжене-
ров-электриков и электроников в Нью-Йорке)).

           Исключения по отношению к требованиям
            алгоритмического языка ANSI-Паскаль

     Алгоритмический язык Турбо-Паскаль подчиняется требова-
ниям ANSI/IEEE770X3.97-1983 со следующими исключениями:

     - В ANSI-Паскале идентификатор может иметь любую  длину
и  все его знаки являются значащими. В Турбо-Паскале иденти-
фикатор может иметь любую длину, но  только  первые  63  его
знака являются значащими.

     - В ANSI-Паскале символ @ является  альтернативным  для
символа  ^.  В Турбо-Паскале  @ является оператором, который
никогда не трактуется идентично символу ^.

     - В ANSI-Паскале комментарий может начинаться [  и  за-
канчиваться  *)  или начинаться (* и заканчиваться ]. В Тур-
бо-Паскале комментарии должны начинаться и заканчиваться од-
ним и тем же набором символов (например { комментарий }).

     - В ANSI-Паскале каждое возможное  целевое  значение  в
операторе  варианта может появляться только один раз. В Тур-
бо-Паскале это требование не является обязательным.

                                - 2 -



     - В ANSI-Паскале тип компонента файлового типа не может
быть структурным типом, имеющим конпонент файлового же типа.
В Турбо-Паскале это требование не является обязательным.

     - В ANSI-Паскале файловые переменные имеют соответству-
ющую  буферную переменную, на которую можно сослаться, запи-
сывая символ после файловой переменной. В Турбо-Паскале фай-
ловая  переменная не имеет соответствующей буферной перемен-
ной и указание символа  после файловой  переменной  является
ошибкой.

     - В ANSI-Паскале раздел операторов функции  должен  со-
держать  по  крайней  мере  одно присваивание идентификатору
функции. В Турбо-Паскале это требование не  является  обяза-
тельным.

     - В ANSI-Паскале поле, которое является разделителем  в
операторе варианла, не может быть фактическим параметром-пе-
ременной. В Турбо-Паскале это требование не является  обяза-
тельным.

     - В ANSI-Паскале процедуры и функции могут иметь проце-
дурные и функциональные параметры. Такие параметры не допус-
каются в Турбо-Паскале.

     - В ANSI-Паскале стандартные процедуры Reset и  Rewrite
не  требуют  предварительной инициализации файловых перемен-
ных. В Турбо-Паскале файловым переменным должны быть присво-
ены  имена  внешнего  файла (для чего используется процедура
Assign ) перед тем, они передаются  в  процедуры  Reset  или
Rewrite.

     - ANSI-Паскале определены стандартные процедуры  Get  и
Put,  которые используются для считывания информации из фай-
лов и записи ее в них. Эти процедуры в Турбо-Паскале не  оп-
ределены.


                                - 3 -


     - В ANSI-Паскале синтаксис New (p,c1,...cn) создает ди-
намическую  переменную с конкретной действующей динамической
областью памяти. В Турбо-Паскале такой синтаксис не допуска-
ется.

     - В ANSI-Паскале синтаксис Dispose(q,k1,...km)  удаляет
динамическую  переменную с конкретной действующей динамичес-
кой областью памяти. В Турбо-Паскале такой синтаксис не  до-
пускается.

     - В ANSI-Паскале определены стандартные процедуры  Pack
и Unpack, которые используются для "упаковки" и "распаковки"
упакованных переменных. Эти процедуры в Турбо-Паскале не оп-
ределяются.

     - В ANSI-Паскале элемент i mod j всегда вычисляет поло-
жительное  значение, и если j является нолем или отрицатель-
ным числом, то влзникаеп ошибка. В Турбо-Паскале   i  mod  j
вычисляется  как  i-(i  div j)*j, и, если j является отрица-
тельным числом, то это не является ошибкой.

     - В ANSI-Паскале оператор goto внутри блока может  ссы-
латься на метку, находящуюся в блоке, его включающем. В Тур-
бо-Паскале такая ситуация вызывает ошибку.

     - В ANSI-Паскале является ошибкой, если значение управ-
ляющей  переменной  в операторе варианта не равно какой-либо
из констант варианта. В Турбо-Паскале такая ситуация не  яв-
ляется   ошибочной,  зато  игнорируется  оператор  вариантов
(case), если он не содержит предложения else.

     - В  ANSI-Паскале  модификация  управляющей  переменной
оператора  не допускается. В Турбо-Паскале такое ограничение
не является обязательным.

     - В ANSI-Паскале операция Read (считывание) из  тексто-
вого  файла с переменной типа char присваивает значение про-
бела этой переменной,если Eoln  имело  значение  True  перед

                                - 4 -


Read  (считывание). В Турбо-Паскале в данном случае этой пе-
ременной присваивается  значение  символа  возврата  каретки
(ANSII 13).

     - В ANSI-Паскале Read (считывание) из текстового  файла
с  переменной  типа integer или real прекращается сразу, как
появляется следующий знак в файле, не являющийся частью  це-
лого  числа  со  знаком  или  просто числа со знаком. В Тур-
бо-Паскале считывание прекращается, когда следующий  знак  в
файле является пробелом или управляющим знаком (включая мет-
ку конца строки).

     - В ANSI-Паскале операция Write  (запись)  в  текстовый
файл  со значением типа упакованная строка приводит к усече-
нию строки, если указанная ширина  поля  меньше,  чем  длина
строки.  В  Турбо-Паскале  строка всегда записывается полно-
стью, даже если она длиннее, чем указанная ширина поля.

           Примечание: В  Турбо-Паскале  нельзя  определить,
      нарушила ли программа какое-либо из ограничений, здесь
      указанных.

        Расширения по отношению к языку ANSI-Паскаль

     Следующие свойства языка Турбо-Паскаль представляют со-
бой  расширенные  возможности по отношению к Паскалю, как он
определен ANSI/IEEE770X3-1983.

     - В Turbo-Паскале имеются  следующие  зарезервированные
слова:

        absolute           interface            string
        external           interrupt            unit
        implementation     shl                  uses
        inline             shr                  xor

     - Идентификатор после первого символа  может  содержать
знаки подчеркивания (_).

                                - 5 -


     - Целые константы могут записываться в  шестнадцатирич-
ном виде. Перед такими константами ставится знак $.
     - Идентификаторы могут использоваться, как метки.
     - Строковые константы совместимы с  типом  string  Тур-
бо-Паскаля  и могут содержать управляющие знаки и другие не-
печатаемые символы.
     - Описания меток, констант, типов, переменных, процедур
и функций могут задаваться в блоке любое число раз и в любом
порядке.
     - Турбо-Паскаль реализует  дополнительные  типы  целых:
короткое  целое  (shortint), длинное целое (longint - 4 бай-
та), байт (byte) и слово (word), а также дополнительные типы
действительных  чисел: с одинарной точностью, с двойной точ-
ностью и с повышенной.
     - Турбо-Паскаль реализует типы строк, которые отличают-
ся  от  упакованных типов строк, определенных в ANSI-Паскале
тем, что такие строки исключают динамический признак  длины,
который может изменять длину во время выполнения программы.
     - Правила совместимости чисел расширены так, чтобы сде-
лать символьные типы (char) и типы упакованных строк совмес-
тимыми со строковыми типами (string).
     - Переменные могут описываться в абсолютных адресах па-
мяти с помощью соответствующего оператора.
     -  Переменная-указатель  может  содержать  обращение  к
функции ссылочного типа, результат которой затем разыменовы-
вается для обозначения динамической переменной.
     - Переменные строкового типа для осуществления  доступа
к  отдельным знакам в строке могут индексироваться, как мас-
сивы.
     - Тип переменной ссылочного типа (переменной-указателя)
может  быть  изменен на другой тип с помощью приведения типа
переменной.
     - Турбо-Паскаль использует константы с указанным  типом
данных,  которые  могут  описывать инициированные переменные
любых типов за исключением файлов.
     - Турбо-Паскаль использует три новых логических  опера-
тора: xor, shl и shr.
     - Операторы not, and, or и xor могут  использоваться  с

                                - 6 -


операндами  типа  целое для выполнения логических операций с
битами.
     - Оператор + может использоваться для соединения строк.
     - Операторы отношений могут использоваться для  сравне-
ния строк.
     - Турбо-Паскаль использует оператор @, применяемый  для
получения адреса переменной или процедуры, или функции.
     - Тип выражения может быть заменен на другой с  помощью
приведения типа значения.
     - Оператор case допускает наличие диапазонов значений в
списках  case  label и позволяет использовать необязательную
часть оператора - else.
     - Процедуры и функции могут описываться с  помощью  уп-
реждающих  директив, директив вставки и директив прерывания,
для того, чтобы обеспечивать возможность использования  под-
программ  на  языке ассемблера, внутреннего машинного кода и
процедур прерывания.
     - Переменный параметр может не иметь типа. В этом  слу-
чае  любой указатель-переменная может быть файтическим пара-
метром.
     - Турбо-Паскаль использует программные модули для обес-
печения возможности модульного программирования и раздельной
компиляции.
     - В Турбо-Паскале имеются следующие процедуры обработки
файлов и функций, отсутствующие в ANSI-Паскале:

     Append         Close         Flush            RmDir
     BlockRead      Erase         GetDir           Seek
     BlockWrite     FilePos       MkDir            SeekEof
     ChDir          FileSize      Rename           SeekEoln

     - Значения типа строка  могут  вводиться  и  выводиться
следующими  стандартными  процедурами:  Read, Readln, Write,
Writeln.
     - В  Турбо-Паскале  реализованы  следующие  стандартные
процедуры и функции, отсутствующие в ANSI-Паскале:


                                - 7 -


     Addr           GetMem        MemAvial         Release
     CSeg           Halt          Move             SPtr
     Concat         Hi            Ofs              SSeg
     Copy           Inc           ParamCount       Seg
     DSeg           Insert        ParamStr         SizeOf
     Dec            Int           Pi               Str
     Delete         Length        Pos              Swap
     Exit           Lo            Ptr              Upcase
     FillCharFrac   Mark          Random           Val
     FreeMem        MaxAvial      Randomize

     - Благодаря наличию стандартных программных  модулей  в
Турбо-Паскале  реализованы  дополнительные стандартные конс-
танты, типы, переменные, процедуры и функции.

           Примечание:  Турбо-Паскаль  не  может  обнаружить
      факт использования программой ни одного из  указанных
      здесь расширений.

         Особенности языка, зависящие от реализации

     Влияние использования особенности  реализации  Паскаля,
определенного  ANSI/IEEE770X3.97-1983, не указывается. Прог-
раммы не должны зависеть от конкретного пути реализации язы-
ка  в  случае,  когда используется особенность, зависящая от
такой реализации. Особенности, зависящие от конкретной  реа-
лизации, включают в себя:
     - порядок вычисления  индексных  выражений  в  указате-
ле-переменной;
     - порядок вычисления выражений в конструкторе набора;
     - порядок вычисления операндов в двоичном операторе;
     - порядок вычисления действительных параметров в вызове
функций;
     - порядок вычисления левой и правой частей в  операторе
присваивания;
     - порядок вычисления действительных параметров в опера-
торе процедуры;
     - влияние чтения текстового файла, с  которым  работала
процедура Page во время его создания;

                                - 8 -


     - привязка переменных, помеченных программными парамет-
рами, к объектам внешним по отношению к этой программе.

                      Обработка ошибок

     В данном разделе приводятся те ошибки из  Приложения  G
Стандарта  ANSI-Паскаля, которые не обнаруживаются автомати-
чески  Турбо-Паскалем.  Номера,  которыми  обозначены  здесь
ошибки,  являются  номерами,  используемыми в Стандарте ANSI
Pascal. Ошибки 6, 19-22, и  25-31  не  обнаруживаются  из-за
того, что не используются в Турбо-Паскале.

     1.  Если t является управляющей переменной в  операторе
         варианта, а f - это поле внутри активной ветви это-
         го оператора варианта изменение значения t во время
         существова-  ния  ссылки на f является ошибкой. Эта
         ошибка не обнаруживается. является ошибкой, если  p
         имеет значение nil. Эта ошибка не обнаруживается.
     2.  Если p является переменной-указателем, то ссылка p^
         является  ошибкой, если p не определено. Эта ошибка
         не обнаруживается.
     3.  Если p является указателем-переменной, то изменение
         значения  p  является  ошибкой до тех пор, пока су-
         ществует ссылка на p. Эта ошибка не обнаруживается.
     4.  Обращение к функции Eoln(f) является ошибкой,  если
         Eof(f)  имеет значение True. В Турбо-Паскале это не
         является ошибкой, и Eoln(f)  имеет  значение  True,
         если Eof(f) имеет значение True.
     5.  Ссылка на переменную в выражении является  ошибкой,
         если  значение  этой  переменной не определено. Эта
         ошибка не обнаруживается.
     6.  Выражение вида i mod j  является  ошибкой,  если  j
         равно нулю или имеет отрицательное значение. В Тур-
         бо-Паскале такое  выражение  не  является  ошибкой,
         если j имеет отрицательное значение.
     7.  Если функция  не  присваивает  значение  результата
         идентификатору  функции,  то  это является ошибкой.
         Эта ошибка не обнаруживается.

                                - 9 -


     8.  Является ошибкой, если значение  управляющей  пере-
         менной  в  операторе варианта не равно ни одному из
         значений констант в операторе  варианта  (case).  В
         Турбо-Паскале такая ситуация не является ошибочной.
         Однако оператор варианта игнорируется, если  он  не
         содержит предложения else.


