stringtranslate.com

Паскаль (язык программирования)

Паскаль — это императивный и процедурный язык программирования , разработанный Никлаусом Виртом как небольшой эффективный язык, предназначенный для поощрения хороших практик программирования с использованием структурированного программирования и структурирования данных . Он назван в честь французского математика, философа и физика Блеза Паскаля .

Паскаль был разработан на основе языка АЛГОЛ 60 . Вирт участвовал в процессе улучшения языка в рамках разработки ALGOL X и предложил версию под названием ALGOL W. Это не было принято, и процесс ALGOL X застопорился. В 1968 году Вирт решил отказаться от процесса ALGOL X и продолжить усовершенствование ALGOL W, выпустив его под названием Pascal в 1970 году.

Помимо скаляров и массивов Алгола , Паскаль позволяет определять сложные типы данных и строить динамические и рекурсивные структуры данных, такие как списки , деревья и графики . Паскаль имеет строгую типизацию для всех объектов, что означает, что один тип данных не может быть преобразован в другой или интерпретирован как другой без явных преобразований. В отличие от C (и большинства языков семейства C ), Паскаль допускает определения вложенных процедур любого уровня глубины, а также допускает большинство видов определений и объявлений внутри подпрограмм (процедур и функций). Таким образом, программа синтаксически подобна отдельной процедуре или функции. Это похоже на блочную структуру АЛГОЛА 60, но ограничено произвольными блочными операторами и ограничивается только процедурами и функциями.

Паскаль стал очень успешным в 1970-х годах, особенно на растущем рынке миникомпьютеров . Компиляторы также были доступны для многих микрокомпьютеров , когда эта область возникла в конце 1970-х годов. Он широко использовался в качестве языка преподавания на курсах программирования университетского уровня в 1980-х годах, а также использовался в производственных условиях для написания коммерческого программного обеспечения в тот же период. Он был вытеснен языком программирования C в конце 1980-х и начале 1990-х годов, когда системы на базе UNIX стали популярными, и особенно с выпуском C++ .

Производная версия под названием Object Pascal , предназначенная для объектно-ориентированного программирования, была разработана в 1985 году. Она использовалась Apple Computer (для компьютеров Lisa и Macintosh) и Borland в конце 1980-х годов, а затем была преобразована в Delphi на платформе Microsoft Windows . Расширение концепций Паскаля привело к появлению языков Modula-2 и Oberon , разработанных Виртом.

История

Более ранние усилия

Большая часть истории разработки компьютерных языков в 1960-е годы восходит к языку АЛГОЛ 60 . АЛГОЛ был разработан в 1950-х годах с явной целью обеспечить возможность четкого описания алгоритмов. Он включал ряд функций структурного программирования , которые остаются распространенными в языках по сей день.

Вскоре после его появления, в 1962 году Вирт вместе с Хельмутом Вебером начал работать над диссертацией по языку программирования Эйлера . Эйлер был основан на синтаксисе АЛГОЛА и многих концепциях, но не был его производным. Его основной целью было добавление динамических списков и типов, позволяющих использовать его в ролях, аналогичных Lisp . Язык был опубликован в 1965 году.

К этому времени в АЛГОЛе был выявлен ряд проблем, в частности отсутствие стандартизированной строковой системы. Группа, которой было поручено поддерживать язык, начала процесс ALGOL X для выявления улучшений, требуя подачи заявок. Вирт и Тони Хоар представили консервативный набор модификаций, чтобы добавить строки и очистить часть синтаксиса. Их считали слишком незначительными , чтобы их можно было использовать в качестве нового стандарта АЛГОЛа, поэтому Вирт написал компилятор для этого языка, который получил название АЛГОЛ W.

В дальнейшем усилия по разработке АЛГОЛ X привели к выбору гораздо более сложного языка, АЛГОЛ 68 . Сложность этого языка привела к значительным трудностям при создании высокопроизводительных компиляторов, и он не получил широкого распространения в отрасли. Это открыло путь для новых языков.

Паскаль

На Паскаль повлияли усилия ALGOL W с явными целями структурированного обучения программированию и разработки системного программного обеспечения. [4] Поколение студентов использовало Паскаль в качестве вводного языка на курсах бакалавриата.

Одним из первых успехов языка было появление UCSD Pascal , версии, работающей на специальной операционной системе , которую можно было портировать на разные платформы. Ключевой платформой был Apple II , где он получил широкое распространение как Apple Pascal . Это привело к тому, что Паскаль стал основным языком высокого уровня, используемым для разработки в Apple Lisa , а затем и в Macintosh . Части исходной операционной системы Macintosh были вручную переведены на язык ассемблера Motorola 68000 из исходного кода Pascal . [5]

Система набора текста TeX Дональда Кнута была написана в WEB , оригинальной системе грамотного программирования , основанной на DEC PDP-10 Pascal. Успешные коммерческие приложения, такие как Adobe Photoshop [6] , были написаны на Macintosh Programmer's Workshop Pascal, а такие приложения, как Total Commander , Skype [7] и Macromedia Captivate, были написаны на Delphi ( Object Pascal ). Apollo Computer использовала Паскаль в качестве языка системного программирования для своих операционных систем, начиная с 1980 года.

Варианты Паскаля также использовались для самых разных целей: от исследовательских проектов до компьютерных игр и встроенных систем . Существуют более новые компиляторы Паскаля, которые широко используются. [8]

Диалекты

Пример компилятора Вирта, предназначенного для распространения языка, системы Pascal-P, использовал подмножество языка, разработанное как минимальное подмножество языка, которое могло скомпилировать себя. Идея заключалась в том, что это могло бы позволить запустить компилятор, который затем был бы расширен до полного статуса языка Паскаль. Это было сделано с помощью нескольких компиляторов, но одним заметным исключением был UCSD Pascal, основанный на Pascal-P2. Он сохранил статус подмножества языка, основываясь на идее, что он будет лучше работать на новых (тогда) микропроцессорах с ограниченной памятью. UCSD также преобразовал интерпретатор Pascal-P2 в «байтовую машину», опять же, потому что он лучше подходил для байт-ориентированных микропроцессоров.

UCSD Pascal лег в основу многих систем, включая Apple Pascal. Borland Pascal не был основан на кодовой базе UCSD, но появился в период популярности UCSD и соответствовал многим его функциям. Это положило начало линии, закончившейся Delphi Pascal и его бесплатной версией FPC.

Стандарт ISO для Паскаля, ISO 7185, был опубликован в 1983 году и широко внедрен и использовался на мэйнфреймах, мини-компьютерах и IBM-ПК, а также на совместимых устройствах с 16-битными до 32-битных версий. Двумя диалектами Паскаля, которые наиболее широко использовались с конца 20-го века и до сегодняшнего дня, являются стандартная версия ISO 7185 и версии Delphi/Turbo Pascal (из которых две версии Borland в основном совместимы друг с другом).

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

Информационные бюллетени группы пользователей Pascal.

Объектный Паскаль

Во время работы над Lisa Ларри Теслер начал переписываться с Виртом по поводу идеи добавления к языку объектно-ориентированных расширений, чтобы сделать Паскаль мультипарадигмальным языком программирования . Первоначально это привело к Clascal , представленному в 1983 году. Когда программа Lisa исчезла и была заменена Macintosh, была создана дополнительная версия, получившая название Object Pascal . Он был представлен на Mac в 1985 году как часть платформы приложений MacApp и стал основным языком разработки Apple в начале 1990-х годов.

Расширения Object Pascal были добавлены в Turbo Pascal с выпуском версии 5.5 в 1989 году. [9] С годами Object Pascal стал основой системы Delphi для Microsoft Windows , которая до сих пор используется для разработки приложений Windows и может пересекать -компилировать код для других систем. Free Pascal — это кроссплатформенная альтернатива с открытым исходным кодом и собственной графической IDE под названием Lazarus .

Реализации

Ранние компиляторы Паскаля

Первый компилятор Паскаля был разработан в Цюрихе для семейства мейнфреймов серии CDC 6000 . Никлаус Вирт сообщает, что первая попытка реализовать его на FORTRAN 66 в 1969 году оказалась неудачной из-за неспособности FORTRAN 66 выражать сложные структуры данных. Вторая попытка была реализована на C-подобном языке (Scallop Макса Энгели), а затем вручную переведена (Р. Шильдом) на сам Паскаль для начальной загрузки. [10] Он был введен в эксплуатацию к середине 1970 года. Многие компиляторы Паскаля с тех пор были аналогичным образом самостоятельными , то есть компилятор сам был написан на Паскале, и компилятор обычно способен перекомпилировать себя, когда в язык добавляются новые функции или когда компилятор должен быть перенесен на другой язык. новая среда. Заметным исключением является компилятор GNU Pascal, поскольку он написан на C.

Первый успешный порт компилятора CDC Pascal на другой мэйнфрейм был завершен Уэлшем и Куинном в Королевском университете Белфаста (QUB) в 1972 году. Целью была серия International Computers Limited (ICL) 1900 . Этот компилятор, в свою очередь, был родителем компилятора Pascal для миникомпьютера Information Computer Systems (ICS) Multum . Порт Multum был разработан – с целью использования Паскаля в качестве языка системного программирования – Финдли, Капплсом, Кавурасом и Дэвисом, работавшими на факультете вычислительной техники Университета Глазго . Считается, что Multum Pascal, завершенный летом 1973 года, мог быть первой 16-битной реализацией.

Совершенно новый компилятор был разработан Уэлшем и др. в QUB в 1977 году. Он предлагал функцию диагностики исходного языка (включающую профилирование, отслеживание и форматированные посмертные дампы с учетом типов), которая была реализована Финдли и Ваттом в Университете Глазго. Эта реализация была перенесена в 1980 году на серию ICL 2900 командой из Саутгемптонского университета и Университета Глазго. Реализация стандартной модели Паскаля также была основана на этом компиляторе, адаптированном Уэлшем и Хэем из Манчестерского университета в 1984 году для строгой проверки соответствия стандарту BSI 6192/ISO 7185 и генерации кода для портативной абстрактной машины.

Первый компилятор Паскаля , написанный в Северной Америке, был создан в Университете Иллинойса под руководством Дональда Б. Гиллиса для PDP-11 и генерировал собственный машинный код.

Система Паскаль-П

Для быстрого распространения языка в Цюрихе был создан комплект для портирования компилятора , который включал в себя компилятор, генерирующий так называемый p-код для машины виртуального стека, то есть код, который поддается достаточно эффективной интерпретации, а также интерпретатор для этого кода – система Паскаль-П . Компиляторы P-системы назывались Pascal-P1, Pascal-P2, Pascal-P3 и Pascal-P4. Pascal-P1 был первой версией, а Pascal-P4 — последней, пришедшей из Цюриха. Версия под названием Pascal-P1 была придумана постфактум для множества различных источников Pascal-P, которые существовали. Компилятор был переработан для повышения мобильности и выпущен как Pascal-P2. Позже этот код был расширен и стал Pascal-P3 с промежуточным кодом, обратно совместимым с Pascal-P2, и Pascal-P4, который не был обратно совместим.

Компилятор-интерпретатор Pascal-P4 по-прежнему можно запускать и компилировать в системах, совместимых с исходным Pascal (как и Pascal-P2). Однако он принимает только подмножество языка Паскаль.

Pascal-P5, созданный вне группы Zürich, поддерживает полный язык Pascal и совместим с ISO 7185.

Pascal-P6 — это продолжение Pascal-P5, которое, наряду с другими функциями, призвано стать компилятором для конкретных процессоров, включая AMD64.

UCSD Pascal ответвился от Pascal-P2, где Кеннет Боулз использовал его для создания интерпретируемой p-системы UCSD. Это была одна из трех операционных систем, доступных на момент запуска оригинального персонального компьютера IBM . [11] UCSD Pascal использовал промежуточный код, основанный на значениях байтов, и, таким образом, был одним из первых компиляторов байт-кода . Apple Pascal был выпущен в 1979 году для компьютерных систем Apple II и Apple III . Это была реализация UCSD Pascal или во многом основанная на ней. От Pascal-P1 до Pascal-P4 они не были, а скорее основывались на 60-битной длине слова CDC 6600 .

Компилятор на основе компилятора Pascal-P4, который создавал собственные двоичные объектные файлы , был выпущен для мейнфрейма IBM System/370 Австралийской комиссией по атомной энергии ; он был назван компилятором AAEC Pascal 8000 в честь сокращения названия комиссии. [12]

Объектный Паскаль и Турбо Паскаль

Apple Computer создала собственный Lisa Pascal для Lisa Workshop в 1982 году и портировала компилятор на Apple Macintosh и MPW в 1985 году. В 1985 году Ларри Теслер , посоветовавшись с Никлаусом Виртом, определил Object Pascal, и эти расширения были включены как в Lisa, так и в Lisa Workshop. Компиляторы Pascal и Mac Pascal.

В 1980-х годах Андерс Хейлсберг написал компилятор Blue Label Pascal для Nascom -2. Повторная реализация этого компилятора для IBM PC продавалась под названиями Compas Pascal и PolyPascal, прежде чем она была приобретена Borland и переименована в Turbo Pascal .

Turbo Pascal стал чрезвычайно популярен благодаря агрессивной ценовой стратегии, наличию одной из первых полноэкранных IDE и очень быстрому времени выполнения работ (всего несколько секунд на компиляцию, компоновку и запуск). Он был полностью написан и оптимизирован на языке ассемблера , что делает его меньше и быстрее, чем большинство конкурентов.

В 1986 году Андерс портировал Turbo Pascal на Macintosh и включил в Turbo Pascal расширения Apple Object Pascal. Эти расширения затем были добавлены обратно в версию Turbo Pascal для ПК версии 5.5. В то же время Microsoft также внедрила компилятор Object Pascal. [13] [14] Turbo Pascal 5.5 оказал большое влияние на сообщество Pascal, которое в конце 1980-х годов начало концентрироваться в основном на IBM PC. Многие любители ПК в поисках структурированной замены BASIC использовали этот продукт. Его также начали использовать профессиональные разработчики. Примерно в то же время из C был импортирован ряд концепций, позволяющих программистам на языке Pascal напрямую использовать интерфейс прикладного программирования (API) на основе C Microsoft Windows . Эти расширения включали строки с нулевым завершением , арифметику указателей , указатели на функции , оператор адреса и небезопасные приведения типов .

Turbo Pascal и другие производные со структурами модулей или модулей являются модульными языками программирования. Однако он не обеспечивает концепцию вложенных модулей или квалифицированный импорт и экспорт определенных символов.

Другие варианты

Super Pascal добавляет нечисловые метки, оператор возврата и выражения в качестве имен типов.

TMT Pascal был первым Borland -совместимым компилятором для 32-битного защищенного режима , совместимого с MS-DOS , OS/2 и Win32 . Он расширяет язык за счет перегрузки функций и операторов .

Университеты Висконсин-Мэдисон, Цюрих , Карлсруэ и Вупперталь разработали компиляторы Pascal-SC [15] [16] и Pascal-XSC [17] [18] [19] ( Расширения для научных вычислений ), направленные на программирование численных вычислений. . Разработка Pascal-SC началась в 1978 году с поддержкой ISO 7185 Pascal уровня 0, но поддержка уровня 2 была добавлена ​​​​на более позднем этапе. [20] Первоначально Pascal-SC предназначался для процессора Z80 , но позже был переписан для DOS ( x86 ) и 68000 . Pascal-XSC в разное время портировался на операционные системы Unix (Linux, SunOS , HP-UX , AIX ) и Microsoft/IBM (DOS с EMX , OS/2, Windows ). Он работает путем генерации промежуточного исходного кода C, который затем компилируется в собственный исполняемый файл. Некоторые расширения языка Pascal-SC были приняты GNU Pascal .

Pascal Sol был разработан примерно в 1983 году французской командой для реализации Unix-подобной системы под названием Sol. Это был стандартный Паскаль уровня 1 (с параметризованными границами массива), но определение позволяло использовать альтернативные ключевые слова и предопределенные идентификаторы на французском языке, а язык включал несколько расширений для упрощения системного программирования (например, эквивалент lseek). [21] Позже команда Sol перешла к проекту ChorusOS для разработки распределенной операционной системы. [22]

IP Pascal — это реализация языка программирования Pascal с использованием Micropolis DOS, но она была быстро перенесена на CP/M-80 , работающий на Z80. В 1994 году он был перенесен на машины типа 80386 и существует сегодня в виде реализаций для Windows/XP и Linux. В 2008 году система была поднята на новый уровень, и полученный язык получил название «Паскалин» (в честь калькулятора Паскаля ). Он включает в себя объекты, элементы управления пространством имен , динамические массивы и многие другие расширения и обычно имеет ту же функциональность и защиту типов, что и C# . Это единственная такая реализация, которая также совместима с исходной реализацией Паскаля, стандартизированной как ISO 7185.

