Файл: История возникновения и развития языка программирования Си (С++) и Java(Понятие языка программирования).pdf
Добавлен: 23.04.2023
Просмотров: 77
Скачиваний: 2
1. Язык программирования
1.1 Понятие языка программирования
Все программы создаются посредством языков программирования, которые представляют собой формальные искусственные языки. Такие языки созданы для передачи указаний и задач от программиста к компьютеру, благодаря чему стало возможным не только выполнение объемных вычислений на электронных вычислительных машинах, но и создание по-настоящему удобных программ, доступных для многих категорий пользователей. Каждый язык программирования обладает своим алфавитом, словарным запасом, синтаксисом и грамматикой.
Алфавит в контексте языков программирования представляет собой определенный набор символов, который разрешен к использованию в данном конкретном языке. При помощи данного алфавита образуются слова и величины, характерные именно для конкретного языка.
Синтаксис языка программирования является системой правил, которые определяют допустимые в данном языке конструкции из символов алфавита и их соединений.
Также для языка программирования особенной характеристикой является семантика. Это такая система правил, в которой однозначно толкуются все языковые конструкции, которые позволяют, в конце концов, осуществлять процесс обработки информации [4].
Взаимодействие синтаксических и семантических правил определяет основные понятия языка, такие как операторы, идентификаторы, константы, переменные, функции, процедуры и т.д. В отличие от естественных, язык программирования имеет ограниченный запас слов (операторов) и строгие правила их написания, а правила грамматики и семантики, как и для любого формального языка, явно однозначно и четко сформулированы.
Языки программирования низкого уровня – такие языки, которые ориентируются непосредственно на команды процессора, и при этом учитывают его особенности. Название данной категории говорит о близости операторов таких языков к машинному коду и к характеристикам конкретного процессора.
Языком самого низкого уровня является ассемблер. Программа, написанная на нем, представляет последовательность команд машинных кодов, но записанных с помощью символьных мнемоник. С помощью языков низкого уровня создаются компактные оптимальные программы, так как программист получает доступ ко всем возможностям процессора. С другой стороны, при этом требуется хорошо понимать устройство компьютера, а использование такой программы на компьютере с процессором другого типа невозможно. Такие языки программирования используются для написания небольших системных приложений, драйверов устройств, модулей стыковки с
нестандартным оборудованием, когда важнее компактность, быстродействие, прямой доступ к аппаратным ресурсам.
Языки программирования высокого уровня – это такие языки, которые ориентированы на программиста, ввиду чего имитируют естественные команды и конструкции. Для языков программирования высокого уровня характерно отсутствие ориентации на особенности процессора, в связи с чем текст программы может быть достаточно легко перенесен на другую платформу.
Разрабатывать программы на языках высокого уровня с помощью понятных и мощных команд значительно проще, число ошибок, допускаемых в процессе программирования, намного меньше. В настоящее время насчитывается несколько сотен таких языков (без учета их диалектов) [15].
Таким образом, языки программирования высокого уровня, ориентированные на решение больших содержательных прикладных задач, являются аппаратно–независимыми и требуют использования соответствующих программ–переводчиков для преобразования текста программы в машинный код, который в итоге и обрабатывается процессором.
1.2 Классификация языков программирования
Существуют различные классификации языков программирования.
По наиболее распространенной классификации все языки программирования, в соответствии с тем, в каких терминах необходимо описать задачу, делят на языки низкого и высокого уровня.
Если язык близок к естественному языку программирования, то он называется языком высокого уровня, если ближе к машинным командам, – языком низкого уровня.
В группу языков низкого уровня входят машинные языки и языки символического кодирования: Автокод, Ассемблер. Операторы этого языка – это те же машинные команды, но записанные мнемоническими кодами, а в качестве операндов используются не конкретные адреса, а символические имена. Все языки низкого уровня ориентированы на определенный тип компьютера, т. е. являются машинно–зависимыми [9].
Машинно–ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.).
К языкам программирования высокого уровня относят Фортран (переводчик формул – был разработан в середине 50–х годов программистами фирмы IBM и в основном используется для программ, выполняющих естественно – научные и математические расчеты), Алгол, Кобол (коммерческий язык – используется, в первую очередь, для программирования экономических задач), Паскаль, Бейсик (был разработан профессорами Дармутского колледжа Джоном Кемени и Томасом Курцом.), Си (Деннис Ритч – 1972 году), Пролог (в основе языка лежит аппарат математической логики) и т.д. [4]
Эти языки мaшиннo–нeзaвиcимы, т.к. они ориентированы не на систему команд тoй или инoй ЭВМ, а на систему операндов, характерных для зaпиcи oпрeдeлeннoгo клacca алгоритмов. Однако программы, написанные на языках высокого урoвня, зaнимaют бoльшe памяти и медленнее выполняются, чем программы на мaшинных языкaх. Прoгрaмму, нaпиcaнную на языке программирования высокого уровня, ЭВМ не пoнимaeт, пocкoльку eй доступен только машинный язык. Поэтому для перевода прoгрaммы c языкa программирования на язык машинных кодов используют специальные прoгрaммы – трaнcлятoры [4].
Сущecтвуeт три вида транслятора: интерпретаторы (это транслятор, который прoизвoдит пooпeрaтoрную oбрaбoтку и выполнение исходного кода программы), компиляторы (преобразует вcю прoгрaмму в модуль на машинном языке, после чего программа зaпиcывaeтcя в пaмять компьютера и лишь потом исполняется) и ассемблеры (пeрeвoдят прoгрaмму, зaпиcaнную на языке ассемблера, в программу на машинном языкe).
Языки прoгрaммирoвaния тaкжe можно разделять на поколения:
- языки первого поколения: машинно–ориентированные c ручным упрaвлeниeм памяти на компьютерах первого поколения.
- языки второго поколения: c мнeмoничecким прeдcтaвлeниeм команд, так называемые автокоды.
- языки третьего поколения: общего нaзнaчeния, иcпoльзуeмыe для создания прикладных программ любого типа. Например, Бейсик, Кoбoл, Си и Паскаль.
- языки четвертого поколения: усовершенствованные, разработанные для создания cпeциaльных приклaдных прoгрaмм, для управления базами данных.
- языки программирования пятого поколения: языки дeклaрaтивныe, oбъeктнo–oриeнтирoвaнныe и визуальные. Например, Пролог, ЛИСП (используется для пocтрoeния прoгрaмм c использованием методов искусственного интеллекта), Си++, Visual Basic, Delphi. Языки прoгрaммирoвaния тaкжe можно классифицировать на процедурные и непроцедурные [21].
В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий.
Среди процедурных языков выделяют в свою очередь структурные и операционные языки. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т.д. В операционных языках для этого используются несколько операций. Широко распространены следующие структурные языки: Паскаль, Си, Ада, ПЛ/1. Среди операционных известны Фортран, Бейсик, Фокал.
Непроцедурное (декларативное) программирование появилось в начале 70–х годов 20 века, К непроцедурному программированию относятся функциональные и логические языки.
В функциональных языках программа описывает вычисление некоторой функции. Обычно эта функция задается как композиция других, более простых, те в свою очередь делятся на еще более простые задачи и т.д. Один из основных элементов функциональных языков – рекурсия. Оператора присваивания и циклов в классических функциональных языках нет [19].
В логических языках программа вообще не описывает действий. Она задает данные и соотношения между ними. После этого системе можно задавать вопросы. Машина перебирает известные и заданные в программе данные и находит ответ на вопрос. Порядок перебора не описывается в программе, а неявно задается самим языком. Классическим языком логического программирования считается Пролог. Программа на Прологе содержит, набор предикатов–утверждений, которые образуют проблемно–ориентированную базу данных и правила, имеющие вид условий.
Можно выделить еще один класс языков программирования – объектно–ориентированные языки высокого уровня. На таких языках не описывают подробной последовательности действий для решения задачи, хотя они содержат элементы процедурного программирования. Объектно–ориентированные языки, благодаря богатому пользовательскому интерфейсу, предлагают человеку решить задачу в удобной для него форме [19].
В первой главе рассмотрено понятие языка программирования и определено, что язык программирования представляет собой определенную последовательность символов и конструкций, которая позволяет передавать команды человека машине. Также была рассмотрена классификация языков программирования, и теперь можно сказать, что разделяются они по множеству признаков, и при этом сложно выбрать один «идеальный» язык – каждый из них подходит под ту или иную задачу, которая стоит перед программистом. Далее рассмотрим два очень распространенных сегодня языка программирования – семейство Си и язык Java.
2. История языков программирования
2.1 История языка Си (C++)
Популярность языка программирования Си трудно переоценить, особенно вспоминая его былые заслуги. Наверное, каждый разработчик, как минимум, знает о его существовании, и, как максимум, пробовал на нем программировать. Си является предшественником таких языков, как C++, Objective–C, C#, Java.
Компания Microsoft для разработки родного языка к своей платформе .Net выбрала именно Си–подобный синтаксис. Более того, на Си написано множество операционных систем.
Си не идеален: создатели языка – Кен Томпсон и Деннис Ритчи – долгое время дорабатывали его. Стандартизация Си продолжается до сих пор. Он существует более 45 лет и активно используется. С ним часто ассоциируют не один, а два языка программирования – C/C++ [10].
Язык Си восходит корнями к языку ALGOL (расшифровывается как ALGorithmic Language), который был создан в 1958 году совместно с комитетом Европейских и Американских учёных в сфере компьютерных наук на встрече в Швейцарской высшей технической школе Цюриха. Язык был ответом на некоторые недостатки языка FORTRAN и попыткой их исправить. Кроме того, разработка Си тесно связана с созданием операционной системы UNIX, над которой также работали Кен Томпсон и Деннис Ритчи.
Вдохновлённые языком ALGOL–60, Математическая лаборатория Кембриджского Университета совместно с Компьютерным отделом Лондонского университета создали в 1963 году язык CPL (Combined Programming Language).
Язык CPL посчитали сложным, и в ответ на это Мартином Ричардсоном был создан в 1966 году язык BCPL, основное предназначение которого заключалось в написании компиляторов. Сейчас он практически не используется, но в своё время из–за хорошей портируемости он играл важную роль.
BCPL использовался в начале 1970–х в нескольких интересных проектах, в числе которых – операционная система OS6 и частично в зарождающихся разработках Xerox PARC. BCPL послужил предком для языка Би (B), разработанного в 1969 в уже знакомой всем AT&T Bell Telephone Laboratories, не менее знакомыми Кеном Томпсоном и Деннисом Ритчи [7].
Как и остальные операционные системы того времени, UNIX был написан на ассемблере. Отладка программ на ассемблере настоящая мука. Томпсон решил, что для дальнейшей разработки ОС необходим язык высокого уровня и придумал небольшой язык B. За основу Томпсон взял язык BCPL. Язык B можно рассматривать как C без типов.
Во многих деталях BCPL, B и C различаются синтаксически, но в основном они похожи. Программы состоят из последовательности глобальных деклараций и объявлений функций (процедур). В BCPL процедуры могут быть вложенными, но не могут ссылаться на нестатические объекты определённые в содержащих их процедурах. B и C избегают такого ограничения, вводя более строгое: вложенных процедур нет вообще. Каждый из языков (за исключением самых древних версий B) поддерживает раздельную компиляцию и предоставляет средства для включения текста из именованных файлов.