История языка программирования паскаль. Язык программирования Pascal Основные блоки языка программирования паскаль

В компьютерной науке, язык программирования Паскаль является одним из знаковых языков программирования, на котором много поколений студентов ломали свои зубы и разные варианты которого по-прежнему широко используются и сегодня. "TeX" и большая часть исходной операционной системы "Macintosh" были написаны на языке программирования Паскаль.
Программирование для начинающих. Никлаус Вирт разработал его в 1970 году для структурного программирования, который бы легчо компилировался. Язык программирования Pascal основан на языке программирования Алгол и назван в честь математика и философа Блеза Паскаля, первопроходца в мире основ программирования. Вирт разработал Modula-2 и Оберон, похожие на языки Паскаль, но которые начали поддерживать объектно-ориентированное программирование. .
Базовый синтаксис Типичный пример синтаксиса языка программирования Pascal можно посмотреть на программе "Привет, мир".

PROGRAM HelloWorld; BEGIN WriteLn ("Здравствуй, мир!"); END.

Все программы начинаются с ключевоого слова "PROGRAM" , а блок кода обозначается ключевыми словами "BEGIN" / "END" . Регистр букв (сточные или прописные) не учитывается в языке Pascal. . Точка с запятой отделяют логические выражения, а "END." с точкой в конце завершает блок главной программы. Для некоторых компиляторов ключевок слово PROGRAM является необязательным. Программирование для чайников.
Паскаль, в его первоначальной форме, является чисто процедурным языком со стандартным набором составных операторов if, while, for и связанных с ними конструкций.

Pascal и C
Паскаль был разработан примерно в то же время, как С, поэтому присутствуют важные сходства между ними. Оригинальный Pascal и C небольшие по размеру, процедурные языки, в которых реализована концепция структурного программирования. Оба имеют функциональные возможности для динамического распределения памяти и некоторые инструкции для манипуляции с указателями. Но эти языки совершенно разные по внешнему виду, и Си выглядит более лаконичным. .
Огромным отличием является оператор присваивания, который является источником священной войны: Pascal использует ":=" для присваивания, а "=" используется для сравнения. Это контрастирует с использованием в Си x = y для присваивания и "==" для сравнения. Поскольку символ "=" используется в математике и для сравнения и для присваивания, то разработчик Pascal решил, что лучше использовать ":=" для присваивания, поскольку все таки математикам привычнее видеть знак равенства (=) как символ сравнения. Разработчик Си утверждал, что оператор присваивания гораздо чаще используется, чем сравнение, поэтому она должна иметь короткий символ. На это сторонники Pascal парируют тем, что очень часто при использовании сравнения в условных выражениях программисты ошибочно пишут знак равенства для сравнения.
Эта дискуссия отражает различия в дизайне философии двух языках. Паскаль был разработан в качестве учебного языка. В Паскале очень редки ошибки составных операторов, а также синтаксис сделан интуитивно понятным. Авторы Си уделяли больше внимания краткости.
Еще одной важной разницей является то, что Паскаль является строго типизированным. Это означает, что все переменные должны быть определены в начале программы с указанием типа данных, прежде чем они могут быть использованы. Кроме того, несовместимых по типу данных переменные должны явно приводиться к необходимому типу данных. Это предотвращает типичные ошибки, где переменные используются неправильно, потому что тип неизвестен. Это также снимает необходимость венгерской нотации - практика указания первой буквой переменной начальной буквы типа данных.
В отличие от C, Pascal позволяет определять переменные в любом месте кода. В своем первоначальном виде, Паскалю не хватало механизма для отдельной компиляции или для обработки массивов с размером неизвестным на стадии компиляции, но уже через пару версий языка были устранены эти проблемы.

