Файл: Классификация языков программирования (Основные парадигмы программирования).pdf
Добавлен: 29.03.2023
Просмотров: 411
Скачиваний: 1
СОДЕРЖАНИЕ
1. Классификация языков программирования
1.1 Основные парадигмы программирования
1.2 Объектно-ориентированная парадигма
2. Критерии выбора среды и языка разработки программ
2.1 Выбор первого языка для разработки программ
2.2 Критерии выбора языка и среды разработки для обучения программированию
ВВЕДЕНИЕ
Выбор парадигмы программирования, определяющей успешность реализации программного продукта, и соответствующего ей языка программирования имеет решающее значение для специалиста в области информационных технологий и программирования. За последние 50 лет появились сотни языков, поддерживающих различные парадигмы, некоторые из них используют несколько парадигм (такие языки называют мультипарадигменными). Однако, несмотря на большое количество языков программирования, существует несколько действительно важных концепций программирования, и не так много языков, которые были бы актуальны на протяжении более десяти лет. Именно парадигмы программирования определяют общий способ проектирования прикладных программ. Парадигмой программирования называют используемый различными языками подход к программированию, то есть, проще говоря, набор идей и понятий, определяющих стиль написания программ. Среди основных парадигм программирования выделяют объектно-ориентированную, процедурную, функциональную и логическую. Большинство языков программирования, активно используемых в современной разработке прикладных программ, являются мультипарадигменными.
Поскольку программное обеспечение становится все более сложным, особую важность приобретают хорошо структурированные программы, при разработке которых может быть использован восходящий подход: в первую очередь для заданной предметной области выделяются и реализуются наиболее простые функции. Такие программы легко писать и отлаживать, поскольку они, как правило, предоставляют набор модулей, которые могут быть повторно использованы с целью сокращения будущих временных или финансовых затрат. Подход к проектированию таких программ называют архитектурным, для него характерны глобальные ограничения, накладываемые на проектирование прикладного программного обеспечения: выбор стандартов разработки, парадигмы программирования, архитектурных стилей. Использование современных языков программирования позволяет внести особый вклад в модульность и быстродействие, предоставляя возможность создания быстрых и точных прототипов сложных программ. Таким образом, изучение возможностей современных языков программирования является актуальной задачей.
Целью данной курсовой работы является выявление критериев, позволяющих выбрать язык программирования и соответствующую ему среду разработки для обучения программированию. Исходя из цели курсовой работы, были поставлены следующие задачи:
- Получить общее представление о парадигмах программирования и классификации языков в соответствии с ними;
- Подробно рассмотреть основные парадигмы программирования, изучить их ключевые понятия;
- Выполнить анализ существующей литературы, выявляющей и анализирующей некоторые критерии выбора того или иного языка программирования и интегрированной среды разработки программ;
- Представить основные критерии выбора, рассмотреть их практическую применимость.
1. Классификация языков программирования
1.1 Основные парадигмы программирования
Современное значение термина «парадигма» было введено американским историком и философом Томасом Куном. Согласно Куну, парадигма – это устоявшаяся система научных взглядов, способная объединить членов научного сообщества [1.]. В этом смысле парадигмой можно назвать взгляды Аристотеля или механику Ньютона, причем в процессе развития науки может произойти смена парадигмы (как, например, гелиоцентрическая система Коперника пришла на смену геоцентрической модели мира, предложенной Птолемеем). Поскольку сторонники старой парадигмы могут быть не готовы принять новую, она может еще некоторое время существовать и даже развиваться.
Определение термина «парадигма программирования», обозначающее его совокупное содержание, не является универсальным. В соответствии с различными определениями, которые могут быть найдены в технической литературе, парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие. Термин «парадигма программирования» впервые применил в 1978 году Роберт Флойд в своей лекции лауреата премии Тьюринга. Флойд отмечал [2.], что в программировании можно наблюдать явление, подобное парадигмам Куна, но, в отличие от них, парадигмы программирования не являются взаимоисключающими и могут сочетаться, обогащая инструментарий программиста. Эту особенность использовали мультипарадигменные языки, появившиеся в результате развития идеологий, представленных в ранних, низкоуровневых языках.
Инструкции первых языков программирования, появившихся в начале 50-х годов XX века и ориентированных на конкретный компьютер, записывались в исходном коде и выполнялись последовательно. Данные, полученные при выполнении предыдущих инструкций, могли быть считаны из памяти или записаны в нее. Таким образом, программы представляли собой последовательность команд, которые должен был выполнить компьютер. Языки программирования, использующие этот подход (прежде всего, это машинные инструкции и язык ассемблера), образовали императивную парадигму программирования. В отличие от декларативного подхода, при котором задается спецификация решения задачи, в императивном широко используются операторы присваивания. Ранние императивные языки сложны для понимания и решения прикладных задач.
Развитие вычислительных устройств и компьютерной техники привело к появлению процедурных языков. Процедурные языки программирования, первые реализации которых относятся к концу 50-х годов, позволили разбивать задачи на шаги и решать их за шагом, причем возможность определять каждый шаг в процессе решения задачи была предоставлена программисту. Эти языки использовали императивный подход, но последовательно выполняемые операторы могли быть собраны в подпрограммы, то есть более крупные целостные единицы кода, с помощью самого языка. Согласно некоторым классификациям, такой подход выделяется в самостоятельную парадигму, получившую название процедурной. К процедурным языкам программирования относятся, например, Паскаль, Си, Алгол, КОБОЛ и Фортран.
Расширение класса решаемых задач требовало разработки новых алгоритмов и приведения их в удобную для применения форму. Процесс вычислений как последовательное изменение состояний, описанный в парадигме императивного программирования, оказался противопоставлен вычислениям значений функций в их математическом понимании (в отличие от функций как программ в процедурном программировании). При функциональном подходе вся совокупность последовательных действий вычислительного процесса может быть представлена явным образом, например, как список. Состояние программы при этом никак не хранится и не изменяется (в отличие от императивного подхода, где одной из базовых концепций является переменная, способная не только хранить свое значение, но и позволяющая менять его по мере выполнения алгоритма).
Теоретические основы функционального подхода впервые были реализованы на практике с появлением языка программирования Лисп, созданного Джоном Маккарти в конце 1950-х годов. Несмотря на то, что его первые версии, реализованные первоначально для компьютеров серии IBM 700/7000, не были полностью функциональными (хотя при этом поддерживали несколько парадигм), Лисп породил целое семейство функциональных языков, многие из которых активно используются и по сей день. Дальнейшим развитием Лиспа стали такие языки, как Scheme и Dylan. Одним из самых популярных функциональных языков программирования стал Haskell.
Следующим шагом в углублении структурирования программ стало так называемое структурное программирование, при котором программа в целом и отдельные процедуры рассматривались как последовательности канонических структур: линейных участков, циклов и разветвлений. Появилась возможность читать и проверять программу как последовательный текст, что повысило производительность труда программистов при разработке и отладке программ. С целью повышения структурности программы были выдвинуты требования к большей независимости подпрограмм, подпрограммы должны связываться с вызывающими их программами только путем передачи им аргументов, использование в подпрограммах переменных, принадлежащих другим процедурам или главной программе, стало считаться нежелательным.
Процедурное и структурное программирование затронули прежде всего процесс описания алгоритма как последовательности шагов, ведущих от варьируемых исходных данных к искомому результату. Для решения специальных задач стали разрабатываться языки программирования, ориентированные на конкретный класс задач: на системы управления базами данных, имитационное моделирование и т.д. При разработке трансляторов все больше внимания стало уделяться обнаружению ошибок в исходных текстах программ, обеспечивая этим сокращение затрат времени на отладку программ.
Объектно-ориентированный подход получил свое развитие в результате решения проблемы концептуальной близости текста программы и описания задачи – построения расширяемого языка, содержащего небольшое ядро и допускающего расширение, дополняющее язык типами данных и операторами, отражающими концептуальную сущность конкретного класса задач. Первыми языками-ядрами были Симула и Алгол-68.
Объектно-ориентированный подход к программированию оказался эффективным в тех случаях, когда некоторый реально существующий предмет характеризуется очень большим числом параметров. Тогда подпрограммы, описывающие алгоритмы обработки или функционирования такого предмета, имеют настолько большое число формальных параметров, что программирование их вызовов слишком трудоемко и сопряжено с большим количеством ошибок. Эффективным методом программирования таких задач является создания в программе объекта, соответствующего предмету. Этот объект будет включать в себя данные, соответствующие параметрам предмета, и подпрограммы (в Си++ функции), описывающие алгоритмы обработки или функционирования предмета. Данные объекта должными являться по умолчанию доступными для алгоритмов объекта (как бы быть глобальными для этих алгоритмов) и не включаться в списки параметров соответствующих подпрограмм. Таким образом, количество параметров подпрограмм существенно уменьшится.
Итак, вычисления в парадигме объектно-ориентированного программирования рассматриваются как моделирование сущностей реального мира. Самыми популярными языками программирования в этой парадигме являются C++, C# и Java. В дальнейшем объектно-ориентированная и функциональная парадигмы рассматриваются более подробно.
1.2 Объектно-ориентированная парадигма
Основными компонентами объектно-ориентированных методологий являются «объекты и классы», «абстракция и инкапсуляция данных», «наследование» и «полиморфизм» [3.].
Объект – это предмет реального мира, который имеет некоторые характеристики, называемые состоянием, и некоторые виды поведения. Состояние объекта представляет собой всю информацию, содержащуюся в нем, а поведение объекта – это набор действий, которые он может выполнять для изменения своего состояния. Характеристики объектов представлены данными-членами класса, а характеристики поведения представлены функциями-членами класса. То есть набором переменных, называемых полями, представляющими свойства конкретного физического или концептуального объекта, а также набором заданных разработчиком операций, называемых методами, для наблюдения и изменения полей этого объекта. Никакой код, за исключением заданных операций, не может получить доступ к полям или методам объекта.
Объекты одного и того же типа могут быть сгруппированы вместе, чтобы сформировать класс. Класс служит своего рода прототипом. Программист должен указать весь набор данных и функций для различных операций над данными объекта как пользовательский тип в виде класса. Другими словами, программист определяет формат объекта и поведение, определяя класс. Компилятор языка программирования не знает об этом определяемом пользователем типе данных. Программист должен определить данные и функциональные возможности, связанные с ним, разработав класс. Таким образом, класс – это набор объектов одного и того же типа. Например, в группе граждан каждый отдельный гражданин является объектом и принадлежит к классу граждан.
Абстракция подразумевает представление более значимых признаков наряду с игнорированием менее значимых с целью отделить объекты / функции от других объектов / функций. В объектно-ориентированном подходе классы используют концепцию абстракции данных. С абстракцией данных можно использовать структуры данных, не заботясь о точных деталях реализации. Это означает, что программист знает только о различных операциях, которые могут быть выполнены с этими типами данных, но то, как эти операции выполняются аппаратным или программным обеспечением, скрыто от программиста. Аналогично в объектно-ориентированном подходе классы действуют как абстрактные типы данных. Классы определены как набор атрибутов и функций для работы с этими атрибутами. Они инкапсулируют все существенные свойства объектов, которые должны быть созданы [5.].