Найти в Дзене
ZDG

Языки программирования 3: Pascal

Оглавление

Паскаль был придуман Никлаусом Виртом – известным разработчиком, преподавателем и учёным, и был попыткой создать "идеальный", с точки зрения структурированности и обучения, язык. И так как этим занимался учёный, то подход был в высшей степени академический. И вот что из этого получилось.

Предыдущая часть:

1. Структура программы

Скажем, в Бейсике, PHP, Питоне, JS программа просто начинается с первой строки. В Паскале же, давайте просто посмотрим:

Программа это структура, состоящая из блоков, и она начинается с самого крупного блока – собственно, программы. У программы есть имя, а код должен размещаться между begin и end. Обратите внимание на точку после end. Это важно для понимания того, какой душнила всё это придумывал :) По типу того, как предложение завершается точкой, программа тоже завершается точкой, и без неё работать не будет ¯\_(ツ)_/¯

Дальнейшие детали структуры будут описаны в следующих разделах.

2. Переменные

Во многих языках мы можем в любом месте программы объявить переменную, вот например в C прямо в заголовке цикла:

-2

Но с точки зрения Паскаля переменные, разбросанные по всей программе, создают бардак. Любую переменную надо продумать и объявить заранее, до начала программы, в секции var:

-3

Открывайте форточки, становится душно :)

Мне не совсем понятно, что делать с переменными, когда они уже отработали своё. Например, в C переменная i, использованная для цикла, освобождается после окончания цикла. В Паскале она очевидно остаётся, и дальнейшая её судьба под вопросом. Если её больше не использовать, то она будет просто занимать память. Если же переиспользовать, то есть риск что-то перепутать и внести ошибку в программу. (Теоретически, компилятор может определить, что переменная с какого-то момента уже нигде не используется, и освободить память.)

Управляющие структуры

Можно видеть, что begin и end используются как начало и конец функционального блока, такого как программа, цикл, условие или функция. В синтаксисах семейства C это будут просто скобки { и }. И представьте себе, сколько раз на Паскале придётся вместо одного символа набирать пять (да, конечно, есть IDE, которые помогут с этим).

Но постойте, этот маленький кусок кода хранит больше секретов!

Так, с виду привычный цикл for, оказывается, может наращивать переменную i только по единице. На С мы бы запросто написали так:

-4

Но в Паскале счётчик цикла это именно счётчик цикла. А счётчики наращиваются только по 1.

Но постойте, это ещё не всё! Предположим, мы решили сделать цикл не от 1 до 10, а от 10 до 1. Тогда, возможно, мы напишем так:

-5

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

-6

Понимаете серьёзность подхода?

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

-7

Это аналоги while и do while в C. Причем ключевое слово until работает как противоположность while. Если while это условие продолжения, то until это условие окончания. Иными словами, "работать, пока выполняется условие" против "работать, пока не выполнится условие". Это несколько сбивает с толку.

Также обратите внимание, что для увеличения или уменьшения i на 1 можно использовать специализированные функции inc(i) и dec(i). На C мы бы писали просто i++ или i--.

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

Подпрограммы в Паскале делятся на два вида:

  • Функции – подпрограммы, которые могут возвращать результат
  • Процедуры – подпрограммы, которые не могут возвращать результат

Посмотрим код:

-8

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

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

Да, и если вы захотите создать какие-то переменные в функции или процедуре, вам тоже придётся создавать их в разделе var, но уже внутри функции или процедуры.

-9

Типы и структуры данных

Как уже нетрудно догадаться, Паскаль – строго типизированный язык. Типы вроде Integer, Word, LongInt, Real, Char, Boolean примерно соответствуют такому же набору в C, есть и строковые.

Также есть статические и динамические (с возможностью изменения длины) массивы с синтаксисом вида

var a: array[1..100] of integer

И типы-структуры, аналогичные структурам в C, которые здесь называются Record:

-10

И конечно, такие типы описываются в отдельной секции type. Всё должно быть упорядочено!

Есть также перечислимые типы и множества, правда множества могут содержать не более 256 элементов. Зато для множеств определены операции объединения, пересечения и т.д.

Есть и типы-указатели, аналогичные тем, которые в С.

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

Заключение

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

Более поздние версии Паскаля получили поддержку ООП (ObjectPascal, Delphi), что уравняло его возможности с другими языками. Но считать ли их каноном – вопрос.

Я не знаю, кто и зачем сейчас программирует на Паскале. Сам я тоже на нём программировал, но по одной причине – по сравнению с Бейсиком он был мощнее, так как компилировался, и получались настоящие программы, которые запускались в среде ОС. Но как только у меня появился доступ к компилятору С, больше я Паскаль ни разу не трогал.

Я бы очень хотел послушать доводы тех, кто сейчас программирует на Паскале – зачем, почему, какой профит?

Читайте дальше: