Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Основы программирования на языке Pascal (Язык программирования Pascal)

Содержание:

Введение

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

Сложность программного обеспечения неуклонно растёт. Для более качественного и быстрого решения различного рода задач создаются всё новые языки программирования (ЯП), обладающие какими-то своими особыми преимуществами «фитчами» (от англ. features — особенность). Это позволяет эффективно создавать программные продукты для необходимых условий и задач.

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

Знание и понимание того в каких случаях необходимо выбрать определённую технологию, язык программирования, алгоритм является наиболее важной и актуальной задачей современного специалиста направления «Информатика и вычислительная техника».

Объект исследования. В данной курсовой работе объектом исследования выступают языки программирования высокого уровня (классификация, ориентированность, типизированность, способы построения программ).

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

Цель работы: изучение языков программирования высокого уровня на примере ЯП Pascal, а именно: его применимости для решения определённого рода задач, способов и методов создания и исполнения программ, ключевых особенностей.

Задачи исследования. Для достижения поставленной цели в данной работе необходимо решить следующие задачи:

  1. Раскрыть смысл таких понятий, как: высокоуровневый язык программирования, компилируемые и интерпретируемые ЯП, статическая/динамическая типизация, пространство имён, объектно-ориентированное программирование.
  2. Изучить отличия в исполнении программ, написанных на компилируемых/интерпретируемых ЯП.
  3. Изучить особенности и принципы объектно-ориентированного программирования.
  4. Изучить основные принципы программирования на языке Pascal.
  5. На основе изученной информации по высокоуровневым ЯП в общем и языке Pascal, в частности, на практическом примере показать пример использования данного языка.

Основные авторы. При написании данной курсовой работы использовались труды авторов: Лутц М. [1], Бизли Д. [2], Вайсфельд М. [3] и другие.

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

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

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

История появления языков программирования

Самая ранняя из известных программируемых машин была реализована задолго до изобретения цифрового компьютера и являлась автоматическим игроком на флейте. Она описана в девятом веке братьями Мусой и Багдадом во времена «исламского золотого века» [4]. С начала 1800 - х годов «программы» использовались для управления поведением таких машин, как ткацкие станки Жаккарда и игровые пианино [5].

В 1842-1843 годах Ада Лавлейс перевела мемуары итальянского математика Луиджи Менабре о новейшей предлагаемой Чарльзом Бэббиджем аналитической машине. В статье она добавила набор заметок, в которых подробно описана методику вычисления чисел Бернулли на аналитической машине. Она была признана историками первой в мире компьютерной программой. [6]

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

Поколения языков программирования

Все существующие языки программирования можно разделить по поколениям, в соответствии их развитию [7] (Рисунок 1).

https://thefullsnack.com/posts/img/assembly-map.png

Рисунок 1 — Поколения языков программирования

1.2.1. Первое поколение

Машинный язык — это единственный язык программирования, который компьютер может понимать напрямую без перевода. Это язык, состоящий только из единиц и нулей. Такой язык должен соответствовать специальным характеристикам определённого процессора, поэтому нет единого универсального машинного языка. Для каждого типа или семейства процессоров требуется собственный машинный язык. По этой причине машинный язык считается машинно-зависимым.

Использование машинного языка — очень утомительный, сложный и трудоемкий способ программирования, поэтому машинные языки — это языки низкого уровня. Поскольку программист должен детально указывать каждый шаг, низкоуровневый язык требует подробного представления о том, как работает ЭВМ. Чтобы упростить программирование, были разработаны более простые в использовании языки программирования. Тем не менее, программы, написанные на других ЯП должны быть переведены на машинный язык, прежде чем компьютер сможет их понять и выполнить (рисунок 2).

10101010011000101

10011010100000010

11111111101000101

Рисунок 2 — Пример кода, написанного на машинного языке

Преимущества:

  • код программы может быть быстрым и эффективным,
  • код программы может использовать определенные функции процессора, например, специальные регистры.

Недостатки:

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

1.2.2. Второе поколение

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

Ассемблерный код

Машинный код

LDA A

ADD #5

STA A

JMP #3

-> Транслятор ->

000100110100

001000000101

001100110100

010000000011

Рисунок 3 — Пример кода, написанного на ассемблере, и его преобразования в машинный код

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

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

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

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

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

Недостатки:

  • код программы не может быть перенесен на другие архитектуры и должен быть переписан заново.

1.2.3. Третье поколение

ЯП третьего поколения (3GL) или языки высокого уровня независимы от архитектуры и более удобны для программистов. Они отличаются большей абстракцией, чем предыдущие поколения языков, и поэтому могут считаться языками более высокого уровня. FORTRAN, ALGOL и COBOL являются примерами первых языков 3GL. Языки программирования третьего поколения принесли много новых функций, таких как циклы, условные обозначения, классы и т.д. Это означает, что одна строка кода на 3GL может порождать множество строк кода машинного языка, что экономит много времени при написании программ и упрощает их понимание.

На сегодняшний день самые популярные языки программирования С, C ++, C #, Java, Pascal, являются языками третьего поколения, хотя каждый из этих языков можно дополнительно подразделить на другие категории, основанные на иных чертах.

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

Основным преимуществом языков высокого уровня является то, что их легче читать, писать и поддерживать. В конечном счете, программы, написанные на языках высокого уровня, должны быть переведены на машинный язык компилятором или интерпретатором. Пример кода программы, написанной на языке С и печатающей в стандартное устройство вывода текст «Hello World» представлен на следующем рисунке.

/* Hello World program */

#include<stdio.h>

main()

{

printf("Hello World");

}

Рисунок 4 — Пример исходного кода на языке высокого уровня

Преимущества:

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

Недостатки:

  • полученный код не может наилучшим образом использовать специфичные для процессора функции, в отличие от 1-го и 2-го поколений.

1.2.4. Четвёртое поколение

Языки четвертого поколения (4GL) также относятся к высокоуровневым языкам и предназначены для сокращения усилий и времени, необходимых для разработки программного обеспечения, что приводит к снижению стоимости разработки ПО. Такие языки не универсальны и используются для определённых типов задач. Примером 4GL являются декларативные языки.

Декларативные языки — описывают, какие вычисления должны выполняться, а не как их выполнять. Примерами могут выступать язык SQL, Oracle Reports, CSS.

/*code to change the headings on a page to

green and the paragraphs to red and italic*/

h1 { color : #00FF00; }

p { color : #FF0000; font-style : italic }

Рисунок 4 — Пример исходного кода на декларативном языке CSS

Классификация языков высокого уровня

Многие современные языки программирования, например, такие как С++, С#, Java, Pascal на первый взгляд имеют очень много общих черт. В частности, эти сходства заключаются в синтаксисе, синтаксических конструкциях, возможностях применения парадигмы объектно-ориентированного программирования и т.д.

Главные же различия заключаются в типизации объектов и способах исполнения программ, написанных на разных языках программирования. На рисунке 5 показана классификация ЯП в соответствии с указанными выше различиями.

Рисунок 5 — Классификация высокоуровневых языков программирования

1.3.1. Компиляторы и интерпретаторы

Интерпретаторами и компиляторами являются программы, входные данные которых, а иногда и их выходные данные, являются программами. В общем, фактическое поведение программ определяется (или, по крайней мере, зависит от) его ввода.

Основными отличиями друг от друга является то, что интерпретаторы можно рассматривать как виртуальные машины, тогда как компиляторы являются программными трансляторами.

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

Компилятор, архитектура которого показана на рисунке 6, преобразует и оптимизирует программу, написанную на более высоком уровне абстракции (исходный язык), в программу, написанную на более низком уровне языка абстракции (целевой язык).

Рисунок 6 — Архитектура компилятора

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

Интерпретаторы принимают абстрактное представление программы на исходном языке и выдают результат её выполнения по отношению к входным данным (рисунок 7).

Рисунок 7 — Архитектура интерпретатора

Более сложная и эффективная комбинация этих концепций присутствует в виртуальной машине Java (JVM) или в среде Common Language Runtime –CLR (.NET framework). Эти архитектуры сочетают компиляцию и интерпретацию языков. Они включают компилятор, переводящий исходный код программы на промежуточный язык, который интерпретируется виртуальной машиной. На этом уровне виртуальная машина может прибегнуть к другому компилятору, который преобразует байт-код в собственный машинный код, который напрямую выполняется на физической машине (рисунок 8).

Рисунок 8 — Интерпретатор с JIT компилятором

Еще одна популярная архитектура — это интеграция интерпретаторов других типов, таких как Javascript-интерпретатор в браузере, или SQL-интерпретатор в системе управления базами данных.

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

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

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

1.3.2. Виды типизации

Язык статически типизирован, если тип переменной известен во время компиляции. Для некоторых языков это означает, что программист должен указать тип каждой переменной (Java, C, C ++); Другие языки предлагают определять тип не программисту, а исполняемой среде «на лету», в зависимости от переменной и её контекста (Haskell, Scala).

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

Язык динамически типизирован, если тип связан со значениями времени выполнения, а не с именами переменных/полей/ и т.д. Это означает, что программист может писать код быстрее, так как ему не нужно указывать типы каждый раз (Perl, Ruby, Pascal).

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

Авторские выводы по первой главе: современные высокоуровневые ЯП предоставляют программистам широкий спектр возможностей для создания приложений любой сложности. Различные стили исполнения программ позволяют находить баланс между скоростью и гибкостью исполнения программ на платформах различных архитектур.

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

2.1. Общие сведения

Pascal — широко используемый универсальный высокоуровневый язык программирования (рисунок 9), созданный Гвидо Ван Россумом и впервые выпущенный в 1991 году как преемник языка ABC, способный обрабатывать исключения и взаимодействовать с операционной системой Amoeba [8].

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png

Рисунок 9 — Логотип языка программированияPascal

Интерпретируемый ЯП Pascal имеет философию, подчёркивающую читаемость кода, в частности, используя отступы в виде табуляций для разметки блоков кода и синтаксис, который позволяет программистам выражать понятия в меньшем количестве строк кода, чем может потребоваться в таких языках, как C ++ или Java. Язык предоставляет синтаксические конструкции, дающие возможность написания как небольших, так и крупномасштабных прогарам [9].

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

2.2. История

Pascal был задуман в конце 1980-х годов и его внедрение началось в декабре 1989 года [10] Гвидо ван Россумом в Нидерландах как преемника языка ABC, способного обрабатывать исключения и взаимодействовать с операционной системой Amoeba [8]. Ван Россум — главный автор и постоянная центральная роль в развитии языка Pascal. Это отражено в прозвище, которое ему дало сообщество Pascal — «Великодушный пожизненный диктатор» (benevolent dictator for life — BDFL).

16 октября 2000 года был выпущен Pascal 2.0, имевший множество новых функций, включая сборщик мусора, и поддержку Unicode. После этого релиза процесс разработки языка стал более прозрачным и поддерживаемым сообществом [11].

Релиз pascal 3.0 глобально несовместимого с ранними выпусками, был произведён 3 декабря 2008 года после длительного периода тестирования. Тем не менее многие из его основных функций были включены в обратную совместимость с версиями Pascal 2.x.

2.2. Особенности

Pascal— это мультипарадигмальный язык программирования с несколькими парадигмами: объектно-ориентированное программирование и структурированное программирование полностью поддерживаются, а многие языковые функции поддерживают функциональное программирование и аспектно-ориентированное программирование (в том числе метапрограммирование [12] и метаобъекты (магические методы)) [13].

Pascal использует динамическую типизацию и сборщик мусора, основанный на циклическом подсчёте ссылок, для управления памятью. Важной особенностью Pascal является динамическое разрешение имен (поздняя привязка), которая связывает имена методов и переменных во время выполнения программы. Pascal предлагает некоторую поддержку функционального программирования в традициях Lisp. Язык имеет функции map(), reduce() и filter(), понятия списков, словарей и множеств; а также генератор выражений [14]. Стандартная библиотека имеет два модуля (itertools и functools), реализующие функциональные инструменты, заимствованные у Haskell и Standard ML [15].

Основная философия языка обобщается в документе «Дзен Питона» (PEP 20), который включает в себя перечень афоризмов, например, [16]

  • Красивое лучше, чем уродливое.
  • Явное лучше, чем неявное.
  • Простое лучше, чем сложное.
  • Сложное лучше, чем запутанное.

Такие афоризмы, являются своеобразным неформальным руководством по написанию программ на Paascal.

Pascal не требует, чтобы все необходимые функции были встроены в ядро языка, а наоборот является очень расширяемым. Также он может быть встроен в существующие приложения, которым необходим программируемый интерфейс. Такой дизайн небольшого основного языка с большой стандартной библиотекой и легко расширяемым интерпретатором был предложен Ван Россумом с самого начала развития Pascal [17] как результат разочарования языком ABC, поддерживающим противоположную концепцию.

Предлагая выбор в методологии кодирования, философия Pascal отвергает широкий синтаксис, например, как в Perl, в пользу менее загроможденной грамматики — «there should be one—and preferably only one—obvious way to do it» — «должен быть один и желательно только один очевидный способ сделать это».

Разработчики Pascal стремятся избежать преждевременной оптимизации. Когда важна скорость, программист Pascal может передавать критически важные функции в модули расширения, написанные на таких языках, как C, или попытаться использовать JIT PyPy компилятор.

2.3. Библиотеки

Pascal имеет большую стандартную библиотеку, которая считается одной из самых сильных сторон Pascal и предоставляет инструменты, подходящие для многих задач. Например, для приложений, ориентированных на Интернет, поддерживаются многие стандартные форматы и протоколы (такие как MIME и HTTP). Также включены модули для создания графических пользовательских интерфейсов, подключения к реляционным базам данных, генерации псевдослучайных чисел, арифметики с плавающей точкой, манипулирования регулярными выражениями, проведения модульного тестирования и т.д.

Некоторые части стандартной библиотеки покрываются спецификациями (например, реализация WSGI (WSGI) wsgiref следует за PEP 333 [18]), но большинство модулей — нет. Но поскольку большая часть стандартной библиотеки представляет собой кроссплатформенный код Paascal, только несколько модулей нуждаются в изменении или перезаписи для разных вариантов реализации.

По состоянию на июль 2017 года, официальный репозиторий, содержащий стороннее программное обеспечение для Pascal, содержит более 107 000 [85] пакетов, предлагающих широкий спектр функций, в том числе:

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

2.4. Среды разработки

Большинство реализаций Pascal(включая CPascal) включают цикл read-eval-print (REPL), что означает их возможность функционировать как интерпретатор командной строки, для которого пользователь последовательно вводит операторы и немедленно получает результаты.

Другие оболочки добавляют возможности, превосходящие возможности базового интерпретатора, включая IDLE и Ipascal. В целом, следуя визуальному стилю оболочки Pascal, они реализуют такие функции, как автозаполнение, сохранение состояния сеанса и подсветка синтаксиса.

В дополнение к стандартным интегрированным средам разработки (Pascal IDE) существуют также IDE на основе веб-браузера, SageMath (предназначенные для разработки программ Pascal в областях науки и математики) и основанная на браузере среда IDE и хостинга PacsalAnywhere [19].

2.5. Реализации

Основная реализация Pascal с именем CPascal написана на C, соответствующем стандарту C89, с несколькими функциями C99. Она компилирует программы Pascal в промежуточный байт-код, который выполняется виртуальной машиной. CPascal распространяется с большой стандартной библиотекой, написанной на смеси C и Pascal Эта реализация доступна в версиях для многих платформ, включая Windows и самые современные Unix-подобные системы.

PyPy — быстрый, совместимый интерпретатор Pascal 2.7 и 3.5. Его JIT компилятор значительно улучшает работу над CPascal. Создается версия, использующая многоядерные процессоры, использующие программную транзакционную память [20].

MicroPascal — это вариант Pascal 3, который оптимизирован для работы на микроконтроллерах.

2.6. Разработка

Разработка Pascal ведется в основном через процесс Pascal Enhancement Proposal (PEP). Процесс PEP является основным механизмом для предложения новых функций, сбора информации в сообществе о проблемах и документирования проектных решений, которые вошли в Pascal. [98] Удачные PEP проверяются и комментируются сообществом Pascal и Ван Россумом и принимаются в качестве новых функция языка [21].

Публичные релизы CPascal бывают трёх типов:

  1. Обратно-несовместимые версии, где ожидается разрыв кода и его необходимо вручную портировать. Увеличивается первая часть номера версии. Эти релизы происходят нечасто — например, версия 3.0 была выпущена через 8 лет после версии 2.0.
  2. Основные или «функциональные» релизы, которые в значительной степени совместимы, но вводят новые функции. Увеличивается вторая часть номера версии. Эти выпуски планируются примерно каждые 18 месяцев, и каждая основная версия поддерживается в течение нескольких лет после ее выпуска.
  3. Выпуски Bugfix, которые не вводят никаких новых функций, но исправляют ошибки. Увеличивается третья последняя часть номера версии. Эти выпуски выполняются всякий раз, когда фиксируется достаточное количество ошибок или примерно каждые 3 месяца. В этих версиях также исправляются уязвимости безопасности.

Многие альфа/бета-версии выпускаются для тестирования до финальных выпусков. Команда разработчиков контролирует состояние кода, запуская большой комплект тестовых модулей во время разработки и используя систему непрерывной интеграции BuildBot [22].

Сообществом разработчиков Pascal представлено более 86 000 программных модулей в Pascal Package Index (PyPI), официальном репозитории сторонних библиотек для Pascal.

Основная научная конференция на Pascal называется PyCon. Также существуют специальные программы наставничества, такие как Pyladies.

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

С 2003 года Pascal постоянно входит в десятку самых популярных языков программирования (индекс TIOBE Programming Community Index). По состоянию на июль 2017 года — Pascal четвёртый по популярности ЯП [23] (рисунок 10). Он был признан языком программирования года в 2007 и 2010 годах. Это второй по популярности язык, грамматический синтаксис которого не основан преимущественно на C.

Рисунок 10 — Индекс TIOBE на июль 2017 г.

Эмпирические исследования показывают, что языки сценариев (например, Pascal) более продуктивны, чем обычные языки (такие как C и Java) для решения задач программирования, связанных с манипуляциями строк и поиском в словаре. Потребление памяти часто лучше, чем Java, и ненамного хуже, чем C или C ++» [24].

Крупными организациями, использующими Pascal, являются Wikipedia, Google, Yahoo!, CERN, NASA. Сайт социальной сети Reddit написан полностью на Pascal.

Pascal может служить языком сценариев для веб-приложений, например, через mod_wsgi для веб-сервера Apache. Веб-структуры, такие как Django, TurboGears, Pyramid, Pylons и другие, помогают при разработке и обслуживании сложных приложений. IronPascal может использоваться для разработки клиентской стороны приложений на основе Ajax. SQLAlchemy может использоваться в качестве преобразователя данных в реляционную БД.

Библиотеки, такие как NumPy, SciPy и Matplotlib, позволяют эффективно использовать Pascal в научных вычислениях.

Pascal был успешно внедрен во многие программные продукты в качестве языка сценариев, в том числе в программном обеспечении с конечными элементами, таких как Abaqus, FreeCAD, 3D-анимационные пакеты, такие как 3ds Max, Blender, Cinema 4D, графический редактор эффектов Nuke, 2D-программы для создания изображений, такие как GIMP, Inkscape. GNU Debugger использует Pascal в качестве визуализатора для отображения сложных структур, таких как контейнеры на C ++.

Многие операционные системы включают Pascal в качестве стандартного компонента. Язык поставляется с большинством дистрибутивов Linux, FreeBSD, OpenBSD и macOS и может использоваться с терминала. Многие дистрибутивы Linux используют инсталляторы, написанные на Pascal: Ubuntu использует установщик Ubiquity, в то время как Fedora используют установщик Anaconda. Gentoo Linux использует Pascal в своей системе управления пакетами Portage.

В одноплатном компьютерном проекте Raspberry Pi (рисунок 11) Pascal используется в качестве основного языка программирования.

Картинки по запросу raspberry pi python

Рисунок 11 — Raspberry Pi

Авторские выводы по второй главе: Pascal является современным высокоуровневым языком программирования, востребованным сообществом разработчиков и программистов. Групповые разработка и обновление позволяют создавать именно те особенности языка, которые действительно необходимы. Возможность использования Pascal для решения различного рода задач и на различных платформах, также способствуют развитию языка. Всё это подтверждается высоким индексом TIOBE. Таким образом Pascal представляет собой лучший пример ЯП активно и непрерывно развивающегося на протяжении всего времени своего существования.

Практическая часть

В практической части данной работы будет приведён пример реализации шифра Хилла [25] на языке программирования Pascal. Этот язык очень удобен для реализации подобного рода задач, решение которых должно быть предоставлено конечному пользователю в виде простого скрипта, который можно редактировать «на месте» без необходимости перекомпиляции. Исходный код программы представлены в приложении А.

3.1 Описание шифра Хилла

В классической криптографии шифр Хилла является полиграфическим замещающим шифром, основанным на функционале линейной алгебре. Он изобретен Лестером С. Хиллом в 1929 году, и является первым полиграфическим шифром, в котором производится шифрование блоков данных — полиграмм.

Каждая буква представлена числом по модулю l, где l — длина алфавита. Часто используется простая схема A = 0, B = 1, ..., Z = 25, но это не является существенной особенностью шифрования. В разрабатываемой в данной работе программе длина алфавита равна 127, т.е. первые 127 символов таблицы ASC II (таблица ASC II представлена в приложении Б). Чтобы зашифровать сообщение, каждый блок из n символов (считающийся n-компонентным вектором) умножается на обратимую n×n матрицу C по модулю l. Для дешифрования сообщения каждый блок умножается на обратную C матрицу — D.

Матрица, используемая для шифрования, является ключом шифрования, и ее следует выбирать случайным образом из набора обратимых n×n матриц (по модулю l). Шифр может быть адаптирован к алфавиту с любым количеством букв.

3.2 Шифрование

В рассматриваемом примере будут использованы заглавные буквы латинского алфавита. Соответствующие им численные значения приведены на следующем рисунке.

C:\Users\lab\Desktop\1.PNG

Рисунок 12 — Соответствие символов алфавита и их числовых значений

Рассмотрим шифрование сообщения «ACT» ключом С (формула 1) (или GYBNQKURP символьно).

(1)

Поскольку «A» равно 0, «C» равно 2, а «T» равно 19, сообщение представляет собой вектор:

(2)

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

(3)

Что соответствует зашифрованному тексту «POH».

3.3 Дешифрование

Чтобы расшифровать сообщение, зашифрованный текст преобразовывается в вектор соответствующих значений, а затем умножается на обратную к С матрицу по модулю l (IFKVIVVMI в символьном представлении). Обратная матрица вычисляется при помощи расширенного алгоритма Евклида и союзной матрицы [26]. Матрица, обратная матрице С (формула 1) равна:

(4)

Взяв зашифрованный текст из предыдущего примера «POH», получим:

(5)

В результате, как и предполагалось, получен исходный текст «ACT».

Не все матрицы имеют обратную. Об этом следует помнить при выборе матрицы шифрования. Матрица будет иметь обратную тогда и только тогда, когда ее определитель не равен нулю. Кроме того, в случае шифрования Хилла детерминант шифрующей матрицы не должен иметь общих делителей с модулем шифрования (длиной алфавита). Таким образом, если мы работаем по модулю 26, как указано в примере, определитель должен быть отличным от нуля и не должен делиться на 2 или 13. В противном случае сообщение невозможно будет расшифровать.

Устранить возможные риски можно выбирая в качестве модуля (длины алфавита) простое число.

3.4 Безопасность

К сожалению, шифр Хилла уязвим для атаки типа known-plaintext, поскольку он полностью линейный. Оппонент, который перехватывает n2 пар символов открытого/шифрованного текста, может составить линейную систему уравнений, которая может быть легко решена; Если система неопределенна, необходимо добавить еще несколько пар открытого/зашифрованного текста. Вычисление решения стандартными алгоритмами линейной алгебры занимает очень мало времени.

В то время как матричное умножение не приводит к созданию защищенного шифра, оно по-прежнему является полезным в сочетании с другими нелинейными операциями, поскольку матричное умножение может обеспечить диффузию Шеннона. Например, соответствующе выбранная матрица может гарантировать, что небольшие различия символов перед умножением на матрицу приведут к большим различиям после умножения. Действительно, некоторые современные шифры используют шаг с матричным умножением для обеспечения диффузии. Например, шаг MixColumns в AES является матричным умножением.

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

3.5 Механическая реализация

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

Шифр Хилла размерности 6 был реализован механически. Хилл с партнером получили патент [29] для устройства, которое выполняло матричное умножение 6×6 по модулю 26 с использованием системы шестеренок и цепей (рисунок 12).

Рисунок 12 — Шифровальная машина Хилла

Расположение шестерёнок (а значит, и ключ) нельзя было изменять для конкретного устройства, поэтому в целях безопасности рекомендовалось тройное шифрование. Такая комбинация была очень сильной для 1929 года, и она показывает, что Хилл несомненно понимал концепции конфузии и диффузии. Однако устройство было довольно медленное, поэтому во Второй мировой войне машины Хилла были использованы только для шифрования трёхсимвольного кода радиосигналов [30].

3.6 Пример реализации шифра Хилла на ЯП Pascal

В приложении А представлен пример реализации шифра Хилла на ЯП Pascal 3.6. Разработанный скрипт читает текст из файла, шифрует его и записывает в выходной файл. Аналогичным образом производится дешифрования. Пути к файлам заданы в виде констант и легко могут быть изменены. Далее представлен пример кода, задающий пути к файлам.

BasePath = "C:\\Users\lab\Desktop\Test"

TextFilePath = "\Test.txt"

CipheredTextFilePath = r"\Ciphered.txt"

DecipheredTextFilePath = "\Deciphered.txt"

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

Таблица 1 — Параметры функции Alignment

Тип

Параметр

Описание

Входной

text

Исходный текст

Выходной

dimension

Размерность матрицы шифрования

#Функция выравнивания текста по левому краю, кратно модулю

def Alignment(text, dimension):

temp = dimension - len(text) % dimension

if(temp != dimension):

for i in range(temp):

text = text + ' '

return text

После выравнивания текст разбивается на вектора, количество которых равно TextLength/Dimension. Далее представлен код данной функции.

Таблица 2 — Параметры функции TextToMatrix

Тип

Параметр

Описание

Входной

text

Текст, размер которого кратен Dimension

Выходной

data

Совокупность векторов размером Dimension

#Функция преобразования текста в матрицу типа int16

def TextToMatrix(text):

text = Alignment(text)

steps = int(len(text) / 3)

data = np.zeros((steps, 3), dtype = np.int16)

for i in range(steps):

temp = text[3*i:3*i+3:1]

for j in range(3):

data[i][j] = ord(temp[j])

return(data)

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

Таблица 3 — Параметры функции EncryptOrDecrypt

Тип

Параметр

Описание

Входной

Matrix

Матрица шифрования/дешифрования

PathFirst

Путь к файлу с исходным текстом

Выходной

PathLast

Пусть выходному файлу

Text

Зашифрованный текст

#Функция шифрования/дешифрования текста

def EncryptOrDecrypt(Matrix, PathFirst, PathLast):

f = open(PathFirst, 'r')

text = f.read()

f.close()

DataMatrix = TextToMatrix(text)

Shape = DataMatrix.shape

CipheredMatrix = np.zeros((Shape[0], Shape[1]), dtype = np.int16)

for i in range(Shape[0]):

CipheredMatrix[i] = ( np.dot(Matrix, DataMatrix[i]) ) % Module

CipheredMatrix = CipheredMatrix.reshape(1,Shape[0]*Shape[1])

Text = ''

for i in range(CipheredMatrix.size):

Text = Text + chr(CipheredMatrix[0][i])

f = open(PathLast, 'w')

f.write(Text)

f.close()

return (Text)

Авторские выводы по третьей главе: В третьей главе был рассмотрен пример реализации алгоритма шифрования Хилла на языке программирования Pascal. В ходе реализации, студент впервые столкнулся с практическим применением данного ЯП. Характерно то, что Pascal является языком с небольшим обилием синтаксических конструкций. Это позволяет получить базовые знания по языку в короткое время 1-2 дня. После чего уже можно реализовывать небольшие скрипты. Особо стоит отметить большое количество дополнительных модулей, которые могут быть использованы для решения различного рода задач.

Заключение

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

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

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

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

Во второй главе курсовой работы проводится рассмотрение высокоуровневого языка программирования Pascal.

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

Третья глава посвящена практической работе и в ней приводится пример реализации алгоритма шифрования Хилла на языке Pascal. В первую очередь приведено описание шифра Хилла и показан пример его математической реализации. Далее даётся описание основным функциям, написанным для реализации алгоритма Хилла. Большую работу на себя берёт модуль NumPy, избавляя программиста от написания функций линейной алгебры таких как, например, матричное умножение.

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

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

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

Список использованной литературы

  1. Лутц М. Изучаем Pascal, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. –. 1280 с., ил.
  2. Бизли Д. Pascal. Подробный справочник. – Пер. с англ. – СПб.: Символ-Плюс, 2017. – 864 с., ил.
  3. Мэтт Вайсфельд Объектно-ориентированное мышление. СПб.: Питер, 2014. — 304 с. — 4-е изд.
  4. The First Programmable Machine & the Earliest Known Mechanical Musical Instrument: [Электронный ресурс], — URL: [http://www.historyofinformation.com/expanded.php?id=699] (дата обращения: 01.08.2017)
  5. Ettinger, James (2004) Jacquard's Web, Oxford University Press
  6. J. Fuegi and J. Francis (October–December 2003), "Lovelace & Babbage and the creation of the 1843 'notes'", Annals of the History of Computing,
  7. Fundamentals of Computer Systems: Generations of programming language: [Электронный ресурс], — URL: [https://en.wikibooks.org/wiki/A-level_Computing/AQA/Computer_Components,_The_Stored_Program_Concept_and_the_Internet/Fundamentals_of_Computer_Systems/Generations_of_programming_language] (дата обращения: 01.06.2020)
  8. General Pascal FAQ. Pascal Software Foundation. Retrieved 22 March 2007.
  9. Kuhlman, Dave. "A Paascal Book: Beginning Python, Advanced Python, and Python Exercises".
  10. Van Rossum, Guido (20 January 2019). "A Brief Timeline of Python". The History of Python. Google. Retrieved 20 January 2009.
  11. Kuchling, A. M.; Zadka, Moshe (16 October 2000). "What's New in Python 2.0". Python Software Foundation. Retrieved 11 February 2012.
  12. Python Metaclasses: Who? Why? When?: [Электронный ресурс], — URL: [http://www.webcitation.org/5lubkaJRc] (дата обращения: 01.08.2017)
  13. "3.3. Special method names". The Python Language Reference. Python Software Foundation. Retrieved 27 June 2019.
  14. Hettinger, Raymond (30 January 2002). "PEP 289 – Generator Expressions". Python Enhancement Proposals. Python Software Foundation. Retrieved 19 February 2012.
  15. "6.5 itertools – Functions creating iterators for efficient looping". Docs.python.org. Retrieved 22 November 2016.
  16. Peters, Tim (19 August 2004). "PEP 20 – The Zen of Python". Python Enhancement Proposals. Python Software Foundation. Retrieved 24 November 2018.
  17. Venners, Bill (13 January 2003). "The Making of Python". Artima Developer. Artima. Retrieved 22 March 2007.
  18. Eby, Phillip J. (7 December 2013). "PEP 333 – Python Web Server Gateway Interface v1.0". Python Enhancement Proposals. Python Software Foundation. Retrieved 19 February 2012.
  19. Enthought, Canopy. "Canopy". www.enthought.com. Retrieved 20 August 2016.
  20. "STM with threads". Morepypy.blogspot.be. 10 June 2012. Retrieved 3 December 2016.
  21. Warsaw, Barry; Hylton, Jeremy; Goodger, David (13 June 2000). "PEP 1 – PEP Purpose and Guidelines". Python Enhancement Proposals. Python Software Foundation. Retrieved 19 April 2016.
  22. "Python Buildbot". Python Developer’s Guide. Python Software Foundation. Retrieved 24 September 2017.
  23. TIOBE Index for August 2017: [Электронный ресурс], — URL: [https://www.tiobe.com/tiobe-index/] (дата обращения: 25.07.2017)
  24. Prechelt, Lutz (14 March 2000). "An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl" (PDF). Retrieved 30 August 2013.
  25. Введение в криптографию / Под общ. ред. В. В. Ященко. — 4-е изд., доп. М.: МЦНМО, 2012. — 348 с
  26. Modular inverse of a matrix: [Электронный ресурс], — URL: [https://planetcalc.com/3324/] (дата обращения: 01.08.2017)
    1. V. N. Krishna, Dr. A. Vinaya Babu A Modified Hill Cipher Algorithm for Encryption of Data In Data Transmission (англ.) // Computer Science and Telecommunications : Georgian Electronic Scientific Journal. — 2007. — № 3(14). — С. 78—83.
  27. А. П. Алферов, А. Ю. Зубов, А. С. Кузьмин, А. В. Черёмушкин. Основы криптографии. — 2-е изд. — Гелиос АРВ, 2002. — С. 115-119. — 480 с.
  28. U.S. Patent 1 845 947: [Электронный ресурс], — URL: [http://www.google.com/patents/US1845947] (дата обращения: 01.08.2017)
  29. Friedrich L. Bauer. Decrypted Secrets: Methods and Maxims of Cryptology. — Springer, 2002. — С. 85. — 474 с

Приложение А

Исходный текст программы

Пример реализации шифра Хилла на ЯП Python 3

Автор: Данченко (Кибовская) Ольга

Дата: 03.08.2017

#---------------------------------------

#-----------Импорт модулей-------------

import numpy as np

#---------------------------------------

#-----------Описание функций------------

#Функция выравнивания текста по левому краю, кратно основанию

def Alignment(text, dimension):

temp = dimension - len(text) % dimension

if(temp != dimension):

for i in range(temp):

text = text + ' '

return text

#Функция преобразования текста в матрицу типа int16

def TextToMatrix(text):

text = Alignment(text)

steps = int(len(text) / 3)

data = np.zeros((steps, 3), dtype = np.int16)

for i in range(steps):

temp = text[3*i:3*i+3:1]

for j in range(3):

data[i][j] = ord(temp[j])

return(data)

#Функция шифрования/дешифрования текста

def EncryptOrDecrypt(Matrix, PathFirst, PathLast):

f = open(PathFirst, 'r')

text = f.read()

f.close()

DataMatrix = TextToMatrix(text)

Shape = DataMatrix.shape

CipheredMatrix = np.zeros((Shape[0], Shape[1]), dtype = np.int16)

for i in range(Shape[0]):

CipheredMatrix[i] = ( np.dot(Matrix, DataMatrix[i]) ) % Module

CipheredMatrix = CipheredMatrix.reshape(1,Shape[0]*Shape[1])

Text = ''

for i in range(CipheredMatrix.size):

Text = Text + chr(CipheredMatrix[0][i])

f = open(PathLast, 'w')

f.write(Text)

f.close()

return (Text)

#---------------------------------------

#-----------Задание констант------------

#Длина алфавита

Module = 127

#Основание (размерность матрицы)

Dimension = 3

#Пути к файлам

BasePath = "C:\\Users\lab\Desktop\Test"

TextFilePath = "\Test.txt"

CipheredTextFilePath = r"\Ciphered.txt"

DecipheredTextFilePath = "\Deciphered.txt"

#Матрицы шифрования/дефшифрования

CipherMatrix = np.array([[6, 24, 1],

[13, 16, 10],

[20, 17, 15]])

#Поиск обратной матрицы по модулю https://planetcalc.ru/3324/

DecipherMatrix = np.array([[107, 98, 63],

[53, 107, 86],

[119, 19, 98]])

#---------------------------------------

#--------Задание полных путей к файлам--

EncryptPathRd = BasePath + TextFilePath

EncryptPathWr = BasePath + CipheredTextFilePath

DecryptPathRd = BasePath + CipheredTextFilePath

DecryptPathWr = BasePath + DecipheredTextFilePath

#----------Пример шифрования/дешифрования заданного текста-------

CipheredText = EncryptOrDecrypt(CipherMatrix, EncryptPathRd, EncryptPathWr)

print('Зашифрованный текст')

print(CipheredText)

DeCipheredText=EncryptOrDecrypt(DecipherMatrix, DecryptPathRd, DecryptPathWr)

print('Расшифрованный текст')

print(DeCipheredText)

#---------------Конец-------------------

Приложение Б

Таблица ASC II

http://www.asciichars.com/_site_media/ascii/ascii-chars-landscape.jpg