В какой парадигме программирования реализован язык Паскаль?
Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.
решение вопроса
Связанных вопросов не найдено
Обучайтесь и развивайтесь всесторонне вместе с нами, делитесь знаниями и накопленным опытом, расширяйте границы знаний и ваших умений.
поделиться знаниями или
запомнить страничку
- Все категории
- экономические 43,679
- гуманитарные 33,657
- юридические 17,917
- школьный раздел 612,662
- разное 16,911
Популярное на сайте:
Как быстро выучить стихотворение наизусть? Запоминание стихов является стандартным заданием во многих школах.
Как научится читать по диагонали? Скорость чтения зависит от скорости восприятия каждого отдельного слова в тексте.
Как быстро и эффективно исправить почерк? Люди часто предполагают, что каллиграфия и почерк являются синонимами, но это не так.
Как научится говорить грамотно и правильно? Общение на хорошем, уверенном и естественном русском языке является достижимой целью.
- Обратная связь
- Правила сайта
§ 14. Паскаль — язык структурного программирования
Программирование для ЭВМ — процесс создания программ управления работой компьютера.
Эволюция программирования
С изобретением программно управляемых вычислительных машин появилась новая профессия — программист. На ламповых ЭВМ первого поколения программисты составляли свои программы, используя непосредственно команды процессора. При этом программисту приходилось самому распределять ячейки памяти под данные и под команды программы. Нужно было знать систему команд процессора и коды всех команд. Исходные данные и команды представлялись в форме двоичного кода, т. е. непосредственно в том виде, в котором они хранились в памяти ЭВМ.
Для сокращения записи программ на специальных бланках обычно использовали двоично-восьмеричный или двоично-шестнадцатеричный код. Вот пример команды программы для одного из компьютеров первого поколения:

Такая команда называется трехадресной. Код 0216 относится к команде сложения. 1-й и 2-й адреса — это адреса ячеек ОЗУ, в которых хранятся слагаемые, 3-й адрес — адрес ячейки, куда заносится сумма. Сама команда хранится в ячейке ОЗУ с адресом 2816.
Программирование в машинных кодах представляло собой сложный процесс. По этой причине производительность работы программистов была довольно низкой. В 1950-х годах возникает направление, которое получило название «автоматизация программирования». Основная его цель — создание средств, облегчающих и ускоряющих процесс создания программы для ЭВМ. Появляются первые языки программирования.
Первыми языками программирования были машинно-ориентированные автокоды. Позднее за языками такого уровня закрепилось название ассемблеры. Первоначально ассемблером называли программу-переводчик с языка ассемблера в машинные команды. Позднее и сам язык ассемблера стали называть именем ассемблер. Программирование на ассемблере снимает с программиста заботу о распределении памяти под данные и команды программы. Программист не должен помнить внутренние коды всех команд процессора. Вот пример той же команды сложения на ассемблере (автокоде):
Слово ADD обозначает команду «сложить», а и b — имена переменных-слагаемых, с — переменная, куда помещается результат.
Язык ассемблер называется машинно-ориентированным по той причине, что для каждой команды процессора существует свой аналог команды на ассемблере. Поскольку разные типы ЭВМ имели разные системы команд процессора, ассемблеры у них тоже отличались. Современные ассемблеры точно так же ориентированы на определенные типы процессоров. Позже появились так называемые макроассемблеры, в языке которых существуют макрокоманды, соответствующие сериям команд (подпрограммам) на языке процессора.
Составление программы на ассемблере проще, чем на языке команд процессора. Работу по распределению памяти под данные и команды, перевод команд ассемблера в машинные команды берет на себя специальная системная программа — транслятор.
Из машинной ориентированности программ на ассемблере следует, что такие программы нельзя переносить для исполнения на другие типы ЭВМ с другой системой команд процессора. Эта проблема создавала серьезные ограничения для прикладных программистов. Кроме того, само программирование на ассемблере является достаточно сложным для массового освоения, что ограничивало использование ЭВМ в прикладных областях.
Языки программирования высокого уровня. Следующим этапом развития программирования стало создание языков программирования высокого уровня — ЯПВУ. Примеры ЯПВУ: Паскаль, Бейсик, Фортран, Си, Java и др. Все названные ЯПВУ относятся к так называемой процедурной парадигме программирования. Поэтому их называют процедурными языками программирования. Программы на таких языках представляют собой последовательности команд, описывающих действия (процедуры) компьютера по обработке информации. Существуют другие парадигмы программирования. Относящиеся к ним языки называют декларативными языками программирования (Пролог, Лисп и др.). Однако мы их рассматривать не будем.
Для каждого языка существует машинно-независимый стандарт. Возможность программирования на данном ЯПВУ зависит от наличия на вашем компьютере транслятора с этого языка. Трансляторы для каждого типа компьютера создают системные программисты.
Текст программы на ЯПВУ по своей форме ближе к естественным языкам (чаще всего — английскому), к языку математики. Та же команда сложения двух величин на ЯПВУ похожа на привычную форму математического равенства:

Освоить программирование на языке высокого уровня гораздо проще, чем на ассемблере. Поэтому с появлением ЯПВУ значительно возросло число прикладных программистов, расширилось применение ЭВМ во многих областях.
Большое количество языков программирования появилось в 1960-1970-х годах. В 1965 году в Дартмутском университете был разработан язык Бейсик. По замыслу авторов это простой, легко изучаемый язык, предназначенный для программирования несложных расчетных задач. Наибольшее распространение Бейсик получил с появлением микроЭВМ и персональных компьютеров.
История Паскаля
Язык программирования Паскаль был создан швейцарским профессором Никлаусом Виртом в 1969 году как язык для обучения студентов структурной методике программирования. Язык получил свое название в честь Блеза Паскаля, изобретателя первого вычислительного механического устройства. Позднее фирма Borland International, Inc (США) разработала систему программирования Турбо Паскаль для персональных компьютеров, которая вышла за рамки учебного применения и стала использоваться для научных и производственных целей. В Турбо Паскаль были внесены некоторые дополнения к базовому стандарту Паскаля, описанному Н. Виртом. Со временем язык развивался. Начиная с версии 5.5, в Турбо Паскаль вводятся средства поддержки объектно-ориентированного программирования (ООП). В дальнейшем это привело к созданию Object Pascal — языка с возможностями объектно-ориентированного программирования. В начале 1990-х годов объединение элементов ООП в Паскале с визуальной технологией программирования привело к созданию системы программирования Delphi.
Структура процедурных языков программирования высокого уровня
Во всяком языке программирования определены способы организации данных и способы организаций действий над данными. Кроме того, существует понятие «элементы языка», включающее в себя множество символов (алфавит), служебных слов и других изобразительных средств языка программирования. Несмотря на разнообразие процедурных языков, их изучение происходит приблизительно по одной схеме. Это связано с общностью структуры различных процедурных языков программирования высокого уровня, которая схематически отражена на рис. 3.9.

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

Раздел операторов имеется в любой программе и является основным. Предшествующие разделы носят характер описаний и не все обязательно присутствуют в каждой программе.
- отсутствие заголовка программы;
- разделы Const, Type, Var, Label могут следовать друг за другом в любом порядке и повторяться в разделе описаний сколько угодно раз.
Система основных понятий

Вопросы и задания
- В каком виде составлялись программы для первых компьютеров?
- Чем отличались программы на автокодах (ассемблерах) от программ в машинных кодах?
- Почему ЯПВУ являются машинно-независимыми языками программирования?
- Что такое трансляция?
- В какой парадигме программирования реализован язык Паскаль?
- Что входит в структуру любого процедурного ЯПВУ?
- Из каких основных разделов состоит программа на Паскале?
Парадигмы программирования: простое объяснение

Редакция Highload разобралась, что такое парадигмы программирования, какими они обладают преимуществами и назначением. Это важное теоретическое знание для новичков, которое поможет лучше понять отличия и возможности разных языков программирования, а также выделить эффективные области их применения.
Детям из Мариуполя нужно 120 ноутбуков для обучения — подари старое «железо», пусть оно работает на будущее Украины
1. Что такое парадигма программирования?
Парадигма программирования — это набор концепций, правил и абстракций, определяющих стиль программирования. В соответствии с ними в каждой парадигме заложен подход к использованию ключевых конструкций.
-
объектно-ориентированное программирование опирается на классы, объекты и взаимодействие между ними;
Курс Project Manager.
Впроваджуйте покроковий алгоритм управління проєктами вже зараз. У цьому вам допоможе Павло Харіков — Head of IoT у Veon Group (Kyivstar).
Подробнее про разные парадигмы мы узнаем далее в соответствующих разделах.
На базе этих и других парадигм разработчики создают языки программирования. Важно, что один язык программирования может быть не ограничен одной парадигмой. Например, императивные и декларативные парадигмы могут весьма успешно уживаться в одном языке. В этом случае такие языки называют мультипарадигменными.
Все дело в том, что не существует универсальной парадигмы. Для каждой задачи можно найти ту, которая подходит лучше. Но для этого необязательно менять язык программирования (если он является мультипарадигменным). Тогда достаточно лишь научиться переключению между парадигмами — то есть, освоить разные стили программирования, оставаясь в пределах уже знакомой среды программирования.
2. Для чего они нужны?
Выше мы уже немного касались темы выбора средств для решения задач.
С годами разработчики программного обеспечения создали эффективные подходы для решения задач на все случаи жизни. Обобщив знания, прошедшие проверку на практике, они оформили их в парадигмы программирования. Теперь достаточно классифицировать задачу, чтобы узнать, какая парадигма (и соответственно — язык программирования) лучше всего подходит для ее решения.

Парадигмы также во многом определяют стандарты написания кода и построения архитектуры приложений. Поэтому разработчики, пишущие на разных языках программирования, но использующие одну и ту же парадигму, при необходимости достаточно быстро преодолевают «языковой барьер».
Курс Стратегічний маркетинг.
Від хаосу до системного маркетингу разом із Тетяною Лукинюк, B2C-директором у Kyivstar, колишнім CMO у Coca-Cola, Mars Ukraine та генеральною директоркою у Red Bull Ukraine.
3. Императивная парадигма программирования
Программный код в императивном стиле организован как последовательность отдельных команд, инструкций, описывающих логику работы программы. Читая такой код, можно понять, каким образом будет меняться состояние приложения в тот или иной момент — в зависимости от того, какие фрагменты кода будут запущены.
Разработчики начали осознанно использовать императивную парадигму примерно с середины XX века. На тот момент уже были в ходу низкоуровневые языки программирования, в которых эта парадигма была реализована интуитивно. Благодаря такой интуитивной простоте императивная парадигма и стала популярной. Дело в том, что на низком уровне (то есть на уровне машинных команд) логика выполнения программ выглядит ровно так, как описано выше: машины просто физически не могли по-другому выполнять инструкции — в силу своей архитектуры.
Тогда же стали появляться и первые высокоуровневые языки, построенные на этой парадигме. Это позволило парадигме стать де факто стандартом коммерческой разработки ПО на многие годы.

Языки
Многие разработчики до сих пор используют низкоуровневые языки программирования (чаще всего, речь идет о разных видах языка ассемблера). Императивную парадигму также гордо несут на своих плечах топовые на сегодня высокоуровневые языки — С/С++, C#, Java, Python, JavaScript. Еще она реализована, например, в не очень топовых языках PHP и Ruby. Но напомню: это не значит, что они не могут поддерживать другие парадигмы.
Преимущества:
- Изучать императивный подход к разработке программ достаточно легко. Это особенно важно, когда человек впервые сталкивается с программированием.
- Можно писать хорошо читаемый код и отлаживать его, работая над небольшими проектами. В таком коде будет достаточно просто разобраться даже специалисту, который не работал над этим проектом.
- Как сказано выше, императивная парадигма лежит в основе топовых языков программирования. Так что стоит признать, что она имеет коммерческий успех.
Недостатки:
- В противовес пункту 2 из предыдущего раздела нужно отметить, что по мере роста проекта код становится тяжело поддерживать и вообще возникают проблемы с масштабированием приложений.
- Так называемые побочные эффекты способны менять состояние переменных. Например, при вызове функции с одинаковыми параметрами на разных этапах выполнения алгоритма можем получить разные результаты. Это как раз происходит из-за побочных эффектов. Зачастую разработчикам очень трудно предусмотреть, где и когда возникнет такая ситуация. Поэтому нужно потратить достаточно много времени, чтобы взять побочные эффекты под контроль.
- В больших проектах из-за ограничений архитектуры разработчики вынуждены писать избыточный код.
Курс Business English для проджект-менеджерів.
Курс на якому ви здолаєте всі бар’єри кроскультурної комунікації, навчитеся розв’язувати конфлікти, попереджати ризики та ефективно презентувати результати роботи іноземним стейкхолдерам.
4. Процедурное программирование

