Pascal — что это за язык, чем он хорош и почему его до сих пор преподают в школах
Изучаем язык предков и пишем первый проект — консольную игру.
Иллюстрация: Оля Ежак для Skillbox Media
Если вы не пропускали школьные уроки информатики, слово Pascal наверняка вызывает у вас лёгкий трепет. Пускай на этом языке давно уже не пишут серьёзный софт, зато он идеален для первых шагов в программировании.
В этой статье разберёмся, что такое Pascal, как он появился, из чего сделан, и за что его так любят преподаватели. А бонусом пробуем написать на Pascal первое приложение — консольную игру «Камень, ножницы, бумага».
Содержание
Что такое Pascal
Pascal — это процедурный язык программирования, названный в честь французского математика и физика Блеза Паскаля. Изначально язык создавался для обучения студентов структурному программированию — но оказался так хорош, что в конце XX века стал одним из самых популярных в мире.
Язык создал Никлаус Вирт, всемирно известный программист и информатик. Идея разработать Pascal ему пришла во время работы над Algol-60, другим популярным языком того времени. Вирт вместе с коллегами занимался улучшением Algol — пытался сделать его проще, лаконичнее и функциональнее. Так появился диалект Algol W, который впоследствии и лёг в основу Pascal. Подробнее о том, как создавался язык, читайте в нашей статье про Никлауса Вирта.
Одной из целей разработки Pascal было обучение студентов программированию, поэтому из сложного синтаксиса Algol убрали всё лишнее, что помогло значительно снизить порог входа.
Вот основные фишки языка:
- Простой синтаксис. Из Алгола убрали неочевидные правила оформления кода, а конструкции операторов for, if и while стали занимать меньше строк.
- Строгая типизация. В Алголе была мощная система работы с типами данных, но новичку с ней было сложно разобраться. Поэтому для Pascal Вирт выбрал строгую типизацию, когда все переменные, функции и параметры надо объявлять с явным указанием типа.
- Строгая структура управления. На данных, полученных в процессе выполнения кода, программы могли создавать новые функции. Из Pascal эту фичу убрали, чтобы упростить логику.
- Множества. Вирт добавил в Pascal поддержку множеств — коллекций уникальных символов, которое можно объединять между собой и искать пересечения. Сейчас множества встречаются во многих языках программирования, но в 1970 году это был новаторский инструмент.
- Ограниченная вложенность. В Algol можно было использовать глубоко вложенные друг в друга блоки кода. Это удобно для разработки больших и сложных проектов, но в скриптах для обучения фича практически бесполезная. Поэтому её тоже не включили в Pascal.
- Структуры данных. В Pascal появилась возможность объединять разные типы данных в одну структуру. Для их обозначения Вирт ввёл ключевое слово record. Позже эту концепцию адаптировали для C/C++.
Всего за 20 лет Pascal стал одним из самых популярных алгоритмических языков программирования. Крупные технологические компании того времени начали выпускать собственные версии компиляторов и даже реализаций Pascal, добавляя в язык то, что не было предусмотрено в оригинальной версии. Так на свет появились Object Pascal, Turbo Pascal, Free Pascal, PascalABC.NET и Delphi.
Для чего нужен язык Pascal
Pascal задумывался Виртом как язык для обучения студентов азам структурного программирования — и до сих пор широко используется в этом качестве. Язык преподают в школах и вузах по всему миру, на нём же пишутся примеры кода и задачи для госэкзаменов. Например, в России на ОГЭ школьникам предлагают ответить, что делает код программы, написанный на Pascal.
Сейчас Pascal не используют для разработки сервисов и приложений, которыми каждый день пользуются миллионы человек. Инженеры отдают предпочтение более быстрым и универсальным языкам программирования, например Java, Python или JavaScript.
Однако в прошлом Pascal выбирали и крупные компании. Например, на нём написали код операционной системы для компьютера Apple Lisa. Для этого в 1980-е инженеры Apple разработали Object Pascal — объектно-ориентированную версию языка программирования, которую использовали практически во всех своих проектах до середины 1990-х годов.
Если вы считаете себя продвинутым пользователем Windows, то наверняка хотя бы раз пользовались файловым менеджером Total Commander. Многие его компоненты до сих пор написаны на Pascal.
Pascal для основы системы вёрстки TeX выбрал информатик Дональд Кнут. Одна из реализаций этой системы, LaTeX, до сих пор активно используется. Например, для представления математических формул в статьях на «Википедии» или для вёрстки текстов научных работ.
Ещё больше софта написано на языке программирования Delphi, который основан на базе объектно-ориентированной версии языка, — Object Pascal. Например, его использовали для Skype, ранних версий игрового движка Unreal Engine, архиватора WinRAR, цифровой музыкальной станции FL Studio и некоторых модулей macOS.
Реализации Pascal
Детище Вирта понравилось не только студентам, но и сообществу. Поэтому компании начали создавать собственные реализации Pascal, добавляя в него необходимые функции. Посмотрим на популярные диалекты и языки программирования, разработанные на базе Pascal.
Object Pascal
В 1986 году группа инженеров под руководством Ларри Теслера разработала для Apple объектно-ориентированную версию языка Pascal — Object Pascal. В языке программирования появились классы, объекты и наследование, а разработчикам открылись новые возможности. Например, стало возможно переиспользовать код, чтобы не приходилось каждый раз переписывать фичи.
Благодаря этому язык стал пригодным для использования в больших проектах. Позже его ещё много раз дорабатывали разные компании. Например, инженеры Borland добавили в него динамическую типизацию — это когда одна и та же переменная может иметь разные типы в разных участках программы.
Читайте также:
Turbo Pascal
Turbo Pascal — среда разработки и диалект языка Pascal, который использовался для работы в ней. Приставку Turbo он получил из-за высокой скорости компиляции кода. Обычно компиляторы проходили по коду несколько раз, создавая сначала промежуточные файлы, а потом связывая их. Turbo Pascal было достаточно всего один раз пройтись по коду проекта, чтобы сразу скомпилировать исполняемый файл. А ещё диалект создавали для систем с ограниченными ресурсами, поэтому компилятор не нагружал память и процессор компьютера.
Читайте также:
Разработкой реализации занимались инженеры компании Borland, а за основу они взяли UCSD Pascal, который использовался на компьютерах Apple II.
Free Pascal
В 1997 году появился Free Pascal — реализация с открытым исходным кодом, которая взяла в себя простоту классической версии Pascal и возможности ООП. Для сообщества открытость была важной фишкой языка, так как появилась возможность переносить Pascal на любые платформы и операционные системы. Сейчас реализация Free Pascal поддерживает более 30 платформ, включая Windows, Linux, macOS, Android, MS-DOS, FreeBSD, Game Boy Advance и Nintendo DS.
Delphi
Delphi — язык программирования от компании Borland, который вырос из Object Pascal. Его создали для того, чтобы было удобнее разрабатывать полноценные программы для ПК — например, добавили библиотеку для разработки графических интерфейсов и инструменты для работы с базами данных.
В отличие от Pascal Delphi умеет компилироваться в кросс-платформенные приложения — для Windows, macOS, Linux, Android и iOS. Также язык поддерживает куда больше библиотек — например, для работы с сетью и графикой.
PascalABC.NET
В 2007 году Южный федеральный университет (ЮФУ) в Ростове-на-Дону выпустил PascalABC.NET — собственную реализацию, которая вобрала в себя возможности Delphi, получила собственные модули и поддержку платформы .NET.
Почему Pascal до сих пор используют для обучения школьников
С релиза Pascal прошло больше 50 лет, и язык воспитал не одно поколение разработчиков. Несмотря на появление более современных языков программирования, Pascal продолжают использовать в школах и на младших курсах вузов. На это есть несколько причин:
Простой синтаксис. Код на Pascal легко писать и читать, поэтому начинающие разработчики могут сфокусироваться на решении задачи, а не бороться со сложностями языка.
Структурированность. Программы на Pascal состоят из блоков кода, поэтому школьники привыкают придерживаться строгой структуры. В следующем примере программа состоит из двух блоков кода: основной программы и процедуры PrintNumbers.
Безопасность. Строгая типизация Pascal исключает появление ошибок в процессе работы программы. Если типы переменных не будут соответствовать заданным значениям, компилятор заметит ошибку и не позволит разработчику «выстрелить себе в ногу».
Лёгкий переход. В Pascal есть всё, что используется в современных языках программирования, поэтому разработчики могут без проблем перейти на Python, Java или C++. Для перехода надо будет ознакомиться только с особенностями нового языка, но при этом не придётся снова погружаться в базовые концепции.
Вот, например, как выглядит простая программа для вывода чисел на экран, написанная на Pascal и Java. Сразу видно, что синтаксис языков различается — однако основные принципы остаются теми же: переменные, циклы, вывод на экран и сама модель построения программы.
Pascal
Java
Традиции. В образовательных системах многих стран мира Pascal десятилетиями использовался для обучения программированию. За это время скопилось множество учебников и пособий, а также появились преподаватели с опытом в Pascal. Поэтому учебные заведения продолжают использовать накопившийся опыт и параллельно разрабатывают программы обучения на основе других языков программирования, например Python.
Синтаксис Pascal
Теперь давайте разберём синтаксис Pascal более подробно. Чтобы экспериментировать с примерами из статьи, можно использовать онлайн-компиляторы, например GDB и JDoodle.
Структура программы
Код любой программы на Pascal должен соответствовать чёткой структуре. Если ей пренебречь, то код просто не запустится. Так в общем виде выглядит шаблон программы:
Построчно разберём её:
- program MyFirstProgram — заголовок программы, в котором указывается название. Этот блок необязательный и может совпадать с именем файла.
- const — блок с объявлением постоянных значений (констант), которые не изменяются по ходу выполнения программы.
- var — блок с объявлением переменных. На этом этапе им не надо передавать значения, достаточно просто указать тип.
- procedure ProcedureName; — блок объявления процедур. Важно, чтобы код самой процедуры находился между ключевыми словами begin и end.
- function FunctionName: returnType; — блок объявления функций. Тут всё то же самое, что и с процедурами, только надо указать тип значения, которое возвращает функция.
Важно!
Процедуры и функции в Pascal очень похожи друг на друга, но надо помнить, что функция должна обязательно вернуть значение в конце своей работы. В современных языках программирования нет различия между этими понятиями, поэтому если вы никогда не сталкивались с Pascal, то это может запутать.
- Основной код программы — код, который идёт в самом конце после объявления всего, что в нём будет использоваться. Также должен находиться строго между ключевыми словами begin и end. В конце программы надо поставить точку.
Из примеров выше можно заметить, что в качестве разделителя в конце строки надо ставить точку с запятой (;). Это правило верно для всех случаев, кроме операторов else и until. Перед их объявлением точку с запятой ставить не нужно.
Переменные и типы данных
Pascal — язык со строгой типизацией. Это значит, что мы должны явно указывать тип данных для каждой переменной. Разработчики могут использовать следующие простые типы данных:
Тип | Служебное слово | Пример |
---|---|---|
Целые числа | integer | 345 |
Числа с плавающей точкой | real | 3,14 |
Логический тип | boolean | true (истина) или false (ложь) |
Символы | char | 'F' |
Помимо простых типов, в Pascal используются структурные, которые объединяют несколько элементов в более сложную структуру:
- Массив — это структура данных, которая хранит в себе несколько элементов одного типа. При объявлении надо обязательно указать имя, размер массива и используемый тип данных. В коде программы к элементам массива можно обращаться по индексу.
- Множество — структурный тип данных, который хранит в себе коллекцию уникальных элементов одного и того же типа. С множествами можно производить операции, например объединение, пересечение и проверку принадлежности элемента к множеству.
Операторы
Операторы — это небольшие команды, которые говорят компьютеру, что надо делать с переменными. Например, мы уже встречали оператор присвоения — :=. Он сообщает, что значение справа нужно записать в переменную слева. Давайте посмотрим на другие операторы в Pascal.
Чаще всего разработчики пользуются арифметическими операторами. Они выглядят и работают так же, как в математике, но есть и исключения:
Оператор | Значение | Пример |
---|---|---|
+ | Сложение | a + b |
- | Вычитание | a - b |
* | Умножение | a * b |
/ | Деление | a / b |
div | Целочисленное деление | a div b |
mod | Остаток от деления | a mod b |
После идут операции сравнения. Они сравнивают значение слева со значением справа и возвращают true (истина) или false (ложь):
Оператор | Значение | Пример |
---|---|---|
= | Равно | a = b |
<> | Не равно | a <> b |
> | Больше | a > b |
< | Меньше | a < b |
>= | Больше или равно | a >= b |
<= | Меньше или равно | a <= b |
Логические операторы выполняют операции над логическими значениями:
- and — логическое И;
- or — логическое ИЛИ;
- not — логическое НЕ.
Также свои операторы есть у множеств. Они нужны для удобной работы со структурой данных, чтобы разработчику не надо было реализовывать всё с нуля:
- + — объединение множеств;
- * — пересечение множеств;
- - — разность множеств;
- in — проверка принадлежности элемента множеству.
Например, вот так можно объединить множество [1, 2, 3] с множеством [3, 4, 5] и получить множество [1, 2, 3, 4, 5]:
Условные операторы
С помощью условных операторов можно выполнять определённые действия только в том случае, если выполняются поставленные условия. Чаще всего используется конструкция if … then … else. В общем виде он выглядит так:
Ключевое слово else нужно для описания операций, которые программа должна выполнить, если окажется, что поставленное условие ложно. Это необязательное ключевое слово, поэтому от него можно отказаться, если оно не нужно в программе.
Напишем код, который проверяет, чтобы содержимое переменной x было больше 3. Если условие соблюдается, то в консоли пользователь увидит сообщение x > 3, иначе появится сообщение x <= 3. Используем функцию writeln() для вывода текста в консоль:
Если нужно выбрать одно действие из нескольких заготовленных, то лучше воспользоваться оператором case … of. В общем виде он выглядит так:
В коде выше:
- Выражение — переменная или выражение, результат которого Pascal будет проверять на соответствие значениям.
- Значения — возможные значения выражения.
- Оператор — действие, которое надо выполнить, если выражение равно соответствующему значению.
- else обрабатывает случай, если ни одно из значений не подошло.
Напишем программу, которая будет выводить название дня недели, исходя из его порядкового номера:
Переменная day равна 4, поэтому код выше выведет в консоль Четверг.
Циклы
С помощью циклов можно многократно выполнять блок кода, пока истинно указанное условие. В Pascal есть три вида циклов:
- for … to … do используется, когда заранее известно количество итераций, а значение управляющей переменной увеличивается или уменьшается на каждом шаге.
- while … do выполняется до тех пор, пока условие цикла истинно. Количество итераций заранее не известно.
- repeat … until также выполняется до тех пор, пока истинно поставленное условие.
Комментарии
Для комментирования кода в Pascal есть два оператора: { … } и (* … *). С их помощью можно выделить код и текст, который проигнорирует компилятор. Например, чтобы добавить пояснения для сложной функции или объяснить работу алгоритма программисту, который будет работать после вас. Операторы различаются только синтаксисом, поэтому можно использовать любой, но важно помнить, что нельзя начать комментарий одним оператором, а закончить другим:
{ … *).
Комментарии могут быть однострочными и многострочными:
Привет, Pascal: пишем игру «Камень, ножницы, бумага»
Мы уже достаточно знаем для того, чтобы запрограммировать настоящую игру, которая будет работать в терминале. Напишем код для «Камень, ножницы, бумага» — простой детской игры. Для этого ещё познакомимся с модулем crt, который нужен для работы с консолью, и генератором случайных чисел.
Настраиваем окружение
Для разработки на Pascal нужен компилятор, совместимый с вашей операционной системой. Рассмотрим установку всего необходимого на примере реализации PascalABC.NET для Windows:
- Перейдите на официальный сайт проекта PascalABC.NET и откройте раздел Скачать.
- Выберите необходимую сборку (с задачником или без него) и нажмите кнопку Скачать.
- В загрузках найдите файл PascalABCNETSetup.exe, запустите его и выполните шаги установки.
- Найдите приложение PascalABC.NET в меню Пуск и запустите его.
- В этой среде разработки можно писать код на Pascal и выполнять его.
Пишем код
Сперва зададим название программы, импортируем модуль crt и объявим переменные. Сторонние модули в Pascal импортируются с помощью ключевого слова uses. В коде игры будем использовать всего три переменные:
- playerChoice, computerChoice — для хранения ходов пользователя и компьютера.
- playAgain — для взаимодействия с меню.
Теперь напишем процедуру, которая будет выводить в консоль меню выбора хода. Назовём её ShowChoices и с помощью нескольких вызовов функции writeln() покажем пользователю возможные ходы:
Ещё нам нужна процедура, которая будет выбирать победителя, исходя из выбора пользователя и компьютера. Назовём её DetermineWinner и в скобках обязательно укажем параметры, которые ей нужны для работы. Для правильного определения победителя помним, что ножницы разрезают бумагу, бумага обезвреживает камень, а камень ломает ножницы:
Всё готово для того, чтобы приступить к разработке главного цикла игры. Он будет повторяться до тех пор, пока пользователь не закроет игру, введя в консоль символ n или N. Общая логика игры выглядит так:
- Инициализируем генератор случайных чисел.
- Очищаем экран с помощью функции clrscr из модуля crt, который мы экспортировали ранее, и выводим меню с помощью процедуры ShowChoices.
- Получаем ход пользователя и проверяем, чтобы он ввёл только значения, которые есть в меню (числа от 1 до 3). Если ввёл что-то другое, то просим сделать выбор ещё раз.
- Генерируем случайный ход компьютера с помощью функции random () и выбираем победителя с помощью процедуры DetermineWinner.
- Спрашиваем пользователя, хочет ли он сыграть ещё раз.
Код главного цикла игры выглядит так:
А так игра работает в консоли:
Полностью код игры выглядит так:
Что дальше
В этой статье мы изучили только основы языка, если хотите погрузиться глубже в Pascal, то вот список полезных материалов:
- Курсы по PascalABC.NET на Stepik — коллекция бесплатных курсов как для школьников, так и для взрослых. Есть отдельные курсы для подготовки к программированию на ЕГЭ.
- Книги по PascalABC.NET — книги Александра Осипова и Валерия Рубанцева подойдут для школьников и студентов первых курсов, а двухтомник Михаила Абрамяна — официальное руководство от Южного федерального университета по работе со структурами данных.
- LearnPascal — сайт с уроками по Pascal и решением задач.
- Rosetta Code — сборник решений задач, в том числе на Pascal.
- Codewars — сервис для практики решения алгоритмических задач. В списке языков программирования можно выбрать Pascal.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!