Важное место в программном обеспечении современных ЭВМ занимают системы программирования. Основное их назначение - освободить программиста от необходимости работать на языке машинных команд. Язык программирования, с которым работает система программирования, называется ее входным языком. Системы программирования именуются по названию своего входного языка. Например: Бейсик - система, Паскаль - система, система пролог. Иногда в название систем включаются префиксы, обозначающие, например, фирменное происхождение системы. Очень популярны системы с приставкой "Турбо": Турбо - Паскаль, Турбо - Си и др. Это системы программирования, разработанные фирмой Borland.
Системы программирования - это универсальные средства работы с информацией. С их помощью можно решать вычислительные задачи, обрабатывать тексты, получать графические изображения, осуществлять хранение и поиск данных и т.д., в общем, делать все, что делают средства прикладного программного обеспечения - специализированные исполнители. Кроме того, сами эти средства (графические и текстовые редакторы, СУБД и др.) - это программы, написанные на языках программирования, созданные с помощью систем программирования.
Языки программирования претерпели большие изменения с тех пор, как в сороковых годах началось их использование. Они все еще продолжают изменяться и теперь даже быстрее, чем когда-либо ранее.
Первые языки программирования были очень примитивными и мало чем отличались от формализованных упорядочений двоичных чисел (единиц и нулей), понятных компьютеру. Использование таких языков было крайне неудобно с точки зрения программиста, так как он должен знать числовые коды всех машинных команд, должен сам распределять память под команды программы и данные. На языках машинных команд трудно поддерживать структурную методику программирования.
Для того чтобы облегчить общение человека с ЭВМ были созданы языки программирования типа Ассемблер. Переменные величины стали изображаться символическими именами. Числовые коды операций заменились на мнемонические (словесные) обозначения, которые легче запомнить. Язык программирования приблизился к человеческому языку, но удалился от языка машинных команд. Чтобы ЭВМ могла работать на языке Ассемблера, необходим транслятор - системная программа, переводящая текст программы на Ассемблере в эквивалентные ей машинные команды. Языки типа Ассемблер – машинно-ориентированные, потому что они настроены на структуру машинных команд конкретного компьютера. Разные компьютеры с разными типами процессоров имеют разный Ассемблер.
В пятидесятых годах, с широким развитием ЭВМ и применением их в различных областях науки и техники, возникла серьезная проблема: простой пользователь не мог работать с ЭВМ из-за сложности языков программирования, а подготовленный программист был просто не в состоянии обслужить огромное количество пользователей. Разрешением данной проблемы явилось создание языков программирования высокого уровня (ЯПВУ). Форма записи программ на ЯПВУ по сравнению с Ассемблером и машинными языками ближе к традиционной математической форме и разговорному языку. Они легко изучаются, хорошо поддерживают структурную методику программирования, и еще, что очень важно, ЯПВУ являются машинонезависимыми языками. Одна и та же программа на таком языке может быть выполнена на ЭВМ различных типов, оснащенных соответствующим транслятором. Однако программы, написанные на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на машинных языках или языках Ассемблера.
Первыми популярными языками высокого уровня, появившимися в 50-х годах, были Фортран, Кобол (в США) и Алгол (в Европе). Для первых ЯПВУ была характерна их предметная ориентация. Так языки Фортран и Алгол были ориентированы на научно - технические расчеты математического характера. Кобол - язык для программирования экономических задач. В нем, по сравнению с двумя другими языками программирования, слабее развиты математические средства, зато хорошо развиты средства обработки текстов, организация вывода данных в форме требуемого документа.
Огромное количество новых языков программирования стало появляться в 60-х, 70-х годах. За всю историю ЭВМ их было создано более тысячи. Однако распространились и выдержали испытание временем немногие. В 1965 году появились два новых важных языка. Профессорами университета в городе Дартмуне Т. Куртцем и Д. Кемени был разработан язык для обучения программированию, который являлся упрощенной версией Фортрана и получил название Бейсик (Beginner's All-purpose Simbolic InstructionCode, т.е. многоцелевой код символических команд для начинающих). Бейсик предоставляет разнообразные средства для диалога: пользователь имеет возможность "общаться" с Бейсик-программой во время ее выполнения. Программа может "попросить" пользователя ввести данные, проверить их, осуществить выбор и т.д. Наибольшее признание Бейсик получил с появлением микроЭВМ начиная с 1975 года. Сейчас Бейсик со всеми его реализациями вполне можно назвать наиболее известным и широко распространенным языком высокого уровня. Вторым языком, появившемся в 1965 году, был ПЛ/1 (Programming Language 1, т.е язык программирования 1). ПЛ/1 был разработан при содействии фирмы IBM. При этом преследовалась цель создать язык, сочетающий в себе лучшие свойства Алгола, Кобола и Фортрана. ПЛ/1 действительно подходит для решения широкого круга задач и является более гибким по сравнению с Алголом, Коболом и Фортраном. При появлении языка ПЛ/1 предсказывали, что он станет основным языком и в конечном итоге заменит своих предшественников. Однако этого не произошло. Главная причина по-видимому связана с тем, что некоторые пользователи Кобола и Фортрана не ощутили тех преимуществ языка ПЛ/1, которые оправдали бы переход к нему. Другая причина связана с "размерами" языка. Большое количество средств и разнообразие операторов ПЛ/1 привели к тому, что он оказался довольно сложным в изучении. В 1971 году профессор Н. Вирт из Технического университета в Цюрихе разработал новый язык, известный под названием "Паскаль" (в честь хорошо известного математика 17-го века Блеза Паскаля).
Язык паскаль основан на Алголе, но содержит ряд усовершенствований. Первоначально он создавался как учебный язык, в нем аккуратно соблюдена структурная линия программирования. Наибольший успех и распространение языку Паскаль принесли первые персональные компьютеры. Фирма Borland Internetional Inc (США) разработала систему Турбо - Паскаль для ПК. Турбо - Паскаль - это не только язык и транслятор с него, но еще и операционная оболочка, позволяющая пользователю удобно работать на Паскале. Турбо - Паскаль вышел за рамки учебного предназначения и стал языком профессионального программирования с универсальными возможностями. В силу своих достоинств Паскаль послужил источником для создания многих основных современных языков программирования, таких как Ада, Си, Модула-2 и др.
Язык Си первоначально был разработан для мини - ЭВМ использующих операционную систему UNIX. Он является относительно простым языком, в нем нет операций над символьными строками и списками, но, в отличии от Паскаля, в нем заложены возможности непосредственного обращения к некоторым машинным командам, к определенным участкам памяти компьютера. Си широко используется как инструментальный язык для разработки операционных систем, трансляторов, баз данных т других системных и прикладных программ.
В 1965 году появился язык программирования Лисп (LISt Processing, т.е. обработка списков). Он служит для обработки строк и рекурсивных данных. Лисп располагает также средствами для выполнения арифметических и логических операций. Он находит широкое применение в исследованиях по созданию искусственного интеллекта.
В настоящее время существует большое количество языков высокого уровня, и каждый год появляются новые языки (хотя немногие из них действительно реализованы и в какой-то степени используются).
В современной информатике можно выделить два основных направления развития языков программирования: процедурное и непроцедурное (рис. 1.).
Процедурное программирование возникло на заре вычислительной техники и получило широкое распространение. В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий. Основные средства, применяемые в этих языках - величины (в том числе и табличные), присваивания, циклы, процедуры. При построении процедурной программы необходимо ясно представлять, какие действия и в какой последовательности будут производиться при ее выполнении. Следовательно, процедурное программирование основано на алгоритмическом мышлении и может служить средством его развития.
Среди процедурных языков можно выделить в свою очередь структурные и операционные языки. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы. В операционных языках для этого используются несколько операций. Широко распространены структурные языки: Паскаль, Си, Ада, ПЛ/1. Операционные: Фортран, Бейсик, Фокал.
Непроцедурное (декларативное) программирование появилось в начале 70-х годов, но стремительное его развитие началось в 80-е годы, когда был разработан японский проект создания ЭВМ пятого поколения, целью которого явилась подготовка почвы для создания интеллектуальных машин. К непроцедурному программированию относятся функциональные и логические языки.
В функциональных языках программа описывает вычисление некоторой функции. Обычно эта функция задается как композиция других, более простых, те в свою очередь разлагаются на еще более простые и т.д. Один из основных элементов в функциональных языках - рекурсия, то есть вычисление значения функции через значение этой же функции от других элементов. Присваивания и циклов в классических функциональных языках нет.
Наиболее распространенными среди функциональных языков являются Лисп и Рефал. Лисп - язык обработки списков давно и активно применяется в системах искусственного интеллекта. Рефал, построенный на алгоритмах Маркова, удобен для обработки текстов и единственный из распространенных в мире языков программирования, разработанный в нашей стране.
Промежуточное положение занимает язык Лого, который содержит средства и процедурного и функционального программирования. На начальном уровне, которым всегда начинается и часто заканчивается его изучение, он похож на классический процедурный язык. Однако при решении сложных задач обработки данных на первый план выходят функциональные методы. Фактически, Лого - это Лисп, адаптированный для обучения. Эта адаптация потребовала включения в язык процедур, переменных, присваивания, т.е. средств, характерных скорее для процедурных, чем для функциональных языков. Функциональная программа, как и процедурная, описывает действия, которые надо совершить для достижения результата (вызов функции - это тоже действие), но ее построение требует скорее математического, чем алгоритмического мышления.
В логической традиции программа вообще не описывает действий. Она задает данные и соотношения между ними. После этого можно задавать вопросы. Машина перебирает известные (заданные в программе) данные и находит ответ на вопрос. Порядок перебора не описывается в программе, а неявно задается самим языком. Классическим языком логического программирования считается Пролог, хотя он и содержит некоторые средства управления перебором, т.е. процедурные элементы. Построение логической программы вообще не требует алгоритмического мышления. Здесь нет динамики, нет описания действий, программа описывает статические отношения объектов, а динамика находится в механизме перебора и скрыта от программиста.
Можно выделить еще один класс языков программирования - объектно-ориентированные языки сверхвысокого уровня. На таких языках не описывают подробной последовательности действий для решения задачи, хотя они содержат элементы процедурного программирования. Объектно-ориентированные языки, благодаря богатому пользовательскому интерфейсу, предлагают человеку решить задачу в удобной для него форме. Примером такого языка может служить язык программирования визуального общения Smalltak. Трудно провести четкую границу между системами программирования сверхвысокого уровня и прикладным программным обеспечением. Как те, так и другие системы позволяют работать с ними неквалифицированному пользователю, т.е. не программисту.