Реализации
Ранние подходы (в первую очередь UCSD p-System) переводили Pascal код в машинно-независимый представление p-код. Это промежуточный код затем интерпретировался программой в специфичный для каждой архитектуры. Как следствие, только малая часть транслятора была перенесена на многие архитектуры.
В 1980-х годов Андерс Хейлсбергом пишет Blue Label Pascal компилятор для Nascom-2. Позже он перешел на работу в Borland и переписал свой компилятор, чтобы тот стал Turbo Pascal для IBM PC. Это новый компилятор был продан за 49 долларов, что было гораздо меньше, чем первоначальная цена, которую просил Хейлсберг за компилятор Blue Label Pascal.
Недорогой компилятор Borland имел большое влияние на сообщество Паскаля, которое начало свое существование в основном на IBM PC, в конце 1980 года. Многие любители ПК в поисках замены для структурированного BASIC использовали именно этот продукт. Turbo Pascal, будучи доступным только для одной архитектуры, была переведена непосредственно на Intel 8088 в машинный код, что сделало его гораздо быстрее, чем схема, когда Паскаль был интерпретируемых языком.
В 1990-х годах компиляторы, которые могут быть перенесены на различные аппаратные архитектуры стали более распространенными. Это позволило Pascal перевести на машинный код, который был в то же время легко переносимым на новое оборудование.
С Turbo Pascal версии 5 Borland добавила объектно-ориентированный подход в Pascal.
Однако, Borland позже решил, что хочет более сложных объектно-ориентированного программирования, и началась работа над Delphi с использованием Object Pascal стандарта, предложенного Apple в качестве основы. (Этот проект Apple не был формальным стандартом в то время.)Компания Borland также назвала этот язык Object Pascal в первой версии Delphi, но изменила название на язык программирования Delphi в более поздних версиях. Основные изменения по сравнению с первыми версиями были объектная модель на основе указателей, виртуальные конструкторы и деструкторы, и свойства.
Публично доступные компиляторы
Несколько компиляторов Паскаля доступны для использования широкой общественности:

  • GNU Pascal Compiler (GPC) является дополнительным интерфейсом к GNU Compiler Collection (GCC), и написана на Си. свободно распространяется под лицензией GNU General Public License. Хотя поддержка Turbo Pascal (Borland) несколько ограничена.
  • FreePascal написан на языке Паскаль (так что он компилирует сам), и направлен на обеспечение удобным и мощным компилятором, пригодного для компиляции старых приложений и вместе с этим быть средством разработки новых приложений. Также свободно распространяется под лицензией GNU GPL. Он может смешивать Turbo Pascal с кодом Delphi, а также поддерживает много платформ и операционных систем.
  • Turbo Pascal был доминирующим компилятором Pascal для персональных компьютеров в течение 80-х и начале 90-х, популярный как в силу своего мощного расширения и крайне малого времени компиляции. В настоящее время старые версии Turbo Pascal (до 5,5) доступны для свободного скачивания с сайта компании Borland (требуется регистрация).
  • Delphi является флагманских RAD (Rapid Application Development) продуктом от Borland. Он использует язык программирования Delphi, может работать с Паскалем, разработан для создания приложений для платформы Windows. Последняя версия также поддерживает компиляцию в. NET платформы.
  • Kylix это реинкарнация компанией Borland своей продукции Паскаль. Он является потомком Delphi, с поддержкой операционной системы Linux и улучшенной библиотекой объектов. Компилятор и IDE теперь доступны для некоммерческого использования. Сам компилятор (но библиотеки или IDE) должен стать ПО с открытым исходным кодом в скором времени.

Критика из прошлого
Несмотря на популярность (пик которой пришелся на 1980-х и начале 1990-х), в ранних версиях Pascal подвергся широкой критике за то, что не подходит для "серьезного" использования за пределами обучения. Брайан Керниган, один из создателей языка программирования Си, изложил свою наиболее заметную критику Паскаля еще в 1981 году, в своей статье "Почему Паскаль не мой любимый язык программирования". С этого времени Pascal начинает изменяться, и большинство из тех пунктов, которые критиковались, не относятся к текущей реализации.
Многие неосведомленные люди до сих пор продолжают верить, что Паскаль не для "серьезного" программирования и не понимают выгоды, которые предлагает этот язык в данный момент. Это клеймо давит на Pascal больше, чем какой-либо реальный недостаток.

Pascal ) - высокоуровневый язык программирования общего назначения. Один из наиболее известных языков программирования, широко применяется в промышленном программировании , обучении программированию в высшей школе, является базой для большого числа других языков. Был создан Никлаусом Виртом в 1968-69 годах (опубликован в 1970 году) после его участия в работе комитета разработки стандарта языка Алгол-68 .

Предыстория

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

Реализации

UCSD Pascal

В 1978 году в Университете Сан-Диего (Калифорния, США) была разработана система UCSD p-System, включавшая компилятор с языка Паскаль в переносимый p-код и реализовывавшая значительное число расширений языка Паскаль, такие как модули, строки символов переменной длины, директивы трансляции, обработка ошибок ввода-вывода, обращение к файлам по именам и пр. Впоследствии основные реализации языка Паскаль основывались на этом диалекте.

Object Pascal от Apple

Turbo Pascal и Object Pascal от Borland, Microsoft Pascal

Наиболее известной реализацией Паскаля, обеспечившая широкое распространение и развитие языка, является Turbo Pascal фирмы Borland , выросшая затем в объектный Паскаль для DOS (начиная с версии 5.5) и Windows и далее в Delphi, в которой были внедрены значительные расширения языка.

Диалекты Паскаля, применяемые в Turbo Pascal для DOS и Delphi для Windows, стали популярны из-за отстутствия других успешных коммерческих реализаций.

Стандарты

После начала использования Паскаля в 1970 году и появления реализаций, расходящихся не только в дополнениях, но и в синтакисе, был поднят вопрос о стандартизации языка. Стандарт языка был разработан Никлаусом Виртом в 1974 году совместно с Кетлин Йенсен (Kathleen Jensen). В дальнейшем, были приняты международный стандарт от ISO и американский от ANSI. На данный момент, выделяют три принципиально разных стандарта: Unextended Pascal (исходный), Extended Pascal (расширенный), Object-Oriented Extensions to Pascal (объектно-ориентированное расширение Паскаля).

Стандарты языка Pascal: исходный, международные ISO и американские ANSI
Название Вариант Кем/где разработан Год создания
Pascal Standard исходный Н. Вирт, Кетлин Йенсен
Pascal Standard исходный ISO 7185:1983
ANSI/IEEE 770X3.97:1983
Unextended Pascal исходный ISO 7185:1990
Extended Pascal расширенный ANSI/IEEE 770X3.160:1989 1989
ISO/IEC 10206
Object-Oriented
Extensions to Pascal
объектно-ориентированное расширение ANSI/X3-TR-13:1994

Одним из главных дополнительных свойств объектно-ориентированного расширения Extended Pascal стала модульность и средства, облегчающие раздельную компиляцию.

Стандартизация языка была запаздывающий по отношению к реальному появлению в языке тех или иных возможностей. Коммерческие реализации расширяли стандартный Паскаль; так было сделано в UCSD Pascal, модификации Object Pascal фирмой Apple, Turbo Pascal от Borland (незначительно модифицированная версия Apple) и его ответвлений. Ни одна из распространённых коммерческих реализаций Паскаля не соответствует в точности ни одному из официальных стандартов языка.

Синтаксис и языковые конструкции

Паскаль, в его первоначальном виде, представляет собою чисто процедурный язык и включает в себя множество алголоподобных структур и конструкций с зарезервированными словами наподобие if , then , else , while , for , и т. д. Тем не менее, Паскаль также содержит большое количество возможностей для структурирования информации и абстракций, которые отсутствуют в изначальном Алголе-60 , такие как определение типов , записи , указатели , перечисления , и множества . Эти конструкции были частично унаследованы или инспирированы от языков Симула -67, Алгол-68 , созданного Никлаусом Виртом AlgolW и предложены Хоаром .

В современных диалектах (Free Pascal) доступны такие операции как перегрузка операторов и функций.

Hello world

Программы на Паскале начинаются с ключевого слова program и следующего за ним имени программы с точкой с запятой (в большинстве диалектов является необязательным), за именем может в скобках следовать список внешних файловых дескрипторов в качестве параметров; за ним следует тело программы, состоящее из секций описания переменных, типов и констант, объявлений процедур и функций и следующего за ними блока операторов , являющегося точкой входа в программу. В языке Паскаль блок ограничивается ключевыми словами begin и end . Операторы разделяются точками с запятой , после тела помещается точка , служащая признаком конца программы. Регистр символов в Паскале не имеет значения.

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

Пример программы, выводящей строку «Hello, World!»:Program HelloWorld(output);begin

WriteLn("Hello, World!"); { оператор вывода строки }

end.

Типы данных

Примитивные типы данных Паскаля: числа с плавающей запятой (real), целые (integer), символьный (char), логический (boolean) и перечисления (конструктор нового типа, введённый в Паскале):

R: Real; { переменная вещественного типа } i: Integer; { переменная целого типа } c: Char; { переменная-символ } b: Boolean; { логическая переменная } e: (apple, pear, banana, orange, lemon); { переменная типа-перечисления }

Выделяется понятие порядковых типов данных (ordinal), к ним относятся целые типы (знаковые и беззнаковые), логический (boolean), символьный (char), перечислимые типы и типы-диапазоны.

Порядковые типы задаются целым числом (кодом), которое можно получить с помощью функции ord. Все операции, выполняемые над порядковыми типами, выполняются с их кодами.

X: 1..10; y: "a".."z"; z: pear..orange;

Для порядковых типов определены операции inc , dec , succ , pred , ord , операции сравнения (= > < => <= <>), их можно использовать в операторах case , for (как счётчик цикла), как границы массивов, для задания элементов множеств и типов-диапазонов.

В Паскале, в отличие от Си-подобных языков, с типами boolean и char арифметические целочисленные операции не определены.

В отличие от многих распространённых языков, Паскаль поддерживает специальный тип данных множество :var

Set1: set of 1..10; set2: set of "a".."z"; set3: set of pear..orange;

Множество - фундаментальное понятие в современной математике, которое может быть использовано во многих алгоритмах.

В паскале тип множество может содержать только однотипные элементы порядкового типа. Эта особенность широко используется и обычно быстрее эквивалентной конструкции в языке, не поддерживающем множества. К примеру, для большинства компиляторов Паскаля:if i in then { проверка на принадлежность элемента множеству }...обработается быстрее, чемif (i>4) and (i<11) then { проверка логическими условиями }...Для задания значения множества используется список элементов множества, отделенных запятыми и заключённый в квадратные скобки (как уже было показано выше):var { секция объявления переменных }

D:set of char;

begin { начало блока }

D:=["a","b"];

...В Паскале Йенсен и Вирта строки представлялись как упакованные массивы символов; следовательно, они имели фиксированную длину и обычно дополнялись до этой длины пробелами.

В современном Паскале для работы со строками используется встроенный тип string , поддерживающий операции конкатенации (+) и сравнения (> < = <> >= <=). Строки сравниваются в лексикографическом порядке . Например, строки считаются равными если они имеют одинаковую длину и коды всех символов с одинаковыми индексами совпадают.

Тип string [n] или просто string в диалектах языка 1970-1990-х годов определялся в виде массива символов array of char (n по умолчанию принимало значение 80 в UCSD Pascal и 255 в Turbo/Borland Pascal), код нулевого символа при таком представлении служит для задания длины строки, соответственно строка могла иметь максимальный размер 255 символов. По умолчанию в Delphi и FreePascal качестве String используется тип AnsiString, память под который выделяется и освобождается компилятором динамически, а максимальный размер строки в текущих реализациях составляет 2 гигабайта. Кроме того, в Delphi и Free Pascal в качестве string может использоваться тип WideString, где применяется 16-битное представление символов в кодировке UCS-2 , при этом средства преобразования из однобайтовых строк в многобайтовые и обратно в стандартной библиотеке языка отсутствуют.

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

X = Integer; y = x;

...Более того, из примитивных типов могут быть сконструированы составные:type { секция объявления типов }

A = Array of Integer; { определение массива } b = record { определение записи } x: Integer; y: Char; end; c = File of a; { определение файла }

Файловые типы в Паскале делятся на типизированные, текстовые и файлы без типов.

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

Файлы без типов объявляются как переменные типа file . С ними можно проводить операции побайтового нетипизированного ввода-вывода по несколько блоков байт указанной длины через буфер, для этого служат специальные процедуры blockread и blockwrite (расширение UCSD).

Указатели

Паскаль поддерживает использование указателей (типизированные ^тип и нетипизированные pointer):type

A = ^b; b = record x: Integer; y: Char; z: a; end;

Pointer_to_b:a;

Здесь переменная pointer_to_b - указатель на тип данных b , являющийся записью. Тип типизированного указателя может быть задан перед объявлением типа, на который он ссылается. Это исключение к правилу, которое гласит, что любая вещь должная быть объявлена перед тем, как используется. Введение этого исключения позволило организовывать рекуррентные определения структур данных, в том числе такие, как линейные списки , стеки и очереди , включая указатель на запись в описании этой записи (см. также: нулевой указатель - nil).

Для типизированного указателя определена операция разыменования (её синтаксис: указатель^).

Чтобы создать новую запись и присвоить значение 10 и символ A полям a и b в ней, необходимы следующие операторы:new(pointer_to_b); { выделение памяти указателю }

pointer_to_b^.x:= 10; { разыменовывание указателя и обращение к полю записи }pointer_to_b^.y:= "A";pointer_to_b^.z:= nil;...dispose(pointer_to_b); { освобождение памяти из-под указателя }Для целей обращения к полям записей и объектов можно также использовать оператор with , как показано в примере:new(pointer_to_b);

with pointer_to_b^ dobegin

X:= 10; y:= "A"; z:= nil

end;...dispose(pointer_to_b);

Процедурный тип

В оригинальном языке Паскаль Йенсен и Вирта процедурный тип использовался только при описании формального параметра. Уже в TP существовал полноправный процедурный тип . В объявлении типа ставится заголовок процедуры либо функции (без имени), обобщённо описывающий интерфейс подпрограммы. Значение этого типа содержит указатель на подпрограмму с заголовком, соответствующую описанному в объявлении типа. С помощью идентификатора переменной может происходить вызов соответствующей процедуры или функции.type myfunc=function:string;

function func1:string;begin

Func1:="func N 1"

function func2:string;begin

Func2:="func N 2"

var fun:myfunc;begin

Fun:=@func1;writeln(fun) {происходит вызов функции func1}

end.

Операторы управления выполнением программы

Паскаль - язык структурного программирования , что означает, что программа состоит из выполняющихся последовательно отдельных стандартных операторов, в идеале - без использования команды GOTO .while a <> b do { цикл с предусловием }

Writeln("Ожидание");

if a > b then { условный оператор }

Writeln("Условие выполнилось")

else { else-секция - может отсутствовать}

Writeln("Условие не выполнилось");

for i:= 1 to 10 do { итерационный цикл }

Writeln("Итерация №", i:1);

repeat { цикл с постусловием }

A:= a + 1

case i of { условный оператор множественного выбора }

0: write("ноль"); 1: write("один"); 2: write("два") else write("неизвестное число") { else-секция - может отсутствовать}

end;В операторах while , for , if , case в качестве выполняемого оператора может использоваться блок . Такая конструкция, представляющая собой обычный оператор или блок, называется сложным оператором .

Для управления процессом компиляции в паскале существуют директивы компилятора. Они помещаются в комментарии и позволяют переключать режимы работы компилятора, например, включать и отключать проверку операций ввода-вывода, проверки переполнения:

Assign(inp,"text.txt"); {$I-} { отключение режима IO checking- генерации кода завершения программы в случае ошибки ввода-вывода } { (для случая, если файл не найден)} reset(inp); {$I+} { включение режима IO checking } if IOresult=0 then begin { проверяем значение переменой ioresult(<>0 в случае ошибки ввода-вывода) } ... close(inp); end else writeln("file not found")

Существуют директивы, аналогичные директивам препроцессора C/C++ ($ifdef , $define , $include), они обрабатываются компилятором в процессе компиляции.

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

В Паскале подпрограммы делятся на процедуры и функции:

Синтаксически процедуры и функции состоят из заголовка (содержащего ключевое слово procedure или function , имени, за которым может следовать описание передаваемых параметров в скобках, тип возвращаемого значения через символ двоеточия для функций и точки с запятой), после заголовка следует тело , после которого ставится символ; .program mine(output);

procedure print(var j: integer);

Function next(k: integer): integer; begin next:= k + 1 end;

Writeln("Всего: ", j); j:= next(j)

I:= 1; while i <= 10 do print(i)

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

Причём содержимое секций описания переменных, типов, констант, внешнего тела (процедуры, функции, программы), расположенных перед описанием процедуры/функции, доступны внутри неё. Также, в большинстве диалектов из процедуры можно обращаться к параметрам внешней процедуры.

Вслед за заголовком процедур/функций вместо тела может помещаться ключевое слово forward , это делается в том случае, если описание процедуры/функции располагается в программе после её вызова, и связано с поддерживаемой в Паскале возможностью компиляции программы за один проход.

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

Модули

До появления модулей в их современном виде некоторые реализации Паскаля поддерживали модульность за счёт механизма включения заголовочных файлов, похожего на механизм #include в языке Си: с помощью специальной директивы, оформляемой в виде псевдокомментария, например, {$INCLUDE "файл"} , содержимое указанного файла прямо включалось в текст программы в исходном, текстовом виде. Таким образом можно было разделить программный код на множество фрагментов, для удобства редактирования, но перед компиляцией они автоматически объединялись в один файл программы, который в итоге и обрабатывался компилятором. Такая реализация модульности примитивна и имеет множество очевидных недостатков, поэтому она была быстро заменена.

Современные реализации языка Паскаль (начиная с UCSD Pascal) поддерживают модули. Программные модули могут быть двух видов: модуль главной программы, который, как обычно, начинается с ключевого слова program и тело которого содержит код, запускаемый после загрузки программы в память, и вспомогательных модулей, содержащих типы, константы, переменные, процедуры и функции, предназначенные для использования в других модулях, в том числе в главном модуле.

Структура

Общая структура подключаемого модуля на Паскале выглядит следующим образом:unit UnitName1;interface

... ...

begin {может отсутствовать-используется, если необходимо поместить операторы инициализации}

...

end.Возможен также ещё один вариант:unit UnitName2;interface

... ... ... ...

end.В отличие от главной программы, файл модуля начинается с ключевого слова UNIT , за которым следует имя модуля и точка с запятой. Современные реализации, как правило, требуют, чтобы имя модуля совпадало с именем файла исходного кода, в котором этот модуль содержится. Модуль содержит три секции: интерфейсную секцию, секцию реализации и тело модуля.

Интерфейсная секция идёт первой, начинается с ключевого слова INTERFACE и заканчивается в том месте модуля, где начинается секция реализации или тело. В интерфейсной секции объявляются те объекты (типы, константы, переменные, процедуры и функции - для них помещаются заголовки), которые должны быть доступны извне модуля. При этом допускается частичное объявление типов: они могут объявляться без указания структуры, одним только именем. При использовании такого типа во внешней программе допускается объявление переменных и параметров этого типа, присваивание значений, но невозможно получить доступ к деталям его реализации. Процедуры и функции в интерфейсной секции объявляются в виде форвардов - заголовков с параметрами, но без тела. Состав интерфейсной секции модуля таков, что его достаточно для генерации кода, использующего данный модуль. Переменные, объявленные в интерфейсной секции, являются глобальными, то есть существуют в единственном экземпляре и доступны во всех частях программы, использующих данный модуль.

Секция реализации следует за интерфейсной и начинается с ключевого слова IMPLEMENTATION . В нём располагаются описания процедур и функций, объявленных в интерфейсной секции, а также описания типов, констант, переменных, процедур и функций, которые необходимы для реализации интерфейсных процедур и функций. Описание процедуры или функции, объявленной в интерфейсной секции, должно иметь в точности такой же заголовок, как в объявлении. В теле могут использоваться другие процедуры и функции данного модуля, объявленные как в интерфейсной части, так и в секции реализации. Переменные, объявленные в секции реализации, являются, по сути, глобальными (то есть существует только один экземпляр каждой такой переменной на всю программу), но доступны они только из процедур и функций, описанных в секции реализации данного модуля, а также из его тела. Если в интерфейсной секции есть сокращённые объявления типов, то эти типы должны быть полностью описаны в секции реализации.

Тело модуля начинается находящимся на верхнем уровне вложенности ключевым словом BEGIN . Тело содержит программный код, который выполняется один раз при загрузке модуля. Тело может применяться для инициализации, присваивания начальных значений переменным модуля, выделения ресурсов для его работы и так далее. Тело модуля может отсутствовать. В ряде реализаций Паскаля, например, в Delphi, вместо тела модуля могут применяться две секции (также необязательные) - INITIALIZATION и FINALIZATION . Они располагаются в конце модуля, после соответствующего ключевого слова. Первая - секция инициализации, - содержит код, который должен быть выполнен при загрузке модуля, вторая - секция финализации, - код, который будет выполнен при выгрузке модуля. Секция финализации может выполнять действия, обратные инициализации - удалять объекты из памяти, закрывать файлы, освобождать выделенные ресурсы.

Модуль заканчивается ключевым словом END с точкой.

Использование

Чтобы использовать модуль, главная программа или другой модуль должны импортировать данный модуль, то есть содержать объявление о его использовании. Это объявление делается с помощью инструкции подключения модулей, представляющей собой ключевое слово USES , за которым через запятую следуют имена модулей, которые требуется подключить. Инструкция подключения должна следовать непосредственно за заголовком программы, либо после ключевого слова INTERFACE , если подключение производится в модуле.

Модули, подключённые в интерфейсной секции, могут использоваться во всём модуле - и в секции реализации, и в теле. Но секция реализации может иметь собственную инструкцию подключения (она следует за ключевым словом IMPLEMENTATION), содержащую имена подключаемых модулей, которые отсутствуют в интерфейсной секции, но нужны для секции реализации. Одним из поводов использования отдельного списка подключения для раздела реализации является ситуация, когда два или более модуля используют друг друга. Чтобы не возникали циклические ссылки в объявлениях использования таких модулей, по крайней мере один из них должен подключать другой в секции реализации.

Любые объявленные в интерфейсных секциях модулей объекты можно использовать в программе там, где эти модули подключены. Имена импортированных из подключённых модулей объектов остаются теми же самыми, и их можно использовать непосредственно. Если два или более подключённых модуля имеют объекты, называемые одинаково, и компилятор не может их различить, то при попытке использования такого объекта будет выдана ошибка компиляции - неоднозначное задание имени. В этом случае программист должен применять квалификацию имени - указать имя в формате «<имя_модуля>.<имя_объекта>».

Проблемы могут возникнуть, если появляется необходимость использования в программе двух разных одноимённых модулей. Если модули доступны только в откомпилированном виде (то есть поменять их имена невозможно), оказывается невозможным их одновременный импорт. Стандартного решения такой коллизии на уровне языка не существует, но конкретные компиляторы могут предлагать те или иные способы её обхода, в частности, средства назначения псевдонимов импортируемым модулям и прямого указания, какой модуль из какого файла брать.

Компиляция и компоновка

Модули спроектированы в расчёте на обеспечение раздельной компиляции - компилятор не должен компилировать импортированные модули для того, чтобы откомпилировать модуль, который их использует. Однако, чтобы правильно компилировать модуль, компилятор должен иметь доступ к секции интерфейса всех используемых им модулей. Существует два разных, иногда совмещаемых подхода к организации такого доступа.

  • Модули компилируются в бинарные файлы специального формата (у каждого компилятора своего), в которых сохранена подробная информация об объектах, объявленных в интерфейсной секции, также может содержаться созданный при компиляции модуля объектный код. При компиляции любого модуля компилятор требует, чтобы все импортируемые модули были уже откомпилированы и доступны. В таком случае, при наличии правильно откомпилированных модулей, их исходные тексты на этапе компиляции не нужны.
  • Модули компилируются в обычные бинарные файлы и подключаются компоновщиком только на этапе сборки конечного исполняемого файла программы. Для обработки обращений к подключаемым модулям компилятор обрабатывает непосредственно текст этих модулей на исходном языке, но использует при этом только интерфейсную секцию модуля. Если библиотечный модуль поставляется в откомпилированном виде (без полных исходных текстов), то вместе с бинарным файлом идёт урезанный файл исходного кода модуля, содержащий только интерфейсную секцию. Компилятору этого достаточно, чтобы правильно обрабатывать обращения из использующих модулей, а на этапе сборки программы компоновщик просто включает в программу бинарный файл.

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

Любое программное обеспечение создается при помощи различных языков программирования. Одним из таковых является Pascal, о котором слышало достаточно большое количество юзеров, однако, мало кто из них имеет хоть малейшее представление о нем.


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

Немного истории

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

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

Эволюция Pascal

Этот язык программирования шагал в ногу со временем и развитием высоких технологий, поэтому постоянно совершенствовался. Таким образом, его эволюция выглядит следующим образом:

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

Object Pascal: представляет собой объектное расширение для базовой версии Pascal и была создана Никлаусом Виртом совместно с компанией Apple.

Turbo Pascal: была разработана в 1983 году совместно с программистами из компании Borland и стала первой в истории интегрированной средой. Тем не менее считать эту версию революционной не совсем правильно, поскольку в ее основу был положен Odject Pascal, поэтому особых различий между ними не было. Стоит отметить, что на базе Turbo Pascal компания Microsoft разработала собственный язык программирования, однако, он получился неудачным и не смог укрепиться на рынке.

Современный Object Pascal: в наши дни этот язык программирования является очень популярным и востребованным, и выпускается в отдельной редакции, в которой собраны все самые лучшие инструменты и наработки. Большая популярность этой версии Паскаля обусловлена великолепной совместимостью со всеми существующими операционными системами на сегодняшний день.

Особенности

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

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

Недостатки

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

Тем не менее несмотря на довольно приличный список недостатков Pascal, этому языку удалось обойти многих своих оппонентов. Например, с выходом новой версии в 1980 году, Pascal с колоссальным разрывом опередил Fortran, в котором, к слову, было значительно больше недостатков. Таким образом, всего за несколько лет Паскаль смог надежно укрепиться на рынке и завоевать звание одного из лучших языков программирования, а его изучение стало обязательным во многих школах по всему миру. Помимо этого, большинство программ, которые только можно найти в сети, созданы именно на базе Pascal, что уже говорит о многом.

Структура

Программный код любой программы, которая пишется на языке Pascal, начинается со специального тега Program, вслед за которым следует название утилиты, а в конце ставится знак препинания «точка с запятой». Стоит отметить, что это условия не является обязательным, поэтому его соблюдение не считается строгим. Вслед за этим тегом могут прописываться основные рабочие параметры программы, которые реализованы в виде списка конфигурационных файлов. Далее, идет основная часть программного кода - тело, которое разделено на отдельные блоки, содержащие информацию переменных, типов, процедур, функций и констант. После тела идет точка входа, которая также называется блоком операторов, помещенная между тегами begin и end, определяющими его границы. Для разделения операторов используется «;», а для закрытия блока просто ставиться точка.

Задействование модулей

Чтобы задействовать какие-либо модули в программе необходимо предварительно объявить о нем. Для этого предназначены инструкции подключения, которые имеют вид строки обычного программного кода, начинающейся со слова USES, вслед за котором идет перечисление всех внешних модулей, которые будут задействованы при написании программы. Стоит отметить, что возможность задействования модулей реализована далеко не во всех версиях Pascal. Например, самые первые редакции были лишены этой возможности.

Пунктуация

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

— «;» - предназначена для разделения операторов между собой и ставиться в конце строки. Не является обязательной к использованию перед закрывающим тегом end.

— «,» - отвечает за разделение различных объектов в пределах одного списка.

— «.» - ставиться в конце программного кода после закрывающего тега.

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

Среди множества языков программирования, предназначенных для обучения именно навыкам программирования, есть один, выделяющийся особо. Язык Паскаль, названный в честь французского ученого XVII столетия Блеза Паскаля, был разработан в конце 1960-х гг. ученым из Швейцарии Никлаусом Виртом, и далеко не с образовательной целью, как этот язык воспринимают теперь.

Наоборот, в те времена ученые пробовали разные языки программирования для практического применения. И позже этот ученый позднее создал ещё два языка программирования – Оберон и Модула, которые, правда, не получили распространения среди специалистов. Если быть точным, то 1968 году была создана первая версия языка Паскаль (на основе АЛГОЛа), а 1970 году – первый компилятор.

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

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

Особенно это стало ясно после того, когда около 1970-го года профессор Хоар опубликовал две статьи: «Аксиоматическая основа программирования для вычислительных машин» и «О структурной организации данных», в которых делается попытка осмыслить правильность составления алгоритмов программ с математической точки зрения. Как раз язык программирования Паскаль и является первым из языков, в котором имеются все необходимые инструменты для проверки эффективности написанных программ.

Ещё одной отличительной особенностью Паскаля является его строгая типизация данных, среди которых возник новый ранее не использовавшийся тип – перечислимый. Фактор строгой типизации сделал репутацию Паскалю как дисциплинирующего языка, приучающий программиста к логическому мышлению.

В Паскале допускается несвязанность программного кода (в отличие от тогдашних языков COBOL и FORTRAN), то есть допускается сколь угодно большое наличие пустых строк, что удобно при форматировании при написании комментариев. Программу на Паскале можно написать хоть в одну строчку – она все ровно будет работать, если написана в соответствии с правилами.

Но с распространением этого языка программирования оказалось, что в нем не хватает многих привычных для нас элементов – возведения в степень, понятия локальной переменной, динамических массивов, возможность использования машинного языка и др. Наиболее известным выражением этого недостатка того времени является статья Кернигана «Почему Паскаль не является моим любимым языком программирования».

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

Язык программирования Pascal был разработан в 1968-1971 гг. Никлаусом Виртом в Цюрихском институте информатики (Швейцария). Первоначальная цель разработки языка PASCAL - необходимость инструмента "для обучения программированию как систематической дисциплине". Однако очень скоро обнаружилась чрезвычайная эффективность языка PASCAL в самых разнообразных приложениях, от решения небольших задач вычислительного характера до разработки сложных программных систем - компиляторов, баз данных, операционных систем и т.д. К настоящему времени Pascal принадлежит к группе наиболее распространенных и популярных в мире языков программирования. Существуют многочисленные реализации языка практически для всех машинных архитектур, разработаны десятки диалектов и проблемно-ориентированных расширений языка Pascal.

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

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

Тем не менее, достоинства языка заставляли многие коммерческие и некоммерческие организации разрабатывать системы программирования на основе языка Паскаль.

Из числа последних выделяется фирма Borland, Turbo Pascal (затем Borland Pascal) которой был значительно расширен, были устранены многие недостатки языка, добавлены новые возможности. Язык стал богаче, но одновременно, потерял переносимость и общность.

Важным шагом в развитии языка, является появление свободного языка Паскаль GNU Pascal , который не только вобрал в себя черты других Паскалей, не только позволил наконец полностью отказаться от «грязных» приемов программирования, особенно присущих, скажем, Turbo Pascal , но и обеспечил черезвычайно широкую портабельность написанных на нем программ (более 20 различных платформ, под более чем 10 различными операционными системами).

В настоящий момент пользуются популярностью такие версии языка как TMT Pascal , Free Pascal и GNU Pascal . Продолжает использоваться и Borland Pascal . Развитием языка Borland Pascal является Object Pascal - версия языка Паскаль расширенная средствами объектно-ориентированного программирования. Последние версии Borland Pascal лежат в основе среды программирования Delphi .