Языковые конструкции

Паскаль в своей исходной форме является чисто процедурным языком и включает в себя традиционный массив АЛГОЛ -подобных управляющих структур с зарезервированными словами, такими как if, then, else, while, forи case, начиная с одного оператора или блока beginоператоров end. В Паскале также есть конструкции структурирования данных, не включенные в исходные типы АЛГОЛа 60 , такие как записи , варианты, указатели , перечисления , а также множества и указатели процедур. Такие конструкции были частично унаследованы или вдохновлены Simula 67, ALGOL 68 , собственным ALGOL W Никлауса Вирта и предложениями CAR Hoare .

Программы на Паскале начинаются с program ключевого слова со списком дескрипторов внешних файлов в качестве параметров [23] (не требуется в Turbo Pascal и т. д.); затем следует основной блок , заключенный в скобки ключевыми словами beginи end. Точка с запятой разделяет операторы , а точка (т. е. точка) завершает всю программу (или модуль ). Регистр букв игнорируется в исходном коде Pascal.

Вот пример исходного кода очень простой фразы «Hello, World!». программа :

программа HelloWorld ( выход ) ; начать WriteLn ( 'Привет, мир!' ) {Нет ";" требуется после последнего оператора блока —  его добавление добавляет в программу «нулевой оператор», который игнорируется компилятором.} end .   

Типы данных

Объявление типа в Паскале используется для определения диапазона значений, которые может хранить переменная этого типа. Он также определяет набор операций, которые разрешено выполнять над переменными этого типа. Предопределенные типы:

Диапазон значений, разрешенных для базовых типов (кроме Boolean), определяется реализацией. Для некоторых преобразований данных предусмотрены функции. Для преобразования realв integerдоступны следующие функции: round(округление до целого числа с помощью банковского округления ) и trunc(округление в сторону нуля).

Программист имеет свободу определять другие часто используемые типы данных (например, байтовые, строковые и т. д.) в терминах предопределенных типов, используя, например, средство объявления типов Паскаля.

тип байт = 0 .. 255 ; подписанный_байт = - 128 .. 127 ; строка = упакованный массив [ 1 .. 255 ] символов ; _            

Часто используемые типы, такие как byte и string, уже определены во многих реализациях.

Обычно система использует слово для хранения данных. Например, byteтип может храниться в виде машинного целого числа (возможно, 32 бита), а не 8-битного значения. Паскаль не содержит языковых элементов, позволяющих более детально определять базовые типы хранения. Эта возможность была включена в ряд расширений Паскаля и последующих языков, в то время как другие, такие как Modula-2 , расширили встроенный набор, чтобы охватить большинство типов машинных данных, таких как 16-битные целые числа.

Ключевое packedслово сообщает компилятору использовать наиболее эффективный метод хранения структурированных типов данных: наборы, массивы и записи, а не использовать одно слово для каждого элемента. Упаковка может замедлить доступ на машинах, которые не обеспечивают легкий доступ к частям слова.

Типы поддиапазонов

Также можно создать поддиапазоны любого порядкового типа данных (любого простого типа, кроме вещественного):

вар х : 1 .. 10 ; y : 'а' .. 'z' ;      

Типы наборов

В отличие от других языков программирования того времени, Паскаль поддерживает набор типов: [24]

var Set1 : набор из 1 .. 10 ; Set2 : набор 'a' .. ' z ' ;          

Множество — это фундаментальное понятие современной математики, и оно может использоваться во многих алгоритмах. Такая функция полезна и может работать быстрее, чем эквивалентная конструкция в языке, не поддерживающем множества. Например, для многих компиляторов Pascal:

если я в [ 5..10 ] , то ... _     

выполняется быстрее, чем:

если ( i > 4 ) и ( i < 11 ) , то ...         

Наборы несмежных значений могут быть особенно полезны как с точки зрения производительности, так и с точки зрения читаемости:

если я в [ 0..3 , 7 , 9 , 12 .. 15 ] , то ... _        

В этих примерах, которые включают наборы в небольших областях, повышение производительности обычно достигается за счет того, что компилятор представляет переменные набора в виде битовых векторов . Затем операторы множества могут быть эффективно реализованы как побитовые операции машинного кода.

Типы записей

Пример типа записи Pascal:

тип автомобиля = длина записи : целое число ; ширина : целое число , конец ;        

Пример варианта типа записи:

введите Shape = ( Круг , Квадрат , Треугольник ) ; Размеры = рекордный рисунок . Форма круга : ( Диаметр : реальный ) ; _ _ Площадь : ( Ширина : реальная ) ; Треугольник : ( Сторона : реальная ; Угол1 , Угол2 : 0..360 ) конец ; _ _                          

Вариантные записи позволяют нескольким полям записи перекрывать друг друга для экономии места.

Объявления типов

Типы могут быть определены из других типов с помощью объявлений типов:

тип x = целое число ; у = х ; ...      

Кроме того, сложные типы могут быть созданы из простых типов:

введите a = массив [ 1 .. 10 ] целых чисел ; б = запись x : целое число ; y : char {лишняя точка с запятой не обязательна} end ; c = файл a ; _                     

Тип файла

введите a = файл целого числа ; б = запись x : целое число ; y : конец символа ; c = файл b ; _                    

Как показано в примере выше, файлы Pascal представляют собой последовательности компонентов. Каждый файл имеет переменную буфера, которая обозначается f^ . Процедуры get (для чтения) и put (для записи) перемещают переменную буфера к следующему элементу. Чтение введено таким образом, что read(f, x) совпадает с x := f^; получить (е); . Write введен таким образом, что write(f, x) совпадает с f^ := x; положить (е); Тип textпредопределен как файл char. Хотя переменную буфера можно было использовать для проверки следующего символа, который будет использоваться (проверка цифры перед чтением целого числа), это приводит к серьезным проблемам с интерактивными программами в ранних реализациях, но позже было решено с помощью «ленивого ввода-вывода». Концепция, которая ожидает фактического доступа к переменной файлового буфера, прежде чем выполнять файловые операции.

Типы указателей

Паскаль поддерживает использование указателей :

введите pNode = ^ Узел ; Узел = запись a : целое число ; б : чар ; c : конец pNode ; вар NodePtr : pNode ; IntPtr : ^ целое число ;                       

Здесь переменная NodePtr — это указатель на тип данных Node , запись. Указатели можно использовать до их объявления. Это предварительное объявление , исключение из правила, согласно которому вещи должны быть объявлены до их использования.

Чтобы создать новую запись и присвоить значение 10 и символ A полям a и b в записи, а также инициализировать указатель c нулевым указателем («NIL» в Паскале), операторы будут такими:

новый ( NodePtr ) ; ... NodePtr ^. а := 10 ; НодеПтр ^. б := 'А' ; НодеПтр ^. с := ноль ; ...      

Это также можно сделать с помощью withоператора следующим образом:

новый ( NodePtr ) ; ... с NodePtr ^ начать a : = 10 ; б := 'А' ; с := нулевой конец ; ...           

Внутри области действия оператора with a и b относятся к подполям указателя записи NodePtr , а не к узлу записи или типу указателя pNode.

Связанные списки , стеки и очереди можно создавать, включив в запись поле типа указателя (c).

В отличие от многих языков, в которых есть указатели, Паскаль позволяет указателям ссылаться только на динамически созданные переменные, которые являются анонимными, и не позволяет им ссылаться на стандартные статические или локальные переменные. У указателей также должен быть связанный тип, а указатель на один тип несовместим с указателем на другой тип (например, указатель на символ несовместим с указателем на целое число). Это помогает устранить проблемы безопасности типов, присущие другим реализациям указателей, особенно тем, которые используются для PL /I или C. Это также устраняет некоторые риски, вызванные висячими указателями , но возможность динамически освобождать ссылочное пространство с помощью функции Dispose (которая имеет тот же эффект, что и функция свободной библиотеки, найденная в C ) означает, что риск висячих указателей не устранен [ 25], как это происходит в таких языках, как Java и C#, которые обеспечивают автоматическую сборку мусора (но не устраняют связанную с этим проблему утечек памяти ).

Некоторые из этих ограничений могут быть сняты в новых диалектах.

Структуры управления

Паскаль — это структурированный язык программирования , что означает, что поток управления структурирован в виде стандартных операторов , обычно без команд « goto ».

while a <> b do WriteLn ( 'Ожидание' ) ;     if a > b then WriteLn ( 'Условие выполнено' ) {точка с запятой не допускается перед else} else WriteLn ( 'Условие не выполнено' ) ;        for i := от 1 до 10 do {здесь нет точки с запятой, поскольку она отделяет следующий оператор} WriteLn ( 'Iteration: ' , i ) ;         повторять a := a + 1 до тех пор, пока a = 10 ;        случай i из 0 : Write ( «ноль» ) ; 1 : Написать ( «один» ) ; 2 : Написать ( «два» ) ; 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 : Напишите ( '?' ) конец ;             

Процедуры и функции

Паскаль структурирует программы в процедуры и функции. Обычно процедура используется для получения побочных эффектов, тогда как функция используется для возвращаемого значения.

программа Печать ( вывод ) ; вар я : целое число ;   процедура PrintAnInteger ( j : integer ) ; начать ... закончить ;    функция тройка ( const x : целое число ) : целое число ; начало тройки := x * 3 конец ;        начало {основная программа} ... PrintAnInteger ( i ) ; PrintAnInteger ( тройной ( i )) end .    

Процедуры и функции могут быть вложены на любую глубину, а конструкция «программа» является самым логическим внешним блоком.

По умолчанию параметры передаются по значению. Если «var» предшествует имени параметра, он передается по ссылке.

Каждая процедура или функция может иметь свои собственные объявления меток перехода, констант, типов, переменных и других процедур и функций, которые должны быть расположены в указанном порядке. Это требование к упорядочению изначально было предназначено для обеспечения эффективной однопроходной компиляции . Однако в некоторых диалектах (например, Delphi ) строгие требования к порядку разделов объявлений были смягчены.

Точки с запятой как разделители операторов

Паскаль перенял многие особенности синтаксиса языка из языка АЛГОЛ , включая использование точки с запятой в качестве разделителя операторов. В этом отличие от других языков, таких как PL/I и C , которые используют точку с запятой в качестве признака завершения оператора. Точка с запятой не требуется перед endключевым словом объявления типа записи, блока или оператора case ; перед untilключевым словом оператора повторения; и перед elseключевым словом оператора if .

Наличие лишней точки с запятой не допускалось в ранних версиях Паскаля. Однако добавление пустых операторов типа ALGOL в Пересмотренный отчет 1973 года и последующие изменения в языке ISO 7185:1983 теперь позволяют использовать необязательные точки с запятой в большинстве этих случаев. Точка с запятой по-прежнему не допускается непосредственно перед elseключевым словом в операторе if , поскольку он elseследует за одним оператором, а не за последовательностью операторов. В случае вложенных ifs точку с запятой нельзя использовать, чтобы избежать проблемы висячего else (когда у внутреннего if нет else, а у внешнего if есть) путем предположительного завершения вложенного if точкой с запятой - вместо этого это завершает оба if. статьи. Вместо этого необходимо использовать явный блок begin.... [26]end

Ресурсы

Компиляторы и интерпретаторы

Для общего использования доступны несколько компиляторов и интерпретаторов Pascal:

Иды

Библиотеки

Стандарты

ИСО/МЭК 7185:1990 Паскаль

В 1983 году язык был стандартизирован в международном стандарте IEC/ISO 7185 [33] и нескольких местных стандартах для конкретных стран, включая американский ANSI/IEEE770X3.97-1983 и ISO 7185:1983. Эти два стандарта отличались только тем, что стандарт ISO включал расширение «уровня 1» для соответствующих массивов (массив, границы которого неизвестны до времени выполнения), где ANSI не допускал этого расширения к оригиналу (Вирт версия) язык. В 1989 году стандарт ISO 7185 был пересмотрен (ISO 7185:1990) для исправления различных ошибок и неясностей, обнаруженных в исходном документе.

Стандарт ISO 7185 был заявлен как разъяснение языка Вирта 1974 года, подробно описанного в Руководстве пользователя и отчете [Дженсен и Вирт], но он также отличался добавлением «Параметры соответствующего массива» в качестве уровня 1 к стандарту, уровень 0 соответствует Паскалю. без соответствующих массивов. Это дополнение было сделано по просьбе CAR Hoare и с одобрения Никлауса Вирта. Предварительной причиной было то, что Хоар хотел создать версию библиотеки числовых алгоритмов (NAG) для Паскаля , которая изначально была написана на FORTRAN, и обнаружил, что это невозможно сделать без расширения, которое позволяло бы использовать параметры массива различного размера. . Аналогичные соображения послужили причиной включения в ISO 7185 средства определения типов процедурных и функциональных параметров.

Сам Никлаус Вирт называл язык 1974 года «Стандартом», например, чтобы отличить его от машинных особенностей компилятора CDC 6000 . Этот язык был задокументирован в The Pascal Report , [34] второй части «Руководства и отчета пользователя Pascal».

На больших машинах (мейнфреймах и миникомпьютерах), на которых возник Паскаль, обычно соблюдались стандарты. На IBM PC их не было. На компьютерах IBM наибольшее количество пользователей используют стандарты Borland Turbo Pascal и Delphi. Таким образом, обычно важно понять, соответствует ли конкретная реализация исходному языку Паскаль или его диалекту Borland.

Версии языка для IBM PC начали различаться с появлением UCSD Pascal, интерпретируемой реализации, которая содержала несколько расширений языка, а также несколько упущений и изменений. Многие особенности языка UCSD сохранились и сегодня, в том числе в диалекте Borland.

ISO/IEC 10206:1990 Расширенный Паскаль

В 1990 году был создан расширенный стандарт Pascal под названием ISO/IEC 10206 [35] , который по техническому содержанию [36] идентичен IEEE/ANSI 770X3.160-1989 [37] . С 2019 года поддержка расширенного Pascal в компиляторе FreePascal Планируется. [38]

Вариации

Версия Pascal, созданная Никлаусом Виртом в Цюрихе, была выпущена за пределами ETH в двух основных формах: исходный код компилятора CDC 6000 и комплект для переноса под названием система Pascal-P. Компилятор Pascal-P упустил несколько функций полного языка, которые не требовались для начальной загрузки компилятора. Например, были опущены процедуры и функции, используемые в качестве параметров, нераспознаваемые варианты записей, упаковка, удаление, межпроцедурные переходы и другие функции полного компилятора.

UCSD Pascal под руководством профессора Кеннета Боулза был основан на наборе Pascal-P2 и, следовательно, имел некоторые ограничения языка Pascal-P. UCSD Pascal позже был принят как Apple Pascal, и там было выпущено несколько версий. Хотя UCSD Pascal фактически расширил подмножество Pascal в комплекте Pascal-P, добавив обратно стандартные конструкции Pascal, это все еще не было полной стандартной установкой Pascal.

В начале 1990-х годов Алан Бернс и Джефф Дэвис разработали Pascal-FC, расширение Pl/0 (из книги Никлауса « Алгоритмы + структуры данных = программы »). Было добавлено несколько конструкций для использования Pascal-FC в качестве инструмента обучения параллельному программированию (например, семафоры, мониторы, каналы, удаленный вызов и ресурсы). Чтобы иметь возможность продемонстрировать параллелизм, выходные данные компилятора (разновидность P-кода ) можно затем выполнить на виртуальной машине. Эта виртуальная машина не только имитировала нормальную – справедливую – среду, но также могла имитировать экстремальные условия (несправедливый режим).

Borland-подобные компиляторы Pascal

Turbo Pascal компании Borland , написанный Андерсом Хейлсбергом , был написан на языке ассемблера независимо от UCSD и компиляторов Цюриха. Однако он принял большую часть того же подмножества и расширений, что и компилятор UCSD. Вероятно, это связано с тем, что система UCSD была наиболее распространенной системой Pascal, подходящей для разработки приложений на микропроцессорных системах с ограниченными ресурсами, доступных в то время.

Упакованная версия Turbo Pascal 3 и более поздние версии, в том числе Borland Object Pascal и Delphi , а также почти совместимые с Borland программы, стали популярными среди программистов, включая авторов условно-бесплатных программ, поэтому библиотека кода Pascal SWAG содержит большое количество кода, написанного с использованием таких версии как Delphi в виду.

Программные продукты ( компиляторы и IDE/ Rad Application Development (RAD)) в этой категории:

Список связанных стандартов

Прием

Паскаль вызвал в компьютерном сообществе самые разнообразные отклики, как критические, так и хвалебные.

