Для чего язык паскаль

Почему в школе до сих пор изучают Pascal

Паскаль. Турбо Паскаль!

Часто в разговорах со школьниками и их родителями можно услышать, что на информатике они «до сих пор изучают Pascal, страну развалили, не могут современные компьютеры поставить!». Говорят, что в 21-м веке можно было бы изучать в школе уже что-то другое — Python или тот же JavaScript, но во многих школах, особенно в регионах, до сих пор преподают этот язык.

Но постойте. Не отменяя, что многим российским школам не повредит обновление парка компьютеров, давайте посмотрим, чем хорош сам Паскаль.

Для чего язык паскаль. Смотреть фото Для чего язык паскаль. Смотреть картинку Для чего язык паскаль. Картинка про Для чего язык паскаль. Фото Для чего язык паскальОлды тут?

Он действительно простой

Pascal — предельно простой и понятный язык. В нём нет сложных конструкций, перегрузок операторов или неявного приведения типов. Достаточно выучить 15 команд, и вы уже сможете решить большинство школьных задач.

Программы на Pascal легко читать и понимать, даже если вы видите этот язык первый раз. Смотрите сами:

Компилятор — наш друг

Pascal — компилируемый язык, как и многие другие. В нашем случае компилятор перед тем как собрать программу проверяет исходный код на ошибки. Единственное, он не предупреждает, если вы объявили переменную, но ни разу её не использовали, как это делает, например, С++. Но если компилятор встретит ошибку, он сразу поставит курсор на место ошибки и сверху на красном фоне напишет, что конкретно ему не нравится в этом коде.

Для чего язык паскаль. Смотреть фото Для чего язык паскаль. Смотреть картинку Для чего язык паскаль. Картинка про Для чего язык паскаль. Фото Для чего язык паскальОшибка несоответствия типов: программист пытается в целочисленную переменную (integer) поместить дробное число.

Всё только по правилам

Pascal — строго типизированный язык с чёткой логической структурой. В нём всё упорядочено настолько, что ошибиться в командах будет очень сложно. Единственное, что может показаться немного странным для тех, кто привык к другим языкам — оператор присваивания, который выглядит так :=

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

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

Что на нём пишут сегодня

На Паскале сейчас не пишут ничего. Сегодня он только для учёбы.

Но раньше — писали, например, самый первый фотошоп был написан на Паскале пополам с ассемблером. А вообще сейчас больше пишут на Delphi — преемнике Pascal, в котором есть и ООП, и визуальное программирование, и работа с мышью и окнами.

С чего начать

Если вы давно хотели познакомиться с Паскалем поближе, но не знали, с чего начать, то начните с этого:

Источник

Паскаль (язык программирования)

Для чего язык паскаль. Смотреть фото Для чего язык паскаль. Смотреть картинку Для чего язык паскаль. Картинка про Для чего язык паскаль. Фото Для чего язык паскаль

Содержание

История

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

Язык Паскаль был создан Никлаусом Виртом в 1968—1969 годах после его участия в работе комитета разработки стандарта языка Алгол-68. Он был опубликован в 1970 году Виртом как небольшой и эффективный язык, чтобы способствовать хорошему стилю программирования, использовать структурное программирование и структурированные данные.

Реализации

UCSD Pascal

Object Pascal

В 1986 году фирма Apple Computer разработала объектное расширение языка Паскаль, получив в результате Object Pascal. Он был разработан группой Ларри Теслера, который консультировался с Никлаусом Виртом.

Turbo Pascal и Object Pascal

В 1989 году объектное расширение языка было добавлено фирмой Borland в Turbo Pascal версии 5.5 (начиная со следующей версии среда была переименована в Borland Pascal). Объектные средства были позаимствованы из Object Pascal от Apple, языковые различия между объектным Turbo Pascal 5.5 и Object Pascal от Apple крайне незначительны.

Почти в то же самое время, что и Borland, Microsoft выпустил свою версию объектно-ориентированного языка Паскаль. [7] [8] Эта версия Паскаля не получила широкого распространения.

Дальнейшее развитие реализации Паскаля от Borland породило Object Pascal от Borland, впоследствии, в ходе развития среды программирования Delphi, получивший одноимённое название.

Современные версии Object Pascal

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

В настоящее время, начиная с Delphi 2003, создана реализация языка для платформы Net, хотя разработчики продолжают использовать Delphi более ранних версий.

О коммерческих разработках на Free Pascal, GNU Pascal и TMT Pascal на данный момент известно мало.

Особенности языка

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

Тем не менее, первоначально язык имел ряд ограничений: невозможность передачи функциям массивов переменной длины, отсутствие нормальных средств работы с динамической памятью, ограниченная библиотека ввода-вывода, отсутствие средств для подключения функций написанных на других языках, отсутствие средств раздельной компиляции и т. п. Подробный разбор недостатков языка Паскаль того времени был выполнен Брайаном Керниганом в статье «Почему Паскаль не является моим любимым языком программирования» [9] (эта статья вышла в начале 1980-х, когда уже существовал язык Модула-2, потомок Паскаля, избавленный от большинства его пороков, а также более развитые диалекты Паскаля). Некоторые недостатки Паскаля были исправлены в ISO-стандарте 1982 года, в частности, в языке появились открытые массивы, давшие возможность использовать одни и те же процедуры для обработки одномерных массивов различных размеров.

Необходимо заметить, что многие недостатки языка не проявляются или даже становятся достоинствами при обучении программированию. Кроме того, по сравнению с основным языком программирования в академической среде 1970-х (которым был Фортран, обладавший гораздо более существенными недостатками), Паскаль представлял собой значительный шаг вперёд. В начале 1980-х годов в СССР для обучения школьников основам информатики и вычислительной техники академик А. П. Ершов разработал алголо-паскалеподобный «учебный алгоритмический язык».

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

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

Стандарты

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

Стандарты языка Pascal: исходный, международные ISO и американские ANSI

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

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

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

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

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

Hello, world!

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

Программа не выполняет никаких действий и содержит пустой блок операторов.

Пример программы, выводящей строку «Hello, world!»:

Типы данных

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

ТипДиапазонФорматРазмер в байтах
Byte0..255Беззнаковый1
ShortInt−128..127Знаковый1
SmallInt−32768..32767Знаковый2
Word0..65535Беззнаковый2
Integer-32768..32767Знаковый2
Cardinal=LongWordБеззнаковый4
LongWord0..4294967295Беззнаковый4
LongInt−2147483648..2147483647Знаковый4
Int64−9223372036854775808..9223372036854775807Знаковый8
QWord0..18446744073709551615Беззнаковый8

Числа с плавающей запятой:

ТипДиапазонколичество значащих цифрРазмер в байтах
Real/Doubleзависит от платформы.8
Real48.11-126
Single1.5E-45..3.4E387-84
Extended1.9E-4932..1.1E493219-2010
Comp−2E64+1..2E63-119-208
Currency−922337203685477.5808..922337203685477.580719-208

В Pascal над целыми типами (byte, shortint, word, integer, longint и их диапазоны) допустимы побитовые операции. Логические операции над битами:

Над битами двух целых операндов можно выполнять ранее рассмотренные логические операции: not, and, or, xor. Отличие между побитовыми и логическими операциями состоит в том, что побитовые (поразрядные) операции выполняются над отдельными битами операндов, а не над их значением в десятичном (обычно) представлении.

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

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

Диапазоны содержат подмножество значений других порядковых типов:

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

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

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

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

обработается быстрее, чем

Для задания значения множества используется список элементов множества, отделенных запятыми и заключённый в квадратные скобки (как уже было показано выше):

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

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

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

Более того, из примитивных типов могут быть сконструированы составные:

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

Стандартные математические функции и процедуры Паскаля

Математические функции
Процедуры преобразования типов переменных
Функции преобразования типов переменных

Указатели

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

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

Чтобы создать новую запись и присвоить значение 10 и символ A полям a и b в ней, необходимы следующие операторы:

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

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

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

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

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

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

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

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

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

Модули

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

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

Структура

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

Возможен также ещё один вариант:

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

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

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

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

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

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

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

Загрузка и выгрузка модулей

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

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

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

Объектно-ориентированное программирование

Для чего язык паскаль. Смотреть фото Для чего язык паскаль. Смотреть картинку Для чего язык паскаль. Картинка про Для чего язык паскаль. Фото Для чего язык паскаль

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

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

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

В Delphi интерфейсы были введены для поддержки технологии COM фирмы Microsoft.

В модификации ObjectPascal/Delphi/FreePascal в описании классов появляются свойства (property), которые совмещают удобство работы с переменными (роль которых в ООП играют поля) и вызовы методов, которые всегда уведомляют объект об изменении его состояния:

В первом случае (использование MyObj.FProp) поле объекта было изменено непосредственно, в итоге, методы объекта не будут подозревать, что это поле было ранее изменено; в более сложном случае они могут полагаться на то, что поле неизменно, либо же полю может быть присвоено значение, недопустимое для данного объекта. Во втором случае значение присваивается непосредственно свойству объекта, которое ссылается на вызов метода, корректно обрабатывающего изменение данного поля.

Этот подход удобен, если объект связан с визуальным элементом: непосредственное изменение поля, отвечающего, например, за ширину элемента, никак не отразится на самом визуальном элементе, а объект будет «дезинформирован» относительно реальных размеров элемента. Корректным подходом без использования свойств является разработка методов на получение и установку любого значения поля, но работа с такими методами будет менее удобна, например, вместо последней строки надо было бы написать

причём метод MyObj.GetProp следовало бы написать для унификации доступа.

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

Тем не менее, свойства не являются «панацеей»: при компиляции обращение к свойствам непосредственно транслируются в вызов методов или прямую работу с полями, поэтому настоящими переменными свойства не являются, в частности, их невозможно передавать в виде var-параметров.

Примечания

Литература

Ссылки

Clascal • Concurrent Pascal • Delphi • Pascal • Object Pascal • Oxygene • SuperPascal

C/AL • Delphi • Delphi Prism (Oxygene) • FrameworkPascal • HP Pascal • IP Pascal • PocketStudio • Prospero Pascal

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *