Pascal — императивный и процедурный язык программирования , разработанный Никлаусом Виртом как небольшой, эффективный язык, призванный поощрять хорошие практики программирования с использованием структурного программирования и структурирования данных . Он назван в честь французского математика, философа и физика Блеза Паскаля . [a]
Pascal был разработан по образцу языка ALGOL 60. Вирт принимал участие в процессе улучшения языка в рамках усилий ALGOL X и предложил версию под названием ALGOL W. Она не была принята, и процесс ALGOL X застопорился. В 1968 году Вирт решил отказаться от процесса ALGOL X и продолжить усовершенствование ALGOL W, выпустив его как Pascal в 1970 году.
В дополнение к скалярам и массивам ALGOL , Pascal позволяет определять сложные типы данных и строить динамические и рекурсивные структуры данных, такие как списки , деревья и графы . Pascal имеет строгую типизацию для всех объектов, что означает, что один тип данных не может быть преобразован или интерпретирован как другой без явных преобразований. В отличие от C (и большинства языков семейства C ), Pascal допускает вложенные определения процедур на любом уровне глубины, а также допускает большинство видов определений и объявлений внутри подпрограмм (процедур и функций). Таким образом, программа синтаксически похожа на отдельную процедуру или функцию. Это похоже на блочную структуру ALGOL 60, но ограничено произвольными блочными операторами только процедурами и функциями.
Pascal стал очень успешным в 1970-х годах, особенно на растущем рынке мини-компьютеров . Компиляторы также были доступны для многих микрокомпьютеров, поскольку эта область появилась в конце 1970-х годов. Он широко использовался в качестве языка обучения на университетских курсах программирования в 1980-х годах, а также использовался в производственных условиях для написания коммерческого программного обеспечения в тот же период. Он был вытеснен языком программирования C в конце 1980-х и начале 1990-х годов, поскольку системы на основе UNIX стали популярными, и особенно с выпуском C++ .
Производный язык Object Pascal, предназначенный для объектно-ориентированного программирования , был разработан в 1985 году. Он использовался Apple Computer (для машин Lisa и Macintosh) и Borland в конце 1980-х годов и позже развился в Delphi на платформе Microsoft Windows . Расширения концепций Pascal привели к языкам Modula-2 и Oberon , оба разработанные Виртом.
Большую часть истории разработки компьютерных языков в 1960-х годах можно проследить до языка ALGOL 60. ALGOL был разработан в 1950-х годах с явной целью — иметь возможность четко описывать алгоритмы . Он включал ряд функций для структурного программирования , которые остаются распространенными в языках и по сей день.
Вскоре после его появления, в 1962 году Вирт начал работать над своей диссертацией с Хельмутом Вебером по языку программирования Эйлера . Эйлер был основан на синтаксисе АЛГОЛа и многих концепциях, но не был производным. Его основной целью было добавить динамические списки и типы, что позволило бы использовать его в ролях, аналогичных Lisp . Язык был опубликован в 1965 году.
К этому времени в ALGOL был выявлен ряд проблем, в частности, отсутствие стандартизированной системы строк . Группа, которой было поручено поддерживать язык, начала процесс ALGOL X для выявления улучшений, призывая присылать предложения. Вирт и Тони Хоар представили консервативный набор изменений для добавления строк и очистки части синтаксиса. Они были сочтены слишком незначительными, чтобы их стоило использовать в качестве нового стандарта ALGOL, поэтому Вирт написал компилятор для языка, который стал называться ALGOL W.
Усилия ALGOL X продолжились выбором гораздо более сложного языка, ALGOL 68. Сложность этого языка привела к значительным трудностям в создании высокопроизводительных компиляторов, и он не получил широкого распространения в отрасли. Это открыло возможности для новых языков.
На Pascal оказали влияние усилия ALGOL W, с явными целями обучения программированию в структурированной форме и для разработки системного программного обеспечения. [5] Поколение студентов использовало Pascal в качестве вводного языка на курсах бакалавриата.
Одним из ранних успехов языка стало появление UCSD Pascal , версии, работавшей на пользовательской операционной системе , которую можно было переносить на разные платформы. Ключевой платформой был Apple II , где он широко использовался как Apple Pascal . Это привело к тому, что Pascal стал основным языком высокого уровня, используемым для разработки в Apple Lisa , а позже и в Macintosh . Части оригинальной операционной системы Macintosh были вручную переведены на язык ассемблера Motorola 68000 из исходного кода Pascal . [6]
Система набора TeX Дональда Кнута была написана на WEB , оригинальной системе литературного программирования , основанной на DEC PDP-10 Pascal. Успешные коммерческие приложения, такие как Adobe Photoshop [7], были написаны на Macintosh Programmer's Workshop Pascal, в то время как приложения, такие как Total Commander , Skype [8] и Macromedia Captivate, были написаны на Delphi ( Object Pascal ). Apollo Computer использовала Pascal в качестве языка системного программирования для своих операционных систем, начиная с 1980 года.
Варианты Pascal также использовались для всего: от исследовательских проектов до игр для ПК и встроенных систем . Существуют более новые компиляторы Pascal, которые широко используются. [9]
Пример компилятора Вирта, предназначенный для распространения языка, система Pascal-P, использовала подмножество языка, разработанное как минимальное подмножество языка, которое могло бы компилировать себя. Идея заключалась в том, что это могло бы позволить самонастройку компилятора, который затем был бы расширен до полного статуса языка Pascal. Это было сделано с несколькими компиляторами, но одним заметным исключением был UCSD Pascal, который был основан на Pascal-P2. Он сохранил статус подмножества языка, основанный на идее, что он будет лучше работать на новых (тогда) микропроцессорах с ограниченной памятью. UCSD также преобразовал интерпретатор Pascal-P2 в «байтовую машину», опять же, потому что он лучше подходил для байт-ориентированных микропроцессоров.
UCSD Pascal лег в основу многих систем, включая Apple Pascal. Borland Pascal не был основан на кодовой базе UCSD, но появился в популярный период UCSD и соответствовал многим его функциям. Это положило начало линейке, которая закончилась Delphi Pascal и совместимым компилятором с открытым исходным кодом FPC/Lazarus.
Стандарт ISO для Pascal, ISO 7185, был опубликован в 1983 году и широко применялся на мэйнфреймах, мини-компьютерах и IBM-PC и совместимых с ними компьютерах с разрядностью от 16 до 32 бит. Два диалекта Pascal, наиболее используемые в конце 20-го века и до сегодняшнего дня, — это версия стандарта ISO 7185 и версии Delphi/Turbo Pascal (из которых две версии Borland в основном совместимы друг с другом).
Источник большей части ранней истории Паскаля можно найти в информационных бюллетенях Pascal User's Group по адресу:
Информационные бюллетени группы пользователей Pascal.
Во время работы над Lisa Ларри Теслер начал переписываться с Виртом по поводу идеи добавления объектно-ориентированных расширений к языку, чтобы сделать Pascal языком программирования Multi-paradigm . Это привело изначально к Clascal , представленному в 1983 году. Когда программа Lisa сошла на нет и была заменена Macintosh, была создана еще одна версия, названная Object Pascal . Она была представлена на Mac в 1985 году как часть фреймворка приложений MacApp и стала основным языком разработки Apple в начале 1990-х годов.
Расширения Object Pascal были добавлены в Turbo Pascal с выпуском версии 5.5 в 1989 году. [10] С годами Object Pascal стал основой системы Delphi для Microsoft Windows , которая до сих пор используется для разработки приложений Windows и может кросс-компилировать код для других систем. Free Pascal — это кросс-платформенная альтернатива с открытым исходным кодом и собственной графической IDE под названием Lazarus .
Первый компилятор Pascal был разработан в Цюрихе для семейства мэйнфреймов серии CDC 6000. Никлаус Вирт сообщает, что первая попытка реализовать его в FORTRAN 66 в 1969 году не увенчалась успехом из-за неадекватности FORTRAN 66 для выражения сложных структур данных. Вторая попытка была реализована на языке, похожем на C (Scallop Макса Энгели), а затем переведена вручную (Р. Шильдом) на сам Pascal для самонастройки. [11] Он был готов к работе к середине 1970 года. Многие компиляторы Pascal с тех пор стали аналогичным образом саморазмещающимися , то есть компилятор сам написан на Pascal, и компилятор обычно способен перекомпилировать себя, когда в язык добавляются новые функции или когда компилятор должен быть перенесен в новую среду. Компилятор GNU Pascal является одним из заметных исключений, поскольку он написан на C.
Первый успешный перенос компилятора CDC Pascal на другой мэйнфрейм был завершен Уэлшем и Куинном в Королевском университете Белфаста (QUB) в 1972 году. Целью была серия International Computers Limited (ICL) 1900. Этот компилятор, в свою очередь, был родителем компилятора Pascal для мини-компьютера Information Computer Systems (ICS) Multum . Порт Multum был разработан — с целью использования Pascal в качестве языка системного программирования — Финдли, Капплсом, Кавурасом и Дэвисом, работавшими на кафедре вычислительной техники в Университете Глазго . Считается, что Multum Pascal, который был завершен летом 1973 года, мог быть первой 16-битной реализацией.
Совершенно новый компилятор был завершен Уэлшем и др. в QUB в 1977 году. Он предлагал функцию диагностики исходного языка (включая профилирование, трассировку и отформатированные посмертные дампы с учетом типов), которая была реализована Финдли и Уоттом в Университете Глазго. Эта реализация была портирована в 1980 году на серию ICL 2900 командой из Университета Саутгемптона и Университета Глазго. Стандартная реализация модели Pascal также была основана на этом компиляторе, адаптированном Уэлшем и Хеем в Манчестерском университете в 1984 году для строгой проверки на соответствие стандарту BSI 6192/ISO 7185 и для генерации кода для переносимой абстрактной машины.
Первый компилятор Pascal , написанный в Северной Америке, был создан в Иллинойсском университете под руководством Дональда Б. Джиллиса для PDP-11 и генерировал машинный код.
Для быстрого распространения языка в Цюрихе был создан комплект для портирования компилятора , который включал компилятор, генерирующий так называемый p-код для виртуальной стековой машины, т. е. код, который поддается достаточно эффективной интерпретации, а также интерпретатор для этого кода — систему Pascal-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.
Pascal-P5, созданный вне цюрихской группы, полностью поддерживает язык Pascal и включает совместимость с ISO 7185.
Pascal-P6 — это продолжение Pascal-P5, которое, наряду с другими функциями, призвано стать компилятором для определенных процессоров, включая AMD64.
UCSD Pascal ответвился от Pascal-P2, где Кеннет Боулз использовал его для создания интерпретативной UCSD p-System. Это была одна из трех операционных систем, доступных на момент запуска оригинального персонального компьютера IBM . [12] 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 Compiler по аббревиатуре названия комиссии. [13]
В 1982 году компания Apple Computer создала собственный Lisa Pascal для Lisa Workshop, а в 1985 году перенесла компилятор на Apple Macintosh и MPW . В 1985 году Ларри Теслер , консультируясь с Никлаусом Виртом, определил Object Pascal, и эти расширения были включены в компиляторы Lisa Pascal и Mac Pascal.
В 1980-х годах Андерс Хейлсберг написал компилятор Blue Label Pascal для Nascom -2. Реализация этого компилятора для IBM PC продавалась под названиями Compas Pascal и PolyPascal, прежде чем была приобретена Borland и переименована в Turbo Pascal .
Turbo Pascal стал чрезвычайно популярен благодаря агрессивной ценовой стратегии, наличию одной из первых полноэкранных IDE и очень быстрому времени выполнения (всего несколько секунд на компиляцию, линковку и запуск). Он был написан и высоко оптимизирован полностью на языке ассемблера , что сделало его меньше и быстрее, чем большинство конкурентов.
В 1986 году Андерс перенес Turbo Pascal на Macintosh и включил расширения Object Pascal от Apple в Turbo Pascal. Затем эти расширения были добавлены обратно в версию Turbo Pascal для ПК для версии 5.5. В то же время Microsoft также реализовала компилятор Object Pascal. [14] [15] Turbo Pascal 5.5 оказал большое влияние на сообщество Pascal, которое начало концентрироваться в основном на IBM PC в конце 1980-х годов. Многие любители ПК в поисках структурированной замены BASIC использовали этот продукт. Его также начали принимать профессиональные разработчики. Примерно в то же время ряд концепций были импортированы из C, чтобы позволить программистам Pascal напрямую использовать интерфейс прикладного программирования (API) на основе C Microsoft Windows . Эти расширения включали строки с нулевым завершением , арифметику указателей , указатели функций , оператор адреса и небезопасные приведения типов .
Turbo Pascal и другие производные с модульными или юнитовыми структурами являются модульными языками программирования. Однако он не предоставляет концепцию вложенных модулей или квалифицированный импорт и экспорт определенных символов.
Super Pascal добавляет нечисловые метки, оператор возврата и выражения в качестве имен типов.
TMT Pascal был первым Borland -совместимым компилятором для 32-битного MS-DOS- совместимого защищенного режима , OS/2 и Win32 . Он расширяет язык перегрузкой функций и операторов .
Университеты Висконсин-Мэдисон , Цюрих , Карлсруэ и Вупперталь разработали компиляторы Pascal-SC [16] [17] и Pascal-XSC [18] [19] [20] ( Расширения для научных вычислений ), нацеленные на программирование численных вычислений. Разработка Pascal-SC началась в 1978 году с поддержки уровня 0 стандарта ISO 7185 Pascal, но поддержка уровня 2 была добавлена на более позднем этапе. [21] 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. Это был стандартный Pascal уровня 1 (с параметризованными границами массива), но определение допускало альтернативные ключевые слова и предопределенные идентификаторы на французском языке, а язык включал несколько расширений для облегчения системного программирования (например, эквивалент lseek). [22] Позже команда Sol перешла к проекту ChorusOS для разработки распределенной операционной системы . [23]
IP Pascal — это реализация языка программирования Pascal с использованием Micropolis DOS, но была быстро перенесена на CP/M-80, работающую на Z80. В 1994 году она была перенесена на типы машин 80386 , и сегодня существует в виде реализаций для Windows XP и Linux. В 2008 году система была выведена на новый уровень, и полученный язык был назван «Pascaline» (в честь калькулятора Паскаля ). Он включает в себя объекты, элементы управления пространствами имен , динамические массивы и многие другие расширения и в целом обладает той же функциональностью и защитой типов, что и C# . Это единственная такая реализация, которая также совместима с оригинальной реализацией Pascal, которая стандартизирована как ISO 7185.
Pascal в своей первоначальной форме является чисто процедурным языком и включает в себя традиционный массив управляющих структур, подобных ALGOL, с зарезервированными словами, такими как if
, then
, else
, while
, for
и case
, располагающимися на одном операторе или блоке begin
операторов end
. Pascal также имеет конструкции структурирования данных, не включенные в исходные типы ALGOL 60 , такие как записи , варианты, указатели , перечисления , а также множества и указатели процедур. Такие конструкции были частично унаследованы или вдохновлены Simula 67, ALGOL 68 , собственным ALGOL W Никлауса Вирта и предложениями CAR Hoare .
Программы на языке Pascal начинаются с program
ключевого слова со списком внешних файловых дескрипторов в качестве параметров [24] (не требуется в Turbo Pascal и т. д.); затем следует основной блок, заключенный в ключевые слова begin
и end
. Точки с запятой разделяют операторы , а точка (т. е. точка) завершает всю программу (или модуль ). Регистр букв в исходном коде на языке Pascal игнорируется.
Вот пример исходного кода, используемого для очень простой программы «Hello, World!» :
program HelloWorld ( output ) ; begin WriteLn ( 'Hello, World!' ) {После последнего оператора блока не требуется ставить ";" — добавление одного оператора добавляет в программу "нулевой оператор", который игнорируется компилятором.} end .
Объявление типа в Паскале используется для определения диапазона значений, которые может хранить переменная этого типа. Оно также определяет набор операций, которые допустимо выполнять над переменными этого типа. Предопределенные типы:
Диапазон значений, допустимых для базовых типов (кроме Boolean), определяется реализацией. Для некоторых преобразований данных предусмотрены функции. Для преобразования в real
доступны integer
следующие функции: round
(которая округляет до целого числа с помощью банковского округления ) и trunc
(округляет к нулю).
Программист имеет свободу определять другие часто используемые типы данных (например, байт, строка и т. д.) в терминах предопределенных типов, используя, например, возможность объявления типов в Паскале.
тип byte = 0 .. 255 ; signed_byte = - 128 .. 127 ; string = упакованный массив [ 1 .. 255 ] символов ;
Часто используемые типы, такие как байт и строка, уже определены во многих реализациях.
Обычно система использует слово для хранения данных. Например, byte
тип может храниться в машинном целом числе — возможно, 32 бита — а не в 8-битном значении. Pascal не содержит языковых элементов, которые позволяют более детально определять основные типы хранения. Эта возможность была включена в ряд расширений Pascal и последующих языков, в то время как другие, такие как Modula-2 , расширили встроенный набор, чтобы охватить большинство машинных типов данных, таких как 16-битные целые числа.
Ключевое packed
слово сообщает компилятору использовать наиболее эффективный метод хранения для структурированных типов данных: наборов, массивов и записей, а не использовать одно слово для каждого элемента. Упаковка может замедлить доступ на машинах, которые не предлагают легкого доступа к частям слова.
Также можно создать поддиапазоны любого порядкового типа данных (любого простого типа, кроме действительного):
вар х : 1 .. 10 ; y : 'а' .. 'z' ;
В отличие от других языков программирования того времени, Pascal поддерживает тип множества: [25]
var Set1 : набор из 1 .. 10 ; Set2 : набор из 'a' .. 'z' ;
Множество — это фундаментальное понятие для современной математики, и они могут использоваться во многих алгоритмах. Такая функция полезна и может быть быстрее, чем эквивалентная конструкция в языке, который не поддерживает множества. Например, для многих компиляторов Pascal:
если i в [ 5 .. 10 ] то ...
выполняется быстрее, чем:
если ( i > 4 ) и ( i < 11 ) , то ...
Наборы несмежных значений могут быть особенно полезны с точки зрения как производительности, так и читабельности:
если i в [ 0 .. 3 , 7 , 9 , 12 .. 15 ] то ...
Для этих примеров, которые включают наборы в небольших доменах, улучшенная производительность обычно достигается за счет того, что компилятор представляет переменные набора как битовые векторы . Затем операторы набора могут быть эффективно реализованы как операции побитового машинного кода.
Пример типа записи Pascal:
тип car = длина записи : целое число ; ширина : целое число конец ;
Пример варианта типа записи:
тип Форма = ( Круг , Квадрат , Треугольник ) ; Размеры = record case Фигура : Форма Круга : ( Диаметр : действительный ) ; Квадрат : ( Ширина : действительная ) ; Треугольник : ( Сторона : действительный ; Угол1 , Угол2 : 0 .. 360 ) конец ;
Вариантные записи позволяют нескольким полям записи перекрывать друг друга для экономии места.
Типы могут быть определены из других типов с помощью объявлений типов:
тип x = целое число ; y = x ; ...
Кроме того, из простых типов можно создавать сложные типы:
тип a = массив [ 1 .. 10 ] целых чисел ; b = запись x : целое число ; y : символ {дополнительная точка с запятой не является строго обязательной} конец ; c = файл a ;
тип a = файл целого числа ; b = запись x : целое число ; y : символ конца ; c = файл b ;
Как показано в примере выше, файлы Pascal представляют собой последовательности компонентов. Каждый файл имеет буферную переменную, которая обозначается как f^ . Процедуры get (для чтения) и put (для записи) перемещают буферную переменную к следующему элементу. Read вводится таким образом, что read(f, x) совпадает с x := f^; get(f); . Write вводится таким образом, что write(f, x) совпадает с f^ := x; put(f); Тип text
предопределен как file of char. Хотя буферная переменная могла использоваться для проверки следующего символа, который будет использоваться (проверка на наличие цифры перед чтением целого числа), это приводило к серьезным проблемам с интерактивными программами в ранних реализациях, но было решено позже с помощью концепции «ленивого ввода-вывода», которая ждет, пока переменная буфера файла фактически не будет доступна, прежде чем выполнять файловые операции.
Паскаль поддерживает использование указателей :
тип pNode = ^ Узел ; Узел = запись a : целое число ; b : символ ; c : pNode конец ; var NodePtr : pNode ; IntPtr : ^ целое число ;
Здесь переменная NodePtr — это указатель на тип данных Node , запись. Указатели можно использовать до их объявления. Это предварительное объявление , исключение из правила, согласно которому вещи должны быть объявлены до их использования.
Чтобы создать новую запись и присвоить значение 10 и символ A полям a и b в записи, а также инициализировать указатель c нулевым указателем («NIL» в Pascal), операторы будут такими:
new ( NodePtr ) ; ... NodePtr ^ .a := 10 ; NodePtr ^ .b := 'A' ; NodePtr ^ .c := nil ; ...
Это также можно сделать с помощью with
следующего заявления:
new ( NodePtr ) ; ... with NodePtr ^ do begin a := 10 ; b := 'A' ; c := nil end ; ...
Внутри области действия оператора with a и b ссылаются на подполя указателя записи NodePtr , а не на запись Node или тип указателя pNode.
Связанные списки , стеки и очереди можно создавать, включив в запись поле типа указателя (c).
В отличие от многих языков, в которых есть указатели, Pascal позволяет указателям ссылаться только на динамически созданные переменные, которые являются анонимными, и не позволяет им ссылаться на стандартные статические или локальные переменные. Указатели также должны иметь связанный тип, и указатель на один тип несовместим с указателем на другой тип (например, указатель на char несовместим с указателем на integer). Это помогает устранить проблемы безопасности типов, присущие другим реализациям указателей, особенно тем, которые используются для PL/I или C. Это также устраняет некоторые риски, вызванные висячими указателями , но возможность динамически освобождать ссылочное пространство с помощью функции dispose (которая имеет тот же эффект, что и функция свободной библиотеки, найденная в C ) означает, что риск висячих указателей не был устранен [26], как это было в таких языках, как Java и C#, которые обеспечивают автоматическую сборку мусора (но которые не устраняют связанную с этим проблему утечек памяти ).
Некоторые из этих ограничений могут быть сняты в новых диалектах.
Паскаль — структурированный язык программирования , что означает, что поток управления структурирован в стандартные операторы , обычно без команд « goto ».
while a <> b do WriteLn ( 'Ожидание' ) ; if a > b then WriteLn ( 'Условие выполнено' ) {точка с запятой перед else не допускается} else WriteLn ( 'Условие не выполнено' ) ; for i := 1 to 10 do {здесь точка с запятой не нужна, так как это отделит следующий оператор} WriteLn ( 'Итерация: ' , i ) ; повторять a := a + 1 до тех пор, пока a = 10 ; случай i из 0 : Запись ( 'ноль' ) ; 1 : Запись ( 'один' ) ; 2 : Запись ( 'два' ) ; 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 : Запись ( '?' ) конец ;
Pascal структурирует программы в процедуры и функции. Обычно процедура используется для ее побочных эффектов, тогда как функция используется для ее возвращаемого значения.
программа Печать ( вывод ) ; переменная i : целое число ; процедура PrintAnInteger ( j : integer ) ; начало ... конец ; функция triple ( const x : integer ) : integer ; begin triple := x * 3 end ; begin { main program } ... PrintAnInteger ( i ) ; PrintAnInteger ( triple ( i )) end .
Процедуры и функции могут быть вложены на любую глубину, а конструкция «программа» является логическим самым внешним блоком.
По умолчанию параметры передаются по значению. Если 'var' предшествует имени параметра, он передается по ссылке.
Каждая процедура или функция может иметь свои собственные объявления goto-меток, констант, типов, переменных и других процедур и функций, которые должны быть в этом порядке. Это требование к порядку изначально было предназначено для обеспечения эффективной однопроходной компиляции . Однако в некоторых диалектах (например, Delphi ) строгое требование к порядку разделов объявлений было смягчено.
Pascal перенял многие особенности синтаксиса языка из языка ALGOL , включая использование точки с запятой в качестве разделителя операторов. Это контрастирует с другими языками, такими как PL/I и Cend
, которые используют точку с запятой в качестве терминатора оператора. Перед ключевым словом объявления типа записи, блока или оператора case точка с запятой не нужна ; перед until
ключевым словом оператора repeat; и перед else
ключевым словом оператора if .
Наличие дополнительной точки с запятой не допускалось в ранних версиях Pascal. Однако добавление пустых операторов, подобных ALGOL, в пересмотренном отчете 1973 года и более поздние изменения языка в ISO 7185:1983 теперь допускают необязательные точки с запятой в большинстве этих случаев. Точка с запятой по-прежнему не допускается непосредственно перед else
ключевым словом в операторе if , поскольку else
следует за одним оператором, а не за последовательностью операторов. В случае вложенных if точка с запятой не может использоваться для избежания проблемы висячего else (когда внутренний if не имеет else, а внешний if имеет) путем предположительного завершения вложенного if точкой с запятой — вместо этого это завершает оба предложения if. Вместо этого должен использоваться явный блок begin
.... [27]end
Для общего пользования доступно несколько компиляторов и интерпретаторов Pascal:
В 1983 году язык был стандартизирован в международном стандарте IEC/ISO 7185 [34] и нескольких местных стандартах, специфичных для отдельных стран, включая американский ANSI/IEEE770X3.97-1983 и ISO 7185:1983. Эти два стандарта отличались только тем, что стандарт ISO включал расширение «уровня 1» для совместимых массивов (массив, границы которого неизвестны до времени выполнения), тогда как ANSI не допускал такого расширения для исходного языка (версии Вирта). В 1989 году ISO 7185 был пересмотрен (ISO 7185:1990) для исправления различных ошибок и двусмысленностей, обнаруженных в исходном документе.
ISO 7185 был заявлен как разъяснение языка Вирта 1974 года, как подробно описано в Руководстве пользователя и Отчете [Йенсен и Вирт], но также был примечателен добавлением "Конформных параметров массива" в качестве уровня 1 к стандарту, уровень 0 был Паскалем без конформных массивов. Это дополнение было сделано по просьбе К. А. Хоара и с одобрения Никлауса Вирта. Побудительной причиной было то, что Хоар хотел создать версию Паскаля (NAG) Numerical Algorithms Library , которая изначально была написана на FORTRAN, и обнаружил, что это невозможно сделать без расширения, которое допускало бы параметры массива различного размера. Аналогичные соображения мотивировали включение в ISO 7185 возможности указывать типы параметров процедурных и функциональных параметров.
Сам Никлаус Вирт называл язык 1974 года «Стандартом», например, чтобы отличить его от машинно-специфичных особенностей компилятора CDC 6000. Этот язык был задокументирован в The Pascal Report [35] , второй части «Руководства и отчета пользователя Pascal».
На больших машинах (мэйнфреймах и мини-компьютерах), на которых возник Паскаль, стандарты в целом соблюдались. На IBM PC — нет. На IBM PC наибольшее количество пользователей имеют стандарты Borland Turbo Pascal и Delphi. Таким образом, обычно важно понимать, соответствует ли конкретная реализация исходному языку Pascal или его диалекту Borland.
Версии языка для IBM PC начали различаться с появлением UCSD Pascal, интерпретируемой реализации, которая включала несколько расширений языка, а также несколько упущений и изменений. Многие возможности языка UCSD сохранились и по сей день, в том числе в диалекте Borland.
В 1990 году был создан расширенный стандарт Pascal под названием ISO/IEC 10206 [36] , который по техническому содержанию [37] идентичен IEEE/ANSI 770X3.160-1989 [38]. С 2019 года планируется поддержка расширенного стандарта Pascal в компиляторе FreePascal . [39]
Цюрихская версия Pascal Никлауса Вирта была выпущена за пределами ETH в двух основных формах: исходный код компилятора CDC 6000 и набор для портирования, называемый системой Pascal-P. Компилятор Pascal-P исключил несколько функций полного языка, которые не требовались для начальной загрузки компилятора. Например, процедуры и функции, используемые в качестве параметров, недискриминационные записи вариантов, упаковка, утилизация, межпроцедурные goto и другие функции полного компилятора были исключены.
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 Turbo Pascal , написанный Андерсом Хейлсбергом , был написан на языке ассемблера независимо от UCSD и компиляторов Zürich. Однако он принял большую часть того же подмножества и расширений, что и компилятор UCSD. Вероятно, это связано с тем, что система UCSD была наиболее распространенной системой Pascal, подходящей для разработки приложений на ограниченных по ресурсам микропроцессорных системах, доступных в то время.
Компактная версия Turbo Pascal 3 и более поздние воплощения, включая Object Pascal и Delphi компании Borland, а также почти совместимые с Borland версии, стали популярны среди программистов , включая авторов условно-бесплатного программного обеспечения, поэтому библиотека кода Pascal SWAG содержит большой объем кода, написанного с учетом таких версий, как Delphi.
Программные продукты ( компиляторы и IDE/ быстрая разработка приложений (RAD)) в этой категории:
Паскаль вызвал широкий спектр откликов в компьютерном сообществе, как критических, так и хвалебных.
Первоначальное определение языка Виртом подверглось широкой критике. В частности, Нико Хаберманн в своих «Критических комментариях о языке программирования Паскаль» (1973) прокомментировал, что многие из его конструкций были плохо определены, в частности, для типов данных , диапазонов , структур и goto . [43] Позже Брайан Керниган , популяризировавший язык Си , изложил свою критику Паскаля в 1981 году в своей статье «Почему Паскаль не мой любимый язык программирования». [44] Самая серьезная проблема, описанная Керниганом, заключалась в том, что размеры массивов и длины строк были частью типа, поэтому было невозможно написать функцию, которая принимала бы массивы переменной длины или даже строки в качестве параметров. Это делало невозможным написание, например, библиотеки сортировки. Керниган также критиковал непредсказуемый порядок вычисления булевых выражений, плохую поддержку библиотеки и отсутствие статических переменных , а также поднял ряд более мелких проблем. Также он заявил, что язык не предоставляет никаких простых конструкций для «избежания» (сознательного и принудительного игнорирования) ограничений и запретов. Более общие жалобы из других источников [26] [45] отмечали, что область действия объявлений не была четко определена в исходном определении языка, что иногда имело серьезные последствия при использовании опережающих объявлений для определения типов указателей, или когда объявления записей приводили к взаимной рекурсии , или когда идентификатор мог или не мог использоваться в списке перечисления. Другая трудность заключалась в том, что, как и ALGOL 60 , язык не позволял процедурам или функциям, передаваемым в качестве параметров, предопределять ожидаемый тип их параметров.
Несмотря на первоначальную критику, Pascal продолжал развиваться, и большинство пунктов Кернигана не применимы к версиям языка, которые были улучшены, чтобы быть пригодными для разработки коммерческих продуктов, таким как Turbo Pascal от Borland . Как и предсказывал Керниган в своей статье, большинство расширений для исправления этих проблем были несовместимы от компилятора к компилятору. Однако с начала 1990-х годов большинство разновидностей, похоже, сведены к двум категориям: ISO и Borland-like. Расширенный Pascal решает многие из этих ранних критических замечаний. Он поддерживает строки переменной длины, инициализацию переменных, раздельную компиляцию, сокращенные булевы операторы и предложения по умолчанию ( otherwise
) для операторов case. [46]
Мы очень внимательно изучили Delphi Object Pascal и построили рабочий прототип ссылок на связанные методы, чтобы понять их взаимодействие с языком программирования Java и его API... Наш вывод состоял в том, что ссылки на связанные методы не нужны и вредны для языка. Это решение было принято после консультации с Borland International, у которой был предыдущий опыт работы со ссылками на связанные методы в Delphi Object Pascal .
Проект продолжался под названием "green", а язык был основан на старой модели
UCSD Pascal
, что позволяет генерировать интерпретируемый код