Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Классификация языков программирования. Критерии выбора среды и языка разработки программ (ТЕОРЕТИЧЕСКИЕ И ИСТОРИЧЕСКИЕ АСПЕКТЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ)

Содержание:

ВВЕДЕНИЕ

Язык программирования служит двум взаимосвязанным целям: он дает программисту аппарат для определения действий, которые должны быть выполнены, и формирует понятия, которые использует программист, и думает о том, что делать. В идеале на первую цель отвечает язык, «ориентированный на машину», так что все основные аспекты машины могут быть легко и просто реализованы так, чтобы это было достаточно очевидно для программиста. На вторую цель в идеале отвечает язык, который настолько «близок к решаемой проблеме», что концепции ее решения можно выразить прямо и кратко.

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

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

Машинных языков почти столько же, сколько компьютеров, но все они являются вариантами идеи: простые операции выполняются с двоичными числами с молниеносной скоростью.

В компьютерах IBM используется машинный язык микропроцессоров семейства 8086, поскольку ваше оборудование основано на этих микропроцессорах.

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

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

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

Объект работы – языки программирования.

Предмет работы – особенности и критерии выбора языков программирования.

Цель работы – проанализировать особенности и критерии выбора языков программирования.

Задачи работы:

- изучить теоретические и исторические аспекты языков программирования;

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

ГЛАВА 1. ТЕОРЕТИЧЕСКИЕ И ИСТОРИЧЕСКИЕ АСПЕКТЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ

Исторические аспекты развития языков программирования

Существует достаточно большое количество различных генеалогических деревьев, описывающих то, как возникали те или иные формальные языки. Например, некоторые источники приводят такое генеалогическое дерево языков программирования[1]:

Рисунок 1. Генеалогическое дерево языков программирования[2]

Такое разнообразие объясняется тем, что языков программирования было создано огромное количество[3], в котором хоть и выделяют несколько семейств, но у авторов может различаться мнение по поводу того, какой язык считается основоположником или лучшим образцом семейства.

Каждые семейство может представлять собой различный подход к программированию, однако идеи некоторых языков (например LISP[4]) трансформировались спустя десятилетия. Некоторые языки встраивались в другие языки, с определенными изменениями (к примеру, в современном языке C++[5] реализованы ассемблерные вставки, которые предоставляют дополнительные возможности для оптимизации кода или взаимодействия с внешними устройствами).

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

Низкоуровневые языки. Ассемблер и его реализация

Ассемблер, не будучи первым языком программирования (таковым принято считать Планкалкюль Конрада Цузе), является первым языком программирования, который был реализован на реальном вычислительном устройстве[6]. Первая реализация ассемблера была запрограммирована на Electronic Delay Storage Automatic Calculator в 1949г. Последующие реализации включают в себя реализацию Натаниела Рочестера для IBM701, а также реализацию Стена Поли для IBM650.

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

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

<операция> <параметры операции, через запятую>[7]

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

Чтобы проиллюстрировать это утверждение, к примеру архитектура процессоров x86 поддерживает операцию MOV, которая в зависимости от параметров может производить чтение из оперативной памяти в регистр, а также запись в оперативную память из регистра, а также задавать адрес в виде суммы регистра и смещения[8]. Однако при этом некоторые RISC-процессоры не поддерживают эту операцию, заменяя еѐ парой операций ST, LD, которые осуществляют запись и чтение по адресу из оперативной памяти. Таким образом, каждая реализация ассемблера может иметь свои операции, используемые для конкретного процессора.

Более того, набор регистров может отличаться в зависимости от процессора, чего ассемблер может не учитывать[9].

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

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

К примеру, в FASM макрос записывается так: <имя макроса> macro <список параметров> <список команд>endm[10].

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

Со временем, в ассемблере стали появляться, конструкции, упрощающие работу с структурным программированием, объявление структур, процедуры, однако под «классическим» ассемблером, понимается именно непосредственный набор директив объявления данных, а также набор команд[11].

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

К недостаткам ассемблера стоит отнести то, что каждая архитектура процессора, и, после возникновения операционной системы, ОС требует своей реализации ассемблера[12]. Также к недостаткам стоит отнести недостаточную абстракцию, отсутствие простого способа записи арифметических выражений, сложную отладку, из-за того, что необходимо знать, какие данные какой регистр содержит в данный момент. Это усугубляется тем, что при отладке нет возможности узнать, как представлен тип в памяти компьютера, так как в «классическом» ассемблере нет простых обозначений для сложных типов (объединений, классов, перечислений).

Первые языки структурного программирования: Fortran и Algol

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

Первой реализацией можно считать реализацию языка Fortran в 1957г.[13], при этом концепция самого языка была создана в 1954-1955гг.

Первичная спецификация самого языка включала в себя 32 вида выражения: 15 управляющих конструкций, 13 конструкций для ввода-вывода, 3 специфицирующих конструкций и арифметическую конструкцию[14].

Кроме этого, в самом языке наличествует понятие констант, в том числе констант для описания чисел с плавающих запятой. Стоит понимать, что если описания чисел в ассемблере, в основном представляют собой целые числа (также строки в некоторых диалектах[15]), то, в случае, констант при лексическом разборе появляются условные конструкции для разбора частей после запятой; конструкций для описания экспоненциальной части, что существенно усложняет саму грамматику. Однако при этом появляется впервые возможность прямым образом описать числа с плавающей запятой и упростить программирование научных расчетов[16].

Кроме этого, в языке реализуется понятие переменной. Кодирование имени переменной производится по схеме, сходной с другим языком – Plankalkül, в котором кодирование семантического значения переменной происходит прямо в еѐ имени. Здесь же, подобно, целочисленные переменные (и переменные с фиксирующей точкой) описываются идентификаторами из цифр и букв, начинающиеся с I,J,K,L,M,N, а также переменные, описывающие числа с плавающей запятой, не могут с них начинаться[17]. Длина идентификатора при этом ограничена шестью символами, что может являться техническим ограничением для экономии оперативной памяти.

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

Функции в Fortran также имеют собственные конструкции. Кроме этого, в отличие от Assembler здесь впервые появляется библиотека встроенных функций, которая дает возможность сократить количество кода за счет их использования[18].

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

Управляющие конструкции в Fortran представляют собой выражения, приведенные ниже. Это безусловный переход (GO TO); условный переход, исходя из значения переменной по строкам; присвоение значения переменной; вычисляемый условный переход, исходя из значения переменной, где значение переменной должно указывать на ветку, по которой осуществляется переход; SENSE LIGHT – зажигает или отключает определенную лампу на консоли 704 (специальная консоль для устройства IBM704)[20]; IF (SENSE LIGHT i), IF(SENSE SWITCH) – переход, исходя из того, включена ли лампа Sense Light на консоли IBM704; проверки переполнения и деления на ноль; пауза; остановка машины и цикл DO[21].

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

Также в первичной реализации Fortran присутствует широкий набор для ввода и вывода, учтена возможность записи работы с магнитной лентой[22].

Спецификационные конструкции Fortran могут представлять собой объявление массива. Оно представляет собой такое же выражение, как и обращение к элементу, предваряемое словом DIMENSION. Другая конструкция, EQUIALENCE позволяет программисту контролировать местоположение переменных в сегментах и создавать объединения, когда несколько переменных указывают на один участок памяти[23].

Отдельно стоит отметить конструкцию FREQUENCY. Она позволяет задать вероятность исполнения той или иной ветки программы. Это могло быть необходимо, так как в случае процессора, это могло бы определить частоту переходов и за счет оптимизации предсказания переходов сократить время, затрачиваемое на переходы[24].

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

Другим языком, который в дальнейшем очень сильно повлиял на развитие языков программирования и языков для структурного программирования в частности является Алгол, изобретенный в 1958г. Данный разрабатывался комитетом по языку высокого уровня IFIP и позднее был усовершенствован в 1964-1968 годах[25].

При разработке данного языка впервые использовалась форма записи продукционных правил, в дальнейшем именуемая как БНФ – форма Бэкуса-Наура.

Данная форма описывается следующим образом:

<определяемый символ> ::= <посл.1> | <посл.2> | . . . | <посл.n>, где, посл.1, посл.2, посл. n — последовательности символов::= — разделяет левую и правую часть продукционных правил | — позволяет задать несколько последовательностей, соответствующих одному символу[26].

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

Помимо этого, были такие новшества в языке, как условная конструкция if…then, а также for и while, которые потом были использованы с теми или иными изменениями во всех существующих на текущий момент императивных языках.

Кроме этого, Алгол вводит понятие блока исполняемого кода, а также понятие процедуры, которое отсутствовало в изначальном стандарте Fortran[27].

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

Также впервые в Алгол появилось объявление типа данных переменной такое, как оно выглядит в современных языках программирования со статической типизацией в виде выражения «<тип переменной> <имя переменной>». Были описаны такие типы, как real, integer,array, boolean и другие.

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

Однако определяемых императивных создания кода, типизация переменных и наличие полноценных функций, пользователем дали существенный толчок к развитию языков программирования и возможностей более быстрого в дальнейшем, идеи языков Алгол и Fortran получили развитие в других языках структурного программирования[28].

Языки структурного программирования. Возникновение ООП

Еще одним языком, который, был положен в основу многих других языков структурного программирования, является изобретенный в 1964г. Т. Курцем и Дж. Кемени, Basic[29]. Данный язык задумывался как инструмент, с помощью которого студенты, не знакомые изначально с программированием могли самостоятельно создавать программы для решения несложных задач. Изначально язык был реализован на мейнфрейме GE-265.

В основу нового языка были положены такие принципы, как[30]:

- простота в использовании для начинающих; нацеленность на разработку программ общего назначения; присутствие возможности расширения функциональности; интерактивность; ясность в сообщениях об ошибках;

- быстрая работа в случае малых программ; отсутствие знания аппаратного обеспечения целевой платформы; защита пользователя от небезопасных команд, ОС.

Именно, в Basic впервые был поставлен вопрос о защите пользователя от операционной системы, т.е. построении такой семантической модели, при которой пользовать не мог бы совершить неверное действие. Кроме этого, впервые был поставлен вопрос о том, как изолировать пользователя от аппаратного обеспечения, предоставив ему возможности, не зависящие от машины, на которой будет исполняться программа. Таким образом, программист на BASIC мог уже не думать о возможностях, предоставляемых машиной и программировать с учетом текущей машины[31].

В отличие от языков Алгол и Fortran, программа на BASIC в изначальном варианте могла иметь всего два вида управляющих операторов – проверку условия и цикл FOR, который мог иметь специальный параметр, указывающий на то, как будет инкрементироваться счетчик. Отчасти, это можно считать предшественником более поздней структуры цикла с подсчетом в языке C: «for(<инициализация счетчика>;<условие завершения цикла>;<действие перед переходом на следующую итерацию>)»[32].

Также в языке присутствовал довольно небольшой набор математических функций и поддержка массивов[33].

Впоследствии данный язык довольно бурно развивался, в нем появлялась поддержка разбиения на модули и, впоследствии, поддержка ООП. Самая последняя версия языка реализована на платформе .NET CLR и дает доступ к огромному набору функций и объектов, позволяя реализовывать современные методы вычисления.

Также в 1959 году был разработан другой довольно популярный язык программирования - COBOL. Название языка (COmmon Business Oriented Language) указывает на ориентацию языка для описания бизнес-приложений[34].

Кобол хотя и подвергается критике за довольно длинные и многословные конструкции по праву считается языком, на котором написано огромное количество программ. К примеру, по информации журнала Dr. Dobbs в 1997 году 90 % финансовых транзакций в мире обрабатывалось программами на COBOL, а общая стоимость кода на COBOL имеет цену порядка двух триллионов долларов[35].

Почему же Кобол стал образцом языка, на котором все конструкции обладают громоздкостью?

Дело в том, что во многих компьютерных лингвистах и программистах имелась и имеется идея некого «literate programming», т.е. такого подхода к программированию, при котором код программы пишется на естественном языке, а компьютер его исполняет в точности так, как указывает пользователь[36]. Если не вдаваться в подробности, то у данной идеи существуют такие проблемы, как большая сложность разбора естественного языка, которая зависит от самого языка, неполнота спецификаций программы, которая может быть дана программистом, а также сам процесс трансляции спецификации в конечную программу. Этот процесс, который в производственном процессе выполняет программист-кодировщик, представляет собой сложную нетривиальную проблему, которая не решена до сих пор.

