Парадигма | |
---|---|
Семья | Вирт Паскаль |
Разработано | Никлаус Вирт |
Впервые появился | 1970 ; 51 год назад ( 1970) |
Печатная дисциплина | |
Сфера | Лексический |
Расширения имени файла | .pp , .pas ,.inc |
Основные реализации | |
Диалекты | |
Под влиянием | |
Под влиянием | |
Паскаль - это императивный и процедурный язык программирования, разработанный Никлаусом Виртом как небольшой эффективный язык, предназначенный для поощрения передовых практик программирования с использованием структурного программирования и структурирования данных. Он назван в честь французского математика, философа и физика Блеза Паскаля.
На основе книги Вирта « Алгоритмы + структуры данных = программы» Паскаль был разработан по образцу языка АЛГОЛ 60. Вирт был вовлечен в процесс, чтобы улучшить язык как часть Алгол X усилий и предложил версию под названием Алгол W. Это не было принято, и процесс ALGOL X застрял. В 1968 году Вирт решил отказаться от процесса ALGOL X и улучшить ALGOL W, выпустив его как Pascal в 1970 году.
Помимо скаляров и массивов ALGOL, Паскаль позволял определять сложные типы данных и строить динамические и рекурсивные структуры данных, такие как списки, деревья и графики. Pascal имеет строгую типизацию для всех объектов, что означает, что один тип данных не может быть преобразован в другой или интерпретирован как другой без явных преобразований. В отличие от C (и большинства языков семейства C ), Pascal допускает определение вложенных процедур на любом уровне глубины, а также позволяет большинство видов определений и объявлений внутри подпрограмм (процедур и функций). Таким образом, программа синтаксически похожа на отдельную процедуру или функцию. Это похоже на блочную структуру АЛГОЛА 60, но ограничено от произвольных блоковых операторов только процедурами и функциями.
Паскаль стал очень успешным в 1970-х годах, особенно на растущем рынке мини-компьютеров. Компиляторы были также доступны для многих микрокомпьютеров, поскольку эта область появилась в конце 1970-х годов. Он широко использовался в качестве языка обучения на университетских курсах программирования в 1980-х годах, а также использовался в производственных условиях для написания коммерческого программного обеспечения в тот же период. Он был вытеснен языком программирования C в конце 1980-х - начале 1990-х годов, когда стали популярными системы на базе UNIX, и особенно с выпуском C ++.
Производная под названием Object Pascal, предназначенная для объектно-ориентированного программирования, была разработана в 1985 году. Она использовалась Apple Computer и Borland в конце 1980-х годов, а затем была преобразована в Delphi на платформе Microsoft Windows. Расширение концепций Паскаля привело к появлению языков Modula-2 и Oberon.
Большая часть истории разработки компьютерных языков в 1960-х годах восходит к языку АЛГОЛ 60. Алгол был разработан в 1950-х годах с явной целью - иметь возможность четко описывать алгоритмы. Он включал в себя ряд функций для структурированного программирования, которые остаются распространенными в языках по сей день.
Вскоре после его появления в 1962 году Вирт вместе с Гельмутом Вебером начал работать над диссертацией по языку программирования Эйлера. Эйлер был основан на синтаксисе АЛГОЛА и многих концепциях, но не был производным. Его основной целью было добавление динамических списков и типов, позволяющих использовать его в ролях, подобных Lisp. Язык был опубликован в 1965 году.
К этому времени в АЛГОЛе был выявлен ряд проблем, в частности, отсутствие стандартизированной строковой системы. Группа, которой было поручено поддерживать язык, начала процесс ALGOL X для выявления улучшений, призывая к подаче заявок. Вирт и Тони Хоар представили консервативный набор модификаций для добавления строк и очистки синтаксиса. Они были признаны слишком незначительны, чтобы быть стоит использовать в качестве нового стандарта Алголом, поэтому вирт написал компилятор для языка, который стал им Algol W.
Усилия ALGOL X продолжатся, чтобы выбрать гораздо более сложный язык, ALGOL 68. Сложность этого языка привела к значительным трудностям при создании высокопроизводительных компиляторов, и он не получил широкого распространения в отрасли. Это оставило возможность для новых языков.
На Паскаль повлияли усилия ALGOL W с явными целями создания языка, который был бы эффективным как в компиляторе, так и во время выполнения, позволял разрабатывать хорошо структурированные программы и был полезен для обучения студентов структурированному программированию. Поколение студентов использовало Паскаль в качестве вводного языка на курсах бакалавриата.
Одним из первых успехов языка стало появление UCSD Pascal - версии, работающей в специальной операционной системе, которую можно было переносить на другие платформы. Ключевой платформой был Apple II, где он нашел широкое применение. Это привело к тому, что Паскаль стал основным языком высокого уровня, используемым для разработки в Apple Lisa, а затем и в Macintosh. Части исходной операционной системы Macintosh были вручную переведены на язык ассемблера Motorola 68000 из исходного кода Pascal.
Наборная система TeX от Дональда Кнута была написана в WEB, оригинальная грамотное программирование система, основанная на DEC PDP-10 Pascal. Успешные коммерческие приложения, такие как Adobe Photoshop, были написаны на Macintosh Programmer's Workshop Pascal, а такие приложения, как Total Commander, Skype и Macromedia Captivate, были написаны на Delphi ( Object Pascal ). Apollo Computer использовал Паскаль в качестве языка системного программирования для своих операционных систем, начиная с 1980 года.
Варианты Pascal также использовались для всего, от исследовательских проектов до компьютерных игр и встроенных систем. Существуют более новые компиляторы Паскаля, которые широко используются.
Во время работы над Lisa Ларри Теслер начал переписку с Виртом по поводу идеи добавления объектно-ориентированных расширений к языку. Первоначально это привело к появлению Clascal, представленного в 1983 году. Когда программа Lisa исчезла и была заменена Macintosh, была создана следующая версия под названием Object Pascal. Он был представлен на Mac в 1985 году как часть среды приложений MacApp и стал основным языком разработки Apple в начале 1990-х годов.
Расширения Object Pascal были добавлены в Turbo Pascal с выпуском версии 5.5 в 1989 году. С годами Object Pascal стал основой системы Delphi для Microsoft Windows, которая до сих пор используется для разработки приложений Windows и может выполнять кросс-компиляцию кода. в другие системы. Free Pascal - это кроссплатформенная альтернатива с открытым исходным кодом и собственной графической IDE под названием Lazarus.
Первый компилятор Паскаля был разработан в Цюрихе для семейства мэйнфреймов серии CDC 6000. Никлаус Вирт сообщает, что первая попытка реализовать его в FORTRAN 66 в 1969 году не увенчалась успехом из-за неадекватности FORTRAN 66 для выражения сложных структур данных. Вторая попытка была реализована на C-подобном языке (Scallop от Max Engeli), а затем вручную переведена (R. Schild) на сам Паскаль для начальной загрузки. Он был введен в эксплуатацию к середине 1970 года. С тех пор многие компиляторы Pascal также самостоятельно размещались, то есть сам компилятор был написан на Pascal, и компилятор обычно способен перекомпилировать себя, когда к языку добавляются новые функции или когда компилятор должен быть перенесен на другой язык. новая среда. GNU Pascal компилятор один Заметным исключением, быть написан на C.
Первый успешный перенос компилятора CDC Pascal на другой мэйнфрейм был завершен Уэлшем и Куинном в Королевском университете Белфаста (QUB) в 1972 году. Целью была серия 1900 International Computers Limited (ICL). Этот компилятор, в свою очередь, был родительским для компилятора Паскаля для миникомпьютера информационных компьютерных систем (ICS) Multum. Порт Multum был разработан - с целью использования Паскаль в качестве языка системного программирования - Финдли, Куплсом, Кавурасом и Дэвисом, работающими на факультете вычислительной техники Университета Глазго. Считается, что Multum Pascal, завершенный летом 1973 года, мог быть первой 16-битной реализацией.
Совершенно новый компилятор был завершен Welsh et al. в 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-P5, созданный вне группы Zürich, принимает полный язык Pascal и поддерживает совместимость с ISO 7185.
UCSD Pascal является ответвлением от Pascal-P2, где Кеннет Боулз использовал его для создания интерпретируемой p-системы UCSD. Это была одна из трех операционных систем, доступных при запуске первого персонального компьютера IBM. UCSD Pascal использовал промежуточный код, основанный на байтовых значениях, и, таким образом, был одним из первых компиляторов байт-кода. От Pascal-P1 до Pascal-P4 нет, но он основан на 60-битной длине слова CDC 6600.
Компилятор на основе Pascal-P5 компилятор, который создал собственные двоичные объектные файлы, был выпущен для IBM System / 370 ЭВМ по Комиссии по атомной энергии австралийских ; он был назван AAEC Pascal 8000 Compiler по сокращению названия комиссии.
Apple Computer создала свой собственный Lisa Pascal для Lisa Workshop в 1982 году и перенесла компилятор на Apple Macintosh и MPW в 1985 году. В 1985 году Ларри Теслер, консультируясь с Никлаусом Виртом, определил Object Pascal, и эти расширения были включены как в Lisa. Компиляторы Паскаля и Mac Паскаля.
В 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. Turbo Pascal 5.5 оказал большое влияние на сообщество Pascal, которое в конце 1980-х начало концентрироваться в основном на IBM PC. Многие любители ПК в поисках структурной замены BASIC использовали этот продукт. Его также начали внедрять профессиональные разработчики. Примерно в то же время из C был импортирован ряд концепций, позволяющих программистам на Pascal напрямую использовать интерфейс прикладного программирования (API) Microsoft Windows на основе C. Эти расширения включены нулевая завершающая строка, арифметика указателей, указатели на функцию, адрес-оператор и небезопасное преобразование типов.
Turbo Pascal и другие производные единицы или модуля структур модульного программирования языков. Однако он не предоставляет концепцию вложенного модуля или квалифицированный импорт и экспорт определенных символов.
Super Pascal - это вариант, в котором в качестве имен типов добавлены нечисловые метки, оператор возврата и выражения.
TMT Pascal был первый Borland совместимый компилятор для 32-битного DOS защищенного режима, OS / 2 и Win32 операционных систем. Язык TMT Pascal первым разрешил перегрузку функций и операторов.
Университеты Висконсин-Мэдисон, Цюрих, Карлсруэ и Вупперталь разработали компиляторы Pascal-SC и Pascal-XSC ( Расширения для научных вычислений ), предназначенные для программирования числовых вычислений. Разработка Pascal-SC началась в 1978 году с поддержкой ISO 7185 Pascal уровня 0, но поддержка уровня 2 была добавлена на более позднем этапе. Первоначально 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 level-1 (с параметризованными границами массивов), но определение допускало альтернативные ключевые слова и предопределенные идентификаторы на французском языке, а язык включал несколько расширений для упрощения системного программирования (например, эквивалент lseek). Позже команда Sol перешла к проекту ChorusOS для разработки распределенной операционной системы.
IP Pascal был реализацией языка программирования Pascal с использованием Micropolis DOS, но был быстро переведен на CP / M-80, работающий на Z80. Он был перенесен на машины 80386 типов в 1994 году и существует сегодня как реализации Windows / XP и Linux. В 2008 году система была поднята на новый уровень, и в результате появился язык, названный «Паскалин» (в честь калькулятора Паскаля ). Он включает в себя объекты, элементы управления пространством имен, динамические массивы и многие другие расширения и обычно имеет те же функции и защиту типов, что и C #. Это единственная такая реализация, которая также совместима с исходной реализацией Паскаля, стандартизированной как ISO 7185.
Паскаль, в его первоначальном виде, является чисто процедурным языком и включает в себя традиционный массив Алгол -кака структур управления с зарезервированными словами, такими как if
, then
, else
, while
, for
, и case
, начиная от одного оператора или begin
- end
блока отчетности. В Паскале также есть конструкции структурирования данных, не включенные в исходные типы Алгола 60, такие как записи, варианты, указатели, перечисления, а также множества и указатели процедур. Такие конструкции были частично унаследованы или вдохновлены Simula 67, ALGOL 68, собственным ALGOL W Никлауса Вирта и предложениями CAR Hoare.
Программы на языке Pascal начинаются с program
ключевого слова со списком дескрипторов внешних файлов в качестве параметров (не требуется в Turbo Pascal и т. Д.); Затем следует основной блок в квадратных скобках по begin
и end
ключевым словам. Точка с запятой разделяет операторы, а точка (то есть точка) завершает всю программу (или модуль). Регистр букв в исходном коде Pascal игнорируется.
Вот пример исходного кода, используемого для очень простого "Hello, World!" программа :
program HelloWorld(output); begin Write('Hello, World!') {No ";" is required after the last statement of a block - adding one adds a "null statement" to the program, which is ignored by the compiler.} end.
Тип в Паскале и некоторых других популярных языках программирования определяет переменную таким образом, что он определяет диапазон значений, которые переменная способна хранить, а также определяет набор операций, которые разрешено выполнять с переменные этого типа. Предопределенные типы:
Тип данных | Тип значений, которые может хранить переменная |
---|---|
целое число | целые (целые) числа |
настоящий | числа с плавающей запятой |
логический | значения True или False |
символ | один символ из упорядоченного набора символов |
установленный | эквивалент упакованного массива логических значений |
множество | счетная группа любого из предшествующих типов данных |
нить | последовательность или «строка» символов (строки не были частью исходного языка; можно было создать «массив символов» и получить доступ к отдельным символам как к массиву, но прямая ссылка на него как на строку была невозможна до тех пор, пока не появились более поздние диалекты Паскаль добавил эту функциональность.) |
Диапазон значений, разрешенных для каждого (кроме логического), определяется реализацией. Предусмотрены функции для преобразования некоторых данных. Для преобразования real
в integer
следующих функциях: round
(который округляется до целого числа, используя банковское округление ) и trunc
(раунды к нулю).
Программист может свободно определять другие часто используемые типы данных (например, байты, строки и т. Д.) В терминах предопределенных типов, используя средство объявления типов Паскаля, например
type byte = 0..255; signed_byte = -128..127; string = packed array[1..255] of char;
(Часто используемые типы, такие как byte и string, уже определены во многих реализациях.)
Также могут быть сделаны поддиапазоны любого порядкового типа данных (любого простого типа, кроме реального):
var x: 1..10; y: 'a'..'z';
В отличие от других языков программирования того времени, Паскаль поддерживает заданный тип:
var Set1: set of 1..10; Set2: set of 'a'..'z';
Наборы - это фундаментальная концепция современной математики, и их можно использовать во многих алгоритмах. Такая функция полезна и может быть быстрее, чем эквивалентная конструкция на языке, который не поддерживает наборы. Например, для многих компиляторов Паскаля:
if i in [5..10] then...
выполняется быстрее, чем:
if (i gt; 4) and (i lt; 11) then...
Наборы несмежных значений могут быть особенно полезны с точки зрения производительности и удобочитаемости:
if i in [0..3, 7, 9, 12..15] then...
Для этих примеров, которые включают наборы над небольшими доменами, улучшенная производительность обычно достигается компилятором, представляющим переменные набора в виде битовых векторов. Затем операторы множества могут быть эффективно реализованы как операции побитового машинного кода.
В Паскале есть два способа создавать союзы. Один из них - стандартный способ записи варианта. Второй - нестандартный способ объявления переменной как абсолютной, то есть она помещается в то же место памяти, что и другая переменная, или по абсолютному адресу. Хотя все компиляторы Pascal поддерживают записи вариантов, только некоторые поддерживают абсолютные переменные.
Для целей этого примера все следующие типы являются целыми числами: байт - 8 бит, слово - 16 бит, а целое число - 32 бита.
В следующем примере показана нестандартная абсолютная форма:
VAR A: Integer; B: Array[1..4] of Byte absolute A; C: Integer absolute 0;
В первом примере каждый из элементов массива B отображается на один из конкретных байтов переменной A. Во втором примере переменной C присваивается точный машинный адрес 0.
В следующем примере у записи есть варианты, некоторые из которых имеют то же расположение, что и другие:
TYPE TSystemTime = record Year, Month, DayOfWeek, Day: word; Hour, Minute, Second, MilliSecond: word; end; TPerson = RECORD FirstName, Lastname: String; Birthdate: TSystemTime; Case isPregnant: Boolean of true: (DateDue:TSystemTime); false: (isPlanningPregnancy: Boolean); END;
Типы могут быть определены из других типов с помощью объявлений типов:
type x = integer; y = x;...
Кроме того, сложные типы могут быть построены из простых типов:
type a = array[1..10] of integer; b = record x: integer; y: char {extra semicolon not strictly required} end; c = file of a;
Как показано в приведенном выше примере, файлы Pascal представляют собой последовательности компонентов. Каждый файл имеет буферную переменную, которая обозначается f ^. Процедуры get (для чтения) и put (для записи) перемещают переменную буфера к следующему элементу. Чтение вводится таким образом, что read (f, x) совпадает с x: = f ^; получить (е);. Запись введена таким образом, что запись (f, x) совпадает с f ^: = x; положить (f); Тип text
предопределен как файл char. Хотя переменную буфера можно было использовать для проверки следующего символа, который будет использоваться (проверка цифры перед чтением целого числа), это приводит к серьезным проблемам с интерактивными программами в ранних реализациях, но позже было решено с помощью «ленивого ввода-вывода» концепция.
В Jensen amp; Wirth Pascal строки представлены как упакованные массивы символов; поэтому они имеют фиксированную длину и обычно заполнены пространством.
Паскаль поддерживает использование указателей :
type pNode = ^Node; Node = record a: integer; b: char; c: pNode end; var NodePtr: pNode; IntPtr: ^integer;
Здесь переменная NodePtr - это указатель на тип данных Node, запись. Указатели можно использовать до их объявления. Это предварительное объявление, исключение из правила, согласно которому вещи должны быть объявлены до того, как они будут использованы.
Для того, чтобы создать новую запись и присвоить значение 10 и символ A на полях и б в записи, и инициализирует указатель C к указателю нуль ( «NIL» в Паскале), операторы будут:
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, а не к узлу записи или типу указателя pNode.
Связанные списки, стеки и очереди могут быть созданы путем включения в запись поля типа указателя (c).
В отличие от многих языков, в которых есть указатели, Паскаль позволяет указателям ссылаться только на динамически создаваемые анонимные переменные и не позволяет им ссылаться на стандартные статические или локальные переменные. Указатели также должны иметь связанный тип, а указатель на один тип несовместим с указателем на другой тип (например, указатель на char несовместим с указателем на целое число). Это помогает устранить проблемы безопасности типа, присущие другими реализациями указателей, в частности, те, которые используются для PL / I или C. Это также устраняет некоторые риски, вызванные висячими указателями, но возможность динамически освобождать указанное пространство с помощью функции удаления (которая имеет тот же эффект, что и функция свободной библиотеки, найденная в C ) означает, что риск появления висячих указателей не был полностью устранен. как и в таких языках, как Java и C #, которые обеспечивают автоматическую сборку мусора (но не полностью устраняют связанную с этим проблему утечек памяти ).
Некоторые из этих ограничений могут быть сняты в новых диалектах.
Паскаль - это структурированный язык программирования, что означает, что поток управления структурирован в стандартные операторы, обычно без команд goto.
while a lt;gt; b do WriteLn('Waiting'); if a gt; b then WriteLn('Condition met') {no semicolon allowed before else} else WriteLn('Condition not met'); for i:= 1 to 10 do {no semicolon here as it would detach the next statement} WriteLn('Iteration: ', i); repeat a:= a + 1 until a = 10; case i of 0: Write('zero'); 1: Write('one'); 2: Write('two'); 3,4,5,6,7,8,9,10: Write('?') end;
Паскаль структурирует программы на процедуры и функции. Обычно процедура используется для ее побочных эффектов, а функция используется для ее возвращаемого значения.
program Printing; var i: integer; procedure PrintAnInteger(j: integer); begin... end; function triple(const x: integer): integer; begin triple:= x * 3; end; begin { main program }... PrintAnInteger(i); PrintAnInteger(triple(i)); end.
Процедуры и функции могут быть вложены на любую глубину, а конструкция «программа» является самым внешним логическим блоком.
По умолчанию параметры передаются по значению. Если 'var' предшествует имени параметра, он передается по ссылке.
Каждая процедура или функция может иметь свои собственные объявления меток перехода, констант, типов, переменных и других процедур и функций, которые все должны быть в указанном порядке. Это требование к порядку изначально предназначалось для обеспечения эффективной однопроходной компиляции. Однако в некоторых диалектах (например, Delphi ) требование строгого упорядочивания разделов объявлений было ослаблено.
Паскаль перенял многие особенности синтаксиса языка ALGOL, включая использование точки с запятой в качестве разделителя операторов. Это отличается от других языков, таких как PL / I и C, в которых точка с запятой используется в качестве признака завершения оператора. Точка с запятой не требуется перед end
ключевым словом объявления типа записи, блока или оператора case ; перед until
ключевым словом оператора повтора; и перед else
ключевым словом оператора if.
Наличие лишней точки с запятой не разрешалось в ранних версиях Паскаля. Тем не менее, добавление Алгол -как пустых заявлений в 1973 Пересмотренный отчет, а затем меняется на языке ISO 7185: 1983 в настоящее время позволяют необязательных в большинстве запятой из этих случаев. Точка с запятой по-прежнему не разрешается непосредственно перед else
ключевым словом в инструкции if, потому что она else
следует за одним оператором, а не за последовательностью операторов. В случае вложенных ifs нельзя использовать точку с запятой, чтобы избежать проблемы с висячим else (где внутреннее if не имеет else, а внешнее if имеет), предположительно завершив вложенное if точкой с запятой - вместо этого это завершает оба, если статьи. Вместо этого должен использоваться явный блок begin
....end
Для общего использования доступны несколько компиляторов и интерпретаторов Паскаля:
В 1983 году язык был стандартизирован в международном стандарте IEC / ISO 7185 и нескольких местных национальных стандартах, включая американский ANSI / IEEE770X3.97-1983 и ISO 7185: 1983. Эти два стандарта различались только тем, что стандарт ISO включал расширение «уровня 1» для совместимых массивов (массив, границы которого неизвестны до времени выполнения), где ANSI не допускает этого расширения оригинала (Wirth версия) язык. В 1989 году ISO 7185 был пересмотрен (ISO 7185: 1990) для исправления различных ошибок и двусмысленностей, обнаруженных в исходном документе.
Стандарт ISO 7185 был заявлен как разъяснение языка Вирта 1974 года, как подробно описано в Руководстве пользователя и отчете [Дженсен и Вирт], но также отличался добавлением «Соответствующих параметров массива» в качестве уровня 1 к стандарту, уровень 0 - Паскаль. без соответствующих массивов. Это дополнение было сделано по просьбе CAR Hoare и с одобрения Никлауса Вирта. Первопричиной было то, что Хоар хотел создать версию библиотеки числовых алгоритмов (NAG) для Паскаля, которая изначально была написана на ФОРТРАНЕ, и обнаружил, что это невозможно сделать без расширения, которое позволяло бы параметры массива различного размера.. Подобные соображения мотивировали включение в ISO 7185 средства для определения типов параметров процедурных и функциональных параметров.
Сам Никлаус Вирт называл язык 1974 года «стандартом», например, чтобы отличить его от машинно-зависимых функций компилятора CDC 6000. Этот язык был задокументирован в The Pascal Report, второй части «Руководства пользователя и отчета Pascal».
На больших машинах (мэйнфреймы и миникомпьютеры), на которых зародился Паскаль, в целом соблюдались стандарты. На IBM PC их не было. На компьютерах IBM наибольшее количество пользователей имеют стандарты Borland Turbo Pascal и Delphi. Таким образом, обычно важно понимать, соответствует ли конкретная реализация исходному языку Pascal или его диалекту Borland.
Версии языка для IBM PC стали отличаться с появлением UCSD Pascal, интерпретируемой реализации, в которой было несколько расширений языка, а также несколько упущений и изменений. Многие возможности языка UCSD сохранились до наших дней, в том числе на диалекте Borland.
В 1990 году был создан расширенный стандарт Паскаля как ISO / IEC 10206, который идентичен по техническому содержанию IEEE / ANSI 770X3.160-1989. С 2019 года планируется поддержка расширенного Паскаля в компиляторе FreePascal.
Цюрихская версия Паскаля Никлауса Вирта была выпущена за пределами 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 «s Turbo Pascal, написанный Хейлсбергом, был написан на языке ассемблера, независимо от UCSD и составителей Zürich. Однако он принял во многом те же подмножества и расширения, что и компилятор UCSD. Вероятно, это связано с тем, что система UCSD была наиболее распространенной системой Pascal, подходящей для разработки приложений на микропроцессорных системах с ограниченными ресурсами, доступных в то время.
Термоусадочная завернута Turbo Pascal версия 3 и более поздние инкарнации, в том числе от Borland Object Pascal и Delphi и не-Борланда почти совместимых стали популярными с программистами, включая автор условно - бесплатные, и поэтому SWAG библиотека Pascal коды имеет большое количество коды, написанная с такими версии как Delphi в виду.
Программные продукты ( компиляторы и IDE / Rapid Application Development (RAD)) в этой категории:
Паскаль вызвал широкий спектр откликов в компьютерном сообществе, как критических, так и дополнительных.
Будучи очень популярными в 1980-х и начале 1990-х, реализации Паскаля, которые точно следовали первоначальному определению языка Виртом, подвергались широкой критике как непригодные для использования вне обучения. Брайан Керниган, популяризировавший язык C, изложил свои наиболее заметные критические замечания в адрес Паскаль еще в 1981 году в своей статье «Почему Паскаль не является моим любимым языком программирования». Самая серьезная проблема, описанная Керниганом, заключалась в том, что размеры массивов и длина строк были частью типа, поэтому было невозможно написать функцию, которая принимала бы массивы переменной длины или даже строки в качестве параметров. Это сделало невозможным написание, например, библиотеки сортировки. Керниган также раскритиковал непредсказуемый порядок вычисления логических выражений, плохую поддержку библиотеки и отсутствие статических переменных и поднял ряд более мелких проблем. Кроме того, он заявил, что язык не предоставляет никаких простых конструкций для «ухода» (сознательного и принудительного игнорирования) ограничений и ограничений. В более общих жалобах из других источников отмечалось, что объем объявлений не был четко определен в определении исходного языка, что иногда имело серьезные последствия при использовании прямых объявлений для определения типов указателей, или когда объявления записей приводили к взаимной рекурсии, или когда идентификатор мог или, возможно, не использовались в списке перечисления. Другая трудность заключалась в том, что, как и в Алголе 60, язык не позволял процедурам или функциям, передаваемым в качестве параметров, предопределять ожидаемый тип своих параметров.
Несмотря на первоначальную критику, Паскаль продолжал развиваться, и большинство замечаний Кернигана не применимы к версиям языка, которые были улучшены, чтобы быть пригодными для разработки коммерческих продуктов, например Turbo Pascal от Borland. Как предсказал Керниган в своей статье, большинство расширений для исправления этих проблем несовместимы от компилятора к компилятору. Однако с начала 1990-х годов большинство разновидностей, похоже, сгруппированы в две категории: ISO и Borland-like. Extended Pascal обращается ко многим из этих ранних критических замечаний. Он поддерживает строки переменной длины, инициализацию переменных, раздельную компиляцию, логические операторы короткого замыкания и предложения default ( otherwise
) для операторов case.