Процедурная парадигма — это подвид императивной парадигмы. Алгоритм выполнения программы также представлен в как последовательность инструкций, но наборы однотипных инструкций организованы в специальные блоки кода, процедуры. Их еще иногда называют подпрограммами, чтобы указать на наличие некой главной программы, в которой эти процедуры созданы, описаны. Процедуры можно вызывать много раз. Им можно передавать параметры. В этом случае процедура будет выполнять одну и ту же операцию над разными исходными данными. Процедуру можно вызвать из любой точки главной программы, из другой процедуры или внутри себя.
Безусловно, эта парадигма унаследовала некоторые недостатки императивной парадигмы, но благодаря оформлению кода в процедуры становится проще:
-
повторно использовать код;
У современных разработчиков такие громкие заявления, возможно, вызовут усмешку, но для инженеров середины XX века это был важный шаг вперед.
sum (a,b) < return a + b; // процедура возвращает сумму двух чисел >multiply (a,b) < return a * b; // процедура возвращает произведение двух чисел >// Основная программа number1 = 2; number2 = 4; // по очереди вызываем процедуры и записываем результат в переменную result result = sum (number1, number2); result = multiply (number1, number2);
Пример в процедурном стиле на псевдокоде
Языки
Так или иначе, процедуры реализованы в тех современных языках, которые перечислены выше, и в большинстве других. Но изначально это было прерогативой таких старых языков, как Cobol, Algol, Perl, Fortran, Pascal, Basic и C.
5. Объектно-ориентированное программирование
Объектно-ориентированное программирование (ООП) по-прежнему имеет отношение к императивной парадигме, но еще дальше продвинулось в познании окружающего мира, разделив его на объекты и классы. В том числе были переосмыслены и процедуры. Так, к 1967 году были сформулированы основные идеи ООП:
- объект — это элементарная сущность, имеющая свойства (атрибуты) и поведение (методы, они же — бывшие процедуры);
- класс — это тип, шаблон, определяющий структуру, набор атрибутов и методов для объектов одного типа — то есть, экземпляров класса;
- класс может наследовать атрибуты и методы своего родительского класса и иметь при этом свои собственные. Так формируется иерархия классов, она позволяет моделировать предметную область на разных уровнях абстракции и детализации, решая задачу по частям;
- полиморфизм — это механизм, позволяющий использовать одну и ту же функцию (метод) для данных разных типов (классов).
- инкапсуляция — это механизм, позволяющий скрывать некоторые детали реализации внутри класса. Часто сторонним сущностям, которые работают с объектом ни к чему знать нюансы реализации его класса и иметь доступ к каким-то его атрибутам и методам. Поэтому часто разработчик создает для класса интерфейс, которые отвечает за взаимодействие с внешними сущностями, открывая специально выбранные для этого атрибуты и методы.
class Calculator < var lastOperation; // атрибут класса // процедура из прошлого примера превратилась в метод sum (a,b) < this.lastOperation = ‘sum’; return a + b; >// процедура из прошлого примера превратилась в метод multiply (a,b) < this.lastOperation = ‘multiply’; return a * b; >> // Основная программа number1 = 2; number2 = 4; calc = new Calculator (); // создаем объект класса Calculator // вызываем методы для объекта calc result = calc.sum (number1, number2); result = calc.multiply (number1, number2);
Пример ООП на псевдокоде
Языки
Парадигма ООП реализована как в современных, так и в старых языках. Только в итоге у них получилось немного разное ООП или недо-ООП:
- Например, Perl и Fortran — это изначально процедурные языки. Их разработчики просто добавили туда некоторые элементы ООП.
- Еще одна пара старых языков, Modula-2 и Oberon, решила обойтись без синтаксических конструкций для методов класса.
- Разработчики предложили вручную имитировать их с помощью обычных процедур.
- В Java, C++ и Python реализовано ООП, но в сочетании с процедурным подходом.
- И наконец Smalltalk, C# и Ruby — так называемые чистые объектно-ориентированные языки.
6. Декларативная парадигма программирования
Декларативная парадигма, в отличие от императивной, описывает не последовательность инструкций, а проблему (задачу) и модель (набор выражений) для ее решения. То есть любой допустимый набор входных данных будет обработан в соответствии с моделью.
При этом последовательность, в которой эти выражения будут вычислены, явно никак не определена. В коде мы это увидеть не сможем, но некоторые языки (и среды) программирования с декларативной парадигмой позволяют выяснить, какие цепочки вычислений сработали для конкретного набора входных данных после запуска программы.
Сможет ли программа быстро найти решение задачи (если оно в принципе существует), будет зависеть от того, насколько верно подобран набор выражений для модели, насколько короткими, «красивыми» (с точки зрения математики) окажутся цепочки вычислений в процессе поиска решения.
Простейший пример
Пусть нам нужно приготовить филе курицы. И овощи (помидоры черри). В тушеном виде. Желательно, чтобы блюдо было соленое и не пересушенное.
Императивная парадигма описывает решение так:
- купить филе курицы;
- купить помидоры черри;
- купить соль и подсолнечное масло;
- порезать филе;
- поставить жаровню на плиту;
- закинуть в жаровню филе курицы и помидоры;
- налить подсолнечное масло и посолить;
- включить плиту на среднем огне;
- через 40 минут выключить плиту.
Декларативная парадигма:
- хочу соленое, тушеное филе курицы с помидорами черри и подсолнечным маслом.
Языки
Декларативные языки программирования не входят в Тор 20 индекса TIOBE, но во второй двадцатке некоторые присутствуют. Среди них — Prolog, LISP, SQL, Haskell, Scala. на самом деле, это зачастую узкоспециализированные языки, решающие свои задачи. В этот же список, кстати, должны входить Erlang, Clojure, Elixir, F#. Так что кто знает — тот знает.
Декларативные языки программирования делятся на две категории:

В разделе преимущества и недостатки парадигмы описывать не будем. Многое зависит от ее конкретной реализации в языке программирования. Картина станет яснее после прочтения следующих двух разделов.
7. Функциональное программирование
В ходе развития декларативной парадигмы сформировался подход, основанный на так называемых чистых функциях. Функция является чистой, если:
- результат функции зависит только от ее входных данных, а не от внешнего контекста или состояния приложения;
- функция не имеет побочных эффектов.
Некоторые функциональные языки программирования позволяют использовать локальные переменные или организовывать побочные эффекты, но в идеале такое парадигма не допускает. И кстати, некоторые императивные языки позволяют использовать элементы функциональной парадигмы, но этого недостаточно, чтобы называть их функциональными.
В функциональных языках также реализован принцип ленивых вычислений: запуск функции на выполнение нужно отложить до тех пор, пока не понадобится результат ее работы. Например, с помощью ленивых вычислений можно работать с бесконечными последовательностями (те значения последовательности, которые уже известны, хранятся в памяти, а остальные хранятся в виде формулы).
Наверно, вы уже догадались, но все равно стоит заметить: функции из процедурной парадигмы очень отличаются от функций из функциональной парадигмы программирования. Еще раз подчеркнем: в функциональной парадигме чистая функция всегда возвращает один и тот же результат для одних и тех же входных данных и независимо от того, когда и в какой строке кода она была запущена.
Пример
Слева — программа на императивном языке С++. Справа — программа на функциональном языке:

Не зря мы выбрали пример с рекурсией (в коде справа функция вызывает сама себя). В функциональном программировании рекурсию используют достаточно часто и охотно.
Языки
Lisp, Erlang, Clojure, Elixir, F# и Haskell — одни из наиболее известных функциональных языков программирования.
Haskell — типичный, чисто функциональный язык программирования со статической типизацией и ленивыми вычислениями. Язык позволяет создавать иммутабельные структуры данных и автоматически определяет (выводит) тип значения для выражений. Благодаря ленивым вычислениям компилятор Haskell ускоряет работу программы, так как не подсчитывает значения для выражений, не участвующих в выводе конечного результата.
Применение функционального программирования
Многие функциональные языки программирования хороши при решении сложных вычислительных задач. Например, они востребованы в сфере разработки искусственного интеллекта и высоконагруженных систем.
Проекты в области Data Science и Big Data требуют большого количества быстрых вычислений с минимальным потреблением аппаратных ресурсов. Часто с этими задачами императивные языки справляются гораздо хуже, так как потребляют слишком много ресурсов — в частности, при выполнении параллельных вычислений.
Но когда дело касается реализации, например, пользовательского интерфейса — императивные языки вновь на коне. Функциональные языки программирования реализованы в соответствии с декларативной парадигмой. Такая реализация имеет свои преимущества и недостатки, которые, увы, трудно воспринимать без знания императивных языков и сопоставления с ними.
Преимущества
- Позволяет минимизировать или вовсе избавиться от мутабельности данных.
- Не допускает появления побочных эффектов.
- Благодаря этому снижается вероятность допустить ошибку, связанную с непредвиденным изменением состояния приложения.
- Лучше подходит для разработки масштабируемой функциональности, так как обеспечивает гораздо меньшую связность кода и высокий уровень абстракции.
Недостатки
- Необходимость менять входные данные при активном взаимодействии приложения с пользователями или другими приложениями заставляет разработчиков лишний подумать, стоит ли использовать эти языки. Ведь для решения таких задач на практике зачастую приходится нарушать принципы декларативного подхода.
- Есть сложности с оценкой производительности, так как структуру декларативных языков трудно оптимально отобразить на машинную архитектуру.
- Из-за узкой направленности декларативные языки менее популярны, не имеют таких больших и развитых экосистем, как у современных императивных языков программирования.
8. Логическое программирование
Реализация декларативной парадигмы в логическом программировании строится на двух сущностях — факты и правила вывода. Программа в ходе своей работы применяет к заранее известным фактам описанные разработчиком правила формальной логики, подтверждая или опровергая выдвинутые гипотезы.
Мы можем сформулировать задачу в этих терминах, разбить ее на подзадачи (если нужно) и решением будет общий результат, собранный после проверки гипотез по каждой подзадаче. Как именно будет проходить проверка гипотез, какие правила будут в ней задействованы — вновь самостоятельно решает компилятор логического языка, на котором написана программа.
Работу программы можно сравнить с картой маршрутов. Чтобы куда-то добраться — нужно идти не по всем маршрутам, которые нарисованы на карте. На каждом условном перекрестке нужно выбрать какой-то вариант движения, принимая решение на основе известных нам фактов (подсказок). А разработчик при написании кода задает эту карту, по которой можно прийти в разные пункты назначения — в зависимости от конкретных исходных данных.
Пример
По заданным признакам определить, какие объекты являются птицей.
У нас есть вот такой набор признаков (фактов, исходных данных):
- голубь – это птица;
- у вороны есть крылья;
- ворона умеет летать;
- у пингвина есть крылья;
- пингвин умеет плавать;
- объект является птицей, если он умеет летать и у него есть крылья.
Высказывания 1–5 будем считать фактами, которые мы принимаем без доказательств. Высказывание под номером 6 представляет собой правило вывода. В данном случае это правило определяет, в каких случаях объект можно считать птицей:
- умеет летать и есть крылья.
Раз между ними стоит И, значит должны быть выполнены оба условиях одновременно.
Полученная модель может обрабатывать, например, такие запросы:
- Кто умеет плавать? (Ответ: пингвин)
- Кто является птицей? (Ответы: голубь, ворона)
- У кого есть крылья? (Ответы: ворона, пингвин)
Программа на неком логическом псевдоязыке (а-ля Prolog) будет выглядеть так:
птица (голубь). есть_крылья (ворона). умеет_летать (ворона). есть_крылья (пингвин). умеет_плавать (пингвин). птица (Объект):- умеет_летать (Объект), есть_крылья (Объект).
В целом интуитивно понятно, да?
Языки
Prolog, Mercury, Alice
Среди старых и, как ни странно, все еще популярных логических языков программирования можно выделить Prolog. Его явили миру в 1970 году и поначалу использовали для анализа естественного языка. Оказалось, что этот язык позволяет создавать так называемые экспертные системы с автоматизацией выдачи информации в ответ на вопросы пользователей. Для этого достаточно лишь описать факты и придумать для них правила вывода.
Применение
Для более старых логических языков в середине XX века было почетно участвовать в автоматическом доказательстве теорем.
Логические языки программирования по-прежнему используются редко и точечно. Тем не менее они хорошо зарекомендовали себя в разработке трансляторов, оптимизаторов кода и систем искусственного интеллекта. Разработчик языка Visual Prolog (компания PDC) с его помощью создает авиационные и медицинские системы.
Часто в коммерческой разработке ПО логический язык используется как дополнение к императивному.
9. Метапрограммирование
Метапрограммирование — достаточно широкое понятие: это и создание шаблонов, и программных компонентов, и разработка инструментария для генерации кода, и набор паттернов проектирования ПО.
По сути, это набор подходов к реализации программ, порождающих или модифицирующих программный код. Метапрограммирование находится на более высоком уровне абстракции, чем тот результирующий или модифицируемый код. Это может быть рефлексия, некий взгляд с позиции наблюдателя или создателя.
В связи с этим закономерно возникают метаязыки — как инструменты реализации таких высокоуровневых управляющих конструкций. Вообще, метаязык — это любой язык, служащий для описания, анализа, модификации или генерации какого-либо языка. Сюда также входит случай, когда язык модифицирует сам себя.
Преобразователи и оптимизаторы
Метапрограммирование используют при реализации механизма компиляции программного кода. То есть, в преобразовании кода, написанного на языке высокого уровня, в объектный код или набор машинных команд участвуют специальные метапрограммы, созданные разработчиками.
Эти метапрограммы могут также выполнять высокоуровневую оптимизацию. Например, при удалении бесполезных фрагментов кода (или мертвого кода; dead code elimination ) метапрограмма анализирует исходный код и убирает фрагменты, которые не влияют на итоговый результат работы. Если, например, какой-то блок исходного кода (возможно, из-за логической ошибки программиста), никогда не запустится или объявляет переменные, которые нигде не используются — программе нужна такая оптимизация.
Подобные оптимизации уменьшают размер скомпилированных бинарных файлов и иногда повышают производительность приложения.
Самомодифицирующийся код
Только что мы говорили про компилятор, а теперь вспомним про интерпретатор. В отличие от компилятора, интерпретатор выполняет анализ, обработку исходного кода и выполнение программы, последовательно считывая по одной строке или команде. То есть, можно сказать, что разработчики интерпретаторов обеспечивают самомодификацию кода (автоматическую модификацию кода во время работы программы) средствами метапрограммирования.
Среди известных и более современных интерпретируемых языков есть и PHP, и Ruby, а также модный в последнее время Python.
По аналогии был реализован и механизм так называемой компиляции на лету ( JIT — Just-in-time) и частично добавлен к этим языкам, а также ко многим другим: Java, JavaScript, в реализации языков для .NET и так далее. Это динамическая компиляция, которая работает прямо во время выполнения программы. За счет этого JIT -компиляция часто дает больший выигрыш в производительности, чем компиляция статическая.
Что еще благодаря метапрограммированию происходит на лету? Динамическое приведение типов и динамический полиморфизм. Это реализовано в таких языках, как C++, C# и Java. Они связаны с таким механизмом как «позднее связывание». Пример: какому классу (типу) принадлежит объект, для того класса (типа) и вызывается метод. Этот вопрос для каждого конкретного случая решается непосредственно в процессе работы программы.
Генераторы кода
В процессе разработки больших или многослойных приложений часто появляется необходимость писать достаточно объемный и однообразный код, который просто обслуживает основной код. Но во многих случаях такой служебный код все-таки имеет существенную вариативную часть. По этой причине одного лишь рефакторинга оказывается недостаточно.
И тогда на помощь приходит метапрограммирование. Возникает светлая мысль: написать генератор кода, принимающий необходимые параметры. После этого необходимую служебную функциональность с заданными параметрами можно будет добавлять автоматически. Впоследствии такие метапрограммы могут быть оформлены в библиотеки, фреймворки и включены в программный инструментарий крупных сред разработки (Qt Creator, Visual Studio, IntelliJ Idea и так далее).

XAML Designer, Visual Studio 2022
Яркий пример такого инструментария — генераторы GUI: они автоматически формируют исходный код для форм, кнопок и других элементов интерфейса, а также позволяют задать им многочисленные параметры (размеры, внешний вид и так далее).
Разработка таких автоматизированных решений обходится дорого и окупает себя только в случае активного или массового использования.
10. Обобщенное программирование
В одном источнике с претензией на википедию для программистов пишут, что это разновидность метапрограммирования. Тем не менее, из-за большого внимания к теме она достойна отдельного обсуждения.
Суть подхода выражается в попытке мыслить алгоритмами обработки абстрактных структур-контейнеров без привязки к типу обрабатываемых данных. Нужно стремиться к универсальным (в смысле типов данных) решениям-шаблонам, позволяющим справляться с похожими задачами. А типы данных должны играть роль входных параметров и для контейнеров, и для алгоритмов.
Выше шла речь про генераторы кода. Здесь и там можно найти общую проблематику: здесь и там есть повторяющиеся похожие задачи, которые предлагается автоматизировать. Но обобщенные алгоритмы и структуры данных должны непосредственно участвовать в решении основных проблем, а не играть вспомогательную или декоративную роль. Рутинные действия будут автоматизированы, но от выбора лаконичного решения и создания подходящих шаблонов будет зависеть основная логика и производительность приложения (или его частей).
Во многих современных языках уже есть встроенные библиотеки таких шаблонов. C++ был одним из первых языков, для которого была создана подобная библиотека. Standard Template Library (STL) включала такие контейнеры, как dynamic array, linked list, queue, set, associative array , алгоритмы, итераторы и многое другое. Чтобы, например, использовать все преимущества связанного списка ( linked list ) и инструментария его обработки, нужно просто передать ему данные и их тип. А всю работу под капотом для вас сделает компилятор.
Шаблоны классов
В С++ для создания шаблонов используют ключевое слово template .
template class Container < public: void add (T value); int index_of (T value); int get_count (); T get_value (int index); private: … … … >;
Вспоминаем, что было сказано чуть выше, и передаем нашему шаблону нужный тип, а затем данные.
Container apples; int main ()
Пример шаблона с несколькими параметрами:
template class Array // это объявление Array // это инициализация
Шаблоны функций
Иногда достаточно создать шаблон только для одной функции, не создавая целый класс.
template void swap (T &left, T &right)
Функция меняет местами значения аргументов.
int main () < int a = 3, b = 5; swap (a, b); // теперь значение a стало равно 5, значение переменной b равно 3 >
Переменные a и b имеют тип int , поэтому компилятор автоматически вызовет swap (a, b) . Но можно явно прописать это в коде, заменив swap (a, b) на swap (a, b) .
Безусловно, с точки зрения метапрограммирования написать библиотеку шаблонов — это достаточно простая задача, но без обобщенного программирования современную индустрию разработки очень трудно представить.
Заключение
Как видите, парадигмы программирования — это бесконечная тема. Чем больше рассказываешь — тем больше всплывает деталей, вопросов и сюжетных ответвлений. Поэтому нужно уже остановиться.
Понятно, что с точки зрения практики, хорошо бы владеть разными стилями (парадигмами) программирования. Хорошо бы понимать, как реализованы парадигмы средствами того или иного языка и как это все применяют в реальных проектах. А погружение в холивары о том, какая парадигма популярнее и в каких языках ее больше, кажется не слишком полезным. Лучше посмотрите таблицу и видео, которое размещено ниже. Надеюсь, это принесет вам больше пользы.
Таблица базовых парадигм
| Парадигма | Ключевой концепт | Программа | Работа программы | Результат |
| Императивная | Команда | Последовательность инструкций | Выполнение инструкций | Итоговое состояние памяти |
| Объектно-ориентированная | Объект и класс | Набор классов и объектов | Обмен данными между объектами через вызов их методов | Итоговое состояние объектов |
| Функциональная | Функция | Набор функций | Вычисление функций | Итоговое значение главной функции |
| Логическая | Факты и правила | Логические соотношения | Логическое доказательство | Результат доказательства |
Видео: Парадигмы программирования (обзорное видео с примерами и ответами на вопросы)
Курс Product Management.
Програма розрахована на тих, хто хоче розпочати свою кар’єру як Product Manager з нуля і тих, хто вже працює в IT і хоче перейти в цю спеціалізацію.
В какой парадигме программирования реализован язык паскаль
Есть вопрос — получи ответ
В какой парадигме программирования реализован язык Паскаль?
Вопрос:
В какой парадигме программирования реализован язык Паскаль?
Подробный ответ:
Язык Паскаль реализован в парадигме программирования, называемой «структурное программирование». В этой парадигме задача программирования разбивается на небольшие блоки кода, называемые процедурами или функциями. Это делает программы более структурированными и понятными. Паскаль предоставляет инструменты для создания четких и легко поддерживаемых программ, что помогает программистам более эффективно работать с кодом.