Однако, создатели COBOL решили максимально приблизить конструкции к английскому языку, таким образом частично решив данную задачу. Таким образом, некоторые конструкции языка COBOL могут быть интерпретированы, как примитивные предложения на английском языке (EXIT PROGRAM, DISPLAY ―STRING‖)[37]

Также, именно COBOL стал первым языком, в котором появился тип данных record, т.е. запись или структура, которая могла включать в себя поля различных типов. Таким образом, появилась возможность обрабатывать данные, состоящие уже из нескольких компонентов.

Еще одним популярным языком структурного программирования стал язык программирования Си, разработанный в 1969-1973г[38].

Первоначально данный язык был разработан для реализации операционной системы UNIX, но, потом, был портирован на довольно большое количество других платформ. Благодаря возможности использования его в качестве высокоуровневого ассемблера, этот язык получил широкое применение при создании системного программного обеспечения и прикладного программного обеспечения для решения широкого круга задач. При этом необходимо понимать, что ключевым фактором, обеспечившим долгосрочное применение данного языка была его скорость, которая в последнее время стала обеспечиваться применением оптимизирующего компилятора, запускающего порой сложные оптимизации[39].

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

Классический компилятор Си, включал помимо обычных возможностей высокоуровневого языка тех времен, структуры, как в COBOL, поддержку длинного целого, целое без знака, операторы, которые позволяли записать коротко увеличение переменной, уменьшение, умножение и.т.п[40]. После этого в стандарт, также были добавлены функции, не возвращающие значение, указатели, не имеющие типа, функции, возвращающие объединения и структуры, присваивания структур, спецификатор констант стандартная библиотека, включающая довольно большое число различных функций и тип числа с плавающей запятой одинарной точности.

Стоит отметить, что таблица приоритетов различных операций в языке Си довольно неоднородна и также включает в себя 17 различных приоритетов, в связи с нетривиальной работой с памятью[41].

Такой широкий набор операций – от набора операций для работы с памятью, которые можно отнести к низкоуровневым, стандартной библиотеки, которая иногда содержала в себе, довольно низкоуровневые операции, а также высокоуровневые конструкции для управления потоком исполнения обеспечили языку серьезную популярность[42].

Такое разнообразие объясняется тем, что хоть язык Си можно лишь частично назвать потомком Алгол и Fortran в синтаксическом смысле, так как его непосредственным предком является B. B в свою очередь - потомок языков BCPL и CPL, которые были предназначены для программирования ОС. Предкам Си не хватало возможностей высокоуровневых языков и эта проблема была решена в его реализации[43].

Тем не менее, со временем в программах появились ситуации, когда структуры имели свой набор операций, который зависел от типа структур. И даже некоторые структуры могли иметь внутри себя некоторые указатели, которые в зависимости от ситуации могли указывать на дополнительные подпрограммы, таким образом, реализуя некий новый уровень абстракции. Со временем появилась идея объектов, которые включали в себя структуру данных и набор операций над ними. Впервые, еѐ выдвинул Иван Сазерленд, в своей программе - Планшет. В нем присутствовала система выпадающих меню и поддержка светового пера, путем применения которого было возможно рисование несложных примитивов, их перемещение и хранение[44].

Понятие класса у Сазерленда отождествлялось с определением "мастера", а объект именовался экземпляром "мастера". Таким образом, появились первые предпосылки возникновения первых объектно-ориентированных языков.

1.5 Языки объектно-ориентированного программирования

Simula-67 считается первым языком программирования с поддержкой объектов[45]. Он был разработан сотрудниками Норвежского Вычислительного Центра Кристеном Нюгордом и Оле-Йоханом Далем для моделирования сложных систем. Изначально она позиционировалась как объектное расширение языка Algol[46].

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

Однако, именно в нем появилась конструкция объявления класса, как набора данных и функций для связи с ними[47]. Она выглядит так, как показано ниже.

class order(number); integer number;

begin integer batch_size;

real setup_time;

end;

Пример, указанный выше объявляет несложный класс order, характеризующийся целочисленным полем number и двумя полями: batch_size и setup_time[48].

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

Этот язык сильно опередил своѐ время, современники были не готовы к возможностям языка Simula-67. В конечном итоге, он не смог конкурировать с другими языками программирования (прежде всего, с языком Fortran)[49].

Отчасти проблема заключается в том, что в нем присутствовала сборка мусора. Нужно понимать, что согласно последним данным для быстрой сборки мусора нужна память в 4-8 раз большая чем память, требуемая программе. Учитывая тот факт, что машинная реализация была не самой эффективной, а сборка мусора дополнительно замедляла программу, то Simula-67 заслужил прохладное к себе отношение у программистов[50].

Другим языком, с которого как считается, появилось объектно-ориентированное программирование, является разработанный Аланом Кеем в 70-х гг. Smalltalk.

Рассмотрим основные идеи Smalltalk.

В Smalltalk всѐ является объектом, даже такие единицы языка в некоторых реализациях, а также аппаратные объекты (стек и память). При этом программа состоит из посылок сообщений между объектов, в которых объект, принимающий сообщение может определить, правильно ли сообщение и как оно должно быть обработано[51].

Само собой при этом, эти объекты могут быть изменены. Если программист хочет изменить среду, в которой производится разработка, он может сделать это прямо во время работы. Если программисту необходима в языке какая-то новая единица синтаксиса, он может запрограммировать еѐ и она станет доступна в системе.

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

Особенно успешным оказался другой язык — Pascal. Автором его является Никлаус Вирт, участвовавший в разработке стандарта языка Алгол. Паскаль был создан в 1968-1969 году[52].

Первая публикация Вирта о языке датирована 1970 годом. Сам Никлаус Вирт ставил целью его создания — построение небольшого и эффективного языка. Данный язык должен был поспособствовать хорошим на тот момент практикам программирования с использованием структур[53].

Необходимо отметить, что сам Паскаль не был объектно-ориентированным языком. Объектное его расширение появилось лишь в 1986 году, когда фирма Apple, а конкретно Ларри Теслер и его группа разработали Object Pascal. Позднее объектная модель появилась и в других реализациях Pascal, одной из которых является популярная до сих пор реализация Turbo Pascal.

В Object Pascal классы задавались с помощью встроенного типа object. Данный тип мог содержать поля данных, а также методы, которые представлялись процедурами и функциями, имена которых шли после имени класса. Конструктор задавался как процедура с именем constructor, а деструктор - destructor. Соответственно, деструкторов могло быть несколько, и они могли иметь параметры. Поддерживались наследование (не множественное), приницип подстановки Барбары Лисков и динамические методы[54].

Другим достаточно интересным подходом к реализации является, реализованная на основе языка LISP (который будет рассмотрен позднее) система объектно-ориентированного программирования CLOS.

CLOS имеет много особенностей. Это и перегрузка с множественной диспетчеризацией, когда реализация определяется всеми аргументами, Это и группировка методов в «обобщѐнные функции»[55], так как методы не принадлежат классам, и исходя из этого - открытость.

CLOS является динамическим языком. В нем структура объектов может быть изменена при исполнении, к примеру могут быть добавлены и удалены методы класса. CLOS поддерживает смену класса любого экземпляра при помощи конструкции CHANGE-CLASS. Кроме этого, CLOS поддерживает множественное наследование.

Данные языки заложили очень важные концепции развития объектно-ориентированного программирования. После них было огромное количество других языков, также позволяющих работать с объектами, но концептов нового уровня они уже не вносили[56]. Конечно, определенным развитием объектно-ориентированного программирования можно считать аспектно-ориентированное программирование, когда моделируются аспекты системы или компонентно-ориентированное программирования, когда моделируются системы в целом. Однако стоит понимать, что изнутри они представляют из себя те же объекты, с более мощными средствами валидации моделей, а также средствами интроспекции[57].

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

В принципе довольно сложно рассмотреть большое количество языков. Современное время породило их огромное количество, и следовательно их обзор может занять довольно большое время. Однако можно рассмотреть основные тенденции их развития.

Одной из тенденций является потребность в решении более сложных и разнообразных задач. Мы уже говорили о том, как появилось аспектное и компонентно-ориентированные стили программирования. Стоит отметить, что при таком условии появляется требование открытости инфраструктуры языка (примером которого служат системы CLOS и Smalltalk)[58]. Современные языки предоставляют возможности препроцессора и шаблонирования, когда одни классы, являются параметрами для других, таким образом повышая уровень абстракции программы. Также возникает возможность подменять реализации уже существующих процедур (к примеру реализация monkey-patching в Ruby).

Требование портируемости кода между платформами, привело к развитию отделения синтаксиса от аппаратной реализации для языков системного программирования и появлению виртуальных машин для языков программирования бизнес-приложений. Что же касается, современных языков для разработки бизнес-приложений, то здесь хорошо себя зарекомендовали виртуальные машины Java (Java, Ceylon, Kotlin, Xtend, Clojure и др.) и .Net (C#, F#, Visual Basic, Delphi), вокруг которых были построены целые плеяды языков[59].

Кроме этого, рост числа процессоров привел к тому, что большинство языков имеют возможности для работы с недетерминированным исполнением команд (потоки). Одним из таких языков стал набирающий популярность в последнее время – Erlang[60].

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

Erlang отчасти демонстрирует еще одну тенденцию в современных языках программирования – уход от концепции объектно-ориентированного программирования в сторону функционального.

Примером такого ухода является рост в последние годы популярности языков LISP и Haskell.

Лисп (LISP, Lisp) представляет собой целую пляду языков программирования. В LISP программы и данные едины и представляют системы списков символов. Создатель Лиспа — Джон Маккарти[61]. Синтаксис данного языка довольно прост и содержит в себе лишь так называемые s-expressions — выражения, разделяемые пробелами и отделяемые друг от друга лишь скобками, в которых сами выражения и заключены. Однако, семантическая сторона последовательности вычисления выражений ничем не ограничена, и исходя из этого он позволяет просто конструировать даже довольно сложные системы[62].

Другим таким языком является Haskell — функциональный язык программирования, позиционирующий себя как «чистый», т.е. лишенный нежелательных побочных эффектов, которые могут запутать программиста[63].

Имеет поддержку отложенных вычислений, которой помогает автоматический вывод типов, основанный системе Хиндли-Милнера и представляющий собой мощный инструмент для создания управляющих структур[64].

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

ГЛАВА 2. КРИТЕРИИ ВЫБОРА СРЕДЫ И ЯЗЫКА РАЗРАБОТКИ ПРОГРАММ

2.1 Языки программирования, особенности и критерии отбора

Отбор языка программирования, как правило, определяется тремя важными условиями:

· Собственно характеристиками, особенностями самого языка;

· Наличием удобного, доступного к использованию среды программирования;

· Наличие методической поддержки[65].

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

Под назначением понимают специфику задач, к выполнению которых можно применять язык программирования. Кроме языков программирования общего назначения существуют языки, разработанные специально для веб-программирования, поддержки баз данных, построения систем искусственного интеллекта и другие[66]. К отдельной категории следует отнести чисто учебный язык программирования.

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

Распространенность указывает в основном на популярность того или иного языка. Языки программирования в процессе эволюции наследовали друг от друга правила написания и оформления программ, закономерности использования и названия команд. Эти правила и договоренности, с определенным уточнением, можно отнести к синтаксису языка программирования. Среди языков программирования, традиционно используются для обучения, можно, достаточно не строго, по сходству между собой, выделить три наиболее распространенных разновидности синтаксис[68]:

1) синтаксис языков Basic и Visual Basic;

2) как Pascal и Delphi;

3) синтаксис языков, подобных языка C (C ++, C #, PHP, Java и др.) [1.10].

Наряду с этим есть много специально разработанных учебных языков программирования. Некоторые из учебных языков достаточно развиты и носят универсальный характер: НАМ (учебный алгоритмический язык), Рапида. Есть и такие, которые используются для решения незначительного количества учебных задач, в частности Лого (черепаховая графика)[69]. В языках программирования, в какой-то степени, можно считать наборы и правила использования команд управления исполнителями в учебных средах «Ступеньки к информатике» и «Сокровищница знаний». Каждая из учебных языков, как правило, имеет свой специфический синтаксис и набор команд.

Для синтаксиса всех без исключения языков программирования важны такие общие характеристики, как понятность, гибкость, простота[70]. Отдавая предпочтение тому или иному синтаксиса, следует учитывать, что хотя в целом синтаксис языков подобный синтаксиса языка С, несколько сложнее, остальные разновидностей синтаксиса языков программирования не столь широко используются в профессиональной деятельности. Проблема перехода с учебной на профессиональный язык программирования является актуальной для большинства специалистов по разработке программного обеспечения. Использование в обучении языков программирования с «С-образным синтаксисом»[71] позволяет практически избежать проблем такого перехода.

2.2 Среды программирования, особенности и критерии отбора

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

Важные характеристики сред[72]:

· Распространенность (массовость, распространенность)

· Доступность (условия распространения, стоимость, условия оплаты)

· Особенности интерфейса (общая понятность, простота, принадлежность к тому или иному типу)

· Способ реализации (компиляция или интерпретация)

· Системные требования (аппаратные и программные).

Из всех приведенных характеристик стоит остановиться на особенностях интерфейса. Интерфейс должен соответствовать требованиям удобства и понятности[73]. Те или иные особенности интерфейса могут быть по-разному использованы в процессе обучения. Простой, традиционный интерфейс очень часто оказывается более методично целесообразным, а отсутствие некоторых функций может даже способствовать лучшему освоению тех или иных особенностей программирования[74]. Наряду с этим сложный многофункциональный интерфейс может отвлекать от выполнения основных задач.

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

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

Для некоторых языков программирования существуют специальные, упрощенные учебные версии. Особенно удобны такие речи и разработаны для них среды программирования для знакомства с програмотворенням школьников младшего и среднего школьного возраста[76]. Примерами таких языков программирования и сред является упрощенная версия языка Pasсal, реализованная в среде «Алгоа» и упрощенная версия языка Visual Basic - среда Small Basic. Как указано на официальной странице Small Basic: «Microsoft Small Basic - система, которая пытается сделать программирования понятным для начинающих»[77]. Разработчики, кроме простоты и доступности, отмечают главное преимущество Small Basic - его современность.

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

Например, осуществим общее сравнения, охарактеризуем пригодность языков программирования C # и Pascal.

Первое, что различает эти языки это то, что язык программирования Pascal создавалась как процедурная, а C # (читается «Си шарп») - как объектно-ориентированный. Для языка Pascal существует ее диалект Object Pascal, поддерживающий технологию объектного программирования. Однако использование этого языка значительно усложняет полноценное обучение объектно-ориентированного программирования. К тому же синтаксис Pascal мало используется в профессиональном написании программ. Нынешняя популярность языка Pascal обусловлена ​​тем, что она была специально разработана как учебная и с мощным методическим обеспечением, которое накопилось в течение долгих лет ее использования в школах и вузах разных стран[79].

Создавая новый язык C #, ее разработчики значительно усовершенствовали именно синтаксис языка С ++. Бытует мнение, что язык C # достаточно проста в восприятии и чрезвычайно удобна как для профессионального программирования, так и для обучения его основ. Язык полностью объектно-ориентированный. Однако методическая поддержка для C # пока недостаточно[80].

Прежде всего отсутствие надлежащей методической поддержки, при всех преимуществах языка C #, не позволяет утверждать о безоговорочной целесообразность ее использования в качестве средства обучения[81].

Рассмотрим возможности отбора среды программирования для языков Pascal и C #. Язык программирования Pascal сейчас в основном изучают с использованием таких сред как Turbo Pascal версий 5.0 и 7.0, Free Pascal различных версий, Pascal ABC, Pascal ABC.Net, Delphi. Сейчас наиболее широко используются среды Turbo и Free Pascal, несмотря на то, что они разработаны для морально устаревших операционных систем типа DOS. Эти среды нормально работают под управлением Windows XP, хотя и не поддерживают многих его возможностей. Среда Delphi не имеет свободно распространяемых версий, среда ABC Pascal опирается на специфический диалект языка Pascal и нет, возможно пока, средств визуального программирования[82]. Поддерживаемая Microsoft язык C # обеспечена достаточным количеством сред разработки, ориентированных на современные и популярные операционные системы Windows XP, Windows Vista, Windows 7. Однако, несмотря на сравнительную новизну и привязывается связи к программной платформы Microsoft .Net Framework, существуют среды программирования, позволяющие создавать программы на языке C # как для уже архаического семейства операционных систем Windows 9x, так и для свободно распространяемого Linux (платформа Mono). Наряду с этим, программы для C # можно не только создавать в текстовом редакторе, но и компилировать из командной строки на любом компьютере, где установлен платформу Microsoft .Net.

Сейчас наиболее распространены такие среды разработки на языке C #[83]:

-· Microsoft Visual Studio Professional 2008, что бесплатно доступно как пробная 90-дневная версия;

-· Microsoft Visual C # 2008 Express Edition. Бесплатная практически полнофункциональная версия, отличающаяся от профессиональной лишь незначительным ограничением функций и неполным библиотеками классов;

-· Sharp Develop - бесплатное, независимое среда разработки на языке C #;

-· Borland C # Editor - среда разработки от фирмы Borland;

-· Antechinus С # Editor - среда, работает с любыми версиями Microsoft .Net Framework (даже Framework 1.0) и под управлением операционных систем семейства Windows 9х. Antechinus С # Editor также совместим с современными системами Windows XP, Windows Vista, Windows Seven[84].

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

ЗАКЛЮЧЕНИЕ

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

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

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

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

Также можно сказать, что на данный момент лидирующую позицию среди языков программирования занимает C ++.

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

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

БИБЛИОГРАФИЯ

Описания произведения из многотомного издания

1. Воройский Ф.С. Информатика. Энциклопедический систематизированный словарь-справочник: введение в современные информационные и телекоммуникационные технологии в терминах и фактах. – 4-е изд. – М.: Физматлит, 2017. – 965 с.

Описание книг одного-трех авторов

2.Аткинсон Л. MySQL. Библиотека профессионала: Монография. – М.:Вильямс, 2015. – 406 с.

3. Вирт Н., Паскаль Паскаль Й. К.. Руководство для пользователя и описание языка / Н. Вирт, Й. К. Паскаль. — М.: Финансы и статистика, 2014. — С. 151.

4. . Бенкен Е.С. PHP, MySQL, XML. Программирование для Интернета. СПб.: изд-во БХВ-Петербург, 2016 г. – 304 с.

5. Ворожцов А.В. Языки программирования в школе / А. В. Ворожцов. // «Потенциал», №3 — М., 2015.

6. Дронов В.А. PHP, MySQL, HTML5 и CSS 3. Разработка современных динамических Web-сайтов. – Спб.: BHV, 2016. – 688 c.

7. Дунаев В. Основы WEB-дизайна. СПб.: изд-во БХВ-Петербург, 2014 г. - 504 с

8. Душкин Р . В. Функциональное программирование на языке Haskell / Гл.ред. Д. А. Мовчан;. — М.: ДМК Пресс,, 2018. — 544 с.

9. Зандстра, М. PHP. Объекты, шаблоны и методики программирования. Перевод с англ.: Тригуб С. М.: изд-во Вильямс, 2015 г. – 560 с.

10. Информационные технологии. Теория и практика. История языков программирования [Электронный ресурс]. — Режим доступа: http://arxweb.net/load/shablony_i_blanki/istorija_jazykov_programmirovanija/3-1-0-46.

11. Колисниченко Д.Н. Профессиональное программирование на PHP: Монография. – М.: ООО «Бином» , 2017. – 512 с.

12. Котеров Д., Костаревы А. PHP 5 в подлиннике. Санкт-Петербург: Изд-во БХВ-Петербург, 2015. – 287 с.

13. Кузнецов М.В., Симдянов И.В. Самоучитель PHP. – 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2016. – 138 с.

14. Кузнецов, М. В. Практика создания Web-сайтов / М. В. Кузнецов, И. В. Симдянов. - 2-е изд., перераб. и доп. - СПб.: БХВ-Петербург, 2015. - 164 с.

15. Матросов А. и др. HTML 4.0 в подлиннике. Санкт-Петербург: Издво БХВ-Петербург, 2016. – 319 с.

16. Олифер В.Г., Олифер Н.А. Компьютерные сети. Принципы, технологии,протоколы: Учебник для ВУЗов. 4-е изд. – Спб.: Питер, 2016. – 944 с.

17. Саак А.Э., Пахомов Е.В., Тюшняков В.Н. Информационные технологии управления. Учебник для вузов. – Спб.: Питер, 2015. – 320 с

18. Себеста Р. У. Объектно-ориентированное программирование: язык Smalltalk / Себеста Р.У. // Основные концепции языков программирования. — 5-е изд. — М.: Вильямс, 2015.— 672 с.

19. Севостьянов И.О., Кудрявцев С.Н. SEO для клиента. Разработка сайтов. Контекстная реклама. Социальные медиа. Оценка эффективности. – Спб.: Питер, 2016 – 272 с

20. Фленов М. PHP глазами хакера. Санкт-Петербург: Изд-во БХВПетербург, 2015. – 221 С.

  1. Информационные технологии. Теория и практика. История языков программирования [Электронный ресурс]. — Режим доступа: http://arxweb.net/load/shablony_i_blanki/istorija_jazykov_programmirovanija/3-1-0-46.

  2. Ворожцов А.В. Языки программирования в школе / А. В. Ворожцов. // «Потенциал», №3 — М., 2015.

  3. Вирт Н., Паскаль Паскаль Й. К.. Руководство для пользователя и описание языка / Н. Вирт, Й. К. Паскаль. — М.: Финансы и статистика, 2014. — С. 151.

  4. Себеста Р. У. Объектно-ориентированное программирование: язык Smalltalk / Себеста Р.У. // Основные концепции языков программирования. — 5-е изд. — М.: Вильямс, 2015.— 672 с.

  5. Душкин Р . В. Функциональное программирование на языке Haskell / Гл.ред. Д. А. Мовчан;. — М.: ДМК Пресс,, 2018. — 544 с.

  6. Саак А.Э., Пахомов Е.В., Тюшняков В.Н. Информационные технологии управления. Учебник для вузов. – Спб.: Питер, 2015. – 320 с

  7. Кузнецов М.В., Симдянов И.В. Самоучитель PHP. – 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2016. – 138 с.

  8. Аткинсон Л. MySQL. Библиотека профессионала: Монография. – М.:Вильямс, 2015. – 406 с.

  9. Колисниченко Д.Н. Профессиональное программирование на PHP: Монография. – М.: ООО «Бином» , 2017. – 512 с.

  10. Дронов В.А. PHP, MySQL, HTML5 и CSS 3. Разработка современных динамических Web-сайтов. – Спб.: BHV, 2016. – 688 c.

  11. Севостьянов И.О., Кудрявцев С.Н. SEO для клиента. Разработка сайтов. Контекстная реклама. Социальные медиа. Оценка эффективности. – Спб.: Питер, 2016 – 272 с

  12. Олифер В.Г., Олифер Н.А. Компьютерные сети. Принципы, технологии,протоколы: Учебник для ВУЗов. 4-е изд. – Спб.: Питер, 2016. – 944 с.

  13. Саак А.Э., Пахомов Е.В., Тюшняков В.Н. Информационные технологии управления. Учебник для вузов. – Спб.: Питер, 2015. – 320 с

  14. Кузнецов М.В., Симдянов И.В. Самоучитель PHP. – 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2016. – 138 с.

  15. Воройский Ф.С. Информатика. Энциклопедический систематизированный словарь-справочник: введение в современные информационные и телекоммуникационные технологии в терминах и фактах. – 4-е изд. – М.: Физматлит, 2017. – 965 с.

  16. Вирт Н., Паскаль Паскаль Й. К.. Руководство для пользователя и описание языка / Н. Вирт, Й. К. Паскаль. — М.: Финансы и статистика, 2014. — С. 151.

  17. Аткинсон Л. MySQL. Библиотека профессионала: Монография. – М.:Вильямс, 2015. – 406 с.

  18. Информационные технологии. Теория и практика. История языков программирования [Электронный ресурс]. — Режим доступа: http://arxweb.net/load/shablony_i_blanki/istorija_jazykov_programmirovanija/3-1-0-46.

  19. Воройский Ф.С. Информатика. Энциклопедический систематизированный словарь-справочник: введение в современные информационные и телекоммуникационные технологии в терминах и фактах. – 4-е изд. – М.: Физматлит, 2017. – 965 с.

  20. Кузнецов, М. В. Практика создания Web-сайтов / М. В. Кузнецов, И. В. Симдянов. - 2-е изд., перераб. и доп. - СПб.: БХВ-Петербург, 2015. - 164 с.

  21. Севостьянов И.О., Кудрявцев С.Н. SEO для клиента. Разработка сайтов. Контекстная реклама. Социальные медиа. Оценка эффективности. – Спб.: Питер, 2016 – 272 с

  22. Олифер В.Г., Олифер Н.А. Компьютерные сети. Принципы, технологии,протоколы: Учебник для ВУЗов. 4-е изд. – Спб.: Питер, 2016. – 944 с.

  23. Бенкен Е.С. PHP, MySQL, XML. Программирование для Интернета. СПб.: изд-во БХВ-Петербург, 2016 г. – 304 с.

  24. Дунаев В. Основы WEB-дизайна. СПб.: изд-во БХВ-Петербург, 2014 г. - 504 с

  25. Себеста Р. У. Объектно-ориентированное программирование: язык Smalltalk / Себеста Р.У. // Основные концепции языков программирования. — 5-е изд. — М.: Вильямс, 2015.— 672 с.

  26. Олифер В.Г., Олифер Н.А. Компьютерные сети. Принципы, технологии,протоколы: Учебник для ВУЗов. 4-е изд. – Спб.: Питер, 2016. – 944 с.

  27. Севостьянов И.О., Кудрявцев С.Н. SEO для клиента. Разработка сайтов. Контекстная реклама. Социальные медиа. Оценка эффективности. – Спб.: Питер, 2016 – 272 с

  28. Воройский Ф.С. Информатика. Энциклопедический систематизированный словарь-справочник: введение в современные информационные и телекоммуникационные технологии в терминах и фактах. – 4-е изд. – М.: Физматлит, 2017. – 965 с.

  29. Ворожцов А.В. Языки программирования в школе / А. В. Ворожцов. // «Потенциал», №3 — М., 2015.

  30. Душкин Р . В. Функциональное программирование на языке Haskell / Гл.ред. Д. А. Мовчан;. — М.: ДМК Пресс,, 2018. — 544 с.

  31. Колисниченко Д.Н. Профессиональное программирование на PHP: Монография. – М.: ООО «Бином» , 2017. – 512 с.

  32. Кузнецов, М. В. Практика создания Web-сайтов / М. В. Кузнецов, И. В. Симдянов. - 2-е изд., перераб. и доп. - СПб.: БХВ-Петербург, 2015. - 164 с.

  33. Бенкен Е.С. PHP, MySQL, XML. Программирование для Интернета. СПб.: изд-во БХВ-Петербург, 2016 г. – 304 с.

  34. Дунаев В. Основы WEB-дизайна. СПб.: изд-во БХВ-Петербург, 2014 г. - 504 с

  35. Дронов В.А. PHP, MySQL, HTML5 и CSS 3. Разработка современных динамических Web-сайтов. – Спб.: BHV, 2016. – 688 c.

  36. Зандстра, М. PHP. Объекты, шаблоны и методики программирования. Перевод с англ.: Тригуб С. М.: изд-в Вильямс, 2015 г. – 560 с.

  37. Зандстра, М. PHP. Объекты, шаблоны и методики программирования. Перевод с англ.: Тригуб С. М.: изд-в Вильямс, 2015 г. – 560 с.

  38. Кузнецов М.В., Симдянов И.В. Самоучитель PHP. – 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2016. – 138 с.

  39. Бенкен Е.С. PHP, MySQL, XML. Программирование для Интернета. СПб.: изд-во БХВ-Петербург, 2016 г. – 304 с.

  40. Зандстра, М. PHP. Объекты, шаблоны и методики программирования. Перевод с англ.: Тригуб С. М.: изд-в Вильямс, 2015 г. – 560 с.

  41. Саак А.Э., Пахомов Е.В., Тюшняков В.Н. Информационные технологии управления. Учебник для вузов. – Спб.: Питер, 2015. – 320 с

  42. Дунаев В. Основы WEB-дизайна. СПб.: изд-во БХВ-Петербург, 2014 г. - 504 с

  43. Кузнецов, М. В. Практика создания Web-сайтов / М. В. Кузнецов, И. В. Симдянов. - 2-е изд., перераб. и доп. - СПб.: БХВ-Петербург, 2015. - 164 с.

  44. Зандстра, М. PHP. Объекты, шаблоны и методики программирования. Перевод с англ.: Тригуб С. М.: изд-в Вильямс, 2015 г. – 560 с.

  45. Котеров Д., Костаревы А. PHP 5 в подлиннике. Санкт-Петербург: Изд-во БХВ-Петербург, 2015. – 287 с.

  46. Дунаев В. Основы WEB-дизайна. СПб.: изд-во БХВ-Петербург, 2014 г. - 504 с

  47. Олифер В.Г., Олифер Н.А. Компьютерные сети. Принципы, технологии,протоколы: Учебник для ВУЗов. 4-е изд. – Спб.: Питер, 2016. – 944 с.

  48. Вирт Н., Паскаль Паскаль Й. К.. Руководство для пользователя и описание языка / Н. Вирт, Й. К. Паскаль. — М.: Финансы и статистика, 2014. — С. 151.

  49. Бенкен Е.С. PHP, MySQL, XML. Программирование для Интернета. СПб.: изд-во БХВ-Петербург, 2016 г. – 304 с.

  50. Матросов А. и др. HTML 4.0 в подлиннике. Санкт-Петербург: Издво БХВ-Петербург, 2016. – 319 с.

  51. Котеров Д., Костаревы А. PHP 5 в подлиннике. Санкт-Петербург: Изд-во БХВ-Петербург, 2015. – 287 с.

  52. Кузнецов, М. В. Практика создания Web-сайтов / М. В. Кузнецов, И. В. Симдянов. - 2-е изд., перераб. и доп. - СПб.: БХВ-Петербург, 2015. - 164 с.

  53. Информационные технологии. Теория и практика. История языков программирования [Электронный ресурс]. — Режим доступа: http://arxweb.net/load/shablony_i_blanki/istorija_jazykov_programmirovanija/3-1-0-46.

  54. Котеров Д., Костаревы А. PHP 5 в подлиннике. Санкт-Петербург: Изд-во БХВ-Петербург, 2015. – 287 с.

  55. Бенкен Е.С. PHP, MySQL, XML. Программирование для Интернета. СПб.: изд-во БХВ-Петербург, 2016 г. – 304 с.

  56. Кузнецов, М. В. Практика создания Web-сайтов / М. В. Кузнецов, И. В. Симдянов. - 2-е изд., перераб. и доп. - СПб.: БХВ-Петербург, 2015. - 164 с.

  57. Дунаев В. Основы WEB-дизайна. СПб.: изд-во БХВ-Петербург, 2014 г. - 504 с

  58. Дронов В.А. PHP, MySQL, HTML5 и CSS 3. Разработка современных динамических Web-сайтов. – Спб.: BHV, 2016. – 688 c.

  59. Душкин Р . В. Функциональное программирование на языке Haskell / Гл.ред. Д. А. Мовчан;. — М.: ДМК Пресс,, 2018. — 544 с.

  60. Колисниченко Д.Н. Профессиональное программирование на PHP: Монография. – М.: ООО «Бином» , 2017. – 512 с.

  61. Воройский Ф.С. Информатика. Энциклопедический систематизированный словарь-справочник: введение в современные информационные и телекоммуникационные технологии в терминах и фактах. – 4-е изд. – М.: Физматлит, 2017. – 965 с.

  62. Котеров Д., Костаревы А. PHP 5 в подлиннике. Санкт-Петербург: Изд-во БХВ-Петербург, 2015. – 287 с.

  63. Матросов А. и др. HTML 4.0 в подлиннике. Санкт-Петербург: Издво БХВ-Петербург, 2016. – 319 с.

  64. Себеста Р. У. Объектно-ориентированное программирование: язык Smalltalk / Себеста Р.У. // Основные концепции языков программирования. — 5-е изд. — М.: Вильямс, 2015.— 672 с.

  65. Вирт Н., Паскаль Паскаль Й. К.. Руководство для пользователя и описание языка / Н. Вирт, Й. К. Паскаль. — М.: Финансы и статистика, 2014. — С. 151.

  66. Колисниченко Д.Н. Профессиональное программирование на PHP: Монография. – М.: ООО «Бином» , 2017. – 512 с.

  67. Саак А.Э., Пахомов Е.В., Тюшняков В.Н. Информационные технологии управления. Учебник для вузов. – Спб.: Питер, 2015. – 320 с

  68. Ворожцов А.В. Языки программирования в школе / А. В. Ворожцов. // «Потенциал», №3 — М., 2015.

  69. Себеста Р. У. Объектно-ориентированное программирование: язык Smalltalk / Себеста Р.У. // Основные концепции языков программирования. — 5-е изд. — М.: Вильямс, 2015.— 672 с.

  70. Кузнецов М.В., Симдянов И.В. Самоучитель PHP. – 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2016. – 138 с.

  71. Информационные технологии. Теория и практика. История языков программирования [Электронный ресурс]. — Режим доступа: http://arxweb.net/load/shablony_i_blanki/istorija_jazykov_programmirovanija/3-1-0-46.

  72. Ворожцов А.В. Языки программирования в школе / А. В. Ворожцов. // «Потенциал», №3 — М., 2015.

  73. Матросов А. и др. HTML 4.0 в подлиннике. Санкт-Петербург: Издво БХВ-Петербург, 2016. – 319 с.

  74. Севостьянов И.О., Кудрявцев С.Н. SEO для клиента. Разработка сайтов. Контекстная реклама. Социальные медиа. Оценка эффективности. – Спб.: Питер, 2016 – 272 с

  75. Аткинсон Л. MySQL. Библиотека профессионала: Монография. – М.:Вильямс, 2015. – 406 с.

  76. Олифер В.Г., Олифер Н.А. Компьютерные сети. Принципы, технологии,протоколы: Учебник для ВУЗов. 4-е изд. – Спб.: Питер, 2016. – 944 с.

  77. Дронов В.А. PHP, MySQL, HTML5 и CSS 3. Разработка современных динамических Web-сайтов. – Спб.: BHV, 2016. – 688 c.

  78. Матросов А. и др. HTML 4.0 в подлиннике. Санкт-Петербург: Издво БХВ-Петербург, 2016. – 319 с.

  79. Воройский Ф.С. Информатика. Энциклопедический систематизированный словарь-справочник: введение в современные информационные и телекоммуникационные технологии в терминах и фактах. – 4-е изд. – М.: Физматлит, 2017. – 965 с.

  80. Севостьянов И.О., Кудрявцев С.Н. SEO для клиента. Разработка сайтов. Контекстная реклама. Социальные медиа. Оценка эффективности. – Спб.: Питер, 2016 – 272 с

  81. Котеров Д., Костаревы А. PHP 5 в подлиннике. Санкт-Петербург: Изд-во БХВ-Петербург, 2015. – 287 с.

  82. Аткинсон Л. MySQL. Библиотека профессионала: Монография. – М.:Вильямс, 2015. – 406 с.

  83. Котеров Д., Костаревы А. PHP 5 в подлиннике. Санкт-Петербург: Изд-во БХВ-Петербург, 2015. – 287 с.

  84. Севостьянов И.О., Кудрявцев С.Н. SEO для клиента. Разработка сайтов. Контекстная реклама. Социальные медиа. Оценка эффективности. – Спб.: Питер, 2016 – 272 с