Языки и системы программирования. Реферат: Современные языки и системы программирования. Архитектура программных систем

Языки и системы программирования. Реферат: Современные языки и системы программирования. Архитектура программных систем

21.02.2019
Главная > Лекция

Лекция 7 . Языки и системы программирования.
Структура данных.

Языки программирования и их классификации. Понятие о системе программирования, ее основные функции и компоненты. Принципы работы сред программирования. "Операционные" и "модульные" среды программирования: достоинства и недостатки. Интерпретаторы и компиляторы. Трансляция программ и сопутствующие процессы.

Данные и их обработка. Простые (неструктурированные типы данных). Структурированные типы данных.

Языки программирования и их классификации.

Язык программирования - формальная знаковая система, предназначенная для описания алгоритмов в форме, которая удобна для исполнителя (например, компьютера). Язык программирования определяет набор лексических, синтаксических и семантических правил, используемых при составлении компьютерной программы. Он позволяет программисту точно определить то, на какие события будет реагировать компьютер, как будут храниться и передаваться данные, а также какие именно действия следует выполнять над этими при различных обстоятельствах.

Со времени создания первых программируемых машин человечество придумало уже более двух с половиной тысяч языков программирования. Каждый год их число пополняется новыми. Некоторыми языками умеет пользоваться только небольшое число их собственных разработчиков, другие становятся известны миллионам людей. Профессиональные программисты иногда применяют в своей работе более десятка разнообразных языков программирования.

Создатели языков по-разному толкуют понятие язык программирования . Среди общин мест, признаваемых большинством разработчиков, находятся следующие:

    Функция: язык программирования предназначен для написания компьютерных программ, которые применяются для передачи компьютеру инструкций по выполнению того или иного вычислительного процесса и организации управления отдельными устройствами.

    Задача: язык программирования отличается от естественных языков тем, что предназначен для передачи команд и данных от человека компьютеру, в то время как естественные языки используются лишь для общения людей между собой. В принципе, можно обобщить определение "языков программирования" - это способ передачи команд, приказов, чёткого руководства к действию; тогда как человеческие языки служат также для обмена информацией.

    Исполнение: язык программирования может использовать специальные конструкции для определения и манипулирования структурами данных и управления процессом вычислений.

Первые языки программирования были очень примитивными и мало чем отличались от формализованных упорядоченных последовательностей единиц и нулей, понятных компьютеру. Использование таких языков было крайне неудобно с точки зрения программиста, так как он должен был знать числовые коды всех машинных команд, должен был сам распределять память под команды программы и данные.

Для того, чтобы облегчить общение человека с ЭВМ были созданы языки программирования типа Ассемблер . Переменные величины стали изображаться символическими именами. Числовые коды операций заменились на мнемонические обозначения, которые легче запомнить. Язык программирования приблизился к человеческому языку, и отдалился от языка машинных команд.

Языки программирования стали появляться уже с середины 50-х годов. Одним из первых языков такого типа стал язык Фортран (англ. FORTRAN от FORmula TRANslator – переводчик формул), разработанный в 1957 году. Фортран применяется для описания алгоритма решения научно-технических задач с помощью ЦВМ. Так же, как и первые вычислительные машины, этот язык предназначался, в основном, для проведения естественно-научных и математических расчётов. В усовершенствованном виде этот язык сохранился до нашего времени. Среди современных языков высокого уровня он является одним из наиболее используемых при проведении научных исследований. Наиболее распространены варианты Фортран-II, Фортран-IV, EASIC Fortran и их обобщения.

После Фортрана в 1958-1960 годах появился язык Алгол (Алгол-58, Алгол-60) (англ. ALGOL от ALGOrithmic Language – алгоритмический язык). Алгол был усовершенствован в 1964-1968 годах – Алгол-68. Алгол был разработан комитетом, в который входили европейские и американские учёные. Он относится к языкам высокого уровня (high-level language) и позволяет легко переводить алгебраические формулы в программные команды. Алгол был популярен в Европе, в том числе СССР, в то время как сравнимый с ним Фортран был распространен в США и Канаде. Алгол оказал заметное влияние на все разработанные позднее языки программирования, и, в частности, на язык Pascal. Этот язык так же, как и Фортран, предназначался для решения научно-технических задач. Кроме того, этот язык применялся как средство обучения основам программирования – искусства составления программ.

Обычно под понятием Алгол подразумевается язык Алгол-60 , в то время как Алгол-68 рассматривается как самостоятельный язык. Даже когда язык Алгол почти перестал использоваться для программирования, он ещё оставался официальным языком для публикации алгоритмов.

В 1959 – 1960 годах был разработан язык Кобол (англ. COBOL от COmmom Business Oriented Language – общий язык, ориентированный на бизнес). Это язык программирования третьего поколения, предназначенный, в первую очередь, для разработки бизнес приложений. Также Кобол предназначался для решения экономических задач, обработки данных для банков, страховых компаний и других учреждений подобного рода. Разработчиком первого единого стандарта Кобола являлась Грейс Хоппер (бабушка Кобола ).

Кобол обычно критикуется за многословность и громоздкость, поскольку одной из целей создателей языка было максимально приблизить конструкции к английскому языку. (До сих пор Кобол считается языком программирования, на котором было написано больше всего строк кода). В то же время, Кобол имел прекрасные для своего времени средства для работы со структурами данных и файлами, что обеспечило ему долгую жизнь в бизнес приложениях, по крайней мере, в США.

Почти одновременно с Коболом (1959 – 1960 гг.) в Массачусетском технологическом институте был создан язык Лисп (англ. LISP от LISt Processing – обработка списков). Лисп основан на представлении программы системой линейных списков символов, которые притом являются основной структурой данных языка. Лисп считается вторым после Фортрана старейшим высокоуровневым языком программирования. Этот язык широко используется для обработки символьной информации и применяется для создания программного обеспечения, имитирующего деятельность человеческого мозга.

Любая программа на Лиспе состоит из последовательности выражений (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде списков - одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.

Основной смысл Лисп-программы "жизнь" в символьном пространстве: перемещение, творчество, запоминание, создание новых миров и т.д. Лисп как метафора мозга, символ, метафора сигнала: "Как происходит биологический анализ сигналов мозгом, как внешний фактор - физическое и химическое воздействие, являющееся для организма раздражителем превращается в биологически значимый сигнал, зачастую жизненно важный, определяющий все поведение человека или животного; и как происходит разделение разных сигналов на положительные, отрицательные и безразличные, индифферентные. Сигнал это уже интегративное понятие. Он представляет собой опознавательный знак группы, комплексных раздражителей, связанных между собой общей историей и причинно следственными отношениями. В этом комплексе, системе раздражителей, сигнальный стимул сам является также составляющим элементом и при иных обстоятельствах его роль может принадлежать другому стимулу из комплекса. В сигнале концентрируется весь прошлый опыт животного или человека."

В середине 60-х годов (1963 г.) в Дартмутском колледже (США) был создан язык Бейсик (англ. BASIC от Beginner’s Allpurpose Instruction Code – всецелевой символический код инструкций для начинающих). Со временем, когда стали появляться другие диалекты, этот «изначальный» диалект стали называть Dartmouth BASIC. Язык был основан частично на Фортран II и частично на Алгол-60, с добавлениями, делающими его удобным для работы в режиме разделения времени и, позднее, обработки текста и матричной арифметики. Первоначально Бейсик был реализован на мейнфрейме GE-265 с поддержкой множества терминалов. Вопреки распространённому убеждению, в момент своего появления это был компилируемый язык.

Бейсик был спроектирован так, чтобы студенты могли писать программы, используя терминалы с разделением времени. Он создавался как решение для проблем, связанных со сложностью более старых языков. Он предназначался для более «простых» пользователей, не столько заинтересованных в скорости программ, сколько просто в возможности использовать компьютер для решения своих задач. В силу простоты языка Бейсик многие начинающие программисты начинают с него свой путь в программировании.

В конце 60-х – начале 70-х годов появился язык Форт (англ. FOURTH – четвёртый). Этот язык стал применяться в задачах управления различными системами после того, как его автор Чарльз Мур написал на нём программу, предназначенную для управления радиотелескопом Аризонской обсерватории.

Ряд свойств, а именно интерактивность, гибкость и простота разработки делают Форт весьма привлекательным и эффективным языком в прикладных исследованиях и при создании инструментальных средств. Очевидными областями применения этого языка являются встраиваемые системы управления. Также находит применение при программировании компьютеров под управлением различных операционных систем.

Появившийся в 1972 году язык Паскаль был назван так в честь великого французского математика XVII века, изобретателя первой в мире арифметической машины Блеза Паскаля. Этот язык был создан швейцарским учёным, специалистом в области информатики Никлаусом Виртом как язык для обучения методам программирования. Паскаль – это язык программирования общего назначения.

Особенностями языка являются строгая типизация и наличие средств структурного (процедурного) программирования. Паскаль был одним из первых таких языков. По мнению Н. Вирта, язык должен способствовать дисциплинированию программирования, поэтому, наряду со строгой типизацией, в Паскале сведены к минимуму возможные синтаксические неоднозначности, а сам синтаксис интуитивно понятен даже при первом знакомстве с языком.

Язык Паскаль учит не только тому, как правильно написать программу, но и тому, как правильно разработать метод решения задачи, подобрать способы представления и организации данных, используемых в задаче. С 1983 года язык Паскаль введён в учебные курсы информатики средних школ США.

Для обучения младших школьников Самуэлем Пайпертом был разработан язык Лого . Он отличается простотой и богатыми возможностями.

На основе языка Паскаль в конце 70-х годов был создан язык Ада , названный в честь одарённого математика Ады Лавлейс (Огасты Ады Байрон – дочери поэта Байрона). Именно она в 1843 году смогла объяснить миру возможности Аналитической машины Чарльза Бэббиджа. Язык Ада был разработан по заказу Министерства обороны США и первоначально предназначался для решения задач управления космическими полётами. Этот язык применяется в задачах управления бортовыми системами космических кораблей, системами обеспечения жизнедеятельности космонавтов в полёте, сложными техническими процессами.

Ада - это структурный, модульный, объектно-ориентированный язык программирования, содержащий высокоуровневые средства программирования параллельных процессов. Синтаксис Ады унаследован от языков типа Algol или Паскаль, но расширен, а также сделан более строгим и логичным. Ада - язык со строгой типизацией, в нём исключена работа с объектами, не имеющими типов, а автоматические преобразования типов сведены к абсолютному минимуму.

По утверждению Стефена Цейглера, разработка программного обеспечения на Аде в целом обходится на 60 % дешевле, а разработанная программа имеет в 9 раз меньше дефектов, чем при использовании языка Си.

В настоящее время популярным среди программистов является язык Си (С – буква английского алфавита). Язык Си берёт своё начало от двух языков - BCPL и B . В 1967 году Мартин Ричардс разработал BCPL как язык для написания системного программного обеспечения и компиляторов. В 1970 году Кен Томпсон использовал В для создания ранних версий операционной системы UNIX на компьютере DEC PDP-7. Как в BCPL, так и в В переменные не разделялись на типы - каждое значение данных занимало одно слово в памяти и ответственность на различение, например, целых и действительных чисел целиком ложилась на плечи программиста.

Язык Си был разработан (на основе В) Деннисом Ритчи из Bell Laboratories и впервые был реализован в 1972 году на компьютере DEC PDP-11. Известность Си получил в качестве языка ОС UNIX. Сегодня практически все основные операционные системы были написаны на Си или С++. По прошествии двух десятилетий Си имеется в наличии на большинстве компьютеров. Он не зависит от аппаратной части.

В конце 70-х годов Си превратился в то, что мы называем «традиционный Си». В 1983 году Американским комитетом национальных стандартов в области компьютеров и обработки информации был учрежден единый стандарт этого языка.

Он является одним из универсальных языков программирования. В отличие от Паскаля, в нем заложены возможности непосредственного обращения к некоторым машинным командам и к определенным участкам памяти компьютера. Си широко используется как инструментальный язык для разработки операционных систем, трансляторов, баз данных и других системных и прикладных программ. Си – это язык программирования общего назначения, хорошо известный своей эффективностью, экономичностью, и переносимостью. Во многих случаях программы, написанные на Си , сравнимы по скорости с программами, написанными на языке Ассемблера . При этом они имеют лучшую наглядность и их более просто сопровождать. Си сочетает эффективность и мощность в относительно малом по размеру языке.

Ещё один язык, который считается языком будущего, был создан в начале 70-х годов группой специалистов Марсельского университета. Это язык Пролог . Своё название он получил от слов «ПРОграммирование на языке ЛОГики». В основе этого языка лежат законы математической логики. Как и язык Лисп, Пролог применяется, в основном, при проведении исследований в области программной имитации деятельности мозга человека. В отличие от описанных выше языков, этот язык не является алгоритмическим. Он относится к так называемым дескриптивным (от англ. descriptive – описательный) – описательным языкам. Дескриптивный язык не требует от программиста разработки всех этапов выполнения задачи. Вместо этого, в соответствии с правилами такого языка, программист должен описать базу данных, соответствующую решаемой задаче, и набор вопросов, на которые нужно получить ответы, используя данные из этой базы.

В последние десятилетия в программировании возник и получил существенное развитие объектно-ориентированный подход. Это метод программирования, имитирующий реальную картину мира: информация, используемая для решения задачи, представляется в виде множества взаимодействующих объектов. Каждый из объектов имеет свои свойства и способы поведения. Взаимодействие объектов осуществляется при помощи передачи сообщений: каждый объект может получать сообщения от других объектов, запоминать информацию и обрабатывать её определённым способом и, в свою очередь, посылать сообщения. Так же, как и в реальном мире, объекты хранят свои свойства и поведение вместе, наследуя часть из них от родительских объектов.

Объектно-ориентированная идеология используется во всех современных программных продуктах, включая операционные системы.

Первый объектно-ориентированный язык Simula - 67 был создан как средство моделирования работы различных приборов и механизмов. Большинство современных языков программирования – объектно-ориентированные. Среди них последние версии языка Turbo - Pascal , C ++ , Ada и другие.

В настоящее время широко используются системы визуального программирования Visual Basic , Visual C ++ , Delphi и другие. Они позволяют создавать сложные прикладные пакеты, обладающие простым и удобным пользовательским интерфейсом.

Существуют различные классификации языков программирования . По наиболее распространенной классификации все языки программирования делят на языки низкого , высокого и сверхвысокого уровня.

В группу языков низкого уровня входят машинные языки и языки символического кодирования: (Автокод, Ассемблер). Операторы этого языка – это те же машинные команды, но записанные мнемоническими кодами, а в качестве операндов используются не конкретные адреса, а символические имена. Все языки низкого уровня ориентированы на определенный тип компьютера, т. е. являются машинно-зависимыми. Машинно-ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.).

Следующую, существенно более многочисленную группу составляют языки программирования высокого уровня . Это Фортран, Алгол, Кобол, Паскаль, Бейсик, Си, Пролог и т.д. Эти языки машинно-независимы, т.к. они ориентированы не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов. Однако программы, написанные на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на машинных языках.

К языкам сверхвысокого уровня можно отнести лишь Алгол-68 и APL. Повышение уровня этих языков произошло за счет введения сверхмощных операций и операторов.

Алгол-68, при разработке которого сделана попытка формализовать описание языка, приведшая к появлению абстрактной и конкретной программ. Абстрактная программа создается программистом, конкретная - выводится из первой. Предполагается, что при таком подходе принципиально невозможно породить неверную синтаксически (а в идеале и семантически) конкретную программу. Язык APL относят к языкам сверхвысокого уровня за счет введения сверхмощных операций и операторов. Запись программ на таком языке получается компактной.

Другая классификация делит языки на вычислительные и языки символьной обработки. К первому типу относят Фортран, Паскаль, Алгол, Бейсик, Си, ко второму типу - Лисп, Пролог, Снобол и др.

В современной информатике можно выделить два основных направления развития языков программирования: процедурное и непроцедурное.

Процедурное программирование возникло на заре вычислительной техники и получило широкое распространение. В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий.

Среди процедурных языков выделяют в свою очередь структурные и операционные языки. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т.д. В операционных языках для этого используются несколько операций. Широко распространены следующие структурные языки : Паскаль, Си, Ада, ПЛ/1. Среди операционных известны Фортран, Бейсик, Фокал.

Непроцедрное (декларативное ) программирование появилось в начале 70-х годов 20 века, но стремительное его развитие началось в 80-е годы, когда был разработан японский проект создания ЭВМ пятого поколения, целью которого явилась подготовка почвы для создания интеллектуальных машин. К непроцедурному программированию относятся функциональные и логические языки.

В функциональных языках программа описывает вычисление некоторой функции. Обычно эта функция задается как композиция других, более простых, те в свою очередь разлагаются на еще более простые и т.д. Один из основных элементов в функциональных языках - рекурсия, то есть вычисление значения функции через значение этой же функции от других элементов. Присваивания и циклов в классических функциональных языках нет.

В логических языках программа вообще не описывает действий. Она задает данные и соотношения между ними. После этого системе можно задавать вопросы. Машина перебирает известные и заданные в программе данные и находит ответ на вопрос. Порядок перебора не описывается в программе, а неявно задается самим языком. Классическим языком логического программирования считается Пролог . Построение логической программы вообще не требует алгоритмического мышления, программа описывает статические отношения объектов, а динамика находится в механизме перебора и скрыта от программиста.

Можно выделить еще один класс языков программирования - объектно - ориентированные языки высокого уровня . На таких языках не описывают подробной последовательности действий для решения задачи, хотя они содержат элементы процедурного программирования. Объектно-ориентированные языки, благодаря богатому пользовательскому интерфейсу, предлагают человеку решить задачу в удобной для него форме. Примером такого языка может служить язык программирования визуального общения Object Pascal.

Языки описания сценариев , такие как Perl, Python, Rexx, Tcl и языки оболочек UNIX, предполагают стиль программирования, весьма отличный от характерного для языков системного уровня. Они предназначаются не для написания приложения с нуля, а для комбинирования компонентов, набор которых создается заранее при помощи других языков. Развитие и рост популярности Internet также способствовали распространению языков описания сценариев. Так, для написания сценариев широко употребляется язык Perl , а среди разработчиков Web-страниц популярен JavaScript .

Понятие о системе программирования, ее основные функции и компоненты.

Система программирования (СП) - совокупность программных средств, облегчающих написание, отладку диалоговой программы и автоматизирующих её многоэтапное преобразование в исполняемую программу и загрузку в память для выполнения. Ныне СП трансформировались в интегрированные среды разработки программ (Integrated Development Environment , IDE), позволяющие визуально разрабатывать пользовательский интерфейс и организовывать связь с базами данных.

Создание сложного программного средства осуществляется в среде программной инженерии. Согласно ГОСТ Р ИСО/МЭК 14764-2002 она представляет собой «набор автоматических инструментальных средств, программно-аппаратных и технических средств, необходимых для выполнения объёма работ по программной инженерии». К автоматизированным инструментальным средствам относятся, в частности, компиляторы, компоновщики загрузочных операционных систем, отладчики, средства моделирования, средства документирования и системы управления базами данных.

Система программирования освобождает проблемного пользователя или прикладного программиста от необходимости написания программ решения своих задач на неудобном для него языке машинных команд и предоставляют им возможность использовать специальные языки более высокого уровня. Для каждого из таких языков, называемых входными или исходными, система программирования имеет программу, осуществляющую автоматический перевод (трансляцию) текстов программы с входного языка на язык машины. Обычно система программирования содержит описания применяемых языков программирования, программы- трансляторы с этих языков, а также развитую библиотеку стандартных подпрограмм. Важно различать язык программирования и реализацию языка.

Язык – это набор правил, определяющих систему записей, составляющих программу, синтаксис и семантику используемых грамматических конструкций.

Реализация языка – это системная программа, которая переводит (преобразует) записи на языке высокого уровня в последовательность машинных команд.

По набору входных языков различают системы программирования одно- и многоязыковые. Отличительная черта многоязыковых систем состоит в том, что отдельные части программы можно составлять на разных языках и помощью специальных обрабатывающих программ объединять их в готовую для исполнения на ЭВМ программу.

Для построения языков программирования используется совокупность общепринятых символов и правил, позволяющих описывать алгоритмы решаемых задач и однозначно истолковывать смысл созданного написания. Основной тенденцией в развитии языков программирования является повышение их семантического уровня с целью облегчения процесса разработки программ и увеличения производительности труда их составителей.

По структуре, уровню формализации входного языка и целевому назначению различают системы программирования машинно-ориентированные и машинно-независимые .

Машинно-ориентированные системы программирования имеют входной язык, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.). Машинно- ориентированные системы позволяют использовать все возможности и особенности машинно-зависимых языков:

    высокое качество создаваемых программ;

    возможность использования конкретных аппаратных ресурсов;

    предсказуемость объектного кода и заказов памяти;

    для составления эффективных программ необходимо знать систему команд и особенности функционирования данной ЭВМ;

    трудоемкость процесса составления программ (особенно на машинных языках и ЯСК), плохо защищенного от появления ошибок;

    низкая скорость программирования;

    невозможность непосредственного использования программ, составленных на этих языках, на ЭВМ других типов.

Машинно-ориентированные системы по степени автоматического программирования подразделяются на классы:

1. Машинный язык . В таких системах программирования отдельный компьютер имеет свой определенный Машинный Язык (далее МЯ), ему предписывают выполнение указываемых операций над определяемыми ими операндами, поэтому МЯ является командным. Однако, некоторые семейства ЭВМ (например, ЕС ЭВМ, IBM/370/ и др.) имеют единый МЯ для ЭВМ разной мощности.

В команде любого из них сообщается информация о местонахождении операндов и типе выполняемой операции. В новых моделях ЭВМ намечается тенденция к повышению внутренних языков машинно-аппаратным путем реализовывать более сложные команды, приближающиеся по своим функциональным действиям к операторам алгоритмических языков программирования.

2. Система Символического Кодирования . В данных системах используются Языки Символического Кодирования (далее ЯСК), которые так же, как и МЯ, являются командными. Однако коды операций и адреса в машинных командах, представляющие собой последовательность двоичных (во внутреннем коде) или восьмеричных (часто используемых при написании программ) цифр, в ЯСК заменены символами (идентификаторами), форма написания которых помогает программисту легче запоминать смысловое содержание операции. Это обеспечивает существенное уменьшение числа ошибок при составлении программ.

Использование символических адресов – первый шаг к созданию ЯСК. Команды ЭВМ вместо истинных (физических) адресов содержат символические адреса. По результатам составленной программы определяется требуемое количество ячеек для хранения исходных промежуточных и результирующих значений. Назначение адресов, выполняемое отдельно от составления программы в символических адресах, может проводиться менее квалифицированным программистом или специальной программой, что в значительной степени облегчает труд программиста.

3. Автокоды . Существуют системы программирования, использующие языки, которые включают в себя все возможности ЯСК, посредством расширенного введения макрокоманд – они называются Автокоды. В различных программах встречаются некоторые достаточно часто использующиеся командные последовательности, которые соответствуют определенным процедурам преобразования информации. Эффективная реализация таких процедур обеспечивается оформлением их в виде специальных макрокоманд и включением последних в язык программирования, доступный программисту. Макрокоманды переводятся в машинные команды двумя путями – расстановкой и генерированием. В постановочной системе содержатся «остовы» – серии команд, реализующие требуемую функцию, обозначенную макрокомандой. Макрокоманды обеспечивают передачу фактических параметров, которые в процессе трансляции вставляются в «остов» программы, превращая её в реальную машинную программу. В системе с генерацией имеются специальные программы, анализирующие макрокоманду, которые определяют, какую функцию необходимо выполнить и формируют необходимую последовательность команд, реализующих данную функцию. Обе указанных системы используют трансляторы с ЯСК и набор макрокоманд, которые также являются операторами автокода. Развитые автокоды получили название Ассемблеры. Сервисные программы и пр., как правило, составлены на языках типа Ассемблер.

4. Макрос . В таких системах язык, являющийся средством для замены последовательности символов описывающих выполнение требуемых действий ЭВМ на более сжатую форму – называется Макрос (средство замены). В основном, Макрос предназначен для того, чтобы сократить запись исходной программы.

Компонент программного обеспечения, обеспечивающий функционирование макросов, называется макропроцессором. На макропроцессор поступает макросопределяющий и исходный текст. Реакция макропроцессора на вызов – выдача выходного текста. Макрос одинаково может работать, как с программами, так и с данными.

Машинно-независимые системы программирования – это средство описания алгоритмов решения задач и информации, подлежащей обработке. Они удобны в использовании для широкого круга пользователей и не требуют от них знания особенностей организации функционирования ЭВМ. В таких системах программы, составляемые языках, имеющих название высокоуровневых языков программирования, представляют собой последовательности операторов, структурированные согласно правилам рассматривания языка (задачи, сегменты, блоки и т.д.). Операторы языка описывают действия, которые должна выполнять система после трансляции программы на МЯ. Таким образом, командные последовательности (процедуры, подпрограммы), часто используемые в машинных программах, представлены в высокоуровневых языках отдельными операторами.

Программист получил возможность не расписывать в деталях вычислительный процесс на уровне машинных команд, а сосредоточиться на основных особенностях алгоритма.

Среди машинно-независимых систем программирования следует выделить:

1. Процедурно-ориентированные системы . Входные языки программирования в таких системах служат для записи алгоритмов (процедур) обработки информации, характерных для решения задач определенного класса. Эти языки, должны обеспечить программиста средствами, позволяющими коротко и четко формулировать задачу и получать результаты в требуемой форме. Процедурных языков очень много, например: Фортран, Алгол – языки, созданные для решения математических задач; Simula, Слэнг - для моделирования; Лисп, Снобол – для работы со списочными структурами.

2. Проблемно-ориентированные системы в качестве входного языка используют язык программирования с проблемной ориентацией. С расширением областей применения вычислительной техники возникла необходимость формализовать представление постановки и решение новых классов задач.

Необходимо было создать такие языки программирования, которые, используя в данной области обозначения и терминологию, позволили бы описывать требуемые алгоритмы решения для поставленных задач. Эти языки, ориентированные на решение определенных проблем, должны обеспечить программиста средствами, позволяющими коротко и четко формулировать задачу и получать результаты в требуемой форме. Программы, составленные на основе этих языков программирования, записаны в терминах решаемой задачи и реализуются выполнением соответствующих процедур.

3. Диалоговые языки . Появление новых технических возможностей поставило задачу перед системными программистами – создать программные средства, обеспечивающие оперативное взаимодействие человека с ЭВМ их назвали диалоговыми языками. Создавались специальные управляющие языки для обеспечения оперативного воздействия на прохождение задач, которые составлялись на любых раннее неразработанных (не диалоговых) языках.

Разрабатывались также языки, которые кроме целей управления обеспечивали бы описание алгоритмов решения задач. Необходимость обеспечения оперативного взаимодействия с пользователем потребовала сохранения в памяти ЭВМ копии исходной программы даже после получения объектной программы в машинных кодах. При внесении изменений в программу система программирования с помощью специальных таблиц устанавливает взаимосвязь структур исходной и объектной программ. Это позволяет осуществить требуемые редакционные изменения в объектной программе.

4. Непроцедурные языки . Непроцедурные языки составляют группу языков, описывающих организацию данных, обрабатываемых по фиксированным алгоритмам (табличные языки и генераторы отчетов), и языков связи с операционными системами. Позволяя четко описывать как задачу, так и необходимые для её решения действия, таблицы решений дают возможность в наглядной форме определить, какие условия должны выполнятся, прежде чем переходить к какому- либо действию. Одна таблица решений, описывающая некоторую ситуацию, содержит все возможные блок-схемы реализаций алгоритмов решения. Табличные методы легко осваиваются специалистами любых профессий. Программы, составленные на табличном языке, удобно описывают сложные ситуации, возникающие при системном анализе.

В самом общем случае для создания программы на выбранном языке программирования нужно иметь следующие компоненты:

1. Текстовый редактор . Специализированные текстовые редакторы, ориентированные на конкретный язык программирования, необходимы для получения файла с исходным текстом программы, который содержит набор стандартных символов для записи алгоритма.

2. Исходный текст с помощью программы-компилятора переводится в машинный код. Исходный текст программы состоит, как правило, из нескольких модулей (файлов с исходными текстами). Каждый модуль компилируется в отдельный файл с объектным кодом , которые затем требуется объединить в одно целое. Кроме того, системы программирования, как правило, включают в себя библиотеки стандартных подпрограмм . Стандартные подпрограммы имеют единую форму обращения, что создает возможности автоматического включения таких подпрограмм в вызывающую программу и настройки их параметров.

3. Объектный код модулей и подключенные к нему стандартные функции обрабатывает специальная программа – редактор связей . Данная программа объединяет объектные коды с учетом требований операционной системы и формирует на выходе работоспособное приложение – исполнимый код для конкретной платформы. Исполнимый код - это законченная программа, которую можно запустить на любом компьютер, где установлена операционная система, для которой эта программа создавалась.

4. В современных системах программирования имеется еще один компонент – отладчик , который позволяет анализировать работу программы во время ее исполнения. С его помощью можно последовательно выполнять отдельные операторы исходного текста последовательно, наблюдая при этом, как меняются значения различных переменных.

Со временем разработчики компиляторов постарались облегчить труд пользователей, предоставив им все необходимое множество программных модулей в составе одной поставки компилятора. Теперь компиляторы поставлялись уже вкупе со всеми необходимыми сопровождающими техническими средствами. Кроме того, были унифицированы форматы объектных файлов и файлов библиотек подпрограмм. Теперь разработчики, имея компилятор от одного производителя, могли в принципе пользоваться библиотеками и объектными файлами, полученными от другого производителя компиляторов.

Для написания командных файлов компиляции был предложен специальный командный язык язык Makefile. Он позволял в достаточно гибкой и удобной форме описать весь процесс создания программы от порождения исходных текстов до подготовки ее к выполнению. Это было удобное, но достаточно сложное техническое средство, требующее от разработчика высокой степени подготовки и профессиональных знаний, поскольку сам командный язык Makefile был по сложности сравним с простым языком программирования. Язык Makefile стал стандартным средством, единым для компиляторов всех разработчиков.

Такая структура средств разработки существовала достаточно долгое время, а в некоторых случаях она используется и по сей день (особенно при создании системных программ). Ее широкое распространение было связано с тем, что сама по себе вся эта структура средств разработки была очень удобной при пакетном выполнении программ на компьютере, что способствовало ее повсеместному применению в эпоху mainframe.

Следующим шагом в развитии средств разработки стало появление так называемой интегрированной среды разработки. Интегрированная среда объединила в себе возможности текстовых редакторов исходных текстов программ и командный язык компиляции. Пользователь (разработчик исходной программы) теперь не должен был выполнять всю последовательность действий от порождения исходного кода до его выполнения, от него также не требовалось описывать этот процесс с помощью системы команд в Makefile. Теперь ему было достаточно только указать в удобной интерфейсной форме состав необходимых для создания программы исходных модулей и библиотек. Ключи, необходимые компилятору и другим техническим средствам, также задавались в виде интерфейсных форм настройки.

После этого интегрированная среда разработки сама автоматически готовила всю необходимую последовательность команд Makefile, выполняла их, получала результат и сообщала о возникших ошибках при их наличии. Причем сам текст исходных модулей пользователь мог изменить здесь же, не прерывая работу с интегрированной средой, чтобы потом при необходимости просто повторить весь процесс компиляции.

Создание интегрированных сред разработки стало возможным благодаря бурному развитию персональных компьютеров и появлению развитых средств интерфейса пользователя (сначала текстовых, а потом и графических). Их появление на рынке определило дальнейшие развитие такого рода технических средств. Пожалуй, первой удачной средой такого рода можно признать интегрированную среду программирования Turbo Pascal на основе языка Pascal производства фирмы Borland. Ее широкая популярность определила тот факт, что со временем все разработчики компиляторов обратились к созданию интегрированных средств разработки для своих продуктов.

Развитие интегрированных сред несколько снизило требования к профессиональным навыкам разработчиков исходных программ. Теперь в простейшем случае от разработчика требовалось только знание исходного языка (его синтаксиса и семантики). При создании прикладной программы ее разработчик мог в простейшем случае даже не разбираться в архитектуре целевой вычислительной системы.

Дальнейшее развитие средств разработки также тесно связано с повсеместным распространением развитых средств графического интерфейса пользователя. Такой интерфейс стал неотъемлемой составной частью многих современных ОС и так называемых графических оболочек. Со временем он стал стандартом де-факто практически во всех современных прикладных программах.

Это не могло не сказаться на требованиях, предъявляемых к средствам разработки программного обеспечения. В их состав были сначала включены соответствующие библиотеки, обеспечивающие поддержку развитого графического интерфейса пользователя и взаимодействие с функциями API (application program interface, прикладной программный интерфейс операционных систем). А затем для работы с ними потребовались дополнительные средства, обеспечивающие разработку внешнего вида интерфейсных модулей. Такая работа была уже более характерна для дизайнера, чем для программиста.

Для описания графических элементов программ потребовались соответствующие языки. На их основе сложилось понятие ресурсов (resources) прикладных программ .

Ресурсами прикладной программы будем называть множество данных , обеспечивающих внешний вид интерфейса пользователя этой программы, и не связанных напрямую с логикой выполнения программы. Характерными примерами ресурсов являются: тексты сообщений, выдаваемых программой; цветовая гамма элементов интерфейса; надписи на таких элементах, как кнопки и заголовки окон ит.п.

Для формирования структуры ресурсов в свою очередь потребовались редакторы ресурсов, а затем и компиляторы ресурсов, обрабатывающие результат их работы. Ресурсы, полученные с выхода компиляторов ресурсов, стали обрабатываться компоновщиками и загрузчиками.

В последние несколько лет в программировании (особенно для операционной среды Windows) наметился так называемый визуальный подход.

Этот процесс автоматизирован в средах быстрого проектирования. При этом используются готовые визуальные компоненты, свойства и поведение которых настраиваются с помощью специальных редакторов. Таким образом, происходит переход от языков программирования системного уровня к языкам сценариев.

Эти языки создавались для различных целей, что обусловило ряд фундаментальных различий между ним. Системные разрабатывались для построения структур данных и алгоритмов “с нуля”, начиная от таких примитивных элементов, как слово памяти компьютера. В отличие от этого, языки описания сценариев создавались для связывания готовых программ. Их применение подразумевает наличие достаточного ассортимента мощных компонентов, которые требуется только объединить друг с другом. Языки системного уровня используют строгий контроль типов данных, что помогает разработчикам приложении справляться со сложными задачами. Языки описания сценариев не используют понятие типа, что упрощает установление связей между компонентами, а также ускоряет разработку прикладных систем.

Языки описания сценариев основаны на несколько другом наборе компромиссов, чем языки системного уровня. В них скорость исполнения и строгость контроля типов ставятся в шкале приоритетов на более низкое место, но зато выше цениться производительность труда программиста и повторное использование. Это соотношение ценностей оказывается все более обоснованным по мере того, как компьютеры становятся быстродействующими и менее дорогими, чего нельзя сказать о программистах. Языки системного программирования хорошо подходят для создания компонентов, где основная сложность заключена в реализации алгоритмов и структур данных, тогда как языки описания сценариев лучше приспособлены для построения приложении из готовых компонентов, где сложность состоит в налаживании межкомпонентных связей. Задачи последнего рода получают все большее распространение, так что роль языков описания сценариев будет возрастать.

Интерпретаторы и компиляторы.
Трансляция программ и сопутствующие процессы.

Следует заметить, что любой язык программирования может быть как интерпретируемым, так и компилируемым, но в большинстве случаев у каждого языка есть свой предпочтительный способ реализации. Языки Фортран, Паскаль в основном компилируют; язык Ассемблер почти всегда интерпретирует; языки Бейсик и Лисп широко используют оба способа.

Основным преимуществом компиляции является скорость выполнения готовой программы. Интерпретируемая программа неизбежно выполняется медленнее, чем компилируемая, поскольку интерпретатор должен строить соответствующую последовательность команд в момент, когда инструкция предписывает выполнение.

В то же время интерпретируемый язык часто более удобен для программиста, особенно начинающего. Он позволяет проконтролировать результат каждой операции. Особенно хорошо такой язык подходит для диалогового стиля разработки программ, когда отдельные части программы можно написать, проверить и выполнить в ходе создания программы, не отключая интерпретатора.

Транслятор - это программа, которая переводит исходную программу в эквивалентную ей объектную программу. Исходная программа пишется на некотором исходном языке, объектная программа формируется на объектном языке. Выполнение программы самого транслятора происходит во время трансляции.

Если исходный язык является языком высокого уровня, например таким, как ФОРТРАН, C и Паскаль, и если объектный язык - ассемблер или некоторый машинный язык, то транслятор называется компилятором. Машинный язык иногда называют кодом машины, поэтому и объектная программа иногда называется объектным кодом .

Трансляция исходной программы в объектную происходит во время компиляции, а фактическое выполнение объектной программы происходит во время выполнения готовой программы.

Ассемблер - это программа, которая переводит исходную программу, написанную на автокоде или на языке ассемблера, на язык вычислительной машины. Автокод (ассемблер) очень близок к машинному языку; действительно, большинство автокодных инструкций является точным символическим представлением команд машины. Более того, автокодные инструкции обычно имеют фиксированный формат, что позволяет легко их анализировать. В автокоде, как правило, отсутствуют вложенные инструкции, блоки и т. п.

Интерпретатор для некоторого исходного языка принимает исходную программу, написанную на этом языке, как входную информацию и выполняет ее. Различие между компилятором и интерпретатором состоит в том, что интерпретатор не порождает объектную программу, которая затем должна выполняться, а непосредственно выполняет ее сам. Для того чтобы выяснить, как осуществить выполнение инструкций исходной программы, чистый интерпретатор анализирует ее всякий раз, когда она должна быть выполнена. Конечно же, это не эффективно и используется не очень часто.

При программировании интерпретатор обычно разделяют на две фазы . На первой фазе интерпретатор анализирует всю исходную программу, почти также, как это делает компилятор, и транслирует ее в некоторое внутреннее представление. На второй фазе это внутреннее представление исходной программы интерпретируется или выполняется. Внутреннее представление исходной программы разрабатывается для того, чтобы свести к минимуму время, необходимое для расшифровки или анализа каждой инструкции при ее выполнении.

Как указывалось выше, сам компилятор - это не что иное, как программа, написанная на некотором языке, для которой входной информацией служит исходная программа, а результатом является эквивалентная ей объектная программа. Исторически сложилось так, что компиляторы писались на автокоде вручную. Во многих случаях это был единственный доступный язык. Однако, сейчас компиляторы разрабатываются на языках высокого уровня (поскольку при этом уменьшается время, затрачиваемое на программирование и отладку, а также обеспечивается удобочитаемость программы компилятора, когда работа завершена).

Кроме того, теперь мы имеем много языков, разработанных специально для составления компиляторов. Эти так называемые "компиляторы компиляторов " являются некоторым подмножеством в "системах построения трансляторов " (СПТ).

Процесс компиляции, структура компилятора, проходы компилятора.

Процесс компиляции разделяется на несколько этапов:

    Препроцессор. Исходная программа обрабатывается путём подстановки имеющихся макросов и заголовочных файлов.

    Лексический и синтаксический анализ. Программа преобразовывается в цепочку лексем, а затем во внутреннее представление в виде дерева.

    Глобальная оптимизация. Внутреннее представление программы неоднократно преобразовывается с целью сокращения размера и времени исполнения программы.

    Генерация кода. Внутреннее представление преобразовывается в блоки команд процессора, которые преобразовываются в ассемблеровский текст или в объектный код.

    Ассемблирование. Если генерируется ассемблерный текст, производится его ассемблирование с целью получения объектного кода.

    Сборка. Сборщик соединяет несколько объектных файлов в исполняемый файл или библиотеку.

На фазе лексического анализа (ЛА) входная программа, представляющая собой поток символов, разбивается на лексемы - слова в соответствии с определениями языка. Основным формализмом, лежащим в основе реализации лексических анализаторов, являются конечные автоматы и регулярные выражения. Лексический анализатор может работать в двух основных режимах: либо как подпрограмма, вызываемая синтаксическим анализатором за очередной лексемой, либо как полный проход, результатом которого является файл лексем. В процессе выделения лексем ЛА может как самостоятельно строить таблицы имен и констант, так и выдавать значения для каждой лексемы при очередном обращении к нему. В этом случае таблица имен строится в последующих фазах (например, в процессе синтаксического анализа).

На этапе ЛА обнаруживаются некоторые (простейшие) ошибки (недопустимые символы, неправильная запись чисел, идентификаторов и др.).

Основная задача синтаксического анализа - разбор структуры программы. Как правило, под структурой понимается дерево, соответствующее разбору в контекстно-свободной грамматике языка. В настоящее время чаще всего используется либо LL(1)- анализ (и его вариант - рекурсивный спуск), либо LR(1)-анализ и его варианты (LR(0), SLR(1), LALR(1) и другие). Рекурсивный спуск чаще используется при ручном программировании синтаксического анализатора, LR(1) - при использовании систем автоматизации построения синтаксических анализаторов.

Результатом синтаксического анализа является синтаксическое дерево со ссылками на таблицу имен. В процессе синтаксического анализа также обнаруживаются ошибки, связанные со структурой программы.

На этапе контекстного анализа выявляются зависимости между частями программы, которые не могут быть описаны контекстно- свободным синтаксисом. Это в основном связи "описание- использование", в частности анализ типов объектов, анализ областей видимости, соответствие параметров, метки и другие. В процессе контекстного анализа строится таблица символов, которую можно рассматривать как таблицу имен, пополненную информацией об описаниях (свойствах) объектов.

Основным формализмом, использующимся при контекстном анализе, являются атрибутные грамматики. Результатом работы фазы контекстного анализа является атрибутированное дерево программы. Информация об объектах может быть как рассредоточена в самом дереве, так и сосредоточена в отдельных таблицах символов. В процессе контекстного анализа также могут быть обнаружены ошибки, связанные с неправильным использованием объектов.

Затем программа может быть переведена во внутреннее представление . Это делается для целей оптимизации и/или удобства генерации кода. Еще одной целью преобразования программы во внутреннее представление является желание иметь переносимый компилятор . Тогда только последняя фаза (генерация кода) является машинно-зависимой. В качестве внутреннего представления может использоваться префиксная или постфиксная запись, ориентированный граф, тройки, четверки и другие.

Фаз оптимизации может быть несколько. Оптимизации обычно делят на машинно-зависимые и машинно-независимые, локальные и глобальные. Часть машинно-зависимой оптимизации выполняется на фазе генерации кода. Глобальная оптимизация пытается принять во внимание структуру всей программы, локальная - только небольших ее фрагментов. Глобальная оптимизация основывается на глобальном потоковом анализе, который выполняется на графе программы и представляет по существу преобразование этого графа. При этом могут учитываться такие свойства программы, как межпроцедурный анализ, межмодульный анализ, анализ областей жизни переменных и т.д.

Наконец, генерация кода - последняя фаза трансляции. Результатом ее является либо ассемблерный модуль, либо объектный (или загрузочный) модуль. В процессе генерации кода могут выполняться некоторые локальные оптимизации, такие как распределение регистров, выбор длинных или коротких переходов, учет стоимости команд при выборе конкретной последовательности команд. Для генерации кода разработаны различные методы, такие как таблицы решений, сопоставление образцов, включающее динамическое программирование, различные синтаксические методы.

Конечно, те или иные фазы транслятора могут либо отсутствовать совсем, либо объединяться. В простейшем случае однопроходного транслятора нет явной фазы генерации промежуточного представления и оптимизации, остальные фазы объединены в одну, причем нет и явно построенного синтаксического дерева.

Принципы работы сред программирования

Следует отличать язык программирования от его реализации, которая обычно представлена в составе среды программирования (Quick Basic, Virtual Pascal) - набора средств для редактирования исходных текстов, генерации исполняемого кода, отладки, управления проектами и т.д. Каждая среда программирования предоставляет свой интерпретатор или компилятор с этого языка, который зачастую допускает использование конструкций, не фиксированных в стандарте.

Использование среды программирования Турбо Паскаль

Разработка программ на Паскале включает в себя следующие действия (этапы разработки программы): ввод и редактирование текста программы на языке программирования Паскаль, ее трансляцию, отладку.

Для выполнения каждого этапа применяются специальные средства: для ввода и редактирования текста используется редактор текстов , для трансляции программы - компилятор , для построения исполняемого компьютером программного модуля с объединением разрозненных откомпилированных модулей и библиотекой стандартных процедур Паскаля - компоновщик (linker), для отладки программ с анализом ее поведения, поиском ошибок, просмотром и изменением содержимого ячеек памяти компьютера - отладчик (debugger).

Для повышения качества и скорости разработки программ в середине 80-х гг. была создана система программирования Турбо Паскаль. Слово Турбо в названии системы программирования - это отражение торговой марки фирмы-разработчика Borland International, Inc. (США).

Систему программирования Турбо Паскаль называют интегрированной (integration - объединение отдельных элементов в единое целое) средой программирования , так как она объединяет в себе возможности ранее разрозненных средств, используемых при разработке программ: редактора текстов, компилятора, компоновщика, отладчика, и при этом обеспечивает программисту великолепные сервисные возможности. Часто ее кратко называют IDE (Integrated Development Environment - интегрированная среда разработки).

Интегрированная среда программирования Турбо Паскаль версий 6.0 и 7.0 имеет следующие возможности:

    множество накладывающихся окон;

    поддержка мыши, меню, диалоговых окон;

    многофайловый редактор, который может редактировать файлы до 1 Мбайта;

    расширенные возможности отладки;

    полное сохранение и восстановление среды разработки.

Основные файлы пакета Турбо Паскаль

Если допустим, что система программирования Турбо Паскаль установлена на диске D: в каталоге D:\BORLAND\BP, то в каталоге..\ВР находятся следующие основные файлы Турбо Паскаля:

TURBO . EXE - интегрированная среда программирования;

TURBO . HLP - файл, содержащий данные для оперативной подсказки;

TURBO . TP - файл конфигурации системы;

TURBO . TPL - библиотека стандартных модулей Турбо Паскаля.

В каталоге D:\BORLAND\BP\BGI находятся файлы, необходимые для работы в графическом режиме: GRAPH . TPU - модуль с графическими процедурами и функциями Турбо Паскаля, несколько файлов с расширением.BGI - драйверы различных типов видеосистем компьютеров, несколько файлов с расширением.CHR, содержащих векторные шрифты.

Для вызова Турбо Паскаля необходимо отыскать в древовидной структуре каталогов ПК этот каталог и в нем файл TURBO.EXE . Этот файл содержит готовую к работе диалоговую систему программирования Турбо Паскаль.

Окна Турбо Паскаля

Почти все, что вы видите и делаете в среде Турбо Паскаль, происходит в окнах. Окно - это область экрана, которую можно перемещать, изменять в размере, перекрывать, закрывать и открывать.

Интегрированная среда программирования Турбо Паскаль 6.0,7.0 позволяет иметь любое количество открытых окон, но в любой момент времени может быть активным только одно окно. Активное окно - это окно, с которым вы в настоящий момент времени работаете. Любая команда, которую вы выбрали, или текст, который вы набрали, относится только к активному окну. (Если один и тот же файл открыт в нескольких окнах, действие будет применяться к файлу везде).

Справочная система Турбо Паскаль

Интегрированная среда программирования Турбо Паскаль 6.0, 7.0 отличается расширенными возможностями встроенной справочной системы, которая позволяет программисту не только получить контекстно-ориентированную справочную информацию, но и делать вырезки и вставки кода примеров для каждой библиотечной процедуры и функции в текст своей программы, возвратиться назад к другим экранам подсказки (клавиши Alt+Fl), воспользоваться подсказкой по справочной информации (клавиша F1, если вы уже находитесь в системе справочной информации).

Примечание . Название контекстно-ориентированная справочная система Турбо Паскаль получила за возможность получения справочной информации, связанной с текущим состоянием среды программирования, по указанному элементу языка программирования. Например, для получения справочной информации о любом пункте меню интегрированной среды программирования активизируйте этот пункт и нажмите клавишу F1; для получения справки по элементу языка в окне редактирования (оператору, функции и т.п) установите курсор на нужном элементе и нажмите клавиши Ctrl+F1.

Для получения справочной информации (за исключением случаев, когда управление переходит к вашей программе) нужно нажать клавишу F1 или отметить мышью нужный пункт меню Help. Меню Help (клавиша Alt+H) обеспечивает вас таблицей содержания системы справочной информации, подробным оглавлением, способностями поиска (Ctrl+F1). Любой экран справочной информации может содержать одно ключевое слово или несколько ключевых слов (высвеченных элементов), по которым можно получить дополнительную справочную информацию.

Редактор интегрированной среды

Составной частью интегрированной среды разработки программ является редактор Турбо Паскаль, который имеет следующие возможности:

    поддержку мыши;

    поддержку больших файлов (до 1 Мбайта; ограничение в 2 Мбайта для всех комбинаций редактора);

    Shift + клавиши со стрелками - для выбора текста;

    окна редактора, которые можно передвигать, перекрывать и изменять в размере;

    мультифайловые возможности, что позволяет открывать несколько файлов одновременно;

    многочисленные окна, позволяющие иметь несколько представлений одного и того же файла или разных файлов;

    разумный макроязык, позволяющий создавать свои собственные команды редактирования;

    брать текст или примеры из окна справочной информации;

    редактируемый карман, допускающий вырезание, копирование и его передачу между окнами.

Для управления редактором используются клавиши, описанные в справочной системе и строке подсказки.

Средства для трансляции программ и их отладки

Интегрированная система программирования Турбо Паскаль включает в себя средства для трансляции программ и их отладки (компилятор, компоновщик, отладчик). Быстрое управление этими средствами с помощью "горячих клавиш", описанных в справочной системе и пунктах подменю.

Ввод текста программы в окне редактора

Для запуска среды программирования Турбо Паскаль введите команду TURBO и нажмите Enter . После запуска программы на экране раскроется окно редактирования. Введите текст программы. Для удаления неверно введенных символов используйте Backspace и Delete , а для перемещения внутри окна редактора используйте клавиши со стрелками. Для завершения ввода нажимайте Enter в конце каждой строки. Для использования дополнительных возможностей нажатием клавиш Alt+Fl вызывайте локальное меню.

Компиляция программы

Выполните компиляцию программы, для чего нажмите Alt + F 9 . Если вы ввели текст правильно, то на экран будет выведено сообщение об успешности компиляции.

Создание.ехе-файла

В ответ на сообщение "Compile successful " (компиляция успешна) нажмите любую клавишу.

Если вам требуется записать программу как исполняемый файл (с расширением.ехе) на магнитный диск, то выберите в главном меню пункт Compile , в котором выберите опцию Destination (назначение), и если справа от нее стоит слово Memory (память), указывающее, что выполняемый код будет храниться в памяти, нажмите клавишу Enter или щелкните левую кнопку мыши (при этом установка назначения изменится и станет Disk (диск).

Если опция Destination установлена в Disk , что указывает на запись выполняемого кода на магнитный диск в виде файла с расширением.ехе, то перейдите к опции Make этого пункта меню.

После установки назначения для создания.ехе-файла на магнитном диске выберите в меню Compile опцию Make (сборка) или нажмите клавишу F 9 . При этом выполняется создание.ехе-файла на диске.

Исполнение программы

В ответ на сообщение "Compile successful" (компиляция успешна) нажмите любую клавишу. Запустите программу на исполнение клавишами Ctrl + F 9 . После этого раскроется экран пользователя, и на нем появится результат работы программы.

Просмотр выполнения программы на экране пользователя

Чтобы посмотреть результат выполнения программы на экране пользователя, выберите Window / User Screen (или нажмите Alt + F 5 ).

Изучите информацию, выведенную программой на экран пользователя, сопоставьте ее с ожидаемой и оцените правильность выполнения программы. Для возврата в среду Турбо Паскаль снова нажмите клавиши Alt + F 5 .

Сохранение программы на диске

Пока файл текста первой программы имеет имя NONAMEOO, т. е. ему не присвоено конкретного имени. Сохраните текст программы на диске. Имя программного файла должно отражать назначение программы и быть уникальным.

Примечание , Имя программы задается в соответствии с правилами DOS (не более 8 символов латинского регистра).

Запишите программу на диск под нужным именем, для чего клавишами Alt + F Save as ... " (записать под новым именем).

Завершение работы в интегрированной среде программирования

Завершите работу интегрированной среды программирования Турбо Паскаль, для чего клавишами Alt + F перейдите в File-меню, в этом меню выберите пункт "Exit " или нажмите Alt + X .

Открытие файла текста программы

Запустите интегрированную среду программирования Турбо Паскаль и считайте файл с текстом программы, для чего клавишами Alt + F перейдите в File-меню, выберите пункт "Open " (открыть файл) или нажмите клавишу F 3 . На экран компьютера будет выведено окно выбора открываемого файла из списка.

Нажимая клавиши Tab или Shift+Tab для перехода от одного элемента к другому (каждый элемент, когда он становится активным, высвечивается), перейдите к окну списка Files и установите текущим директорий D:\BORLAND\ BPVTUTOR, из которого нужно считать файл текста программы. Установите курсор (подсветите) файл.PAS, после этого нажатием клавиши Tab выберите кнопку [Open ]. Если вы передумали, то выберите кнопку [Cancel ] или нажмите клавишу Esc .

Получение справочной информации по редактору

Для получения справочной информации по операциям редактирования клавишей F 1 вызовите экран подсказки; нажимая клавишу PageDown , перейдите к перечню подсказок о функциях редактирования.

Ошибки, обнаруженные при компиляции

Часто по результатам компиляции на экран компьютера выводится сообщение об ошибке. Это объясняется тем, что язык программирования Паскаль имеет грамматические правила, которые нужно выполнять. Наиболее частыми ошибками начинающих программистов на языке Паскаль бывают:

Unknown identifier (неизвестный идентификатор)

";" expected (ожидается ";")

и другие.

Типы данных

Данные суть факты, идеи, сведения, представленные в знаковой (символьной) форме, позволяющей производить их передачу, обработку и интерпретацию (т.е. толкование, объяснение, раскрытие смысла), а информация - это смысл, который человек приписывает данным на основании известных ему правил представления в них фактов, идей, сообщений. Такое понимание информации соответствует и этимологии обозначающего его слова (от лат. information - разъяснение, изложение).

С дискретностью семантической информации тесно связана и ее структура , которая имеет явно выраженный иерархический характер. В этой структуре также можно различать содержательный и формальный аспекты. При рассмотрении обоих аспектов видно, что чем выше уровень иерархии, тем большую специфику имеет класс информации. В содержательной структуре это связано с ростом кумулятивности информации. Такими классами служат:

  • гипотезы, теории и концепции;

    основы областей знания;

    мировоззрение.

Формальная структура данных семантической информации так же иерархична, как и содержательная. Низшие уровни этой иерархии являются общими для всех данных семантической информации, в которой можно выделить звуки или буквы, слова, фразы, смысловые фрагменты, произведения. На высших уровнях иерархии, при обращении к научным документам и, особенно, к их потокам мы сталкиваемся со спецификой, присущей одной лишь научной информации. Мотивы создания научных документов, пути и способы их распространения и использования находятся в сфере действия особых закономерностей.

Структурированная информация , т.е. связанная причинно-следственными и иными отношениями и образующая систему, составляет знания. Из этих толкований следует, что если данные воспринимаются и интерпретируются человеком, то они становятся для него информацией. Данные в определенной степени подобны письменному сообщению, передающему какие-то сведения грамотному человеку и остающиеся набором непонятных знаков для неграмотного.

Тип данных характеризует область определения значений данных.

Напомним, что к базовым типам относятся:

    целочисленный тип;

    действительный тип;

    логический тип;

    символьный тип;

    строковый тип.

К простым типам относятся:

    порядковый тип;

    перечислимый тип.

К структурированным типам относятся:

    множества;

Простые типы (simple types) включают в себя перечисляемые (ordinal types) и действительные (real types) типы, которые определяют упорядоченные наборы значений. К перечисляемым типам относятся данные, для которых верным является следующее правило: каждое значение кроме первого имеет уникального предшественника, а каждое значение кроме последнего имеет уникального преемника.

Структурированные типы (structured types) данных позволяют определить переменные, которые могут хранить наборы однотипных или разнотипных данных. К структурированным типам можно отнести множества (sets), массивы (array), записи (record), а также файловые (file), классовые (class) и интерфейсные (interface) типы.

В отличие от простых типов, которые определяются линейно, структурированные типы могут иметь сложную структуру, то есть включать в себя другие типы.

Тема 8. Языки программирования высокого уровня

Семестр

Программа – это логически упорядоченная последовательность команд, необходимых для управления компьютером (выполнения им конкретных операций), поэтому программирование сводится к созданию последовательности команд, необходимой для решения определенной задачи.

Процессор компьютера – это большая интегральная микросхема. Все команды и данные он получает в виде электрических сигналов, которые можно представить как совокупность нулей и единиц. Поэтому реально программа, с которой работает процессор, представляет собой последовательность двоичных чисел, называемую машинным кодом . Самому написать программу в машинном коде весьма сложно, причем эта сложность резко возрастает с увеличением размера программы и трудоемкости решения нужной задачи. Поэтому сегодня практически все программы создаются с помощью языков программирования .

Однако с помощью языка программирования создается не готовая программа, а только ее текст (исходный код ), описывающий ранее разработанный алгоритм. Чтобы получить работающую программу, надо этот текст с помощью специальных служебных приложений, называемых трансляторами , либо перевести в машинный код, либо исполнить.

Существуют трансляторы трех видов: компиляторы, интерпретаторы и ассемблеры.

Компиляторы полностью обрабатывают весь исходный код: просматривают его в поисках синтаксических ошибок (иногда несколько раз), выполняют определенный смысловой анализ и затем автоматически переводят (транслируют) на машинный язык – генерируют машинный код.

Интерпретатор берет очередной оператор языка исходного кода программы, анализирует его структуру и затем сразу исполняет оттранслированную команду. Только после того как текущий оператор успешно выполнен, интерпретатор перейдет к следующему причем, если один и тот же оператор должен выполняться в программе многократно, интерпретатор всякий раз будет выполнять его так, как будто встретил впервые. При этом исполняемый файл не создается. Разрабатывать интерпретаторы проще, чем компиляторы, но работает интерпретируемая программа, как правило, медленнее скомпилированной.

Ассемблеры предназначены для перевода программы, написанной на языке ассемблера, в машинный код.

Языки программирования – искусственные языки. От естественных они отличаются ограниченным числом «слов» и очень строгими правилами записи команд (операторов). Совокупность подобных требований образует синтаксис языка программирования, а смысл каждой команды и других конструкций языка – его семантику. Нарушение формы записи программы приводит к тому, что транслятор не может понять назначение оператора и выдает сообщение о синтаксической ошибке . Правильно написанное, но не отвечающее алгоритму использование команд языка, приводит к семантическим ошибкам , называемым еще логическими ошибками или ошибками времени выполнения.



Процесс поиска ошибок в программе называется тестированием, процесс устранения ошибок – отладкой.

Классификация языков программирования, их эволюция

Разные типы процессоров имеют разные наборы команд. Если язык программирования ориентирован на конкретный тип процессора и учитывает его особенности, т.е. является машинно-зависимым, он называется языком программирования низкого уровня. В данном случае «низкий уровень» не значит «плохой». Имеется в виду, что операторы языка близки к машинному коду и ориентированы на конкретные команды процессора.

Языками низкого уровня являются все языки ассемблеров, которые представляет каждую команду машинного кода, не в виде чисел, а с помощью условных символьных обозначений, называемых мнемониками. Однозначное преобразование одной машинной инструкции в одну команду ассемблера называется транслитерацией. Так как наборы инструкций для каждой модели процессора отличаются, конкретной компьютерной архитектуре соответствует свой язык ассемблера, и написанная на нем программа может быть использована только в этой среде.

С помощью языков низкого уровня создаются очень эффективные и компактные программы, так как разработчик получает доступ ко всем возможностям процессора, но при этом:

Требуется очень хорошо понимать устройство компьютера,

Затрудняется отладка больших приложений,

Результирующая программа не может быть перенесена на компьютер с другим типом процессора.

Подобные языки обычно применяют для написания небольших системных приложений, драйверов устройств, модулей стыковки с нестандартным оборудованием, когда важнейшими требованиями становятся компактность, быстродействие и возможность прямого доступа к аппаратным ресурсам.

Языки программирования высокого уровня значительно ближе и понятнее человеку, нежели компьютеру. Особенности конкретных компьютерных архитектур в них не учитываются, поэтому создаваемые программы на уровне исходных текстов легко переносимы на другие платформы, для которых создан транслятор этого языка. Разрабатывать программы на языках высокого уровня с помощью понятных и мощных команд значительно проще, а ошибок при создании программ допускается гораздо меньше.

Языки и системы программирования

Понятие о машинном языке

Машинный язык - система команд, непосредственно понимаемых аппаратурой данной электронно-вычислительной системы. Как следствие этого, машинный язык однозначно определяется системой команд процессора и архитектурой компьютера.

Набор команд процессора содержит:

· арифметико-логические команды - команды арифметических действий над двоичными числами и логических действий над двоичными векторами;

· команды управления - команды перехода, ветвлений, повторений, и некоторые другие команды;

· команды пересылки данных - команды, с помощью которых обмениваются данными ОЗУ и ЦП;

· команды ввода-вывода данных - команды, с помощью которых обмениваются данными ЦП и внешние устройства.

Каждая команда содержит код операции, ею выполняемой и информацию об адресах данных, над которыми эта операция выполняется. Кроме этого, команда (непосредственно - команды управления и косвенно - другие команды) содержит информацию об адресе команды, которая будет выполняться следующей. Таким образом, любая последовательность команд, размещенная в ОЗУ, фактически представляет из себя алгоритм, записанный в системе команд процессора - машинную программу.

Наиболее распространенной сейчас является архитектура ЭВМ с общей шиной. Общая шина - это центральная информационная магистраль, связывающая внешние устройства с центральным процессором. Она состоит из шины данных, шины адреса и шины управления. Шина данных предназначена для обмена данными между ОЗУ и внешними устройствами. По шине адреса передаются адреса данных. Эта шина однонаправлена. Шина управления служит каналом обмена управляющими сигналами между внешними устройствами и центральным процессором.

Таким образом, машинный язык (язык процессора) - это набор команд, каждая из которых описывает некоторое элементарное действие по преобразованию информации, представленной в двоичном коде. Универсальное использование двоичного кода представления информации самых разнообразных форм приводит к тому, что программа решения даже достаточно простой задачи содержит сотни машинных команд. Написать такую программу, используя машинные команды, весьма непросто даже квалифицированному программисту. Реальные программы состоят из десятков и сотен тысяч машинных команд. Поэтому любая технология проектирования программы должна опираться на приемы, характерные для человеческого мышления, оперировать привычными для человека понятиями из той предметной области, которой принадлежит задача.

Иными словами, программист (проектировщик алгоритмов) должен иметь возможность сформулировать свой алгоритм на языке привычных понятий; затем специальная программа должна выразить эти понятия с помощью машинных средств, осуществляя перевод (трансляцию) текста алгоритма на язык машины.

Эта необходимость и привела к появлению языков программирования высокого уровня как языков записи алгоритмов, предназначенных для исполнения на ЭВМ.

Машинно-ориентированные языки

Предшественниками языков высокого уровня стали так называемые машинно-ориентированные языки или языки автокодов. Одним из самых ярких представителей машинно-ориентированных языков является Ассемблер. Ассемблер очень близок к машинному языку, большинство его инструкций является точным символическим представлением машинных команд. Преимущество состоит в том, что уже нет необходимости помнить числовые коды команд процессора, достаточно знать их символическое представление. Кроме этого, впервые в машинно-ориентированных языках появляется понятие переменной, как именованной области памяти для хранения данных, а вместе с ним и понятие типа данных. В программах на машинно-ориентированном языке появляется возможность использовать как числовую так и текстовую информацию в привычной для человека форме.

Несмотря на явные преимущества машинно-ориентированных языков перед сугубо машинным языком, написание программ на этих языках по прежнему сопряжено со значительными трудностями. Программы получаются очень громоздки и трудно читаемы.

Языки программирования высокого уровня

Языки программирования высокого уровня играют роль средства связи между программистом и машиной, а также между программистами. Это обстоятельство накладывает на язык многие обязательства:

Язык должен быть близок к тем фрагментам естественных языков, которые обеспечивают конкретную предметную область деятельности человека; (Язык, ориентированный на деловые сферы применений, должен содержать понятия, используемые в этом виде деятельности: документ, счет, база данных и т.п.).

Все средства языка должны быть формализованы в такой степени, чтобы их можно было реализовать как машинные программы.

Язык программирования - нечто большее, чем средство описания алгоритмов: он несет в себе систему понятий, на основе которых человек может обдумывать свои задачи, и нотацию, с помощью которой он может выразить свои соображения по поводу решения задачи.

Модели трансляции программ. Трансляторы

Вообще ЭВМ не рассчитана на то, чтобы понимать языки программирования высокого уровня. Аппаратура распознает и исполняет только машинный язык, программа на котором представляет из себя не более чем последовательность двоичных чисел.

Появление языков программирования было связано с осознанием того факта, что перевод алгоритма, написанного на “почти” естественном (алгоритмическом) языке, на машинный язык может быть автоматизирован и, следовательно, возложен на плечи машины. Здесь важно различать язык и его реализацию. Сам язык - это система записи, регламентируемая набором правил, определяющих его лексику и синтаксис. Реализация языка - это программа, которая преобразует эту запись в последовательность машинных команд в соответствии с семантическими правилами, определенными в языке.

Имеются два основных способа реализации языка: компиляторы и интерпретаторы. Компиляторы транслируют весь текст программы, написанной на языке программирования, в машинный код в ходе одного непрерывного процесса. При этом создается полная программа в машинных кодах, которую затем можно исполнять без участия компилятора.

Интерпретатор в каждый момент времени распознает и выполняет по одному предложению (оператору) программы, по ходу дела превращая обрабатываемое предложение в машинную программу. Разница между компилятором и интерпретатором подобна разнице между синхронным переводом устной речи и письменным переводом текста.

В принципе любой язык может быть и компилируем, и интерпретируем, однако в большинстве случаев у каждого языка есть свой, предпочтительный способ реализации. По видимому, такое предпочтение - нечто большее, чем дань традиции. Выбор определен самим языком. Fortran, Pascal, Modula-2 в основном компилируют. Такие языки как Logo, Fort почти всегда интерпретируют. BASIC и Lisp широко используется в обеих формах.

По типу выходных данных различают два основных вида компиляторов:

· компилирующие окончательный выполнимый код;

· компилирующие интерпретируемый код, для выполнения которого требуется дополнительное программное обеспечение.

Окончательным выполнимым кодом являются приложения, реализованные как EXE-файлы, DLL-библиотеки, COM-компоненты. К интерпретируемому коду можно отнести байт-код JAVA-программ, выполняемый посредством виртуальной машины JVM.

Объектный код, создаваемый компилятором, представляет собой область данных и область машинных команд, имеющих адреса, которые в дальнейшем "согласуются" редактором связи (иногда называемым загрузчиком). Редактор связи размещает в едином адресном пространстве все по отдельности откомпилированные объектные модули и статически подключаемые библиотеки.

В дельнейшем будем называть выполнимой формой программы код, получаемый в результате компиляции исходной программы.

Процесс трансляции (компиляции)

Программу, написанную на языке программирования высокого уровня, называют исходной программой, а каждую самостоятельную программную единицу, образующую данную программу, - программным модулем. Для преобразования исходной программы в ее выполняемую форму (выполнимый файл) транслятор выполняет некоторую последовательность действий. Эта последовательность зависит как от языка программирования, так и от конкретной реализации самого транслятора. В ходе трансляции важно не просто откомпилировать программу, а получить при этом достаточно эффективный код.

В процессе трансляции выполняется анализ исходной программы, а затем синтез выполнимой формы данной программы. В зависимости от числа просмотров исходной программы, выполняемых компилятором, трансляторы разделяются на однопроходные, двухпроходные и трансляторы, использующие более двух проходов.

К достоинствам однопроходного компилятора можно отнести высокую скорость компиляции, а к недостаткам - получение, как правило, не самого эффективного кода.

Широкое распространение получили двухпроходные компиляторы. Они позволяют при первом проходе выполнить анализ программы и построить информационные таблицы, используемые при втором проходе для формирования объектного кода.

На рисунке представлены основные этапы, выполняемые в процессе трансляции исходной программы.

Фаза анализа программы состоит из:

· лексического анализа;

· синтаксического анализа;

· семантического анализа.

При анализе исходной программы транслятор последовательно просматривает текст программы, представимой как набор символов, выполняя разбор структуры программы.

На этапе лексического анализа выполняется выделение основных составляющих программы – лексем. Лексемами являются ключевые слова, идентификаторы, символы операций, комментарии, пробелы и разделители. Лексический анализатор не только выделяет лексемы, но и определяет тип каждой лексемы. При этом на этапе лексического анализа составляется таблица символов, в которой каждому идентификатору сопоставлен свой адрес. Это позволяет при дальнейшем анализе вместо конкретного значения (строки символов) использовать его адрес в таблице символов.

Процесс выделения лексем достаточно трудоемок и требует применения сложных контекстно-зависимых алгоритмов.

На этапе синтаксического анализа выполняется разбор полученных лексем с целью получения семантически понятных синтаксических единиц, которые затем обрабатываются семантическим анализатором. Так, синтаксическими единицами выступают выражения, объявление, оператор языка программирования, вызов функции.

На этапе семантического анализа выполняется обработка синтаксических единиц и создание промежуточного кода. В зависимости от наличия или отсутствия фазы оптимизации результатом семантического анализа может быть оптимизируемый далее промежуточный код или готовый объектный модуль.

К наиболее общим задачам, решаемым семантическим анализатором, относятся:

· обнаружение ошибок времени компиляции;

· заполнение таблицы символов, созданной на этапе лексического анализа, конкретными значениями, определяющими дополнительную информацию о каждом элементе таблицы;

· замена макросов их определениями;

· выполнение директив времени компиляции.

Макросом называется некоторый предварительно определенный код, который на этапе компиляции вставляется в программу во всех местах указания вызова данного макроса.

На фазе синтеза программы производится:

· генерация кода;

· редактирование связей.

Процесс генерации кода состоит из преобразования промежуточного кода (или оптимизированного кода) в объектный код. При этом в зависимости от языка программирования получаемый объектный код может быть представлен в выполнимой форме или как объектный модуль, подлежащий дальнейшей обработке редактором связей.

Так, процесс генерации кода является неотъемлемой частью фазы синтеза программы, а необходимость выполнения редактора связей зависит от конкретного языка программирования. Следует учесть, что на практике термин «генерация кода» часто применяют ко всем действиям фазы синтеза программы, ведущим к получению выполнимой формы программы.

Редактор связей приводит в соответствие адреса фрагментов кода, расположенных в отдельных объектных модулях: определяются адреса вызываемых внешних функций, адреса внешних переменных, адреса функций и методов каждого модуля. Для редактирования адресов редактор связей использует специальные, создаваемые на этапе трансляции, таблицы загрузчика. После обработки объектных модулей редактором связей генерируется выполнимая форма программы.

Язык программирования – формальный язык, предназначенный для связи человека с вычисли­тельной машиной. На языке программирования задаются информация и алгоритм обработки данных. Электронная вычислительная машина (ЭВМ) непосредственно воспринимает программу, представленную на машинном языке, программирование на котором весьма неудобно для человека.

Развитие вычислительной техники обусловило появление языков программирования. Назначение такого языка – в оснащении набора вычислительных формул дополнительной информацией, которая превращает этот набор в алгоритм. В дальнейшем под языком программирования понимается язык для составления программ, т.е. язык, на котором записывается алгоритм для решения задачи на ЭВМ.

Программирование для ЭВМ первого поколения велось исключительно на машинном языке. Машинный язык представляет собой свод правил кодирования в числовом виде определенных действий (в большинстве арифметических). Для всех машин понятна только двоичная система счисления, которая, однако, для сокращения записи программистами заменялась восьмеричной.

Под системой счисления обычно понимается совокупность приемов наименования и обозначения чисел. Обычная система записи чисел представляет собой позиционную десятичную систему счисления в соответствии с тем, что от позиции, занимаемой любой из используемых в этой системе цифр, зависит ее числовое значение. Двоичная система счисления является простейшей, так как в ней используются только две цифры: 0 и 1, а восьмеричная система счисления удобна тем, что основание ее, а именно числовое значение 8, является степенью основания двоичной системы счисления 2. Например, десятичное число 65 можно представить

· в десятичной системе счисления:

6 × 101 + 5 × 100 = 65;

· в восьмеричной системе как

1 × 82 + 0 × 81 + 1 × 80 = 101;

· и в двоичной системе счисления в виде

1 × 26 + 0 × 25 + 0 × 24 + 0 × 23 + 0 × 22 + 0 × 2l + 1 × 20 = 100 001.

Каждое действие, которое должно быть выполнено ЭВМ, на машинном языке задается в виде команды. Команда – это информация, представленная в форме, позволяющей ввести ее в машину, и определяющая действия ЭВМ в течение некоторого отрезка времени. Таким образом, каждая команда определяет, вообще говоря, некоторую элементарную часть процесса обработки инфор­мации, называемую машинной операцией. Исходная информация для обработки поставляется, как правило, набором конкретных значений, называемых обычно данными. Исходные данные для выполнения любого действия, в том числе и машинной операции, будем называть операндами.

В команде в общем случае должны быть указаны вид действия, место хранения в машине (адрес) исходной информации, над которой производится машинная операция, адрес результата, а также следующая команда, которая должна быть выполнена после данной. Для арифметических действий (или операций) исходная информация задается, как правило, в виде двух чисел, следовательно, в команде для нее должны быть указаны два адреса. Таким образом, команда должна содержать код операции, задающий вид выполняемой машинной операции, и четыре адреса: два адреса операндов, адрес результата и адрес следующей команды. Как правило, необходимое число адресов в команде меньше четырех.

В ЭВМ с трехадресными командами не указывается адрес следующей команды, а автоматически выполняется команда из следующей ячейки памяти (с номером, на единицу большим, который и является адресом следующей команды). Например, если принять для операции сложения код 01, то для сложения двух чисел из ячеек с номерами 2051 и 2052 с результатом, помещаемым в ячейку с номером 2345, в трехадресной машине команда будет выглядеть так:

01 2051 2052 2345 26

Первым усовершенствованием процесса программирования явилось введение символических адресов, позволившее составление команд и распределение памяти выполнять раздельно. Сущность этого приема заключается в разбиении оперативной памяти машины на массивы, число ячеек в которых заранее не известно, а номера ячеек массива задаются буквенно-числовыми обозначе­ниями типа ai + 1, ai + 2, . . ., называемыми символическими адресами. Распределение памяти осуществляется приписыванием всем ai числовых значений уже после составления программы. Последний процесс является чисто механическим и может быть автоматизирован, т.е. присвоение истинных адресов может быть поручено самой вычислительной машине.

Такое усовершенствование процесса программирования вскоре привело к созданию языков символического программирования, или автокодов. Такой язык отличается от машинного языка лишь тем, что вместо числовых значений, выражающих код операции команды и ее адреса, используются символические (буквенные) обозначения. Поэтому в первых автокодах существовало взаимно однозначное соответствие между операциями, записанными на языке символического программирования (или кодирования), и командами в машинном языке, на что указывал символ 1: 1, который записывался после наименования языка. Например, АВТОКОД 1:1 – АВТОматическое Кодирование один к одному.

Дальнейшее совершенствование автокодов выражалось в появлении дополнительных средств, устанавливающих по обычным правилам порядок действий в арифметических формулах или обеспечивающих в необходимых условиях разветвление вычислительного процесса, циклическое повторение участков программы и другие операции, вытекающие из условия задачи. Так, постепенно автокоды утратили приставку 1: 1, а их входные языки стали не чисто машинными, а машинно-ориентированными. Машинная ориентированность означает, что в основе этих языков продолжала лежать система команд какой-либо конкретной вычислительной машины. Первые машинно-ориентированные языки в целом были несовершенны. У одних языков описание после­довательности вычислений было оторвано от самих формул, другие имели сложную символику, мало наглядную или слишком специализированную, третьи были приспособлены лишь для решения ограниченного круга задач. Основной же недостаток заключался в привязанности языка к данной машине.

С появлением машин второго поколения возникла потребность создания языков, целиком ориентированных на особенности задач и не зависящих от конкретной машины. Это требование усугублялось еще и тем, что ЭВМ разных марок быстро сменяли одна другую или использовались совместно. Символом второго поколения ЭВМ стали проблемно-ориентированные языки програм­мирования. Их развитие все в большей степени определялось спецификой задач, а не особенностями машин. На первый план выступило то общее, что было в различных задачах, а это сближало разные языки, созданные в эпоху господства вычислительных задач. Эти языки принято называть формальными алгоритмическими или просто алгоритмическими языками.

От формального алгоритмического языка требуется многое. Во-первых, он должен быть наглядным, что может быть достигнуто использованием существующей математической символики и других легко понимаемых изобразительных средств. Во-вторых, гибким, чтобы любой алгоритм мог быть описан без излишнего усложнения, связанного с недостаточностью изобразительных средств. В-третьих, от языка требуется однозначность – запись любого алгоритма, выполненная с соблюдением всех правил языка, не должна допускать различных толкований. В-четвертых, многоступенчатость – сложный алгоритм может быть описан в виде сочетания более простых алгоритмов. И, наконец, язык должен быть единым – с одной стороны, число изобразительных средств не должно быть слишком большим, и, с другой стороны, необходимо чтобы одни и те же средства можно было применять для выражения одних и тех же или родственных понятий в разных (по их назначению) частях алгоритма. Такой язык служит:

· средством мышления – логическое несовершенство предполагаемого метода решения задачи часто выявляется в процессе записи этого метода средствами алгоритмического языка;

· средством общения между людьми – описание процесса, выполненное одним человеком, должно быть доступно другим;

· посредником между человеком и машиной – при этом перевод с алгоритмического языка на язык машины выполняется самой машиной с помощью специальной программы – транслятора.

Одним из первых и наиболее удачных языков такого рода стал Фортран, разработанный фирмой IBM. В 1954 г. группа американских специалистов в области программирования опубли­ковала первое сообщение о языке Фортран. Название языка происходит от словосочетания FORmulae TRANslation – преобразование формул. Язык Фортран не только просуществовал до наших дней, но и уверенно удерживает первое место в мире по распространенности. Среди причин такого долголетия можно отметить простую структуру как самого Фортрана, так и предназначенных для него трансляторов. Программа на Фортране записывается в виде последовательности предло­жений, или операторов (под оператором понимается описание некоторого преобразования информации), и оформляется по определенным правилам. Эти правила накладывают ограничения, в частности, на форму записи и расположения частей оператора в строке бланка для записи операторов. Программа, записанная на Фортране, представляет собой один или несколько сегментов (подпрограмм) из операторов. Сегмент, управляющий работой всей программы в целом, называется основной программой.

Фортран был задуман для использования в сфере научных и инженерно-технических вычислений. Однако на этом языке легко описываются задачи с разветвленной логикой (моделирование произ­водственных процессов, решение игровых ситуаций и т.д.), некоторые экономические задачи и особенно задачи редактирования (составление таблиц, сводок, ведомостей и т.д.).

Модификация языка Фортран, появившаяся в 1958 г., получила название Фортран II и содержала понятия подпрограммы и общих переменных для обеспечения связи между сегментами.

К 1962 г. относится появление языка, известного под названием Фортран IV и ставшего наиболее употребительным в настоящее время. К этому же времени относится и начало деятельно­сти комиссии при Американской Ассоциации Стандартов (ASA), которая выработала (к 1966 г.) два стандарта – языки Фортран и базисный (основной) Фортран (Basic FORTRAN). Эти языки приблизительно соответствуют модификациям IV и II, однако базисный Фортран является подмножеством Фортрана, в то время как Фортран II таковым для Фортрана IV не является.

Язык Фортран до сих пор продолжает развиваться и совершенствоваться, оказывая влияние на создание и развитие других языков. Например, Фортран заложен в основу диалогового языка Бейсик и его расширения Бейсик-плюс, широко распространенных языков во всех системах с режимом разделения времени, языков для обучения навыкам использования алгоритмических языков в практике программирования. Эти языки реализованы в частности на персональных компьютерах. В настоящее время создан новый стандарт – Фортран 77.

Вскоре после создания Фортрана (1957 г.) появился язык Алгол (ALGOritmic Language – алгоритмический язык), созданный на основе широкого международного сотрудничества. В 1960 г. было опубликовано официальное сообщение об алгоритмическом языке, названном Алгол-60, где число 60 означает год утверждения языка.

Алгол-60 создавался после разработки и практического применения Фортрана, поэтому харак­теризуется как введением новых конструкций, так и обобщением понятий, имеющихся в Фортране. Например, если в Фортране операторы с функциональной точки зрения подразделяются на исполняемые и неисполняемые, то в Алголе такого деления нет, а роль неисполняемых операторов Фортрана выполняют конструкции, называемые описаниями.

Имеются и другие отличия. Однако общим для Фортрана и Алгола является то обстоятельство, что в основе обоих языков лежит понятие выражения, практически совпадающее с понятием математического выражения, использующего лишь алгебраические операции и элементарные функции. Простейшие объекты, из которых составляются выражения, – это целые и приближенные вещественные числа и логические значения.

Алгол повсеместно признан как весьма удобное средство для публикации алгоритмов и для обучения основам программирования.

И Фортран, и Алгол-60 до недавнего времени по праву заслуживали название универсальных языков, так как обеспечивали программирование основной массы научно-технических задач (преимущественно вычислительных). Но ни один из этих языков, конечно, не позволял описать все без исключения возникающие задачи. Поэтому примерно в то же время появились алгоритмические языки с другой ориентацией, отвечающие нуждам тех новых направлений науки и техники, которые стали интенсивно развиваться в последующие годы.

Примером могут служить экономические задачи – задачи учета материальных ценностей, выпущенной продукции, личного состава, финансов и т.д. предприятия или отрасли. Для таких задач основными действиями являются операции ввода и вывода при относительно небольшом количестве несложных вычислений, а также последовательная обработка массивов данных. Описание действий такого рода может быть осуществлено на языке Кобол (COmmon Business Oriented Language), предложенном фирмой IBM в 1959 г.

Задачи обработки символьной информации возникают преимущественно в области научных исследований. Это, например, преобразование формул, решение уравнений (не численное, а в ана­литическом виде), анализ и синтез текстов на искусственном или естественном языке (в частности, автоматическое программирование и машинный перевод) и т.п.

Из языков для обработки символьной информации очень популярным, главным образом среди представителей физико-математических наук, является язык Лисп, созданный группой исследователей в 1960 г. в Массачусетсском технологическом институте. В этом языке вся находя­щаяся в обработке информация, в том числе и сама программа, организуется в так называемые списки – последовательности элементов. Элемент может быть первичным (буквенным обозначением или числом) или в свою очередь списком. Так могут возникать сколь угодно сложные структуры.

Другой язык – Снобол – применяется в основном для машинного анализа текстов, написанных на естественных языках. В нем основным понятием является строка – произвольная последова­тельность букв, цифр и других знаков. Главная операция – это поиск в строке части строки, построенной по заданному образу, и замена этой части другой строкой. Как образ, так и заменяющие его строки составляются из отдельных элементов простого вида. Исход поиска определяет последовательность дальнейших действий. Язык Снобол очень прост для изучения.

Основное достоинство проблемно-ориентированных, машинно-независимых алгоритмических языков в том, что они были построены с максимальным учетом представлений человека если не о существе, то о форме решаемой задачи, с максимальным приближением к той форме, в которой человек привык описывать эти задачи, и с учетом тех логических связей, которые он научился выделять в исследуемых явлениях.

Для Алгола, например, характерно приближение к привычной математической символике. Фортран же, в отличие от Алгола, ближе к машинному языку, чем к языку человека. Для Лиспа характерно использование аппарата так называемых рекурсивных описаний, широко применяемого в математической логике, в исследованиях по основаниям математики и т.п.

Обилие алгоритмических языков, появившихся в период второго поколения ЭВМ, с одной стороны, во многом объясняется модой, с другой стороны – невозможностью ни одним из предло­женных языков удобно описывать все возникавшие задачи. Третье поколение ЭВМ поставило на повестку дня выработку нового подхода к созданию действительно универсального алгоритмического языка.

Одной из попыток такого рода является создание фирмой IBM алгоритмического языка ПЛ/1 (Programming Language/1 – язык программирования один). Он основан на языках Фортран и Кобол, ряд изобразительных средств и понятий взят из Алгола и других языков, в частности языков для обработки символьной информации. Затем последовательно было опубликовано несколько версий языка, которые сильно отличались друг от друга, но постепенно язык стабили­зировался, и теперь новые публикации отличаются от предыдущих лишь редакционными поправками, устранением неточностей или усовершенствованием отдельных элементов.

Основными элементами программы, написанной на языке ПЛ/1, являются операторы, с помощью которых описываются как данные, так и операции их обработки. По аналогии с Фортраном исходная программа представляет собой совокупность основной программы и подпрограмм, имеющих форму блока. Понятие блока в ПЛ/l базируется на концепциях блока в языке Алгол-60. Таким образом, этот язык построен в целом на базе понятий существующих алгоритмических языков и в их традициях.

Другая попытка связана с дальнейшим развитием Алгола. В 1968 г. опубликован документ с изложением основ нового универсального алгоритмического языка, получившего название Алгол-68. В этом языке число основных понятий сведено к разумному минимуму с целью добиться высокой изобразительной силы языка, обеспечив свободу сочетания и взаимодействия этих понятий между собой.

Язык Алгол-68 традиционен, поскольку проявляется стремление обеспечить всех пользователей готовыми средствами для описания их алгоритмов. До сих пор этот подход не мог предотвратить появления все новых специализированных языков. Так, в 1971 г. был опубликован алгоритмический язык Паскаль, названный в честь великого французского ученого XVII века, сумевшего первым в мире изобрести автоматическое устройство, позволяющее складывать числа. Язык Паскаль является преемником Алгола-60, он имеет конструкции, аналогичные существующим в ПЛ/l и Алголе-68, однако Паскаль более лаконичен. Язык Паскаль почти так же прост, как и Бейсик, однако Паскаль способствует внедрению современной технологии программирования, основанной на постепенном построении программы, состоящей из небольших четко определенных процедур, т.е. последовательно проводятся в жизнь идеи структурного программирования. Другой существенной особенностью Паскаля является концепция структуры данных как одного из фундаментальных понятий, лежащих, наряду с понятием алгоритма, в основе программирования.

На основе языка Паскаль в конце 70-х годов был создан язык Ада, имеющий очень широкую сферу применения. Язык назван так по имени первой женщины-программиста Ады Лавлайс. Алгоритмический язык Ада претерпел определенные изменения в процессе эволюции и теперь имеет все отличительные признаки языка-стандарта. Это существенно структурированный язык, особенно он подходит для разработки систем реального времени. Однако язык Ада слишком громоздкий, многословный и не предоставляет программисту достаточной свободы.

В отличие от перечисленных языков высокого уровня, появившихся в начале 80-х годов, язык программирования Си является языком сравнительно низкого уровня. Но это не значит, что этот язык недостаточно мощный. Язык Си – универсальный язык, тесно связанный с популярной операционной системой UNIX (на языке Си написаны и система UNIX и ее программное обеспечение). Алгоритмический язык Си достаточно полно отражает возможности современных компьютеров, позволяя писать весьма эффективные программы, не прибегая к языкам Ассемблера, главным образом за счет простых, последовательных конструкций потоков управления. Предлагаются проверки, циклы, группирование и подпрограммы, но не мультипрограммирование, параллельные операции, синхронизация и сопрограммы – непременные атрибуты мощных языков (Ада, ПЛ/1, Алгол-68).

В последнее время проявляется тенденция к созданию так называемых расширяемых универ­сальных языков. Основная идея такого направления – не избегать специализированных языков-диалектов, а создать общую основу «программистских диалектов».

Расширяемый язык должен располагать средствами для грамматического разбора текстов любого из расширений, чтобы выяснить, какие тексты являются грамматически правильными для данного диалекта и какой структурой они обладают. Такой язык должен дать будущим его потребителям целый ряд важных возможностей: например, строить семантические модели (т.е. вводить новые термины в описывать выражаемые ими понятия, их взаимосвязь с некоторыми основными, исходными понятиями и с понятиями, введенными ранее), описывать реализацию расширений – способы их наиболее целесообразного представления с помощью средств, которыми располагают современные ЭВМ. Можно отметить и другие характерные черты расширяемых языков.

Система программирования (СП) - совокупность программных средств, облегчающих написание, отладку диалоговой программы и автоматизирующих её многоэтапное преобразование в исполняемую программу и загрузку в память для выполнения. Ныне СП трансформировались в интегрированные среды разработки программ (Integrated Development Environment , IDE), позволяющие визуально разрабатывать пользовательский интерфейс и организовывать связь с базами данных.

Создание сложного программного средства осуществляется в среде программной инженерии. Согласно ГОСТ Р ИСО/МЭК 14764-2002 она представляет собой «набор автоматических инструментальных средств, программно-аппаратных и технических средств, необходимых для выполнения объёма работ по программной инженерии». К автоматизированным инструментальным средствам относятся, в частности, компиляторы, компоновщики загрузочных операционных систем, отладчики, средства моделирования , средства документирования и системы управления базами данных.

Система программирования освобождает проблемного пользователя или прикладного программиста от необходимости написания программ решения своих задач на неудобном для него языке машинных команд и предоставляют им возможность использовать специальные языки более высокого уровня. Для каждого из таких языков, называемых входными или исходными, система программирования имеет программу, осуществляющую автоматический перевод (трансляцию) текстов программы с входного языка на язык машины. Обычно система программирования содержит описания применяемых языков программирования, программы- трансляторы с этих языков, а также развитую библиотеку стандартных подпрограмм. Важно различать язык программирования и реализацию языка.

Язык – это набор правил, определяющих систему записей, составляющих программу, синтаксис и семантику используемых грамматических конструкций.

Реализация языка – это системная программа, которая переводит (преобразует) записи на языке высокого уровня в последовательность машинных команд.

По набору входных языков различают системы программирования одно- и многоязыковые. Отличительная черта многоязыковых систем состоит в том, что отдельные части программы можно составлять на разных языках и помощью специальных обрабатывающих программ объединять их в готовую для исполнения на ЭВМ программу.

Для построения языков программирования используется совокупность общепринятых символов и правил, позволяющих описывать алгоритмы решаемых задач и однозначно истолковывать смысл созданного написания. Основной тенденцией в развитии языков программирования является повышение их семантического уровня с целью облегчения процесса разработки программ и увеличения производительности труда их составителей.

По структуре , уровню формализации входного языка и целевому назначению различают системы программирования машинно-ориентированные и машинно-независимые .

Машинно-ориентированные системы программирования имеют входной язык, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.). Машинно- ориентированные системы позволяют использовать все возможности и особенности машинно-зависимых языков:


  • высокое качество создаваемых программ;

  • возможность использования конкретных аппаратных ресурсов;

  • предсказуемость объектного кода и заказов памяти;

  • для составления эффективных программ необходимо знать систему команд и особенности функционирования данной ЭВМ;

  • трудоемкость процесса составления программ (особенно на машинных языках и ЯСК), плохо защищенного от появления ошибок;

  • низкая скорость программирования;

  • невозможность непосредственного использования программ, составленных на этих языках, на ЭВМ других типов.
Машинно-ориентированные системы по степени автоматического программирования подразделяются на классы:

1. Машинный язык . В таких системах программирования отдельный компьютер имеет свой определенный Машинный Язык (далее МЯ), ему предписывают выполнение указываемых операций над определяемыми ими операндами, поэтому МЯ является командным. Однако, некоторые семейства ЭВМ (например, ЕС ЭВМ, IBM/370/ и др.) имеют единый МЯ для ЭВМ разной мощности.

В команде любого из них сообщается информация о местонахождении операндов и типе выполняемой операции. В новых моделях ЭВМ намечается тенденция к повышению внутренних языков машинно-аппаратным путем реализовывать более сложные команды , приближающиеся по своим функциональным действиям к операторам алгоритмических языков программирования.

2. Система Символического Кодирования . В данных системах используются Языки Символического Кодирования (далее ЯСК), которые так же, как и МЯ, являются командными. Однако коды операций и адреса в машинных командах, представляющие собой последовательность двоичных (во внутреннем коде) или восьмеричных (часто используемых при написании программ) цифр, в ЯСК заменены символами (идентификаторами), форма написания которых помогает программисту легче запоминать смысловое содержание операции. Это обеспечивает существенное уменьшение числа ошибок при составлении программ.

Использование символических адресов – первый шаг к созданию ЯСК. Команды ЭВМ вместо истинных (физических) адресов содержат символические адреса. По результатам составленной программы определяется требуемое количество ячеек для хранения исходных промежуточных и результирующих значений. Назначение адресов, выполняемое отдельно от составления программы в символических адресах, может проводиться менее квалифицированным программистом или специальной программой, что в значительной степени облегчает труд программиста.

