Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Глава 1. Языки программирования (ЯП)1.1. Эволюция ЯП (поколения ЯП) Первые ЯП появились как средство общения человека с ЭВМ практически одновременно с первыми компьютерами. В процессе развития вычислительной техники и ЭВМ изменялись также и ЯП. От поколения к поколению они улучшали свои характеристики, становились все более доступными в освоении и удобными в использовании. В настоящее время принято выделять 5 поколений ЯП. ЯП I-го поколения появились одновременно с первыми ЭВМ (40-50 гг. ХХ в.). В то время любой ЯП представлял собой набор машинных команд в двоичном или восьмеричном коде, который определялся архитектурой конкретной ЭВМ. Каждый тип ЭВМ имел свой ЯП, программы на котором были пригодны только для данного типа ЭВМ. Такие ЯП являлись машинно-зависимыми, поэтому от программиста требовалось хорошее знание не только машинного языка, но и архитектуры ЭВМ. Программированием могли заниматься только специально обученные программисты, а сам процесс программирования был трудоемким и сложным. ЯП II-го поколения характеризуются появлением ассемблеров – ЯП, позволяющих вместо двоичных или других форматов машинных команд использовать их мнемонические символьные обозначения, т.е. имена. Это явилось существенным шагом вперед. Но ассемблерные языки все еще оставались машинно-зависимыми, а ассемблерные программы были все также затруднительны для чтения, трудоемки в отладке и требовали больших усилий для переноса на другие типы ЭВМ. Однако ассемблеры до сих пор иногда используются при необходимости разработки высокоэффективного программного обеспечения, минимального по объему и с максимальной производительностью. ЯП III-го поколения – началом их появления можно считать появление в 1956 г. алгоритмического языка высокого уровня под названием Fortran (Фортран). За короткое время он становится основным языком программирования при решении инженерно-технических и научных задач. Первоначально Этот ЯП использовался на больших ЭВМ, гораздо позднее появились его версии и для ПЭВМ. Вскоре после Фортрана были разработаны и другие ЯП высокого уровня: Algol (Алгол), Cobol (Кобол), Basic (Бейсик), PL/1 («Пи эль один»), Pascal (Паскаль), ADA (Ада), С (Си) и др. Особо следует отметить язык Lisp (Лисп), который был разработан специально для обработки символьной информации и первых исследований по искусственному интеллекту (ИИ). ЯП III-го поколения являлись уже машинно-независимыми (в отличие от ЯП I-го и II-го поколений) и обладали развитым синтаксисом, в котором для обозначения конструкций использовались слова человеческого языка (английского). ЯП IV-го поколения имеют ярко выраженный непроцедурный характер в отличие от ЯП III-го поколения, являющихся процедурными. Программа на любом процедурном языке состоит из последовательности инструкций, которые должна выполнить ЭВМ. В программах же на языках непроцедурного типа формируются скорее соотношения, а не последовательности шагов выполнения алгоритма. Таким образом, программы на таких языках описывают только что, а не как надо сделать. Среди непроцедурных языков можно выделить четыре тенденции развития: 1) объектно-ориентированные языки, 2) языки логического программирования, 3) языки обработки запросов, 4) языки параллельного программирования. Важной тенденцией развития ЯП IV–го поколения являются языки объектно-ориентированного программирования (ООП), которое базируется на понятии программного объекта. Впервые это понятие стало использоваться в языке Simula-67. Программный объект представляет собой совокупность структур данных и алгоритмов. При этом каждый объект «знает» как выполнять операции со своими собственными данными. Наиболее известными языками ООП являются Object Pascal (система программирования Delphi) и С++ (Java). Язык Visual Basic также обладает элементами ООП. Помимо языков ООП к непроцедурным языкам можно также отнести языки логического программирования, ярким представителем которых является язык Prolog (Пролог). Этот язык был разработан на базе языка Lisp. Третьим направлением развития ЯП IV поколения являются языки обработки запросов для баз данных. Эти языки имеют свой особый синтаксис, но в отличие от языков III поколения, проще в использовании. Стандартом таких языков можно считать язык SQL (Structured Query Language). Языки параллельного программирования (модификация языка Fortran, языки Occam, SISAL, FP и др.), ориентированы на создание программного обеспечения для вычислительных средств параллельной архитектуры (многомашинные, мультипроцессорные среды и др.). В то время как все ЯП III-го поколения были ориентированы только на однопроцессорную архитектуру ЭВМ. ЯП V-го поколения – традиционно к этому поколению принято относить языки ИИ, ориентированные на создание экспертных систем и баз знаний (InterLisp, EpertLisp, IQLisp, SAIL, Visual Prolog и др.), а также естественные языки с ограниченными возможностями (Clout, Q&A, HAL и др.).
1.2. Элементы ЯП
Элементы ЯП могут рассматриваться на разных уровнях, т.е. с точки зрения: 1) алфавита, 2) лексики, 3) синтаксиса и 4) семантики конструкций ЯП. 1. Алфавит – совокупность символов, используемых для записи конструкций данного языка. 2. Лексика – совокупность правил образования цепочек символов (лексем), из которых образуются идентификаторы (имена переменных и меток), операторы, операции и другие лексические компоненты языка. Сюда же включаются зарезервированные слова, предназначенные для обозначения операторов, встроенных функций и т.п. 3. Синтаксис – совокупность правил образования языковых конструкций (предложений) ЯП – блоков, процедур, составных операторов, условных операторов, операторов цикла и т.п. Особенностью синтаксиса некоторых ЯП является рекурсивность – принцип вложенности правил построения конструкций, т.е. элемент синтаксиса языка в своем определении прямо или косвенно в одной из своих частей может содержать сам себя. Например, при определении оператора цикла телом цикла может являться еще один оператор цикла. 4. Семантика – смысловое содержание конструкций языка. Семантическим анализом называют проверку смысловой правильности конструкций. Примером семантической ошибки в классических процедурных ЯП является случай, когда в программе делается попытка присвоить переменной значение не подходящего типа (несоответствующего тому типу, который был заявлен для этой переменной при ее описании).
1.3. Способы описания ЯП Наиболее известными являются 2 способа описания ЯП: 1) нотация Бэкуса (впервые была применена для языка Алгол), 2) нотация IBM (впервые была применена для языка Кобол). 1. Нотация Бэкуса используется для описания такого известного классического ЯП как Паскаль. Согласно этой нотации описание конструкций языка состоит из левой и правой частей, между которыми ставится символ ::=, который можно трактовать как «по определению есть». В левой части определения записывается название определяемого понятия, взятое в угловые скобки < >. Правая часть включает совокупность элементов, соединенных вертикальной чертой |, которая трактуется как «или» и объединяет альтернативы – различные варианты значения определяемого элемента (понятия). Многие элементы носят рекурсивный характер, т.е. в правой части описания может содержаться левая часть как самостоятельный элемент. Пример1. Определение оператора присваивания в языке Pascal : <Оператор присваивания>::=<Переменная>:=<Выражение> Пример2. Определение идентификатора переменной в языке Pascal: <Идентификатор> ::= <Буква>|<Идентиф-р><Буква>|<Идентиф-р><Цифра> Данное определение содержит рекурсию и означает, что идентификатор (имя) переменной состоит из букв и цифр, но первым символом в имени всегда должна быть буква. 2. Нотация IBM используется для описания таких известных ЯП как Бейсик и Си. Она включает в себя следующие конструкции: < > – угловые скобки (или двойные кавычки “ “) обозначают элементы программы, определяемые пользователем (<идентификатор>, <список параметров>, <условие> и пр.), [ ] – квадратные скобки, ограничивающие конструкцию, обозначают возможность ее отсутствия, | – вертикальная черта разделяет список значений обязательных элементов, одно из которых должно быть выбрано, … – многоточие, следующее после конструкции, обозначает последовательность конструкций той же самой формы, что и предшествующая многоточию конструкция. Рекурсивные определения в нотации IBM не используются. Пример (определение описания процедуры-подпрограммы): [Private | Public | Friend][Static] Sub <идентификатор>([<список параметров>])[<оператор>] … [Exit Sub] [<оператор>] … End Sub
1.4. Типы данных
В информатике термин «данные» используется как синоним понятия «информация». В программировании данными принято называть информацию, подвергающуюся обработке с помощью некоторого алгоритма (программы). Данные, известные до выполнения алгоритма и подающиеся ему на вход (например, через ввод), называют исходными данными. Данные, получающиеся в процессе выполнения алгоритма на его различных шагах, называют промежуточными. Данные, получаемые в конце работы алгоритма (как результат решения задачи), называют выходными данными. Во многих ЯП данные делятся на константы и переменные. Константы – это данные, значения которых не меняются в процессе выполнения алгоритма. Переменные – это такие данные, значения которых могут меняться в процессе выполнения алгоритма. Каждая переменная, используемая в алгоритме (программе), должна иметь свое уникальное имя – идентификатор. В большинстве ЯП идентификатор переменной представляет собой последовательность букв и цифр, начинающуюся с буквы. Любой константе, переменной, выражению (с точки зрения обработки на ЭВМ) ставится в соответствие некоторый тип данных. Тип данных характеризует множество значений, к которому относится данная константа и которые может принимать данная переменная (или выражение). Например, если переменная i в некотором алгоритме должна принимать только значения из множества целых чисел, то ей ставится в соответствие целый тип данных. Типы данных принято делить на простые (базовые) и структурированные (сложные). К основным простым типам относятся: – целый (чаще всего обозначается как Integer) определяет множество целых чисел (в ограниченном диапазоне), – вещественный (в Паскале обозначается как Real, в языке Visual Basic как Double) определяет множество действительных чисел (в ограниченном диапазоне), – логический (обозначается как Boolean) определяет множество из двух значений: истина и ложь, – символьный (в Паскале обозначается как Char, в Visual Basic отсутствует) определяет множество целых чисел (в ограниченном диапазоне). Основные типы языка VBA перечислены в главе 3 в пункте 3.2 (в таблице 3) с указанием диапазона и размера занимаемой памяти по каждому типу данных.
Отличие простых переменных от структурированных. Переменной простого типа в определенный момент времени ставится в соответствие только одно значение. Переменной структурированного типа ставится в соответствие целый набор значений (т.е. некоторая структура).
К основным структурированным типам данных относятся: массив, запись и файл. Массив представляет собой конечный набор элементов одного типа. Размерность массива определяется количеством индексов, которые ставятся в соответствие каждому элементу массива. Например, в одномерном массиве каждому элементу ставится в соответствие значение только одного индекса (номер элемента), в двумерном массиве (матрице) каждому элементу ставятся в соответствие значения двух индексов: номер строки и номер столбца. При описании переменной типа массив указывается имя массива, а также тип элементов данного массива (описание массива в языке VBA см. в пункте 3.2). Для обращения к отдельному элементу массива указывается не только имя массива, но и значения его индексов (в одномерном массиве – номер элемента) в скобках после имени массива. Пример. Х – одномерный массив из 10 элементов целого типа. Требуется присвоить пятому элементу массива Х значение 10. На языке Паскаль это действие запишется так: X[5]:=10; На языке Бейсик (в том числе на VBA): X(5)=10
Для обработки массивов, как правило, используются циклические структуры (типовые структуры алгоритмов описаны в главе 2 в пункте 2.6), т.к. в цикле можно задать выполнение одного и того же действия поочередно для всех элементов массива. Пример. Х – одномерный массив из n элементов. Требуется задать ввод значений элементов данного массива. В данном случае удобно использовать цикл с заданным числом повторений, в теле которого будет задано действие «Ввод X(i)» как ввод очередного i-го элемента массива Х. В заголовке цикла будет задан перебор всех значений индекса i от 1 до n (с первого до последнего) с шагом 1 (рис.1). Рис.1 Блок-схема цикла для ввода значений элементов массива Х Запись представляет собой конечный набор элементов разного типа. Элементы записи называют полями. Каждое поле должно иметь собственное имя. При описании переменной типа запись кроме имени записи указываются имена всех полей и их типы. Если в описании нескольких записей присутствует поле с одним и тем же именем, то далее при обращении к этому полю в программе должно указываться составное имя, где будет указано не только имя поля, но также имя записи, к которой данное поле относится. Файл можно определить как логически непрерывный именованный набор данных на внешнем носителе (например, диске). Связь программы с внешними файлами осуществляется через специальные переменные. Процесс обработки файла включает в себя следующие операции: 1) открытие файла, 2) организация цикла для обработки содержания файла, который обычно заканчивается по исчерпании записей файла – достижении состояния EOF(End-Of-File), 3) закрытие файла. По типу записей различают: 1) файлы с записями фиксированной длины, 2) файлы с записями переменной или неопределенной длины, 3) файлы, образующие байтовый или битовый поток. По способу выборки информации различают: 1) файлы последовательного доступа, 2) файлы прямого доступа.
1.5. Краткие сведения о некоторых ЯП 1.5.1. Бейсик (Basic) Еще в XIX веке один английский миссионер для облегчения контакта с туземцами выделил из английского языка некоторую его базовую часть, содержащую около 300 наиболее распространенных слов и почти без грамматики. Такое подмножество английского языка получило название BASIC ENGLISH и впоследствии завоевало популярность не только среди туземного населения, но и среди иммигрантов. В начале 60-х гг. XX в. сотрудники Дартмурского колледжа Джон Кемени и Томас Куртс ставили перед собой подобную задачу – создать средство для расширения и облегчения контактов только не между людьми, а между непрофессионалами и ЭВМ. В результате в 1964 г. ими был разработан алгоритмический язык BASIC (Бейсик), который, как и любой другой ЯП, являлся формальной знаковой системой, предназначенной для связи человека с ЭВМ через описание данных и алгоритмов для их обработки на ЭВМ. Название BASIC является аббревиатурой английской фразы “Beginner’s All-purpose Symbolic Instruction Code” – в переводе «многоцелевой язык символических команд для начинающих». Однако некоторые «злые языки» до сих пор полагают, что данная расшифровка, возможно, была придумана авторами данного языка позже, чем само название BASIC. Вскоре как начинающие, так и профессиональные программисты обнаружили, что Бейсик может делать практически все то, что делает громоздкий ЯП Фортран. Преимуществом Бейсика оказался упрощенный синтаксис, что позволяло писать программы на нем быстрее, чем на Фортране. Бейсик был широко доступен на первых персональных компьютерах (ПК), обычно он был встроен в его ПЗУ. Все это привело к широкой популярности Бейсика как среди начинающих, так и профессионалов. Даже сегодня Бейсик остается самым простым для освоения из десятков языков общецелевого программирования. Несмотря на наличие мощных профессиональных ЯП Си и Паскаль, Бейсик не теряет своей актуальности и является языком, снабженным хорошими средствами решения некоторых специфических задач (работа с файлами, вывод текстовой и графической информации и др.). Со временем стали появляться различные версии этого языка, в большей или меньшей степени отличающиеся от классического Бейсика. Таким образом, на сегодняшний день мы имеем не единственный конкретный язык Бейсик, а целую группу однотипных диалоговых языков, объединенных данным названием. На сегодняшний день, пожалуй, наиболее актуальной реализацией Бейсика можно считать язык и систему программирования Visual Basic, которая является визуальной средой программирования с элементами объектно-ориентированного подхода (ООП). Тем более, что помимо существования Visual Basic как отдельной среды программирования, данный язык был также включен (как встроенная сиcтема программирования) во все приложения пакета MS Office под названием Visual Basic for Application (VBA). Описание языка VBA более подробно излагается в главе 3 данного пособия, а понятие ООП описывается в главе 4. 1.5.2. Паскаль (Pascal) Отличительная черта ЯП Pascal (Паскаль) в том, что данный язык изначально разрабатывался с педагогическими целями, т.е. для обучения программированию. Его предварительное описание было впервые опубликовано в 1968 г. Создателем языка Паскаль является профессор кафедры вычислительной техники Швейцарского федерального института технологии Никлаус Вирт, который назвал язык в честь французского математика и физика Блеза Паскаля, создавшего в 1642 г. первую счетную машину. По своему духу Паскаль стал продолжением линии языков Алгол-60 и Алгол-W. В 1970 г. заработал первый компилятор языка Паскаль. После двух лет использования данного языка потребовалось внести в него некоторые изменения. Поэтому в 1973 г. было опубликовано Пересмотренное сообщение, в котором язык был уже определен в терминах множества символов ISO (International Standards Organization – Международный институт стандартов). С начала 80-х гг. с появлением версий языка MS Pascal и Turbo Pascal для ПЭВМ язык Паскаль получает еще более широкое распространение и становится одним из наиболее часто используемых языков на ПК. Далее в развитии языка стала заметна тенденция его привязки к ПК типа IBM PC. Следующим шагом усовершенствования языка явилась версия Object Pascal, используемая в среде разработки приложений (системе программирования) Delphi. Object Pascal – объектно-ориентированное расширение языка Паскаль. Включив в себя понятие класса, заменившего объект, эта версия языка поддерживает предыдущие версии Паскаля в реализации фирмы Borland. На сегодняшний день основные пользователи Delphi – 1) разработчики информационных систем, 2) программисты, применяющие данную среду как средство быстрого решения своих задач.
1.5.3. Си (C) Прежде всего, следует отметить, что язык Си (в отличие от Бейсика и Паскаля) был разработан сугубо с профессиональными целями и для профессионалов. Он был создан в начале 70-х гг. Деннисом Ритчи, работавшем в компании Bell Laboratories. Язык Си соединил в себе свойства языка высокого уровня с возможностью эффективного использования ресурсов компьютера, которое обычно обеспечивается только при программировании на языках ассемблерного типа. Си был разработан как язык для программирования в новой по тем временам операционной системе Unix. Вскоре сама Unix была переписана на языке Си. В 1974-75 гг. ОС Unix фирмы Bell Laboratories стала первым коммерческим продуктом, реализующим идею о том, что операционная система может быть успешно написана на языке высокого уровня, если этот язык достаточно мощный и гибкий. В 1978 г. Брайан Керниган и Деннис Ритчи написали книгу «Язык программирования Си» (издательство Prentice-Hall). Данная работа, называвшая в узком кругу «белой книгой», а в остальном мире – «K & R», стала стандартом описания языка Си. На момент создания «K & R» существовали компиляторы языка Си для ЭВМ PDP-11, Interdata 8/32, Honeywel 6000 b IBM 370. В дальнейшем этот список расширился После появления ПК типа IBM PC стали появляться и компиляторы языка Си для данного типа ЭВМ. В настоящее время на рынке представлены не менее семнадцати компиляторов языка Си для IBM PC. В 1983 г. Американский институт стандартов (ANSI) сформировал технический Комитет X3J11, устав которого предусматривает создание стандарта языка Си. Стандартизация должна распространяться не только на язык, но и на программную среду компилятора, а также на библиотеку стандартных функций. Язык Си не очень прост в обучении и требует тщательности в программировании, но позволяет писать сложные и весьма высокоэффективные программы. Другими словами, это язык не для начинающих (не для обучения программированию), а язык, ориентированный на профессиональное использование (т.е. для программистов). Позднее Бьярном Страустрапом был разработан язык Си ++. Это расширение классического языка Си, в котором реализуются популярные в настоящее время концепции объектно-ориентированного программирования, что облегчает создание сложных программ. 1.6. Системы программирования При классификации программного обеспечения ПК выделяют отельную группу программ под названием инструментальные программы или системы программирования. Назначение программ данного типа – разработка и создание новых программ, т.е. системы программирования служат как бы инструментом для создания новых программ. Любая система программирования организует среду, в которой может осуществляться разработка новых программ. По структуре система программирования представляет собой совокупность нескольких компонентов, необходимых в процессе разработки программы. Как правило, это – язык программирования (или несколько ЯП), транслятор, редактор связей, библиотеки подпрограмм, утилиты и обслуживающие программы (например, отладчик и др.). Все вышеперечисленные средства требуются для обеспечения автоматизации процесса составления и отладки программ. Классификация систем программирования может проводиться по различным признакам, которые приведены в таблице 1. Таблица 1.
В многоязыковой системе программирования отдельные части (секции, модули или сегменты) программы могут быть подготовлены на различных языках и объединены во время или перед выполнением в единый модуль. В одноязыковой системе все части программы записываются на одном ЯП. В открытую систему программирования (в отличие от замкнутой системы) может быть введен новый входной язык программирования с транслятором, при этом не потребуется внесения изменений в саму систему программирования. Транслятором называют специальную программу, которая осуществляет автоматический перевод программы, записанной на алгоритмическом языке высокого уровня, на язык машинных кодов. Процесс такого перевода соответственно называется трансляцией (to translate – в переводе с англ. «переводить») программы. Различают трансляторы двух типов: интерпретатор и компилятор. Существуют также трансляторы-гибриды. В интерпретирующей системе программирования, т.е. использующей транслятор типа интерпретатор, осуществляется покомандный перевод и выполнение инструкций программы, при чем только в среде данной системы программирования. Таким образом, при интерпретации процесс трансляции (перевода) команды программы совмещается с ее выполнением. В компилирующей системе программирования, в которой для трансляции программы используется компилятор, осуществляется перевод сразу всей программы и подготавливается результирующий модуль (например, в виде файла типа .exe), который далее может выполняться на ЭВМ вне среды программирования. Для ПК типа IBM PC с момента их появления и до настоящего времени было разработано большое количество систем программирования, возможности которых менялись и прогрессировали параллельно с улучшением самих ПК этого типа. В первую очередь следует отметить системы программирования для таких классических ЯП как Бейсик, Паскаль, Си, Си++. Хотя первые версии этих ЯП появились еще в период господства больших ЭВМ (60-70-е гг. ХХ в.), они оказались настолько популярными, что системы программирования для них стали выпускаться и для ПК (сначала под DOS, потом под Windows). Среди наиболее известных в свое время систем программирования под DOS нужно отметить Quick Basic, Microsoft C, Microsoft C++ фирмы Microsoft; Turbo Basic, Turbo C++, Turbo Pascal фирмы Borland. Позднее были разработаны сиcтемы программирования под Windows: Visual Basic, Visual C++ фирмы Microsoft; Delphi (для языка Object Pascal) фирмы Borland. Для языка Лисп можно упомянуть системы программирования Common Lisp, Expert Lisp; для языка Пролог – Turbo Prolog, Visual Prolog.
Контрольные вопросы 1. Сколько поколений ЯП принято выделять в настоящее время? 2. В чем особенность ЯП I-го поколения? 3. В чем особенность ЯП II-го поколения? 4. В чем главное отличие ЯП III-го поколения от ЯП I-го и II-го поколений? 5. В чем особенность ЯП IV-го поколения? 6. Какие тенденции развития ЯП непроцедурного типа можно выделить? 7. Какие ЯП традиционно относят к языкам V-го поколения? 8. На каких уровнях можно рассматривать элементы ЯП? 9. Какие 2 способа описания ЯП наиболее известны? 10. Какие из известных ЯП описываются с помощью нотации Бэкуса, а какие – с помощью нотации IBM? 11. Какая из нотаций может содержать рекурсию в описании? 12. Что такое данные? 13. Какие данные называют исходными, промежуточными и выходными? 14. Чем отличается переменная от константы? 15. Что такое идентификатор? 16. Что такое тип данных? 17. Какие типы данных являются простыми (базовыми)? 18. Какие типы данных относят к структурированным? 19. В чем отличие переменных простого типа от переменных структурированного типа? 20. Что такое массив? Как осуществляется обращение к элементу массива? 21. Что такое запись? Как осуществляется обращение к элементу записи? 22. Что такое файл как тип данных? 23. Какие типы файлов различают? 24. Что объединяет классические ЯП Бейсик и Паскаль и, тем самым, отличает от языка Си? 25. Какие программы называют системами программирования? 26. Способы классификации систем программирования. 27. Какие системы программирования наиболее известны для программирования под Windows?
Дата добавления: 2014-10-17; просмотров: 857; Нарушение авторских прав Мы поможем в написании ваших работ! |