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

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 12.03.2024

Просмотров: 21

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Содержание:

Введение

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

История, предпосылки к созданию языка программирования

Начнём с самого начала. В самом начале у компьютеров не было даже клавиатуры. То есть всё было так - у них не было ни клавиатуры, ни экрана, были перфокарты. Если есть дырочка (или наоборот нет) - это означало ноль или единицу. И программы в то время писали с помощью машинных кодов - у каждой операции в компьютере (сложение, вычитание, более сложные операции) был машинный код. Люди сами по таблице выбирали этот код, адреса в памяти, всё это выбивали руками и засовывали в считыватель - и всё считалось. Это была эра программирования непосредственно в машинных кодах, а основным носителем информации были перфокарты и перфоленты. Программисты обязаны были знать архитектуру машины досконально. Программы были достаточно простыми, что обуславливалось, во-первых, весьма ограниченными возможностями этих машин, и, во-вторых, большой сложностью разработки и, главное, отладки программ непосредственно на машинном языке. Становилось возможным использование таких хитроумных алгоритмов и способов организации программ, какие и не знали современные разработчики. Например, применялась такая возможность, как самомодифицирующийся код. Знание двоичного представления команд позволяло иногда не хранить некоторые данные отдельно, а встраивать их в код как команды. И это далеко не полный список приемов, владение хотя бы одним из которых сейчас сразу же продвигает вас до уровня экстра-класса. Работа программиста была, наверное, тогда не особо интересной - проделывать дырочки в перфокартах.[1]

Появление первых языков программирования

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


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

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

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

  • Наглядность. Использование в языке по возможности уже существующих символов, хорошо известных и понятных как программистам, так и пользователям ЭВМ;
  • Единство. Использование одних и тех же символов для обозначения родственных понятий в разных частях алгоритма. Количество этих символов должно быть по возможности минимальным;
  • Гибкость. Возможность относительно удобного, несложного описания распространенных приемов математических вычислений с помощью имеющегося в языке ограниченного набора выразительных средств;
  • Модульность. Возможность описания сложных алгоритмов в виде совокупности простых модулей, которые могут быть составлены отдельно и использованы в различных сложных алгоритмах;
  • Однозначность. Только одна запись любого алгоритма. Отсутствие ее могло бы привести к неправильным ответам.

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

  • машинные;
  • машинно-ориентированные (ассемблеры);
  • машинно-независимые (языки высокого уровня).

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

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


Одним из первых языков стал Fortran. Это первый компилируемый язык, созданный в корпорации IBM группой разработчиков во главе с Джоном Бэкусом (John Backus) в 1954 году. Его тоже ещё выбивали на перфокартах - были специальные перфокарты для выбивания программ на Фортране. Программисты, разрабатывавшие программы исключительно на ассемблере, выражали сомнение в возможности появления высокопроизводительного языка высокого уровня, поэтому основным критерием при разработке компиляторов Фортрана являлась эффективность исполняемого кода. Хотя в Фортране впервые был реализован ряд важнейших понятий программирования, удобство создания программ было принесено в жертву возможности получения эффективного машинного кода. Однако для этого языка было создано огромное количество библиотек, начиная от статистических комплексов и заканчивая пакетами управления спутниками, поэтому Фортран продолжает использоваться в некоторых организациях, хотя уже довольно сильно отличается от того, что было раньше.

Другой язык - это COBOL. Это компилируемый язык для применения в экономической области и решения бизнес-задач, разработанный в начале 60-х годов. Он отличается большой «многословностью» - его операторы иногда выглядят как обычные английские фразы. В Коболе были реализованы очень мощные средства работы с большими объемами данных, хранящимися на различных внешних носителях. На этом языке создано очень много приложений, которые эксплуатируются и сегодня. Но, что удивительно, ещё 10 лет назад больше половины всего кода, написанного человечеством, было написано на Коболе. И до сих пор, значительная часть всяких банковских транзакций идёт с помощью программ, написанных на этом языке.

PL/1. В 1964 году все та же корпорация IBM создала язык PL/1, который был призван заменить Cobol и Fortran в большинстве приложений. Язык обладал исключительным богатством синтаксических конструкций. В нем впервые появилась обработка исключительных ситуаций. Надо заметить, что синтаксическая структура языка была очень непростой. Пробелы уже использовались как синтаксические разделители, но ключевые слова не были зарезервированы. В частности, следующая строка - это вполне нормальный оператор на PL/1: IF ELSE=THEN THEN THEN; ELSE ELSE. В силу таких особенностей разработка компилятора для PL/1 была исключительно сложным делом. Язык так и не стал популярен вне мира IBM.

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


Современные языки программирования

Понятия о языках программирования

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

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