Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 3-9 full.doc
Скачиваний:
16
Добавлен:
22.12.2018
Размер:
979.97 Кб
Скачать

Глава 3

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

3.1 Общие понятия

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

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

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

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

3.2 Классификация языков программирования

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

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

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

  • языки численных расчетов и научных вычислений,

  • языки обработки деловой информации,

  • языки для искусственного интеллекта,

  • системные языки,

  • издательская деятельность,

  • языки управления процессами,

  • языки WEB-программирования.

Языки программирования для проведения научных расчетов исторически появились первыми. Это обусловлено классом первых задач для компьютеров. Первым языком программирования в этой области являлся язык FORTRAN, созданный еще в 1957 году (автор Бэкус, США) для IBM 704. Позднее этот язык несколько раз пересматривался и модифицировался, современная его версия носит название FORTRAN 90. Для конкуренции в Европе в 1958 г. был создан язык программирования ALGOL-58 (первоначально IAL). Главным отличием этого языка от языка FORTRAN являлось более удобная переносимость транслятора языка. В США этот язык прижился в виде клона JOVIAL и использовался ВВС США. На основе языка ALGOL был разработан язык Simula-67 (Найгард и Дал, Норвегия) (в него были введены классы). В последствии был разработан ALGOL-68, но это был последний из серии этих языков. В 1963 г. фирма IBM для компьютеров серии 360 разработала язык NPL (new programming language), который в последствии был переименован в MMPL (multi purpose programming language), а затем в PL/I. В последствии был вытеснен языками C, С++, Ada. В 70е годы появились языки С и Pascal. В 80е - С++, а в 90е - Java.

Среди языков обработки деловой информации основным был и остается язык COBOL. Этот язык был создан в 1960 г, и пересматривался в 1974 и 1984 гг. В настоящее время в эту область активно внедряются языки С, С++, Java. Развитие электронной коммерции посредством сети Internet привело к внедрению в эту область языков Perl, Jawascript. К языкам данного класса можно отнести и язык структурированных запросов SQL, используемый в различных системах управления базами данных.

Задачи искусственного интеллекта традиционно решают с помощью языков Lisp и Prolog. Язык Lisp был разработан как функциональный язык обработки списков. В настоящее время ему на смену пришли языки Scheme и Common LISP. Язык Prolog является языком с задаваемыми правилами и базируется на предикатном исчислении и математической логике.

Среди языков системного уровня долгое время доминировал Ассемблер. Существовавшие в 50 - 60 годы языки CPL и BCPL широкого применения так и не нашли. В 1970 году в ходе создания операционной системы UNIX был разработан язык С, который до сих пор является ведущим системным языком программирования. В последнее время к нему добавился С++. Небольшую долю в области системного программирования занимают языки Modula и современный BASIC. Язык программирования Ada также разрабатывался для этих нужд, но нашел более широкое применение в сфере встроенных компьютеров.

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

В 60х - 70х годах появляется новое направление в программировании: управление процессами. Впервые это произошло в системе UNIX в виде нескольких shell-языков. Данные языки разработаны для организации запуска программ на выполнение согласно расписанию. С этими целями можно также использовать языки Perl и TCL.

С развитием сетевых технологий и сети Интернет появилась необходимость в языках программирования, предназначенных для работы в новых условиях. Большое развитие получили языки разметки. Основным языком в этой области является SGML. Но ввиду своей чрезмерной сложности, он не используется, а на его основе созданы HTML и XML. Также в области сетевого программирования применяются такие языки как Perl и Java.

По основной парадигме языки программирования делятся на четыре класса:

  • императивные языки,

  • аппликативные языки,

  • языки, основанные на системе правил,

  • объектно-ориентированные языки.

Императивные (процедурные) языки - это управляемые командами или операторно-ориентированные языки программирования. Основной концепцией является состояние машины - множество всех значений всех ячеек памяти компьютера. Программа состоит из последовательности операторов, выполнение каждого из которых влечет за собой изменение значения в одной или нескольких ячейках памяти, то есть переход машины из одного состояния в другое. К данному классу относятся большинство языков программирования: С, С++, Pascal, ALGOL, FORTRAN, COBOL.

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

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

Объектно-ориентированная парадигма является наиболее перспективной. Ее значимость постепенно возрастает. Основной идеей данной парадигмы является создание сложных объектов данных с описанными для них функциями на основе уже существующих более простых объектов. Языков программирования использующих только эту парадигму пока нет. Языки C++, Java, SmallTalk, C# являются импликативными с элементами объектно-ориентированного подхода.

Смена парадигм языков программирования, отмирание старых языков и появление новых связано с развитием и совершенствованием компьютерной техники. Выделяют три основные эры:

  • эра универсальных вычислительных машин,

  • эра персональных вычислительных машин,

  • эра сетевых технологий.

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

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

Язык С был разработан в 1972 г. Дэнисом Ритчи и Кеном Томпсоном из AT&T Laboratories в рамках разработки ОС UNIX. В 60е годы Томпсон разрабатывал ОС UNIX. Основной идеей являлась то, что ядро операционной системы и она сама, писались на языке высокого уровня. В начале для этой цели был использован BCPL. Но он не имел динамической поддержки и на его основе был разработан язык B. В этом языке было разработано минимальное подмножество языка BCPL для системного уровня. Это было сделано для возможности работы на компьютере PDP-7 с 8 килобайтами памяти. В 1970 году для проекта UNIX был приобретен компьютер PDP-11 с памятью в 24 Кб. В язык В были добавлены понятие структуры и некоторые дополнительные операторы. Новый язык и стал известен как язык С.

В настоящее время С - универсальный язык, обладающий чертами как прикладного, так и системного языка. Язык С первоначально приобрел наибольшую популярность в университетах, использующих ОС UNIX. Затем он начал распространяться и на другие операционные системы, становясь коммерческим продуктом. В 1989 году был издан первый стандарт языка ANSI C (C89), а в 1990 он был принят в качестве международного стандарта ISO/IES 9899. В дальнейшем стандарт пересматривался в 1999 году (стандарт С99).

Язык С оказал значительное влияние на развитие таких языков программирования как С++, Java, С#.

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

  • Язык С.

  • Препроцессор С.

  • Допущения интерфейса С.

  • Библиотека С.

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

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

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

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

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

Язык С изначально был тесно связан с ОС UNIX. Вызов некоторых функций производился напрямую из операционной системы. Для возможности этого необходимо было подключить соответствующую библиотеку. Например, для вызова функции выделения динамической памяти необходимо было вначале подключить библиотеку: #include<malloc.h>, а затем в самой программе осуществить ее вызов: malloc(StorageSize). При компиляции и запуске такой программы определения соответствующих функций подключаются из библиотеки языка С. В языке С имеется множество библиотек, содержащие функции. Подключение производится с помощью заголовочных файлов, имеющих расширение .h.

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

  • блочный (/* … */),

  • строчный (// …).

Блочный комментарий включает в себя все символы, расположенные между открывающим (/*) и закрывающими (*/) тегами. Данный комментарий может содержать несколько строк текста. Строчный комментарий начинается сразу после символов // и заканчивается в конце текущей строки.