Лекция
Это окончание невероятной информации про классификация языков программирования.
...
большинстве случаев вынуждены исполняться медленнее, чем языки первого порядка. Причины лежат как в самой декомпозиции линейного кода на цепочку вложенных вызовов, так и в вытекающих особенностях низкоуровневого представления функций (см. замыкание) и данных (обернутое (англ. boxed), теговое). Однако существуют техники агрессивной оптимизации программ, позволяющие редуцировать языки высшего порядка до языков первого порядка (см. дефункциализация[en], MLton, Stalin Scheme[en]).
Трудно определить, какой язык программирования наиболее популярен, так как значение слова «популярность» зависит от контекста (в английском языке используется термин «usage», имеющий еще более размытое значение). Один язык может отнимать наибольшее количество человеко-часов, на другом написано наибольшее число строк кода, третий занимает наибольшее процессорное время, а четвертый наиболее часто служит исследовательской базой в академических кругах. Некоторые языки очень популярны для конкретных задач. Например, Кобол до сих пор доминирует в корпоративных дата-центрах, Фортран — в научных и инженерных приложениях, вариации языка Си — в системном программировании, а различные потомки ML — в формальной верификации]. Другие языки регулярно используются для создания самых разнообразных приложений.
Существуют различные метрики для измерения популярности языков, каждая из которых разработана с пристрастием к определенному смыслу понятия популярности:
Следует заметить, что высокие оценки по этим показателям не только никак не свидетельствуют о высоком техническом уровне языка и/или оптимизации расходов при его использовании, но и, напротив, порой могут говорить об обратном. Например, язык Кобол входит в число лидеров по количеству написанных на нем строк кода, но причиной этому является крайне низкий показатель модифицируемости кода, что делает этот код не повторно используемым, а legacy-кодом[en]. Как следствие, поддержка программ на Коболе в кратковременной перспективе обходится значительно дороже, чем программ на большинстве современных языков, но переписывание их с нуля потребовало бы значительных единовременных вложений и может сравниваться только с долговременными расходами. Техническое несовершенство Кобола обусловлено тем, что его разрабатывали без привлечения экспертов в области информатики[65][66].
Индекс TIOBE (TIOBE programming community index) — индекс, оценивающий популярность языков программирования, на основе подсчета результатов поисковых запросов, содержащих название языка (запрос вида +" programming"
Tim Bunce, автор Perl DBI, критиковал индекс и методы, используемые при ранжировании. В частности, он утверждал, что рейтинг уязвим к «накруткам» сторонниками того или иного языка. К томуже как утверждает Zuse поисковая популярность может вырасти не из за того что язык популаерн и прост а из за того что в нем ного излишней сложности, из-за которой программисты болше ищут перениее искуссвенных проблем
Технологии прграммирования реализуются с помощью систем программирования, под которыми понимается комплекс средств, предназначенный для создания и эксплуатации программ на конкретном языке программирования. Система программирования включает:
Различные классы задач имеют свою специфику, и поэтому для своего решения требуют учета их особенностей, что достигается выбором соответствующего стиля и технологии программирования. Сегодня наиболее популярными являются следующие стили программирования:
а). Структурное.
b). Модульное.
c). Объектно-ориентированное.
d). Case – технологии (Computer-aided software engineering).
e). Функциональное.
f). Логическое.
g). Интернет-программирование (web-программирование).
В основе структурного программирования лежит представление программы в виде иерархической структуры блоков (фрагментов программы). Компьютерная программа, в этом случае состоит из базовых конструкций: последовательного исполнения, ветвления и циклов, которые были рассмотрены в предыдущем параграфе. Их количество и последовательность определяется решаемой задачей.
Базовые конструкции могут вкладываться друг в друга произвольным образом. Других средств управления последовательностью выполнения операций при структурном программировании не допускаются. Все элементы программ должны представлять собой логически целостные вычислительные блоки.
Базовые элементы программы оформляются как подпрограммы - процедуры или функции. В тексте основной программы, используется инструкция вызова требуемой подпрограммы. После ее исполнения, программа продолжает работу со следующей инструкции.
Разработка программы ведется пошагово, методом «сверху вниз». Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент.
На начальном этапе разработки реальные, работающие подпрограммы, заменяются на так называемые «заглушки», которые какое-то время могут быть «пустыми», то есть не выполнять каких-то действий. Именно с ними программа верхнего уровня проверяется и отлаживается.
Если будет получена правильная последовательность вызова программных модулей, то это означает, что общая структура программы верна. После этого, подпрограммы-заглушки последовательно заменяются на реально работающие подпрограммы. Разработка каждой из них ведется тем же методом, что при создании основной программы. Разработка заканчивается тогда, когда не останется ни одной «заглушки», которая не была бы удалена, что представляется следующим текстом:
Такая последовательность создания программного продукта гарантирует, что на каждом этапе разработки программист имеет дело с обозримым и понятным ему множеством фрагментов программного кода. Тем самым повышается уверенность, что общая структура всех более высоких уровней программы верна.
При сопровождении и внесении изменений в программу выясняют, в какие именно процедуры нужно внести изменения, которые не затрагивают иные части программы. Это повышает гарантии того, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.
Структурное программирование иначе называют еще программированием без операторов безусловного перехода (GOTO). Неправильное, необдуманное, произвольное использование которых приводит к получению запутанных, плохо структурированных программ, которые практически невозможно понять.
Структурное программирование сделало тексты программ читабельными. Облегчилось их понимание, стало возможным разработка программ в промышленном режиме, когда программу может без особых затруднений понять не только ее автор, но и другие программисты. Это позволяет разрабатывать и сопровождать крупные программные комплексы силами больших коллективов разработчиков, даже в условиях изменений в составе персонала. Следует отметить, что многие языки, например Pascal, специально ориентированы на структурное программирование.
Очевидно, что при создании программного продукта должны быть заранее известны состав и структура входных и выходных данных. Внутренние (рабочие) данные определяются уже в процессе проектирования и разработки программного продукта. В задачах связанных с экономической сферой, в отличии от вычислительных задач, проектирование структур данных является отдельной проблемой и удачное ее решение определяет эффективность созданной программы.
Любая модификация структур внутренних данных неизбежно приводит к изменению алгоритмов обработки и, следовательно, к изменению текстов программ. Такое изменение может быть вызвано уточнением постановки задачи, сменой объектов предметной области, которые эти данные описывают. Это влечет коррекцию структур данных, алгоритмов и в конце счете текстов программных модулей.
Объединение специфических понятий языков программирования высокого уровня, таких как - тип данных, процедура, функция, запись и относящихся к одному определенному объекту алгоритма, заложило основу для возникновения объектно-ориентированного программирования. Его специфика заключается в рассмотрении данных в неразрывной связи с методами их обработки, что позволяет условно записать следующее:
Объект = Данные + Операции
Такой подход позволяет программировать не вдаваясь в отработку деталей программ, которые могут уточняться в процессе реализации программного продукта. Объектно-ориентированное программирование представляет следующие преимущества:
Каждый объект характеризуется состоянием (свойства объекта) и возможностью выполнять некоторые действия (методы объекта). Например, для объекта «Накладная» это могут быть переменные, в том числе структуры данных, в которых хранятся значения реквизитов документа, внешний вид документа, значения строк и т.д. Для выполнения требуемых действий обращаются (вызывают) к методам объекта, например, печать, вывод на экран, добавление строки и т.п.
Если изменится объект реального мира – документ «Накладная», то в программе надо будет только в одном месте внести изменения в виртуальный объект, либо создать новую разновидность объекта, учитывающую эти изменения. Таким образом, ООП позволяет создавать программы «более близкие» к реальному миру и легко адаптирующиеся к изменениям.
Каждый объект в ООП всегда принадлежит некоторому классу.
Класс объектов — это обобщенное (абстрактное) описание множества однотипных объектов. Объекты являются конкретными представителями своего класса, их принято называть экземплярами класса. Например, класс КОШКИ - понятие абстрактное, а экземпляр этого класса МОЙ КОТ ФИЛЯ - понятие конкретное. Основными понятиями ООП можно считать – абстрагирование инкапсуляцию, наследование и полиморфизм.
Абстрагирование– это выделение только значимые характеристики объекта.
Инкапсуляция– это объединение данных и методов, работающих с объектом, в некий класс и скрывающий детали его реализации от пользователя. Инкапсуляция делает объекты похожими на маленькие программные модули, у которых имеется интерфейс использования в виде подпрограмм. Переход от понятий "структура данных" и "алгоритм" к понятию "объект" значительно повысил ясность и надежность программ.
Наследование – это свойство системы, позволяющее описать новый класс объектов на основе уже существующего. При этом частично или полностью заимствуются его функции. Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или производным классом.
Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации об его типе и внутренней структуре. Это означает, что в производных классах можно изменять работу уже существующих в базовом классе методов. При этом весь программный код, управляющий объектами родительского класса, пригоден для управления объектами дочернего класса без всякой модификации.
Объектно – ориентированное программирование обычно используется при разработке крупных программных комплексов коллективом программистов. Проектирование системы в целом, создание отдельных компонент и их объединение в конечный продукт в этом случае часто выполняется разными людьми. Языками, поддерживающими данную технологию являются: C++, Java, Delphi и многие другие.
Настоящее ООП нацелено на разделение обязанностей и сокрытие информации.
Это парадигма, придуманная для моделирования объектов реального мира. Как она это делает? Удобно показывать на метафорах и аналогиях, поэтому рассмотрим ситуацию с тостером или микроволновкой:
Есть контроллер, управляющий всеми запчастями черными стрелками и подписанный на состояние кнопок по голубым проводам.
Умело разделяя систему на объекты и продумывая сообщения между ними можно достичь нирваны в ООП. А влезая в это кривыми руками можно забыть о структуре и сделать месиво:
Здесь компоненты соединены кучами проводов и нужно всюду впаивать логику, чтобы термометр умел работать с дисплеем и включать печк
Современные CASE- средства охватывают широкую область поддержки многочисленных технологий проектирования информационных систем (ИС): от простых средств анализа и документирования до средств автоматизации всего жизненного цикла программного обеспечения. CASE-средства – это программные средства, поддерживающие процессы создания и сопровождения ИС, включая анализ и формулировку требований, проектирование прикладного ПО (приложений) и баз данных, генерацию кода, тестирование, документирование, обеспечение качества, конфигурационное управление и управление проектом. CASE-средства вместе с системным ПО и техническими средствами образуют полную среду разработки ИС. Их компонентный состав включает:
Современный рынок программных средств насчитывает около 300 различных CASE-программ, которые активно используются ведущими западными фирмами. На Российском рынке CASE-средств наиболее известными пакетами являются: Vantage Team Builder (Westmount I-CASE), Designer/2000, Erwin+Bpwin, CASE-аналитик, System Architect,Visible Analyst Workbench, EasyCASE.
В современных CASE-пакетах используются практически все известные методологии проектирования. CASE-технология - это не только методология, но и инструментарий. Сейчас на рынке существует большое количество CASE-пакетов. Например, построитель мета-моделей данных CA ERwin Data Modeler, который позволяет проводить их описание, анализ и моделирование.
Он включает в себя три стандартные методологии: IDEF0 (функциональное моделирование), DFD (моделирование потоков данных) и IDEF3 (моделирование потоков работ).
Примеры языков: Haskell, Lisp, Erlang, Clojure, F#
Функциональное — это про функции?
Нет. Функциональное — это не про функции. Функции есть почти в любых языках программирования: и в функциональных, и в императивных. Отличие функционального программирования от императивного — в общем подходе.
Обычные традиционные (императивные) языки высокого уровня, такие как Pascal, Cи, Ada и др. последовательно выполняют инструкции (операторы) программы и результаты размещаются в памяти.
данные → функция1 → данные → функция2 → данные → функция3 → результат.
Чем это отличается от обычного процедурного подхода?
Разбиение императивного кода на процедуры и функции в процедурной парадигме служит как инструмент абстракции в руках умелых или только для избавления от копипасты в руках обычных. Функции рассчитывают результат, а процедуры что-то куда-то записывают. Ведь нет смысла вызывать процедуру, которая ничего не возвращает и ничего при этом не делает.
В нашем парсере ничего записывать не надо и императивная пошаговость не нужна. Мы просто в потоке преобразуем одни данные в другие, не перезаписывая старые значения. Поэтому в функциональной парадигме можно выкинуть процедуры и переменные за ненадобностью и оставить лишь константы и функции.
В парадигме функционального программирования основным понятием является функция. Известно, что математические функции выражают связь между исходными данными и результатом. Процесс вычисления также имеет вход и выход, поэтому функция вполне может использоваться для описания вычислений.
Функциональная программа представляет собой набор определений функций. Функции определяются через другие функции или рекурсивно через самих себя. При выполнении программы функции получают параметры, вычисляют и возвращают результат, при необходимости вычисляя значения других функций.
На функциональном языке программист не должен описывать порядок вычислений. Нужно просто описать желаемый результат как систему функций. Функциональное программирование, нашло большое применение в теории искусственного интеллекта и ее приложениях. К его основным особенностям можно отнести краткость и простоту, строгую типизацию, модульность, отсутствие (как правило) побочных эффектов.
Программы на функциональных языках обычно короче и проще, чем те же самые программы, написанные в других система программирования. Кроме этого, функциональные языки программирования лучше приспособлены к организации параллельных вычислений. Раз все функции для вычислений используют только свои параметры, можно вычислять независимые функции в произвольном порядке или параллельно, на результат вычислений это не повлияет.
Следует отметить, что в традиционных языках программирования (например, Си++) вызов функции приводит к вычислению всех аргументов. Этот метод вызова функции называется «вызов по значению». Если какой-либо аргумент не использовался в функции, то результат вычислений пропадает, следовательно, вычисления были произведены впустую. В каком-то смысле противоположностью «вызова по значению» является «вызов по необходимости», который используется в функциональных языках программирования. В этом случае аргумент вычисляется, только если он нужен для получения результата.
В функциональном программировании широко используется понятие рекурсии, способа общего определения множества объектов или функций через эти же функции и объекты, с использованием ранее заданных частных определений.
Понятие функционального программирования часто связывают с языком Lisp (от английского сокращения LISt Processing language - «язык обработки списков») В настоящее время известно множество его реализаций. Например, Common Lisp стандартизованный диалект языка Lisp. Он был разработан с целью объединения разрозненных его диалектов.
Common Lisp - мультипарадигменный (то есть, поддерживающий несколько парадигм) язык программирования общего назначения. Он поддерживает комбинацию процедурного, функционального и объектно-ориентированного программирования. Его используют в самых разных проектах – в интернет-серверах, серверах приложений, в клиентах взаимодействующих с реляционными и объектными базами данных, в научных расчетах и игровых программах.
Практики, которые помогают преобразовать методы в математические функции:
Иммутабельность.
Избегать исключения для управления потоком программы.
Избавляться от примитивной одержимости.
Делать nulls явными.
Согласно логическому подходу к программированию, программа представляет собой совокупность правил или логических высказываний. Также в ней допустимы логические причинно-следственные связи, в частности, на основе операции импликации (импликация, от латинского « implicatio» - сплетение, тесно связываю, логическая связка, соответствующая грамматической конструкции если ..., то).
В логическом программирование программы пишутся не в виде последовательности инструкций, а в виде множества фактов и правил. Процесс выполнения программы состоит в выводе нужных результатов из этого множества. Логическое программирование относится к декларативному программированию, поскольку программа на нем скорее описывает свойство задачи, нежели алгоритм ее решения. Основано оно на автоматическом доказательстве теорем, и на теории и аппарате математической логики с использованием математических принципов резолюций.
Языки логического программирования позволяют выполнить описание проблемы в терминах фактов и логических формул, а собственно решение проблемы выполняет система с помощью механизмов логического вывода. Самым известным языком логического программирования является Prolog, со всеми своими многочисленными диалектами (такими как - Arity Prolog, B-Prolog, Ciao Prolog, Arity/Prolog32, CxProlog/ IF/Prolog, JIProlog и др.).
Они широко используются для создания баз знаний и экспертных систем и исследований в сфере искусственного интеллекта. На его основе создаются логические модели баз знаний и логические процедуры вывода и принятия решений.
Следует отметить также Visual Prolog, который использует «визуальное программирование». Разработка программ в нем производится специальными графическими средствами без традиционного программирования на алгоритмическом языке. В результате эта система программирования, отличается логичностью, простотой и эффективностью.
g). Интернет-программирование (web-программирование)
Раздел программирования, в рамках которого создаются программы интернет-приложений, реализующие разнообразные интернет-технологии называются интернет - программированием. Программы интернет-приложений называются скриптами. Существует две основные категории скриптов – клиентские, то есть выполняемые на компьютере пользователя и серверные, предназначенные для использования на интернет-сервере.
Как правило, клиентские скрипты исполняются с помощью браузеров, специальных программ, с помощью которых просматриваются интернет-страницы. Эти скрипты представляют собой некие команды на специализированном языке программирования, которые заключаются среди общего кода web-сайта. Самыми распространенными клиентскими языками программирования являются JavaScript, VBScript, ActionScript и Java.
Примерами серверных скриптов могут служить «стандартные» программы, которые используются на интернет-страницах: счетчики посещаемости сайта, программы на сервере, поддерживающие голосование и гостевые книги на сайте и так далее. Важной стороной работы серверных скриптов – возможность с их помощью организации взаимодействия с системой управления базами данных имеющихся на сервере. При написании серверных скриптов используются языки Perl, ASP, WebSQL и Java Server Pages.
Дальнейшее развитие технологий создания программного обеспечения чрезвычайно важно, так как оно является составной частью современных информационных технологий. Их совершенствование особенно важно при создании таких новых систем, как облачные вычисления, новые поколения мультимедийных поисковых систем, аналитическое программное обеспечение, технологии передачи и хранения информации, 3d-моделирования и много другого, без чего невозможно решение задач экономики.
Я хотел бы услышать твое мнение про классификация языков программирования Надеюсь, что теперь ты понял что такое классификация языков программирования и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Языки и методы программирования. Теория трансляции
Часть 1 Классификация языков программирования
Часть 2 Языки программирования высокого уровня - Классификация языков программирования
Часть 3 Языки первого и высшего порядка - Классификация языков программирования
Часть 4 Популярность языков( Индекс TIOBE) - Классификация языков программирования
Комментарии
Оставить комментарий
Языки и методы программирования. Теория трансляции
Термины: Языки и методы программирования. Теория трансляции