Технологии программирования и этапы развития
Современный мир невозможно представить без компьютеров и программ. С каждым годом технологии программирования развиваются все быстрее, появляются новые инструменты и методы разработки программного обеспечения. В этой статье мы рассмотрим, что такое технологии программирования, как они развивались и какие инструменты используются в процессе разработки программ.
Что такое технологии программирования
Технологии программирования – это совокупность методов и инструментов, используемых при разработке программного обеспечения. Они включают в себя как технические аспекты (языки программирования, фреймворки и библиотеки), так и методологические (модели жизненного цикла разработки, архитектурные шаблоны и т.д.). Основная цель технологий программирования – обеспечение быстрого и качественного создания программного обеспечения.
Развитие технологии программирования
Технологии программирования начали активно развиваться в середине XX века. Ключевым моментом в этом процессе было постоянное развитие и внедрение новых технологий, которые улучшали процесс программирования и позволяли создавать более сложные и масштабные проекты.
Сначала программы писались на языках низкого уровня, таких как ассемблер. В то время основной задачей было написание программ для научных и математических расчетов. В дальнейшем появились языки высокого уровня, такие как Fortran и COBOL, которые позволяли программистам писать программы на более понятном человеку языке. Позже появились более высокоуровневые языки программирования, такие как C и Pascal, которые позволили упростить процесс написания кода.
В 1980-х годах стали активно развиваться методологии разработки программного обеспечения, такие как “каскадная” модель и “спиральная” модель. В 1990-х годах появились новые подходы, такие как гибкая методология разработки (Agile и Scrum) и разработка через тестирование (TDD). Кроме того, в этот период начали развиваться такие технологии, как базы данных, сетевые технологии и веб-приложения.
Сегодняшний этап развития технологии программирования связан с появлением новых технологий, таких как искусственный интеллект, машинное обучение, блокчейн и многие другие. Также стали активно использоваться открытые исходные коды и технологии, такие как Linux, Git, Docker и т.д. Эти технологии позволяют разработчикам быстро и эффективно создавать программное обеспечение, повышая тем самым производительность и качество проектов.
Основные этапы
Разберем этапы развития по пунктам:
- Ранний период (1940-е — 1950-е годы).
- Использование машинного языка и ассемблера для написания программ.
- Разработка первых компьютеров, таких как ENIAC и UNIVAC.
- Появление фортрана (FORTRAN) в 1957 году как первого высокоуровневого языка программирования.
- Развитие языков программирования, таких как COBOL, ALGOL и PL/I.
- Использование структурного программирования для улучшения качества программ.
- Разработка языка Си (C) в 1972 году, который стал основой для многих современных языков.
- Развитие языков программирования, таких как Smalltalk, C++ и Java.
- Появление концепции объектно-ориентированного программирования.
- Использование объектно-ориентированного программирования для создания более гибких и модульных программ.
- Развитие языков программирования, таких как Python, JavaScript и Ruby.
- Появление новых технологий, таких как искусственный интеллект, блокчейн и интернет вещей.
- Использование новых технологий для создания более сложных и мощных программ.
Отметим, что каждый этап развития технологии программирования не означал полного замещения предыдущих технологий новыми. Более того, многие из них до сих пор используются в различных проектах. Каждый этап является просто следующим шагом в развитии и усовершенствовании технологий программирования.
Инструментарий технологий программирования
Один из ключевых инструментов технологий программирования – языки программирования. Существует множество языков программирования, каждый из которых предназначен для решения конкретных задач. Например, язык Python часто используется для разработки научных приложений, а язык JavaScript – для создания интерактивных пользовательских интерфейсов веб-приложений.
Кроме того, существуют инструменты, которые помогают программистам более эффективно использовать языки программирования. Например, компиляторы и интерпретаторы – это программные средства, которые позволяют переводить исходный код на языке программирования в машинный код, который может быть выполнен на компьютере.
Современные технологии программирования также включают в себя инструменты автоматизации тестирования для быстрой и надежной проверки работоспособности программного продукта перед его выпуском на рынок. Такие инструменты, как Selenium и Appium, используются для автоматического тестирования веб-приложений и мобильных приложений соответственно.
Кроме инструментов, технологии программирования также включают в себя методологии разработки программного обеспечения. Например, Agile и Scrum – это методологии, которые позволяют разработчикам быстро реагировать на изменения в требованиях к программному продукту и максимально эффективно использовать ресурсы команды.
Что почитать
Если вы хотите узнать больше о технологиях программирования, мы подготовили для вас небольшую подборочку книг, которые помогут больше углубиться в данную тематику. Итак:
- «Clean Code: A Handbook of Agile Software Craftsmanship» (Роберт Мартин)
Эта книга является бестселлером в сфере программирования. В ней Роберт Мартин обсуждает важность чистого кода и настойчиво рекомендует программистам писать читаемый, понятный и поддерживаемый код. Она также содержит множество примеров и рекомендаций, которые помогут улучшить качество программного кода.
- «Design Patterns: Elements of Reusable Object-Oriented Software» (Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес)
Книга «Design Patterns» является классикой в мире программирования. Она содержит описание множества паттернов проектирования, которые помогут разработчикам создавать эффективные и гибкие программы. Книга также включает множество примеров и рекомендаций по использованию паттернов.
- «The Pragmatic Programmer: From Journeyman to Master» (Эндрю Хант, Дэвид Томас)
Это, можно сказать, сборник советов и рекомендаций для программистов всех уровней. Авторы помогают читателям стать более эффективными и продуктивными в своей работе. Книга также содержит множество примеров, которые помогут улучшить качество программирования.
- «Code Complete: A Practical Handbook of Software Construction» (Стив Макконнелл)
Еще одна классическая книга в сфере программирования. Она описывает множество методов и приемов, которые помогут программистам создавать высококачественный код. Книга также содержит примеры и рекомендации по созданию и тестированию программного кода.
Эти издания являются лишь небольшими примерами из множества книг, которые могут помочь расширить знания о технологиях программирования. Однако они действительно классические и могут помочь как начинающим, так и опытным программистам.
Итог
Технологии программирования играют важную роль в различных отраслях, и их значимость будет только расти в будущем. Они прошли долгий путь развития, начиная от низкоуровневых языков до высокоуровневых инструментов разработки. И сегодня, они продолжают развиваться и усовершенствоваться, открывая перед разработчиками все новые возможности для создания качественного и эффективного программного обеспечения.
Важно следить за новыми тенденциями в области технологий программирования, изучать новые языки программирования и инструментарий, чтобы быть в курсе последних технологических достижений и применять их на практике. Технологии программирования стали неотъемлемой частью нашей жизни, и их роль в обществе и бизнесе только растет, поэтому следует всегда оставаться на шаг впереди и не останавливаться на достигнутом.
Технологии программирования
Для начала разберёмся с тем, что такое технология. Постараюсь изъясняться простым языком, пусть даже это будет не очень точно. Зато понятно.
Итак, технология — это некий набор знаний (способов, инструментов), которые позволяют достичь желаемой цели. Исходя из этого
Технологии программирования — это способы создания программ. Эти способы включают в себя как определённые знания (например, знание языка программирования), так и определённые инструменты (например, средства разработки программ).
То есть технология программирования — это совокупность знаний и способов, использование которых приведёт к созданию нужной программы — от идеи до результата.
Различают также технологию программирования и методологию программирования. Но мы в эти дебри лезть не будем — оставим это удовольствие лютым теоретикам.
Развитие технологий программирования
Развитие технологий программирования — это эволюция способов разработки программ. Эту эволюцию можно разбить на следующие этапы (на текущий момент — в будущем может быть придумают что-то ещё):
- Стихийное программирование. То есть “как Бог даст”, как получится. Можно сказать, что на этом этапе какие-либо технологии отсутствовали. На этом этапе случился переход от машинных кодов к ассемблерам. А затем к алгоритмическим языкам программирования. На этом этапе обычно сначала создавали кучу подпрограмм, а потом пытались объединить их в одну программу. Первое время это удавалось. Но по мере усложнения задач, решать их в разумные сроки становилось всё труднее. Поэтому возникла необходимость перехода на второй этап.
- Структурное программирование. Появились структурированные языки программирования. Изначально Паскаль был именно таким языком. А язык С, можно сказать, таким языком и остался. Структурный подход представлял собой технологию, когда большая задача разбивалась на несколько относительно небольших, и представлялась в виде некой иерархической (древовидной) структуры.
- Модульное программирование. Эта технология рождалась почти одновременно со структурным программированием. Идея заключалась в том, чтобы разбивать программы на модули. В модули включали подпрограммы, близкие по своему назначению.
- Объектно-ориентированное программирование (ООП). Технология объектно-ориентированного программирования — это уже современный подход, хотя начиналось это ещё с середины 80-х годов 20-го века. Суть ООП заключается в представлении программы в виде совокупности объектов. Каждый из объектов имеет свои свойства (характеристики) и методы (функции). При этом программисту часто не обязательно знать, как устроен объект. Достаточно только общего описания свойств и методов. Объектно-ориентированные языки программирования — это С++, Object Pascal, Delphi и т.п.
- Компонентый подход и CASE-технологии. Развиваются с середины 90-х прошлого столетия. Программы создаются из отдельных компонентов. Большинство из этих компонентов уже имеются в средствах разработки. CASE-технологии позволяют не только создавать, но и сопровождать программное обеспечение от “рождения до смерти”, то есть на всём жизненном цикле ПО. Компонентный подход в совокупности с ООП на сегодняшний день и является наиболее используемой технологией программирования.
Ну и, как вы понимаете, на всех этих этапах было много чего придумано и создано. То есть эти эти группы можно разбить на подгруппы, а подгруппы — снова разбить и т.д.
Например, к компонентным технологиям можно отнести технологию OLE, разработанную всем известной компанией Microsoft. И к ним же можно отнести технологию CORBA.
То есть представленный выше список — это лишь основные технологии программирования. Точнее даже будет сказать, что это виды технологий программирования.
И в каждом из этих видов есть немало конкретных технологий, таких как OLE, API или .NET. Так что тема эта очень обширная и очень интересная. Как говорится — не переключайтесь ))))
А мы прервёмся на короткую рекламу )))
Билет 6
1. Технология программирования. Структурное и объектно-ориентированное программирование. Процедуры и функции. Локальные и глобальные переменные
Программирование сравнительно молодая и быстро развивающаяся отрасль науки и техники. Опыт ведения реальных разработок и совершенствования имеющихся программных и технических средств постоянно переосмысливается, в результате чего появляются новые методы, методологии и технологии, которые, в свою очередь, служат основой более современных средств разработки программного обеспечения. Исследовать процессы создания новых технологий и определять их основные тенденции целесообразно, сопоставляя эти технологии с уровнем развития программирования и особенностями имеющихся в распоряжении программистов программных и аппаратных средств.
- указание последовательности выполнения технологических операций;
- перечисление условий, при которых выполняется та или иная операция;
- описания самих операций, где для каждой операции определены исходные данные, результаты, а также инструкции, нормативы, стандарты, критерии и методы оценки и т. п.
Кроме набора операций и их последовательности, технология также определяет способ описания проектируемой системы, точнее модели, используемой на конкретном этапе разработки.
Различают технологии, используемые на конкретных этапах разработки или для решения отдельных задач этих этапов, и технологии, охватывающие несколько этапов или весь процесс разработки. В основе первых, как правило, лежит ограниченно применимый метод, позволяющий решить конкретную задачу. В основе вторых обычно лежит базовый метод или подход (парадигма), определяющий совокупность методов, используемых на разных этапах разработки, или методологию.
Исторически в развитии программирования можно выделить несколько принципиально отличающихся методологий.
Изначально понятие технологии как таковой это 60-е годы прошлого столетия это период «стихийного» программирования. В этот период отсутствовало понятие структуры программы, типов данных и т.д. Вследствие этого код получался запутанным, противоречивым. Программирование тех лет считалось искусством. Конец 60-х кризис в программирование.
Выход из этого кризиса переход к структурной парадигме программирования. Структурный подход к программированию представляет собой совокупность рекомендуемых технологических приемов, охватывающих выполнение всех этапов разработки программного обеспечения. В основе структурного подхода лежит декомпозиция (разбиение на части) сложных систем с целью последующей реализации в виде отдельных небольших подпрограмм. С появлением других принципов декомпозиции (объектного, логического и т.д.) данный способ получил название процедурной декомпозиции.
Другим базовым принципом структурного программирования является использование при составлении программ только базовых алгоритмических структур (см. билет 4), запрет на использование оператора GOTO.
Структурный подход требовал представления задачи в виде иерархии подзадач простейшей структуры. Проектирование осуществлялось «сверху-вниз» и подразумевало реализацию общей идеи, обеспечивая проработку интерфейсов подпрограмм. Одновременно вводились ограничения на конструкции алгоритмов, рекомендовались формальные модели их описания, а также специальный метод проектирования алгоритмов метод пошаговой детализации.
Поддержка принципов структурного программирования была заложена в основу так называемых процедурных языков программирования. Как правило, они включали основные «структурные» операторы передачи управления, поддерживали вложение подпрограмм, локализацию и ограничение области «видимости» данных. Среди наиболее известных языков этой группы стоит назвать PL/1, ALGOL-68, Pascal, С.
Дальнейший рост сложности и размеров разрабатываемого программного обеспечения потребовал развития структурирования данных. Как следствие этого в языках появляется возможность определения пользовательских типов данных. Одновременно усилилось стремление разграничить доступ к глобальным данным программы, чтобы уменьшить количество ошибок, возникающих при работе с глобальными данными. В результате появилась и стала развиваться технология модульного программирования.
Модульное программирование предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные, в отдельно компилируемые модули (библиотеки подпрограмм), например, модуль графических ресурсов. Связи между модулями при использовании данной технологии осуществляются через специальный интерфейс, в то время как доступ к реализации модуля (телам подпрограмм и некоторым «внутренним» переменным) запрещен. Эту технологию поддерживают современные версии языков Pascal и С (C++), языки Ада и Modula.
Объектно-ориентированное программирование (ООП) определяется как технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного типа (класса), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов в такой системе осуществляется путем передачи сообщений.
Основным достоинством объектно-ориентированного программирования по сравнению с модульным программированием является «более естественная» декомпозиция программного обеспечения, которая существенно облегчает его разработку. Это приводит к более полной локализации данных и интегрированию их с подпрограммами обработки, что позволяет вести практически независимую разработку отдельных частей (объектов) программы. Кроме этого, объектный подход предлагает новые способы организации программ, основанные на механизмах наследования, полиморфизма, композиции, наполнения. Эти механизмы позволяют конструировать сложные объекты из сравнительно простых. В результате существенно увеличивается показатель повторного использования кодов и появляется возможность создания библиотек классов для различных применений.
Бурное развитие технологий программирования, основанных на объектном подходе, позволило решить многие проблемы. Так были созданы среды, поддерживающие визуальное программирование, например, Delphi, C++ Builder, Visual C++ и т. д. При использовании визуальной среды у программиста появляется возможность проектировать некоторую часть, например, интерфейсы будущего продукта, с применением визуальных средств добавления и настройки специальных библиотечных компонентов. Результатом визуального проектирования является заготовка будущей программы, в которую уже внесены соответствующие коды.
Можно дать обобщающее определение: объект ООП это совокупность переменных состояния и связанных с ними методов (операций). Упомянутые методы определяют, как объект взаимодействует с окружающим миром.
Под методами объекта понимают процедуры и функции, объявление которых включено в описание объекта и которые выполняют действия. Возможность управлять состояниями объекта посредством вызова методов в итоге и определяет поведение объекта. Эту совокупность методов часто называют интерфейсом объекта.
Инкапсуляция это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования. Когда методы и данные объединяются таким способом, создается объект.
Применяя инкапсуляцию, мы защищаем данные, принадлежащие объекту, от возможных ошибок, которые могут возникнуть при прямом доступе к этим данным. Кроме того, применение этого принципа очень часто помогает локализовать возможные ошибки в коде программы. А это намного упрощает процесс поиска и исправления этих ошибок. Можно сказать, что инкапсуляция подразумевает под собой скрытие данных, что позволяет защитить эти данные. Однако применение инкапсуляции ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова методов для изменения внутренних элементов (переменных) объекта. Но при современном уровне развития вычислительной техники эти потери в эффективности не играют существенной роли.
Наследование это процесс, посредством которого один объект может наследовать свойства другого объекта и добавлять к ним черты, характерные только для него. В итоге создаётся иерархия объектных типов, где поля данных и методов «предков» автоматически являются и полями данных и методов «потомков».
Смысл и универсальность наследования заключается в том, что не надо каждый раз заново («с нуля») описывать новый объект, а можно указать «родителя» (базовый класс) и описать отличительные особенности нового класса. В результате новый объект будет обладать всеми свойствами родительского класса плюс своими собственными отличительными особенностями.
Полиморфизм это свойство, которое позволяет одно и тоже имя использовать для решения нескольких технически разных задач. Полиморфизм подразумевает такое определение методов в иерархии типов, при котором метод с одним именем может применяться к различным родственным объектам. В общем смысле концепцией полиморфизма является идея «один интерфейс множество методов». Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного интерфейса для единого класса действий. Выбор конкретного действия, в зависимости от ситуации, возлагается на компилятор.
Современная технология программирования компонентный подход, который предполагает построение программного обеспечения из отдельных компонентов физически отдельно существующих частей программного обеспечения, которые взаимодействуют между собой через стандартизованные двоичные интерфейсы. В отличие от обычных объектов объекты-компоненты можно собрать в динамически вызываемые библиотеки или исполняемые файлы, распространять в двоичном виде (без исходных текстов) и использовать в любом языке программирования, поддерживающем соответствующую технологию. На сегодня рынок объектов стал реальностью. Это позволяет программистам создавать продукты, хотя бы частично состоящие из повторно использованных частей, т.е. использовать технологию, хорошо зарекомендовавшую себя в области проектирования аппаратуры.
Компонентный подход лежит в основе технологий, разработанных на базе COM (Component Object Model компонентная модель объектов), и технологии создания распределенных приложений CORBA (Common Object Request Broker Architecture общая архитектура с посредником обработки запросов объектов) . Эти технологии используют сходные принципы и различаются лишь особенностями их реализации.
Технология СОМ фирмы Microsoft является развитием технологии OLE (Object Linking and Embedding связывание и внедрение объектов) , которая использовалась в ранних версиях Windows для создания составных документов. Технология СОМ определяет общую парадигму взаимодействия программ любых типов: библиотек, приложений, операционной системы, т. е. позволяет одной части программного обеспечения использовать функции (службы), предоставляемые другой, независимо от того, функционируют ли эти части в пределах одного процесса, в разных процессах на одном компьютере или на разных компьютерах. Модификация СОМ, обеспечивающая передачу вызовов между компьютерами, называется DCOM (Distributed COM распределенная СОМ) .
Таковы, вкратце, основные этапы изменения технологий программирования. Поскольку программное обеспечение на сегодняшний день используется в самых различных устройствах и сферах деятельности человека, то можно прогнозировать дальнейшее совершенствование технологий программирования.
Обсудим далее то, что, в конечном итоге, является «кирпичиками», строительным материалом любой программы подпрограммы и варианты их реализации на примере языка Pascal процедуры и функции.
При решении новых задач можно попытаться воспользоваться ранее написанными программами. Алгоритм, ранее разработанный и целиком используемый в составе других алгоритмов, называется вспомогательным. Применение вспомогательных алгоритмов позволяет разбить задачу на части, структурировать ее.
Вся программа условно может быть разделена на две части: основную и вспомогательную. В основной части производится простейшая обработка информации, организуется обращение к разным подпрограммам. Вспомогательный алгоритм тоже может вызывать другие вспомогательные, длина такой цепочки вызовов теоретически не ограничена. Вспомогательными и основными алгоритмы являются не сами по себе, а по отношению друг к другу.
При использовании вспомогательных алгоритмов необходимо учитывать способ передачи значений исходных данных для них и получения результата от них. Аргументы вспомогательного алгоритма это переменные, в которых должны быть помещены исходные данные для решения соответствующей подзадачи. Результаты вспомогательного алгоритма это также переменные, где содержатся результаты решения этих подзадач, а также результатом может быть конкретное действие, которое совершает компьютер под действием подпрограммы.
Подпрограммы могут быть двух видов: подпрограмма без параметров и подпрограмма с параметрами. Обращение к подпрограмме может быть организовано из любого места основной программы или другой подпрограммы сколько угодно раз.
При работе с подпрограммами важными являются понятия формальных и фактических параметров. Формальные параметры это идентификаторы входных данных для подпрограммы. Если формальные параметры получают конкретные значения, то они называются фактическими. Формальные параметры могут получить конкретные значения только в той программе, где производится обращение к данному модулю-подпрограмме. Тип и порядок записи, а также семантическое (смысловое) наполнение фактических параметров должны быть такими же, как и формальных параметров. В противном случае результат работы программы будет непредсказуемым. Из этого следует, что фактические параметры используются при обращении к подпрограмме из основной, а формальные параметры только в самой подпрограмме.
Подпрограмма с параметрами используется для записи многократно повторяющихся действий при разных исходных данных. Подпрограммы с параметрами можно разделить на два типа: подпрограммы-функции и просто подпрограммы с параметрами (их называют процедурами).
- каждая подпрограмма имеет свое имя и список формальных параметров;
- процедура из основной программы вызывается командой вызова, которая по форме ничем не отличается от вызова команды исполнителя. Результат присваивается одной или нескольким переменным, которые находятся в списке формальных параметров. Но результатом могут быть, конечно, не только значения переменных, но какое либо действие, выполненное ЭВМ.
Пример 1. Используем алгоритм нахождения наибольшего общего делителя двух натуральных чисел в качестве вспомогательного при решении задачи: составить программу вычитания дробей ( a , b , c , d натуральные числа). Результат представить в виде обыкновенной несократимой дроби.
Program Sub; Var A, B, C, D, G, E, F : Integer; Procedure Nod(M, N : Integer; Var K : Integer); Begin While M <> N Do If M > N Then M := M - N Else N := N - M; K := M End; Begin Write('Введите числители и знаменатели дробей:'); ReadLn(A, B, C, D); E := A * D - B * C; F := B * D; If E = 0 Then WriteLn(E) Else Begin Nod(Abs(E), F, G); E := E Div G; F := F Div G; WriteLn('Ответ: ', E, '/', F) End End.
Как видно из примера, объявление и тело подпрограмм находится в разделе описаний. В заголовке подпрограммы содержится список формальных параметров с указанием их типа, которые условно можно разделить на входные и выходные (перед ними стоит служебное Var). При обращении к процедуре указывается ее имя и список фактических параметров. Формальные и фактические параметры должны соответствовать по количеству и по типу.
Вызов процедуры осуществляется следующим образом:
Nod(Abs(E), F, G);
По способу передачи фактических значений в подпрограмму в Turbo Pascal выделяют параметры-переменные, параметры-значения, параметры-константы. Есть и другие способы, которые менее актуальны
Функция (в отличие от процедуры) всегда возвращает единственное значение.
Покажем, как изменится подпрограмма из примера, если ее записать в виде функции.
Function Nod(M, N : Integer) : Integer; Begin While M <> N Do If M > N Then M := M - N Else N := N - M; Nod := M End;
Итак, после списка параметров указывается тип значения функции, а в теле функции хотя бы один раз встречается присваивание переменной, имя которой совпадает с именем функции, соответствующего значения.
Вызов функции будет следующим:
G := Nod(Abs(E), F);
Вообще, вызов функции может присутствовать в выражении, стоящем: в правой части оператора присваивания, в процедуре вывода, в качестве фактического параметра в вызове другой подпрограммы и т.д.
При решении задач целесообразно проанализировать условие, записать решение в крупных блоках (не являющихся операторами Pascal), детализировать каждый из блоков (записав в виде блоков, возможно, по-прежнему не операторов Pascal), и т.д., продолжать до тех пор, пока каждый из блоков не будет реализован с помощью операторов языка.
Пример 2. Дано натуральное число n . Переставить местами первую и последнюю цифры этого числа.
Program Integ; Var N : Integer; Begin Write('Введите натуральное число: '); ReadLn(N); If Possible(N) Then WriteLn('Невозможно переставить цифры, возникнет переполнение') Else Begin Change(N); WriteLn('Ответ: ', N) End; End.
Можно заметить, что необходимо детализировать логическую функцию Possible, которая диагностирует, возможна ли перестановка, и процедуру Change, которая эту перестановку (в случае, если она возможна) выполняет.
Function Possible(N : Integer) : Boolean; Begin If Number(N) < 5 Then Possible := False Else Possible := (N Mod 10 >3) Or (N Mod 10 = 3) And (N Mod 10000 Div 10 * 10 + N Div 10000 > MaxInt Mod 10000) End;
Здесь необходимо детализировать функцию Number, возвращающую количество цифр в записи натурального числа (т.к. функция Impossible содержит ее вызов, то в разделе описаний функция Number должна ей предшествовать).
Function Number(N : Integer) : Integer; Var Vsp : Integer; Begin Vsp := 0; While N > 0 Do Begin Vsp := Vsp + 1; N := N Div 10 End; Number := Vsp End;
Наконец, последняя процедура.
Procedure Change(Var N : Integer); Var Kol, P, S, R : Integer; Begin Kol := Number(N); P := N Mod 10; If Kol > 1 Then S := N Div Round(Exp((Kol - 1) * Ln(10))) Else S := 0; R := N Mod Round(Exp((Kol - 1) * Ln(10))) Div 10; N := P * Round(Exp((Kol - 1) * Ln(10))) + R * 10 + S End;
Возможны также подпрограммы, которые вызывают сами себя. Они называются рекурсивными. Создание таких подпрограмм является красивым приемом программирования, но не всегда целесообразно из-за чрезмерного расхода памяти ЭВМ.
Пример 3. Найти максимальную цифру в записи данного натурального числа.
Program MaxDigit; Type NaturLong = 1..(High(LongInt)); Digit = 0..9; Var A : LongInt; Function Maximum(N : LongInt) : Digit; Begin If N < 10 Then Maximum := N Else If N Mod 10 >Maximum(N Div 10) Then Maximum := N mod 10 Else Maximum := Maximum(N Div 10) End; Begin Write('Введите натуральное число: '); ReadLn(A); WriteLn('Максимальная цифра равна ', Maximum(A)) End.
При создании функции Maximum было использовано следующее соображение: если число состоит из одной цифры, то она является максимальной, иначе если последняя цифра не является максимальной, то ее следует искать среди других цифр числа. При написании рекурсивного алгоритма следует позаботиться о граничном условии, когда цепочка рекурсивных вызовов обрывается и начинается ее обратное «раскручивание». В нашем примере это условие N
На рисунке схематически показана структура взаимного расположения описаний подпрограмм в некоторой условной программе. Попробуем, используя эту схему, разобраться в вопросе об области действия описаний подпрограмм.
Любая подпрограмма может использоваться лишь в пределах области действия ее описания (а описанные в ней объекты лишь внутри этой подпрограммы). Например, область действия подпрограмм А и В основная программа. Поэтому из основной программы можно обратиться к подпрограммам А и В. В свою очередь, в подпрограмме В могут быть обращения к подпрограмме А; а из А нельзя обратиться к В, поскольку описание А предшествует описанию В. Подпрограммы А1 и А2 локализованы в подпрограмме А и могут использоваться только в ней; из А2 можно обратиться к А1, но нельзя наоборот.
Из подпрограммы В1 можно обратиться к А, поскольку ее описание является глобальным по отношению к В1, но нельзя обратиться к А1, поскольку область действия описания А1 не распространяется на блок подпрограммы В.
Из подпрограммы В22 можно обратиться только к В21, В1, А.
2. Средствами почтовой программы создать фильтр для автоматического распределения входящих писем по почтовым папкам в зависимости от темы письма
Рассмотрим решение поставленной задачи в двух разных почтовых клиентах.
Для того чтобы такое распределение было возможно, необходимо существование тех папок, по которым предполагается «раскладывать» письма (или нужно создать такие папки в процессе формирования правила сортировки почты).
Необходимо выбрать меню Сообщение -> Создать правило из сообщения.
Далее в диалоговом окне Создать правило для почты (см. рис.) указать, что сортировка почты осуществляется по полю Тема , в качестве действия указать Переместить в заданную папку , далее описать правило.
Описание правила включает:
1) ввод ключевых слов
2) выбор папки, куда будут помещаться указанные сообщения
Последнее задание названия для правила (либо можно согласиться с предлагаемым по умолчанию).
Таким образом, почтовый клиент будет автоматически сортировать часть почты. Аналогично можно сортировать почту по отправителю и т.д.
В персональных настройках можно установить фильтры.
Выбрать Добавить фильтр в список фильтров . Настроить фильтр
3. Задание на подсчет полного набора символов (мощности алфавита), используемого при кодировании информации
Пример. Перед въездом в город стоят пять флагштоков. На флагштоках можно поднимать флаги желтого, зеленого и красного цвета. Какое количество различных сигналов можно подать при помощи этих флагштоков при условии, что не обязательно поднимать флаг на каждом из флагштоков?
Решение. При условии, что не обязательно поднимать флаг на каждом из флагштоков, для каждого флагштока есть 4 возможности: нет флага, желтый флаг, зеленый флаг, красный флаг. Тогда общее количество комбинаций получается следующим: 4×4×4×4×4=1024.
- В стране лилипутов живут 3000 жителей. Доказать, что по крайней мере 3 из них имеют одинаковые инициалы, учитывая то, что алфавит лилипутов состоит из 40 букв, каждый из которых можно использовать для инициалов.
- Сколькими способами можно рассадить аллею, если у нас есть яблоня, береза, липа, сосна, елка и рябина. При этом сосну нельзя сажать первой, а яблоню нельзя сажать рядом с рябиной?
- Сколько можно составить пятизначных телефонных номеров из цифр от 0 до 7?
- На полке стоит 5 напитков. Сколько разных коктейлей из них можно составить?
- Номер машины состоит из 3 цифр. Сколько неправильных вариантов можно получить, угадывая номер?
© Е.А. Ерёмин, А.П. Шестаков, 2006-07
Технология программирования
Технология программирования — это совокупность методов и средств для разработки программного обеспечения. В технологии должны быть определены последовательность выполнения операций, условия, при которых выполняется каждая операция, описание самих операций: исходные данные, нормативные документы, в том числе стандарты, критерии и методы оценки, результаты и др.
Любая задача начинается со словесного описания, которое называется условием задачи, а в программировании — спецификацией задачи. Далее условие следует формализовать, т. е. так записать спецификацию, чтобы можно было ее решить на компьютере. Формализацией условия начинается этап, который называется математической формулировкой задачи. Выводятся формулы и выбираются методы решения задачи, т. е. строится математическая модель задачи. Далее в виде алгоритма строится последовательность стандартных действий, выполнение которых даст искомый результат. На выбранном языке программирования проектируется и пишется программа для компьютера. Затем выполняется ее тестирование и отладка на компьютере. Выполняются необходимые расчеты. Таким образом, решение задачи проходит следующие этапы (рис. 3.7).
Рис. 3.7. Схема решения задачи на компьютере
Технология программирования предусматривает переход от алгоритма к программе. Программы пишут специалисты — программисты, т. е. люди, подготовленные в области создания программ. Каждый тип процессора имеет свою систему команд, из которых и создаются компьютерные программы. Но машинные коды сложны для восприятия человеком, поэтому постепенно и стали развиваться языки, более приближенные к естественным. Программисты стали писать программы (программировать) в удобной форме, на понятных им языках программирования. А написанные специальные программы (трансляторы), которые могут прочитать то, что написал программист, и перевести в машинные коды, стали инструментом программирования.
Постепенно программы накапливались, особенно на процессы, выполняемые наиболее часто, например ввод данных с клавиатуры, вывод информации на экран и др. Такие небольшие программы (процедуры) называют стандартными. В настоящее время программист при создании большой программы обращается к библиотекам стандартных программ, извлекает необходимые программы-процедуры и включает их в свою программу. Это значительно облегчает процесс программирования.
Под программированием понимается совокупность процессов, связанных с разработкой программ и их реализацией.
В зависимости от назначения программирование подразделяют на:
- • системное — разработка средств общего программного обеспечения, в том числе операционных систем, вспомогательных программ, пакетов программ общесистемного назначения, например автоматизированных систем управления, систем управления базами данных и т. д.;
- • прикладное — разработка и отладка программ для конечных пользователей, например бухгалтерских, обработки текстов и т. п.
В зависимости от метода программирование подразделяют на:
- • процедурное — метод, в соответствии с которым программы пишутся как перечни последовательно выполняемых команд. При этом используются процедурно-ориентиро- ванные языки программирования, например, PL/1, Алгол-68, Паскаль, Си;
- • структурное, модульное — метод написания программ небольшими независимыми структурированными частями (модулями), каждый из которых связан с какой-либо процедурой или функцией. Результирующая программа организуется в виде совокупности взаимосвязанных по определенным правилам модулей. Это упрощает разработку сложных программных продуктов и их тестирование. Языки для модульного программирования Турбо Паскаль (Turbo Pascal), Си++, Ада, Модула (Modula);
- • декларативное — метод, предназначенный для решения задач искусственного интеллекта. В указанном контексте программа описывает логическую структуру решения задачи, указывая преимущественно, что нужно сделать, не вдаваясь в детали. Используются языки программирования типа Пролог;
- • параллельное — разработка программ, обеспечивающих одновременное выполнение операций, связанных с обработкой данных;
- • объектно-ориентированное (ООП) — метод, основанный на использовании концепции объекта, абстрагирующего конкретные его реализации в предметной области. При этом данные тесно связываются с выполняемыми над объектами процедурами;
- • функциональное — метод, основанный на разбиении алгоритма решения задачи на отдельные функциональные модули, а также описании их связей и характера взаимодействия. Для этого наиболее широко используются языки Норе и М, частично Си и другие языки;
- • эвристическое — метод, основанный на моделировании мыслительной деятельности человека. Используется для решения задач, не имеющих строго формализованного алгоритма или связанных с неполнотой исходных данных;
- • компонентное — метод создания ПО путем сбора объектов-компонентов (физически отдельно существующих частей ПО), взаимодействующих между собой через стандартизованные двоичные интерфейсы, в библиотеки или исполняемые файлы.
Программисты разрабатывают все более мощные и сложные программы. Современные методы разработки качественных программ существенно сокращают время и затраты на их создание. Это структурное программирование, пошаговое нисходящее уточнение, разбиение на функции (модули), объектно-ориентированное и компонентное программирование. Широко используется мультипрограммирование, когда несколько задач или программ одновременно разделяют между собой ресурсы компьютера.
Технология программирования развивалась вместе с развитием ЭВМ и языков программирования. Она прошла этап «стихийного» программирования, когда программы состояли из машинных кодов или ассемблеров и обрабатываемых данных.
В 1949 г. сотрудник высшего технического училища Пенсильванского университета Дж. Мочли поручил своим программистам создать программу, которая позволила бы машине воспринимать алгебраические уравнения, записанные в традиционной форме. Созданная система кодирования под названием Short Code (Короткий код) позволяла записывать уравнения не в двоичном виде, а с помощью двухсимвольных комбинаций. Например, уравнение вида А = В + С могло быть введено в форме последовательности 00 S0 03 S1 07 S2, где переменные А, В, С обозначены SO, si, S2, а операции равенства и сложения — 03 и 07 (комбинация 00 определяет номер строки программы). Программист (кодировщик) мог затем дать указание присвоить переменной S0, например, значение 5, а переменной si — значение 3. После этого компьютер уже сам определял значение переменной S2.
Этап структурного программирования начался в 1960—1970-х годах. В его основе лежит представление задачи в виде иерархии подзадач простейшей структуры (линейной последовательности, альтернативы, многократного повторения — цикла), реализуемых в виде небольших подпрограмм и модулей.
Модульное программирование — выделение групп подпрограмм, в которых используются одни и те же глобальные данные в отдельно транслируемые модули (библиотеки подпрограмм). Модули между собой связаны через интерфейс. Структурный подход в сочетании с модульным программированием позволяет разрабатывать надежные программы, содержащие не более 100 тыс. операторов.
Для сложного программного обеспечения на этапе 1980— 1990-х годов стало применяться объектно-ориентированное программирование (ООП), когда программа представлена в виде совокупности объектов, каждый из которых служит экземпляром определенного класса. Класс — совокупность объектов, характеризующихся общностью свойств и применяемых методов обработки. Классы образуют иерархию с наследованием свойств. Для обеспечения взаимодействия программных объектов используются сообщения. Механизмы наследования, полиформизма, композиции, наполнения позволяют строить сложные объекты из простых. ООП позволило создать огромное количество библиотек классов, ориентированных на разные задачи. Многократное использование этих библиотек позволяет повысить производительность разработки программ и уменьшить количество ошибок.
ООП явилось прологом к визуальному программированию. Были созданы системы визуального программирования: Visual C++ Builder, Visual Basic, Visual Fox Pro, Delphi и др.
В основе ООП лежат следующие понятия: объект, класс, инкапсуляция, наследование, полиморфизм. Объект рассматривается как некоторая структура, соответствующая объекту реального мира и его поведению. Задача, решаемая с помощью методики ООП, описывается в терминах объектов и операций над ними. Программа при таком подходе представляется в виде набора объектов и связей между ними.
Объекты — это динамически размещаемые структуры. Тип объекта называется классом. При создании нового типа объекта фактически создается класс. При создании новой программной конструкции на основе некоторого класса создается экземпляр класса — объект. Каждый объект содержит уникальную копию каждого поля, определенного в его базовом классе. Все объекты одного класса имеют одни и те же методы. Для создания и удаления объектов используются специальные методы, называемые конструкторами и деструкторами.
Переменная, обозначающая объект, фактически является указателем, ссылающимся на данные объекта в памяти. На один и тот же объект могут ссылаться несколько объектных переменных. Поскольку объектные переменные являются указателями, они могут содержать значение nil, указывающее, что объектная переменная не ссылается ни на какой объект. В отличие от указателей, объектная переменная для доступа к объекту не требует разыменования. Например, оператор Editl.Text := ‘NewData’; присваивает значение ‘NewData’ свойству Text поля ввода Editl. Оператор разыменования при этом не используется.
ОС Windows управляет событиями. Например, после щелчка по кнопке она генерирует событие, которое сопровождается рассылкой соответствующих сообщений. Компоненты и элементы управления, например в Delphi, фактически являются объектами, методы которых активизируются после получения сообщений от ОС.
Три фундаментальных составляющих ООП: инкапсуляция, наследование и полиморфизм.
Инкапсуляция означает объединение всех данных об объекте и характеристик его поведения в одном блоке. Объект содержит свойства и методы, при этом предоставляются средства для сокрытия данных.
Наследование позволяет расширять классы и способствует созданию родительско-дочерних отношений между объектами. Например, в приложении базы данных, в которой хранится информация о служащих компании, могут быть определены классы Employee (Служащий) и Manager (Менеджер). Класс Employee содержит информацию о служащих — фамилии, номера карточек социального страхования и др. Кроме того, для каждого менед- жера-служащего нужна та же информация, что и для служащих, и необходимы некоторые дополнительные сведения. Следовательно, между этими классами существует логическое отношение: класс Manager образует подмножество класса Employee. Класс Manager (дочерний класс) наследует все свойства и методы класса Employee, однако, кроме наследованных, он имеет собственные свойства и методы.
Полиморфизм (дословно — способность проявляться во многих формах) означает, что программа может обрабатывать объект по-разному в зависимости от его класса.
Этап компонентного подхода и CASE-технологии начался с середины 1990-х годов. Компонентный подход лежит в основе технологий СОМ и CORBA. Для программиста элемент такой технологии обладает свойствами, методами и событиями, и его можно использовать для построения приложений. COM (Component Object Model) — компонентная модель объекта. Эта технология является развитием технологии связывания и внедрения объектов OLE, используемой для создания сложных и составных документов в приложениях, работающих под управлением ОС Windows. СОМ позволяет использовать функции одной части ПО другой частью.
На базе СОМ для разработки программного обеспечения были созданы компонентные технологии:
- • OLE-automation — технология создания программируемых приложений (например, ее поддерживает MS Excel);
- • ActiveX — технология создания ПО как на одном компьютере, так и в распределенной сети. Создана на базе OLE-auto- mation. ActiveX применяется для создания ПО в Интернете и написания программ в среде Delphi, C++ Builder, Visual C++ и др.;
- • MTS (Microsoft Transaction Server — сервер управления транзакциями) — технология для стабильной и безопасной работы распределенных приложений, работающих с большими объемами передаваемых данных;
- • MIDAS (Multitier Distributed Application Server — сервер многозвенных распределенных приложений) — технология для организации доступа к данным разных компьютеров с учетом сбалансированности нагрузки сети.
Технология CORBA (Common Object Request Broker Architecture — общая архитектура с посредником обработки запросов объектов) используется для создания распределенных приложений. Может работать на всех основных аппаратных и программных платформах.
Для ускоренной разработки ПО применяют технологию RAD (Rapid Application Development). Она позволяет максимально быстро получить первые версии ПО. Эту технологию используют в основном для относительно небольших проектов, когда не требуется высокий уровень планирования и проектирования. Для крупных систем с большим количеством уникального кода эту технологию нельзя применять.
Языки программирования (ЯП) для создания ПО могут быть выбраны, исходя из конкретных условий. Это связано со знанием программистом определенного языка, с наличием у организации-разработчика лицензионной версии системы программирования, решаемых задач и т. д. Более подробно ЯП рассматривается далее. О линии ЯП Паскаль — Турбо Паскаль — Delphi рассказано в источнике [5].
С самого начала следует выработать хороший стиль программирования и оформления программ. При создании объектов следует давать им содержательные имена (идентификаторы), использовать ступенчатую форму записи, каждый оператор размещать на отдельной строке, давать ясные комментарии, размещать текст программы только в рамках экрана и др.
Программа — упорядоченный список команд (инструкций, включающих операторы и параметры) на языке программирования. Такая программа называется исходным текстом, или исходным кодом. Для реализации программа должна быть откомпилирована, в результате чего образуется объектный код, записанный в машинных кодах. Для подключения к программе необходимых стандартных процедур и функций используют редактор связей, который выполняет эту работу, извлекая из библиотек стандартных подпрограмм необходимые элементы и вставляя их в объектный код. Полученная программа называется исполняемым кодом и является уже рабочей программой, которую можно запустить на исполнение.
Разделение программы на части — важный элемент программирования, так как сложные программы почти невозможно создать без их разделения на относительно независимые части: основная часть программы и подпрограммы — именованные группы программных действий, которые могут быть вызваны из других мест программы. Подпрограммам дают уникальные имена. Они должны быть один раз описаны и могут быть многократно использованы.
Имена переменных, описываемых непосредственно после заголовка и до тела подпрограммы, называются локальными. Они допустимы для использования только в той подпрограмме, где они описаны. Имена переменных, описанных перед всеми подпрограммами, называются глобальными. Они доступны для использования как в подпрограммах, так и в основной части программы. Принято соглашение: внутри подпрограммы действуют локальные переменные, а снаружи — глобальные. Глобальные имена следует применять очень осторожно.
Подпрограммы условно разделяют на подпрограммы-функции и подпрограммы-процедуры. Но это относится не ко всем языкам программирования.
Подпрограмма-функциия обязательно возвращает результат, который затем используется в программе. Тип результата должен быть задан. Для обозначения подпрограммы используют служебное слово function.
Задание компьютеру действий (т. е. функции, предназначения) в месте, отличном от места их использования, называют описанием подпрограммы.
Общий вид описания подпрограммы-функции на языке Паскаль [5] следующий:
function имя_функции (список_аргументов): тип результата
описания внутренних переменных подпрограммы
тело подпрограммы (операторы, задающие действия с использованием формальных аргументов)
Подпрограммы по своему строению напоминают простую программу.
Подпрограммы-процедуры не возвращают ни одного значения или возвращают более одного значения. Для обозначения таких подпрограмм используют служебное слово procedure, а задание типа результата отсутствует.
Общий вид описания подпрограммы-процедуры на языке Паскаль следующий:
procedure имя_ процедуры (список_аргументов); описание внутренних переменных программы begin
Имя процедуры не может использоваться внутри процедуры как псевдопеременная.
Для записи исходного текста программы прежде всего необходимы три простые команды: присваивание, ввод, вывод. Команда присваивания служит для изменения состояния объектов алгоритма и обозначается, к примеру, в языке Pascal [5] символом := (например х: =1, А: =в). Команды ввода-вывода необходимы для связи ЭВМ с внешним миром. Эти команды относятся к разряду основных и реализованы в любой машине. Основной единицей программы, выполняющей определенные действия над данными, является оператор. Операторы бывают управляющие и обрабатывающие.
В программах для ЭВМ используются описания объектов следующих типов: целые, вещественные, литерные (символьные) и др. С каждым типом связан свой способ представления объекта в памяти ЭВМ.
Основная структура программы на языке Паскаль имеет следующие разделы:
Заголовок. Описание данных. Начало программы. Операторы. Конец программы.
Как правило, в любой программе компьютер должен выполнять ввод, обработку, хранение и вывод информации. Составление программы осуществляют набором констант, переменных, операторов и др., как правило, указывая их в определенной последовательности. Часто программа состоит из основной (главной) части и подпрограмм.
Изучение программирования начнем с помощью команд языка Паскаль в среде Турбо Паскаль.
Составление программы осуществляют описанием переменных, констант и др., а также набором последовательно записанных команд.
Пример 3.1. Вывести на экран текст «Я хочу учиться».
writeln (‘Я хочу учиться’);
В этой программе имеется только главная часть, которая находится между служебными словами begin (начало) и end (конец). Предложения языка программирования, задающие действия компьютера, называются операторами (т. е. заданиями операции над информацией). В примере оператор writeln — оператор вывода.
Операторы вывода:
- • write (b:m), где b — имя выводимой переменной, m — число позиций, константа или выражение целого типа;
- • write (b:m;n), где п — дробная часть значения выводимой переменной.
По формальным правилам языка то, что надо вывести на экран, помещают в круглые скобки ( ), а сам текст заключается в апострофы. Если задана команда writeln, то экран настраивается на вывод в следующей строке, если write — то будет предложен вывод в этой же строке экрана. В конце программы ставится точка.
Правила строги, если их нарушить, то система программирования выдаст сообщение об ошибке.
Символ ; (точка с запятой) используется для разделения предложений языка (операторов).
В Паскале оператор ввода с клавиатуры — read, за которым в круглых скобках указываются переменные через запятую. Завершение ввода — нажатие на клавишу Enter.
Собственно вычисление в программе выполняет оператор присваивания. Общий вид записи оператора присваивания: а: = Ь, где а — имя переменной, b — выражение.
В фигурных скобках < >даются комментарии, которые предназначены для человека и не воспринимаются компьютером.
Имя переменной обязательно начинается с латинской буквы или символа подчеркивания, а далее могут быть цифры, буквы, символы подчеркивания, например student l.
Тип переменных определяет, какое значение может принимать эта переменная и какие операции над этой переменной возможны. Наиболее простые типы: целые числа (integer), числа с дробной частью — вещественный (real), буквы, символы — символьный (char).
Для записи математических формул на языке программирования используются следующие обозначения:
- • * (звездочка) — знак умножения;
- • Л — знак возведения в степень;
- • / — знак деления и дополнительное применение скобок
- (х+у)/(х-у);
- • стандартные математические функции требуют обязательного указания аргументов в скобках — Sin (х);
- • корень квадратный записывается через функцию sqr;
- • переменные с индексами будут рассматриваться далее (см. информацию о массивах);
- • используют некоторые функции, например Round — для округления дробного значения до ближайшего целого, Trunc — для отбрасывания дробной части (Truncate — усечь, обрезать) и др.
Рассмотрим примеры создания программ разной структуры в соответствии со следующими этапами:
- • постановка задачи;
- • определение метода решения;
- • составление сценария работы с ЭВМ;
- • разработка алгоритма;
- • перевод алгоритма в программу;
- • ввод и тестирование программы;
- • анализ полученных результатов.