Ранняя критика

Хотя реализации Паскаля, которые были очень популярны в 1980-х и начале 1990-х годов, внимательно следовали первоначальному определению языка Вирта, они подвергались широкой критике как непригодные для использования вне обучения. Брайан Керниган , популяризировавший язык C , изложил наиболее заметные критические замечания в адрес Паскаля еще в 1981 году в своей статье «Почему Паскаль — не мой любимый язык программирования». [42] Самая серьезная проблема, описанная Керниганом, заключалась в том, что размеры массивов и длины строк были частью типа, поэтому было невозможно написать функцию, которая принимала бы массивы переменной длины или даже строки в качестве параметров. Это делало невозможным написание, например, библиотеки сортировки. Керниган также раскритиковал непредсказуемый порядок вычисления логических выражений, плохую поддержку библиотеки и отсутствие статических переменных , а также поднял ряд более мелких проблем. Также он заявил, что язык не предоставляет каких-либо простых конструкций, позволяющих «уйти» (сознательно и принудительно игнорировать) ограничений и ограничений. Более общие жалобы из других источников [25] [43] отмечали, что область объявлений не была четко определена в определении исходного языка, что иногда имело серьезные последствия при использовании прямых объявлений для определения типов указателей или когда объявления записей приводили к взаимной рекурсии. или когда идентификатор мог использоваться или не использоваться в списке перечисления. Другая трудность заключалась в том, что, как и АЛГОЛ 60 , этот язык не позволял процедурам или функциям, передаваемым в качестве параметров, заранее определять ожидаемый тип своих параметров.

Несмотря на первоначальную критику, Паскаль продолжал развиваться, и большинство замечаний Кернигана не применимо к версиям языка, которые были усовершенствованы, чтобы быть пригодными для разработки коммерческих продуктов, таких как Turbo Pascal от Borland . Как предсказал Керниган в своей статье, большинство расширений, исправляющих эти проблемы, были несовместимы от компилятора к компилятору. Однако с начала 1990-х годов большинство разновидностей, похоже, сведены в две категории: ISO и Borland-подобные. Расширенный Паскаль устраняет многие из этих ранних критических замечаний. Он поддерживает строки переменной длины, инициализацию переменных, раздельную компиляцию, логические операторы короткого замыкания и otherwiseпредложения по умолчанию ( ) для операторов case. [44]

Смотрите также

