Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

'Доклад'
Школа – победитель в конкурсном отборе образовательных учреждений активно внедряющих инновационные образовательные программы, в рамках Приоритетного ...полностью>>
'Решение'
Рекомендовано решением Экспертно-консультативного совета Республиканского центра профилактики наркотизации населения при Кабинете Министров Республики...полностью>>
'Курсовая'
Финансовой работе на предприятии в условиях рыночных отношений должно уделяться большое внимание как главному звену деятельности, посредством которой...полностью>>

Эволюция языков программирования

Главная > Документ
Сохрани ссылку в одной из сетей:

Эволюция языков программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наиболее широко распространены разновидности следующих трёх: операционного, денотационного (математического) и деривационного (аксиоматического).

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

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

Денотационная семантика оперирует понятиями, типичными для математики — множества, соответствия, а также суждения, утверждения и др.

Язык программирования строится в соответствии с той или иной базовой моделью вычислений и парадигмой программирования.

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

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

Языки программирования могут быть реализованы как  и .

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

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

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

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

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

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

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

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

Некоторые языки, например,  и , находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, . Далее байт-код выполняетсявиртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету» (Just-in-time compilation, ). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine,), для C# — Common Language Runtime.

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

Современные языки программирования рассчитаны на использование , то есть доступность всех графических символов ASCII является необходимым и достаточным условием для записи любых конструкций языка. Управляющие символы ASCII используются ограниченно: допускаются только возврат каретки CR, перевод строки LF и горизонтальная табуляция HT (иногда также вертикальная табуляция VT и переход к следующей странице FF).

Ранние языки, возникшие в эпоху 6-битных символов, использовали более ограниченный набор. Например, алфавит Фортрана включает 49 символов (включая пробел): A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / () . , $ ' :

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

Использование символов за пределами ASCII (например, символов KOI8-R или символов Юникода) зависит от реализации: иногда они разрешаются только в комментариях и символьных/строковых константах, а иногда и в идентификаторах. В  существовали языки, где все ключевые слова писались русскими буквами, но большу́ю популярность подобные языки не завоевали (исключение составляет Встроенный язык программирования 1С:Предприятие).

Расширение набора используемых символов сдерживается тем, что многие проекты по разработке программного обеспечения являются международными. Очень сложно было бы работать с кодом, где имена одних переменных записаны русскими буквами, других — арабскими, а третьих — китайскими иероглифами. Вместе с тем, для работы с текстовыми данными языки программирования нового поколения (Delphi 2006, , ) поддерживают .

Виды программирования

Игровое программирование

Типичный язык — 

Цель — для развлечения и поддержания навыков, фактически — беcцельно

Интерфейс — понятный себе

Научное программирование

Типичный язык — 

Цель — для решения конкретной задачии или очень узкого круга однотипных задач

Интерфейс — такой, чтоб можно было подойти и объяснить

Индустриальное программирование (зародилось лишь в )

Типичного языка нет

Цель — для решения чужих задач, т.е. происходит отчуждение программы

Интерфейс — поясненный обширной документацией, понятный интуитивно

Есть мнение, что ЯП — язык написания компьютерных программ. Но.

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

 — еще одна похожая нотация.

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

 — реализован на компьютере, но основное предназначение — публикация алгоритмов в журналах

 — язык разметки текста с уклоном в последующее отображение

Язык Программирования — инструмент для планирования поведения исполнителя, в точности выполняющего предписания.

Это подразумевает однозначную трактовку текста на языке исполнителем (будь то ОС компьютера, веб-сервер Apache или миллион китайцев) с целью выполнения поставленной цели. И здесь мы встречаем важное отличие искусственных языков от естественных —однозначность.

Этапы развития ЯП

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

Первым значительным шагом представляется переход к языку ассемблера (позволим себе маленькое лирическое отступление: английское название assembly language, или assembler, на русский переводят именно тем термином, который был использован выше. При этом у новичка создается впечатление, что язык назван в честь некоего человека по имени ассемблер. Достаточно забавная ситуация, не правда ли?). Не очень заметный, казалось бы, шаг — переход к символическому кодированию машинных команд — имел на самом деле огромное значение. Программисту не надо было больше вникать в хитроумные способы кодирования команд на аппаратном уровне. Более того, зачастую одинаковые по сути команды кодировались совершенно различным образом в зависимости от своих параметров (широко известный пример из мира современных компьютеров — это кодирование инструкции mov в процессорах Intel: существует несколько совершенно по-разному кодируемых вариантов команды; выбор того или иного варианта зависит от операндов, хотя суть выполняемой операции неизменна: поместить содержимое (или значение) второго операнда в первый). Появилась также возможность использования макросов и меток, что также упрощало создание, модификацию и отладку программ. Появилось даже некое подобие переносимости — существовала возможность разработки целого семейства машин со сходной системой команд и некоего общего ассемблера для них, при этом не было нужды обеспечивать двоичную совместимость.

Язы́к ассе́мблера — язык программирования низкого уровня, мнемонические команды которого (за редким исключением) соответствуют инструкциям  вычислительной системы. Трансляция программы в исполняемый машинный код производится  (от  assembler - сборщик) - программой-транслятором, которая и дала языку ассемблера его название.

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

В 1954 году в недрах корпорации IBM группой разработчиков во главе с Джоном Бэкусом (John Backus) был создан язык программирования Fortran.

Фортра́н (Fortran) — первый язык программирования высокого уровня, имеющий . Создан в период с  по 1957 год группой программистов под руководством Джона Бэкуса в корпорации  (язык , претендующий на пальму первенства, был изобретён ещё в 1945 году, но не был реализован вплоть до 2000 года). Название Fortran является аббревиатурой от FORmula TRANslator, то есть, переводчик формул. Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана — большое количество написанных на нём программ и библиотек подпрограмм. Среди учёных, например, ходит такая присказка, что любая математическая задача уже имеет решение на Фортране, и, действительно, можно найти среди тысяч фортрановских пакетов и пакет для перемножения , и пакет для решения сложных интегральных уравнений, и многие, многие другие. Ряд таких пакетов создавался на протяжении десятилетий и популярен (главным образом в научной среде) по сей день.

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

В Фортране следующая конструкция описывает «цикл for до метки 10 при изменении индекса от 1 до 100»: 
DO 10 I=1,100
Если же здесь заменить запятую на точку, то получится оператор присваивания:
DO10I = 1.100
Говорят, что такая ошибка заставила ракету взорваться во время старта!

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

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

1954–1957 — появление языка , первого языка программирования высокого уровня. Через 10 лет после выхода FORTRAN, в  в США уже использовалось более 400 языков. Тем не менее из всего многообразия языков можно выделить некоторое количество знаковых.

Научно-технические расчеты — FORTRAN

Версии FORTRAN: FORTRAN I (), FORTRAN II, FORTRAN IV (), FORTRAN 66 (), FORTRAN 77 (), FORTRAN 96 ()

Ряд свойств языка FORTRAN показывает, что он неприменим для создания надёжных программ.

Пример: Фортран глотает пробелы, что резко повышает число ошибок

цикл

(FORTRAN)

DO 10 I=1,3

операторы

10: CONTINUE

Здесь трижды выполняется тело цикла

он же, но с ошибкой

(FORTRAN)

DO 10 I=1.3

операторы

10: CONTINUE

Здесь переменной DO10I присваивается 1.3, затем однажды выполняется тело цикла

Надёжность программы — свойство программы, которое обратно пропорционально количеству ошибок в ней.

Аксиома. Абсолютно надёжных программ не бывает.

Форма записи языковых конструкций на FORTRAN не способствует созданию надёжных программ (пример с точкой вместо запятой), тем не менее, FORTAN — самый успешный язык программирования. Стандарты FORTRAN выпускались в , ,  годах, самой популярной версией является стандарт FORTRAN  года. Успешность FORTRAN связана с успешностью занятияэкологической ниши языка программирования.

Языки программирования подобны биологическим видам, в среде языков программирования, также, как и в биологической среде, выживание одни виды и вымиырают другие. При этом даже более приспособленным видам трудно выгнать из ниши того, кто ее ужезанял. Экологической нишей для ЯП является его проблемная область. Самой первой проблемной областью являлись научно-технические расчёты, FORTRAN же был транслятором формул, что следует из его названия (FORTRAN = Formula Translator).

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

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

Мобильность ПО — переносимость ПО с одной системы на другую.

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

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

Algol-60

В 1960 году командой во главе с Петером Науром (Peter Naur) был создан язык программирования Algol. Этот язык дал начало целому семейству Алгол-подобных языков (важнейший представитель — Pascal). В 1968 году появилась новая версия языка. Она не нашла столь широкого практического применения, как первая версия, но была весьма популярна в кругах теоретиков. Язык был достаточно интересен, так как обладал многими уникальными на так момент характеристиками.

Алго́л ( Algol от  algorithmic — алгоритмический и  language — язык) — название ряда языков программирования, применяемых при составлении программ для решения научно-технических задач на ЭВМ. Разработан комитетом по языку высокого уровня IFIP в 1958—1960 гг. (Алгол-58, Алгол-60); усовершенствован в 1964—1968 гг. (Алгол 68). Алгол относится к языкам высокого уровня и позволяет легко переводить алгебраические формулы в программные команды. Алгол был популярен в Европе, в том числе в СССР, в то время как сравнимый с ним язык  был распространён в США и Канаде. Оказал заметное влияние на все разработанные позднее императивные языки программирования — в частности, на язык .

 (Algol-58) — сделаны научной группой во главе с IFIP — язык для обменя алгоритмами между учёными различных стран и специальностей. Впервые для описания синтаксиса был применён формальный язык (БНФ). Algol получился достаточно простым и достаточно мощным. Например, программы на Algol впервые имели блочную структура, также была возможность использования рекурсии. В результате Algol стал стандартом для изучения в университетах и т. д.



Скачать документ

Похожие документы:

  1. Роль и значение языка паскаль в эволюции языков программирования

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

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

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

    Учебно-методический комплекс
    Рабочая программа учебной дисциплины «Высокоуровневые методы информатики и программирования» предназначена для реализации государственных требований к минимуму содержания и уровню подготовки выпускников по специальности: 351400 «Прикладная
  5. Ые системы", "Операционные системы, среды и оболочки" и "Операционные системы и системное программирование" для студентов специальнос­тей факультета Кибернетики

    Документ
    Операционные системы. Лабораторный практикум для выполнения лабораторных и контрольных (домашних) работ дисциплин "Операционные системы", "Операционные системы, среды и оболочки" и "Операционные системы и

Другие похожие документы..