Файл: Основы программирования на языке Pascal (Язык программирования Pascal).pdf
Добавлен: 29.03.2023
Просмотров: 344
Скачиваний: 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].
|
Рисунок 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, который оптимизирован для работы на микроконтроллерах.