Рекомендации

  1. ^ «О «Делегатах» Microsoft» . Архивировано из оригинала 27 июня 2012 г. Мы очень внимательно изучили Delphi Object Pascal и построили рабочий прототип ссылок на привязанные методы, чтобы понять их взаимодействие с языком программирования Java и его API... Наш вывод заключался в том, что ссылки на привязанные методы не нужны и вредны для языка. Это решение было принято после консультаций с компанией Borland International, которая имела предыдущий опыт работы со ссылками на связанные методы в Delphi Object Pascal .
  2. ^ Исследования TechMetrix (1999). «История Явы» (PDF) . Отчет о серверах приложений Java . Архивировано из оригинала (PDF) 29 декабря 2010 г. Проект получил название «зеленый», а язык был основан на старой модели UCSD Pascal , которая позволяет генерировать интерпретируемый код.
  3. ^ «Разговор с Джеймсом Гослингом - Очередь ACM» . Архивировано из оригинала 16 июля 2015 года . Проверено 11 августа 2015 г.
  4. ^ Вирт, Никлаус (2000). «Развитие процедурных языков программирования. Личный вклад и перспективы». Модульные языки программирования . Конспекты лекций по информатике. Том. 1897. стр. 1–10. дои : 10.1007/10722581_1. ISBN 978-3-540-67958-5.
  5. ^ Херцфельд, Энди. «Венгерский фольклор.org. Архивировано 18 ноября 2015 г. в Wayback Machine : Macintosh Stories. Проверено 6 марта 2012 г.
  6. ^ https://www.computerhistory.org/atchm/adobe-photoshop-source-code/. Архивировано 7 мая 2014 г. на Wayback Machine , исходный код Adobe Photoshop.
  7. ^ "Демонстрация приложений RAD Studio" . 2021-10-29.
  8. ^ tiobe.com. Архивировано 15 марта 2012 г. в Wayback Machine , Индекс сообщества программистов за январь 2011 г.
  9. ^ «Антикварное программное обеспечение: Turbo Pascal v5.5» . Архивировано из оригинала 24 ноября 2010 г. Проверено 17 мая 2018 г.
  10. ^ Компьютеры и вычислительная техника. Личная перспектива. Архивировано 10 мая 2017 г. в Wayback Machine Никлаусом Виртом.
  11. ^ cbi.umn.edu, «Интервью с Джоном Брэкеттом и Дугом Россом» [ постоянная мертвая ссылка ] , стр. 15, Институт Чарльза Бэббиджа, 2004 г.
  12. ^ Исследовательское учреждение Австралийской комиссии по атомной энергии, Лукас-Хайтс, Отчет отделения ядерной науки и технологий, Отдельные исследования (PDF) . Международное агентство по атомной энергии (IEAE) (Отчет). 1977. с. 22.
  13. ^ Джон Уделл, Крах объектно-ориентированного Паскаля, BYTE, июль 1989 г.
  14. ^ М. И. Трофимов, Конец Паскаля?, BYTE, март 1990 г., с. 36.
  15. ^ Ралл, Л.Б. (1987). «Введение в язык научных вычислений Pascal-SC». Компьютеры . 14 : 53–69. дои : 10.1016/0898-1221(87)90181-7.
  16. ^ ПИ (29 августа 1986 г.). «Cadmus jetzt mit Kulisch-Arithmetik - Uni Karlsruhe gibt Pascal-Compiler nach München» [Cadmus теперь поставляется с арифметикой Кулиша - Университет Карлсруэ доставляет компилятор Паскаля в Мюнхен]. Computerwoche (на немецком языке). Мюнхен – Карлсруэ, Германия: IDG Business Media GmbH . Архивировано из оригинала 30 мая 2016 г. Проверено 30 мая 2016 г.
  17. ^ «Pascal-XSC: Паскаль для расширенных научных вычислений» . Архивировано из оригинала 05 января 2014 г.
  18. ^ "Программное обеспечение XSC" . Архивировано из оригинала 1 ноября 2015 года . Проверено 11 августа 2015 г.
  19. ^ "Universitaet Wuppertal: Wissenschaftliches Rechnen / Softwaretechnologie" . Архивировано из оригинала 6 ноября 2015 года . Проверено 11 августа 2015 г.
  20. ^ Бамбергер, Лотар; Давенпорт, Джеймс Х.; Фишер, Ганс-Кристоф; Кок, Ян; Шумахер, Гюнтер; Ульрих, Кристиан; Уоллис, Питер Дж.Л.; Зима, Дик Т.; Вольф фон Гуденберг, Юрген (1990). Уоллис, Питер Дж.Л. (ред.). Улучшение программирования с плавающей запятой (1-е изд.). Бат, Соединенное Королевство: ISBN John Wiley & Sons Ltd.  0-471-92437-7.
  21. ^ Мишель Жьен, «Операционная система SOL», на конференции Usenix Summer '83, Торонто, Онтарио (июль 1983 г.), стр. 75–78.
  22. ^ «Обзор распределенных операционных систем CHORUS» (PDF) . Хоровые системы . 1991. Архивировано из оригинала (PDF) 7 февраля 2015 г. – через cs.berkeley.edu.
  23. ^ Pascal ISO 7185:1990. Архивировано 17 июня 2012 г. в Wayback Machine 6.10.
  24. ^ Манделл, Стивен Л. (1987). Программирование на Паскале сегодня . Западная издательская компания. ISBN 978-0-314-33935-5.
  25. ^ Аб Дж. Уэлш, У. Дж. Снерингер и К. А. Хоар, «Двусмысленность и неуверенность в Паскале», Программное обеспечение: Практика и опыт 7 , стр. 685–696 (1977)
  26. ^ Паскаль, Нелл Дейл и Чип Уимс, «Остальное болтающееся», с. 160–161. Архивировано 18 марта 2017 г. в Wayback Machine.
  27. ^ «Pascal-S: подмножество и его реализация», Н. Вирт в книге «Паскаль - язык и его реализация», Д. У. Бэррон, Wiley, 1979.
  28. ^ «Руководство пользователя VAX-11 Pascal V1.0» (PDF) .
  29. ^ ab «Описание продукта программного обеспечения VSI Pascal для OpenVMS» (PDF) . ВСИ. 2017. Архивировано из оригинала (PDF) 18 апреля 2021 г. Проверено 7 февраля 2022 г.
  30. ^ "Интервью с архитектором Паскаля - Compaq Pascal" . Архивировано из оригинала 19 октября 2021 г. Проверено 28 мая 2022 г.
  31. ^ «Compaq Pascal версии 5.8 для описания продукта программного обеспечения Tru64 UNIX» . Архивировано из оригинала 25 июля 2020 г. Проверено 28 мая 2022 г.
  32. ^ "Интервью Джона Рейгана из VSI о GEM и LLVM для X86/64" . Системы eCube . 2019-03-12. Архивировано из оригинала 12 августа 2020 г. Проверено 7 февраля 2022 г.
  33. ^ ISO/IEC 7185:1990 Паскаль (PDF) . Архивировано из оригинала (PDF) 27 января 2016 года . Проверено 16 сентября 2014 г.
  34. ^ Вирт, Никлаус (июль 1973 г.). Язык программирования Паскаль (пересмотренный отчет) . ETH Цюрих. doi : 10.3929/ethz-a-000814158.
  35. ^ Расширенный Паскаль: ISO/IEC 10206:1990. Архивировано из оригинала 27 марта 2016 г. Проверено 16 сентября 2014 г.
  36. ^ «Языковые стандарты: Паскаль, расширенный Паскаль, Фортан». Архивировано из оригинала 14 июля 2014 г. Проверено 16 сентября 2014 г.
  37. ^ Стандарт IEEE/ANSI для языка программирования Extended Pascal . 1990. doi :10.1109/IEESTD.1990.101061. ISBN 978-0-7381-4247-0.
  38. ^ "Расширенный Pascal - Бесплатная вики Pascal" . wiki.freepascal.org .
  39. ^ «Виртуальный Паскаль для OS/2». Архивировано из оригинала 30 августа 2011 года . Проверено 3 апреля 2016 г.
  40. Вольфганг (15 октября 2020 г.). «WDSibyl: среда визуальной разработки». WDSibyl.org . Архивировано из оригинала 12 февраля 2020 г. Проверено 20 апреля 2020 г.
  41. ^ "netlabs.org - Проект: Открытая Сивилла" . Архивировано из оригинала 4 марта 2016 года . Проверено 3 апреля 2016 г.
  42. ^ Брайан В. Керниган (1981). «Почему Паскаль не мой любимый язык программирования». Архивировано 28 апреля 2009 г. в Wayback Machine.
  43. ^ О. Лекарм, П. Дежарден, «Дополнительные комментарии к языку программирования Паскаль», Acta Informatica 4 , стр. 231–243 (1975).
  44. ^ «Расширенный Паскаль». Архивировано из оригинала 18 октября 2015 г.

дальнейшее чтение