3. Автокоды . Существуют системы программирования, использующие языки, которые включают в себя все возможности ЯСК, посредством расширенного введения макрокоманд – они называются Автокоды. В различных программах встречаются некоторые достаточно часто использующиеся командные последовательности, которые соответствуют определенным процедурам преобразования информации. Эффективная реализация таких процедур обеспечивается оформлением их в виде специальных макрокоманд и включением последних в язык программирования , доступный программисту. Макрокоманды переводятся в машинные команды двумя путями – расстановкой и генерированием. В постановочной системе содержатся «остовы» – серии команд, реализующие требуемую функцию, обозначенную макрокомандой. Макрокоманды обеспечивают передачу фактических параметров, которые в процессе трансляции вставляются в «остов» программы, превращая её в реальную машинную программу. В системе с генерацией имеются специальные программы, анализирующие макрокоманду, которые определяют, какую функцию необходимо выполнить и формируют необходимую последовательность команд, реализующих данную функцию. Обе указанных системы используют трансляторы с ЯСК и набор макрокоманд, которые также являются операторами автокода. Развитые автокоды получили название Ассемблеры. Сервисные программы и пр., как правило, составлены на языках типа Ассемблер.

4. Макрос . В таких системах язык, являющийся средством для замены последовательности символов описывающих выполнение требуемых действий ЭВМ на более сжатую форму – называется Макрос (средство замены). В , Макрос предназначен для того, чтобы сократить запись исходной программы.

Компонент программного обеспечения, обеспечивающий функционирование макросов, называется макропроцессором. На макропроцессор поступает макросопределяющий и исходный текст. Реакция макропроцессора на вызов – выдача выходного текста. Макрос одинаково может работать, как с программами, так и с данными.

Машинно-независимые системы программирования – это средство описания алгоритмов решения задач и информации, подлежащей обработке. Они удобны в использовании для широкого круга пользователей и не требуют от них знания особенностей организации функционирования ЭВМ. В таких системах программы, составляемые языках, имеющих название высокоуровневых языков программирования, представляют собой последовательности операторов, структурированные согласно правилам рассматривания языка (задачи, сегменты, блоки и т.д.). Операторы языка описывают действия , которые должна выполнять система после трансляции программы на МЯ. Таким образом, командные последовательности (процедуры, подпрограммы), часто используемые в машинных программах, представлены в высокоуровневых языках отдельными операторами.

Программист получил возможность не расписывать в деталях вычислительный процесс на уровне машинных команд, а сосредоточиться на основных особенностях алгоритма.

Среди машинно-независимых систем программирования следует выделить:

1. Процедурно-ориентированные системы . Входные языки программирования в таких системах служат для записи алгоритмов (процедур) обработки информации, характерных для решения задач определенного класса. Эти языки , должны обеспечить программиста средствами, позволяющими коротко и четко формулировать задачу и получать результаты в требуемой форме. Процедурных языков очень много, например: Фортран, Алгол – языки, созданные для решения математических задач; Simula, Слэнг - для моделирования; Лисп, Снобол – для работы со списочными структурами.

2. Проблемно-ориентированные системы в качестве входного языка используют язык программирования с проблемной ориентацией. С расширением областей применения вычислительной техники возникла необходимость формализовать представление постановки и решение новых классов задач.

Необходимо было создать такие языки программирования, которые, используя в данной области обозначения и терминологию, позволили бы описывать требуемые алгоритмы решения для поставленных задач. Эти языки, ориентированные на решение определенных проблем, должны обеспечить программиста средствами, позволяющими коротко и четко формулировать задачу и получать результаты в требуемой форме. Программы, составленные на основе этих языков программирования, записаны в терминах решаемой задачи и реализуются выполнением соответствующих процедур.

3. Диалоговые языки . Появление новых технических возможностей поставило задачу перед системными программистами – создать программные средства, обеспечивающие оперативное взаимодействие человека с ЭВМ их назвали диалоговыми языками. Создавались специальные управляющие языки для обеспечения оперативного воздействия на прохождение задач, которые составлялись на любых раннее неразработанных (не диалоговых) языках.

Разрабатывались также языки, которые кроме целей управления обеспечивали бы описание алгоритмов решения задач. Необходимость обеспечения оперативного взаимодействия с пользователем потребовала сохранения в памяти ЭВМ копии исходной программы даже после получения объектной программы в машинных кодах. При внесении изменений в программу система программирования с помощью специальных таблиц устанавливает взаимосвязь структур исходной и объектной программ. Это позволяет осуществить требуемые редакционные изменения в объектной программе.

4. Непроцедурные языки . Непроцедурные языки составляют группу языков, описывающих организацию данных, обрабатываемых по фиксированным алгоритмам (табличные языки и генераторы отчетов), и языков связи с операционными системами. Позволяя четко описывать как задачу, так и необходимые для её решения действия, таблицы решений дают возможность в наглядной форме определить , какие условия должны выполнятся, прежде чем переходить к какому- либо действию. Одна таблица решений, описывающая некоторую ситуацию, содержит все возможные блок-схемы реализаций алгоритмов решения. Табличные методы легко осваиваются специалистами любых профессий. Программы, составленные на табличном языке, удобно описывают сложные ситуации, возникающие при системном анализе.

В самом общем случае для создания программы на выбранном языке программирования нужно иметь следующие компоненты:

1. Текстовый редактор . Специализированные текстовые редакторы, ориентированные на конкретный язык программирования, необходимы для получения файла с исходным текстом программы, который содержит набор стандартных символов для записи алгоритма.

2. Исходный текст с помощью программы-компилятора переводится в машинный код. Исходный текст программы состоит , как правило, из нескольких модулей (файлов с исходными текстами). Каждый модуль компилируется в отдельный файл с объектным кодом , которые затем требуется объединить в одно целое. Кроме того, системы программирования, как правило, включают в себя библиотеки стандартных подпрограмм . Стандартные подпрограммы имеют единую форму обращения, что создает возможности автоматического включения таких подпрограмм в вызывающую программу и настройки их параметров.

3. Объектный код модулей и подключенные к нему стандартные функции обрабатывает специальная программа – редактор связей . Данная программа объединяет объектные коды с учетом требований операционной системы и формирует на выходе работоспособное приложение – исполнимый код для конкретной платформы. Исполнимый код - это законченная программа, которую можно запустить на любом компьютер, где установлена операционная система , для которой эта программа создавалась.

4. В современных системах программирования имеется еще один компонент – отладчик , который позволяет анализировать работу программы во время ее исполнения. С его помощью можно последовательно выполнять отдельные операторы исходного текста последовательно, наблюдая при этом, как меняются значения различных переменных.

Со временем разработчики компиляторов постарались облегчить труд пользователей, предоставив им все необходимое множество программных модулей в составе одной поставки компилятора. Теперь компиляторы поставлялись уже вкупе со всеми необходимыми сопровождающими техническими средствами. Кроме того, были унифицированы форматы объектных файлов и файлов библиотек подпрограмм. Теперь разработчики, имея компилятор от одного производителя, могли в принципе пользоваться библиотеками и объектными файлами, полученными от другого производителя компиляторов.

Для написания командных файлов компиляции был предложен специальный командный язык язык Makefile. Он позволял в достаточно гибкой и удобной форме описать весь процесс создания программы от порождения исходных текстов до подготовки ее к выполнению. Это было удобное, но достаточно сложное техническое средство, требующее от разработчика высокой степени подготовки и профессиональных знаний, поскольку сам командный язык Makefile был по сложности сравним с простым языком программирования. Язык Makefile стал стандартным средством, единым для компиляторов всех разработчиков.

Такая структура средств разработки существовала достаточно долгое время , а в некоторых случаях она используется и по сей день (особенно при создании системных программ). Ее широкое распространение было связано с тем, что сама по себе вся эта структура средств разработки была очень удобной при пакетном выполнении программ на компьютере, что способствовало ее повсеместному применению в эпоху mainframe.

Следующим шагом в развитии средств разработки стало появление так называемой интегрированной среды разработки. Интегрированная среда объединила в себе возможности текстовых редакторов исходных текстов программ и командный язык компиляции. Пользователь (разработчик исходной программы) теперь не должен был выполнять всю последовательность действий от порождения исходного кода до его выполнения, от него также не требовалось описывать этот процесс с помощью системы команд в Makefile. Теперь ему было достаточно только указать в удобной интерфейсной форме состав необходимых для создания программы исходных модулей и библиотек. Ключи, необходимые компилятору и другим техническим средствам, также задавались в виде интерфейсных форм настройки.

После этого интегрированная среда разработки сама автоматически готовила всю необходимую последовательность команд Makefile, выполняла их, получала результат и сообщала о возникших ошибках при их наличии. Причем сам текст исходных модулей пользователь мог изменить здесь же, не прерывая работу с интегрированной средой, чтобы потом при необходимости просто повторить весь процесс компиляции.

Создание интегрированных сред разработки стало возможным благодаря бурному развитию персональных компьютеров и появлению развитых средств интерфейса пользователя (сначала текстовых, а потом и графических). Их появление на рынке определило дальнейшие развитие такого рода технических средств. Пожалуй, первой удачной средой такого рода можно признать интегрированную среду программирования Turbo Pascal на основе языка Pascal производства фирмы Borland. Ее широкая популярность определила тот факт, что со временем все разработчики компиляторов обратились к созданию интегрированных средств разработки для своих продуктов.

Развитие интегрированных сред несколько снизило требования к профессиональным навыкам разработчиков исходных программ. Теперь в простейшем случае от разработчика требовалось только знание исходного языка (его синтаксиса и семантики). При создании прикладной программы ее разработчик мог в простейшем случае даже не разбираться в архитектуре целевой вычислительной системы.

Дальнейшее развитие средств разработки также тесно связано с повсеместным распространением развитых средств графического интерфейса пользователя. Такой интерфейс стал неотъемлемой составной частью многих современных ОС и так называемых графических оболочек. Со временем он стал стандартом де-факто практически во всех современных прикладных программах.

Это не могло не сказаться на требованиях, предъявляемых к средствам разработки программного обеспечения. В их состав были сначала включены соответствующие библиотеки , обеспечивающие поддержку развитого графического интерфейса пользователя и взаимодействие с функциями API (application program interface, прикладной программный интерфейс операционных систем). А затем для работы с ними потребовались дополнительные средства, обеспечивающие разработку внешнего вида интерфейсных модулей. Такая работа была уже более характерна для дизайнера, чем для программиста.

Для описания графических элементов программ потребовались соответствующие языки. На их основе сложилось понятие ресурсов (resources) прикладных программ .

Ресурсами прикладной программы будем называть множество данных , обеспечивающих внешний вид интерфейса пользователя этой программы, и не связанных напрямую с логикой выполнения программы. Характерными примерами ресурсов являются: тексты сообщений, выдаваемых программой; цветовая гамма элементов интерфейса; надписи на таких элементах , как кнопки и заголовки окон ит.п.

Для формирования структуры ресурсов в свою очередь потребовались редакторы ресурсов, а затем и компиляторы ресурсов, обрабатывающие результат их работы. Ресурсы, полученные с выхода компиляторов ресурсов, стали обрабатываться компоновщиками и загрузчиками.

В последние несколько лет в программировании (особенно для операционной среды Windows) наметился так называемый визуальный подход.

Этот процесс автоматизирован в средах быстрого проектирования. При этом используются готовые визуальные компоненты, свойства и поведение которых настраиваются с помощью специальных редакторов. Таким образом, происходит переход от языков программирования системного уровня к языкам сценариев.

Эти языки создавались для различных целей, что обусловило ряд фундаментальных различий между ним. Системные разрабатывались для построения структур данных и алгоритмов “с нуля”, начиная от таких примитивных элементов, как слово памяти компьютера. В отличие от этого, языки описания сценариев создавались для связывания готовых программ. Их применение подразумевает наличие достаточного ассортимента мощных компонентов, которые требуется только объединить друг с другом. Языки системного уровня используют строгий контроль типов данных, что помогает разработчикам приложении справляться со сложными задачами. Языки описания сценариев не используют понятие типа , что упрощает установление связей между компонентами, а также ускоряет разработку прикладных систем.

Языки описания сценариев основаны на несколько другом наборе компромиссов, чем языки системного уровня. В них скорость исполнения и строгость контроля типов ставятся в шкале приоритетов на более низкое место, но зато выше цениться производительность труда программиста и повторное использование. Это соотношение ценностей оказывается все более обоснованным по мере того, как компьютеры становятся быстродействующими и менее дорогими, чего нельзя сказать о программистах. Языки системного программирования хорошо подходят для создания компонентов, где основная сложность заключена в реализации алгоритмов и структур данных, тогда как языки описания сценариев лучше приспособлены для построения приложении из готовых компонентов, где сложность состоит в налаживании межкомпонентных связей. Задачи последнего рода получают все большее распространение, так что роль языков описания сценариев будет возрастать.

Интерпретаторы и компиляторы.
Трансляция программ и сопутствующие процессы.

Следует заметить, что любой язык программирования может быть как интерпретируемым, так и компилируемым , но в большинстве случаев у каждого языка есть свой предпочтительный способ реализации. Языки Фортран, Паскаль в основном компилируют; язык Ассемблер почти всегда интерпретирует; языки Бейсик и Лисп широко используют оба способа.

Основным преимуществом компиляции является скорость выполнения готовой программы. Интерпретируемая программа неизбежно выполняется медленнее, чем компилируемая, поскольку интерпретатор должен строить соответствующую последовательность команд в момент, когда инструкция предписывает выполнение.

В то же время интерпретируемый язык часто более удобен для программиста, особенно начинающего. Он позволяет проконтролировать результат каждой операции. Особенно хорошо такой язык подходит для диалогового стиля разработки программ, когда отдельные части программы можно написать, проверить и выполнить в ходе создания программы, не отключая интерпретатора.

Транслятор - это программа, которая переводит исходную программу в эквивалентную ей объектную программу. Исходная программа пишется на некотором исходном языке , объектная программа формируется на объектном языке. Выполнение программы самого транслятора происходит во время трансляции.

Если исходный язык является языком высокого уровня, например таким, как ФОРТРАН, C и Паскаль, и если объектный язык - ассемблер или некоторый машинный язык, то транслятор называется компилятором. Машинный язык иногда называют кодом машины, поэтому и объектная программа иногда называется объектным кодом .

Трансляция исходной программы в объектную происходит во время компиляции, а фактическое выполнение объектной программы происходит во время выполнения готовой программы.

Ассемблер - это программа, которая переводит исходную программу, написанную на автокоде или на языке ассемблера, на язык вычислительной машины. Автокод (ассемблер) очень близок к машинному языку ; действительно, большинство автокодных инструкций является точным символическим представлением команд машины. Более того, автокодные инструкции обычно имеют фиксированный формат, что позволяет легко их анализировать. В автокоде, как правило, отсутствуют вложенные инструкции, блоки и т. п.

Интерпретатор для некоторого исходного языка принимает исходную программу, написанную на этом языке, как входную информацию и выполняет ее. Различие между компилятором и интерпретатором состоит в том, что интерпретатор не порождает объектную программу, которая затем должна выполняться, а непосредственно выполняет ее сам. Для того чтобы выяснить , как осуществить выполнение инструкций исходной программы, чистый интерпретатор анализирует ее всякий раз, когда она должна быть выполнена. Конечно же, это не эффективно и используется не очень часто.

При программировании интерпретатор обычно разделяют на две фазы . На первой фазе интерпретатор анализирует всю исходную программу, почти также, как это делает компилятор, и транслирует ее в некоторое внутреннее представление. На второй фазе это внутреннее представление исходной программы интерпретируется или выполняется. Внутреннее представление исходной программы разрабатывается для того, чтобы свести к минимуму время, необходимое для расшифровки или анализа каждой инструкции при ее выполнении.

Как указывалось выше, сам компилятор - это не что иное, как программа , написанная на некотором языке, для которой входной информацией служит исходная программа, а результатом является эквивалентная ей объектная программа. Исторически сложилось так, что компиляторы писались на автокоде вручную. Во многих случаях это был единственный доступный язык. Однако, сейчас компиляторы разрабатываются на языках высокого уровня (поскольку при этом уменьшается время, затрачиваемое на программирование и отладку, а также обеспечивается удобочитаемость программы компилятора, когда работа завершена).

Кроме того, теперь мы имеем много языков, разработанных специально для составления компиляторов. Эти так называемые "компиляторы компиляторов " являются некоторым подмножеством в "системах построения трансляторов " (СПТ).



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows