
Язы́к программи́рования — формальный язык, предназначенный для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель (обычно — ЭВМ) под её управлением.
Со времени создания первых программируемых машин человечество придумало более восьми тысяч языков программирования (включая эзотерические). Каждый год их число увеличивается. Некоторыми языками умеет пользоваться только небольшое число их собственных разработчиков, другие становятся известны миллионам людей. Профессиональные программисты могут владеть несколькими языками программирования.
Язык программирования предназначен для написания компьютерных программ, которые представляют собой набор правил, позволяющих компьютеру выполнить тот или иной вычислительный процесс, организовать управление различными объектами, и т. п. Язык программирования отличается от естественных языков тем, что предназначен для управления ЭВМ, в то время как естественные языки используются, прежде всего, для общения людей между собой. Большинство языков программирования использует специальные конструкции для определения и манипулирования структурами данных и управления процессом вычислений.
Как правило, язык программирования определяется не только через спецификации стандарта языка, формально определяющие его синтаксис и семантику
, но и через воплощения (реализации) стандарта — программные средства, обеспечивающие трансляцию или интерпретацию программ на этом языке ; такие программные средства различаются по производителю, марке и варианту (версии), времени выпуска, полноте воплощения стандарта, дополнительным возможностям; могут иметь определённые ошибки или особенности воплощения, влияющие на практику использования языка или даже на его стандарт.История
Ранние этапы развития
Можно сказать, что первые языки программирования возникали ещё до появления современных электронных вычислительных машин: уже в XIX веке были изобретены устройства, которые можно с долей условности назвать программируемыми — к примеру, музыкальная шкатулка (и позднее механическое пианино) посредством металлического цилиндра и Жаккардовый ткацкий станок (1804) посредством картонных карт. Для управления ими использовались наборы инструкций, которые в рамках современной классификации можно считать прототипами предметно-ориентированных языков программирования[источник не указан 817 дней]. Значимым можно считать «язык», на котором леди Ада Августа (графиня Лавлейс) в 1842 году написала программу для вычисления чисел Бернулли для аналитической машины Чарльза Бэббиджа, ставшей бы, в случае реализации, первым компьютером в мире, хотя и механическим — с паровым двигателем.
В 1930—1940 годах А. Чёрч, А. Тьюринг, А. Марков разработали математические абстракции (лямбда-исчисление, машину Тьюринга, нормальные алгоритмы соответственно) — для формализации алгоритмов.
В это же время, в 1940-е годы, появились электрические цифровые компьютеры и был разработан язык, который можно считать первым высокоуровневым языком программирования для ЭВМ — «Plankalkül», созданный немецким инженером К. Цузе в период с 1943 по 1945 годы.
Программисты ЭВМ начала 1950-х годов, в особенности таких, как UNIVAC и IBM 701, при создании программ пользовались непосредственно машинным кодом, запись программы на котором состояла из единиц и нулей и который принято считать языком программирования первого поколения (при этом разные машины разных производителей использовали различные коды, что требовало переписывать программу при переходе на другую ЭВМ).
Первым практически реализованным языком стал в 1949 году так называемый «Краткий код», в котором операции и переменные кодировались двухсимвольными сочетаниями. Он был разработан в компании Eckert–Mauchly Computer Corporation, выпускавшей UNIVAC-и, созданной одним из сотрудников Тьюринга, Джоном Мокли. Мокли поручил своим сотрудникам разработать транслятор математических формул, однако для 1940-х годов эта цель была слишком амбициозна. Краткий код был реализован с помощью интерпретатора.
Вскоре на смену такому методу программирования пришло применение языков второго поколения, также ограниченных спецификациями конкретных машин, но более простых для использования человеком за счёт использования мнемоник (символьных обозначений машинных команд) и возможности сопоставления имён адресам в машинной памяти. Они традиционно известны под наименованием языков ассемблера и автокодов. Однако при использовании ассемблера становился необходимым процесс перевода программы на язык машинных кодов перед её выполнением, для чего были разработаны специальные программы, также получившие название ассемблеров. Сохранялись и проблемы с переносимостью программы с ЭВМ одной архитектуры на другую, и необходимость для программиста при решении задачи мыслить терминами «низкого уровня» — ячейка, адрес, команда. Позднее языки второго поколения были усовершенствованы: в них появилась поддержка макрокоманд.
С середины 1950-х начали появляться языки третьего поколения, такие как Фортран, Лисп и Кобол. Языки программирования этого типа более абстрактны (их ещё называют «языками высокого уровня») и универсальны, не имеют жёсткой зависимости от конкретной системы команд и конфигурации периферийных устройств. Программа на языке высокого уровня может исполняться (по крайней мере, в теории, на практике обычно имеется ряд специфических версий или диалектов реализации языка) на любой ЭВМ, на которой для этого языка имеется транслятор (инструмент, переводящий программу на язык машины, после чего она может быть выполнена процессором).
Обновлённые версии перечисленных языков до сих пор имеют хождение в разработке программного обеспечения, и каждый из них оказал определённое влияние на последующее развитие языков программирования. Тогда же, в конце 1950-х годов, появился Алгол, также послуживший основой для ряда дальнейших разработок в этой сфере. Необходимо заметить, что на формат и применение ранних языков программирования в значительной степени влияли интерфейсные ограничения.
Совершенствование
В период 1960-х — 1970-х годов были разработаны основные парадигмы языков программирования, используемые в настоящее время, хотя во многих аспектах этот процесс представлял собой лишь улучшение идей и концепций, заложенных ещё в первых языках третьего поколения.
- Язык APL оказал влияние на функциональное программирование и стал первым языком, поддерживавшим обработку массивов.
- Язык ПЛ/1 (NPL) был разработан в 1960-х годах как объединение лучших черт Фортрана и Кобола.
- Язык Snobol, разработанный и совершенствуемый в течение 1960-х годов, ориентированный на обработку текстов, ввёл в число базовых операций языков программирования сопоставление с образцом.
- Язык Симула, появившийся примерно в это же время, впервые включал поддержку объектно-ориентированного программирования. В середине 1970-х группа специалистов представила язык Smalltalk, который был уже всецело объектно-ориентированным.
- В период с 1969 по 1973 годы велась разработка языка Си, популярного и по сей день и ставшего основой для множества последующих языков, например, столь популярных, как C++ и Java.
- В 1972 году был создан Пролог — наиболее известный (хотя и не первый, и далеко не единственный) язык логического программирования.
- В 1973 году в языке ML была реализована расширенная система полиморфной типизации, положившая начало типизированным языкам функционального программирования.
Каждый из этих языков породил по семейству потомков, и большинство современных языков программирования в конечном счёте основано на одном из них.
Кроме того, в 1960—1970-х годах активно велись споры о необходимости поддержки структурного программирования в тех или иных языках. В частности, голландский специалист Э. Дейкстра выступал в печати с предложениями о полном отказе от использования инструкций GOTO во всех высокоуровневых языках. Развивались также приёмы, направленные на сокращение объёма программ и повышение продуктивности работы программиста и пользователя.
Объединение и развитие
В 1980-е годы наступил период, который можно условно назвать временем консолидации. Язык C++ объединил в себе черты объектно-ориентированного и системного программирования, правительство США стандартизировало язык Ада, производный от Паскаля и предназначенный для использования в бортовых системах управления военными объектами, в Японии и других странах мира осуществлялись значительные инвестиции в изучение перспектив так называемых языков пятого поколения, которые включали бы в себя конструкции логического программирования. Сообщество функциональных языков приняло в качестве стандарта ML и Лисп. В целом этот период характеризовался скорее опорой на заложенный в предыдущем десятилетии фундамент, нежели разработкой новых парадигм.
Важной тенденцией, которая наблюдалась в разработке языков программирования для крупномасштабных систем, было сосредоточение на применении модулей — объёмных единиц организации кода. Хотя некоторые языки, такие, как ПЛ/1, уже поддерживали соответствующую функциональность, модульная система нашла своё отражение и применение также и в языках Модула-2, Оберон, Ада и ML. Часто модульные системы объединялись с конструкциями обобщённого программирования.
Важным направлением работ становятся визуальные (графические) языки программирования, в которых процесс «написания» программы как текста заменяется на процесс «рисования» (конструирования программы в виде диаграммы) на экране ЭВМ. Визуальные языки обеспечивают наглядность и лучшее восприятие логики программы человеком.
В 1990-х годах в связи с активным развитием Интернета распространение получили языки, позволяющие создавать сценарии для веб-страниц — главным образом Perl, развившийся из скриптового инструмента для Unix-систем, и Java. Возрастала также и популярность технологий виртуализации. Эти изменения, однако, также не представляли собой фундаментальных новаций, являясь скорее совершенствованием уже существовавших парадигм и языков (в последнем случае — главным образом семейства Си).
В настоящее время развитие языков программирования идёт в направлении повышения безопасности и надёжности, создания новых форм модульной организации кода и интеграции с базами данных.
Спецификация языков
Стандартизация
Для многих широко распространённых языков программирования созданы международные стандарты. Специальные организации проводят регулярное обновление и публикацию спецификаций и формальных определений соответствующего языка. В рамках таких комитетов продолжается разработка и модернизация языков программирования и решаются вопросы о расширении или поддержке уже существующих и новых языковых конструкций.
Алфавит
Современные языки программирования широко используют мультиязычные символы Юникода (Delphi 2006, C#, Java, Rust) для идентификаторов и хранения исходного кода. Исторически, до начала 2000-х годов в языках применялась 7-и битная кодировка ASCII, принятая стандартом в США.
Ранние языки, возникшие в эпоху 6-битных символов, использовали более ограниченный набор. Например, алфавит Фортрана включает 49 символов (включая пробел): A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / () . , $ ' : Управляющие символы ASCII используются ограниченно: допускаются только возврат каретки CR, перевод строки LF и горизонтальная табуляция HT (иногда также вертикальная табуляция VT и переход к следующей странице FF). Заметным исключением является язык APL, в котором используется очень много специальных символов.
Использование символов за пределами 7-битного ASCII (например, символов KOI8-R) зависит от реализации: иногда они разрешаются только в комментариях и символьных/строковых константах, а иногда и в идентификаторах.
В СССР и современной России существуют языки, где все ключевые слова пишутся русскими буквами, например встроенный язык программирования 1С:Предприятие и учебные языки программирования — псевдокод, школьный алгоритмический язык системы КуМир и язык РАПИРА.
Расширение набора используемых символов (вне латинского алфавита) основано на том, что многие проекты по разработке программного обеспечения являются международными, а так же популяризацией графических символов из наборов эмотиконов.
Грамматика
Этот раздел нужно дополнить. |
- Контекстно-свободная грамматика
- Контекстно-зависимая грамматика
- Регулярный язык
- регулярные выражения
- Грамматика с фразовой структурой
- LL(n)
- LALR(1)
- Yacc
- ANTLR
- Parsec
- AST
- [англ.]
- [англ.]
- [англ.]
Семантика
Существует несколько подходов к определению семантики языков программирования. Основных три: , и .
- При описании семантики в рамках операционного подхода обычно исполнение конструкций языка программирования интерпретируется с помощью некоторой воображаемой (абстрактной) ЭВМ.
- Аксиоматическая семантика описывает последствия выполнения конструкций языка с помощью языка логики и задания пред- и постусловий.
- Денотационная семантика оперирует понятиями, типичными для математики — множества, соответствия, а также суждения, утверждения и др.
Классификация
Не существует общепринятой систематичной таксономии языков программирования. Есть множество черт, согласно которым можно производить классификацию языков, причём одни из них однозначно проводят разделы между языками на основе технических свойств, другие основываются на доминирующих признаках, имеют исключения и более условны, а третьи полностью субъективны и нередко сопровождаются заблуждениями, но на практике весьма распространены.
Конкретный язык программирования в подавляющем большинстве случаев имеет более одного языка-предка. Многие языки создаются как сочетание элементов различных языков. В одних случаях такое сочетание проходит математический анализ на предмет непротиворечивости (см., например, Определение Standard ML), в других — язык формируется исходя из практических потребностей, для решения актуальных проблем с целью получения коммерческого успеха, но при этом без соблюдения математической строгости и со включением в язык взаимоисключающих идей (как в случае C++).
Языки низкого и высокого уровня
Формально язык программирования не имеет такого критерия как «уровень». Условно этот термин обычно означает одно из двух:
- «приближенность» языка программирования к естественному человеческому языку и образу мысли,
- «удалённость» семантики языка программирования от машинного кода целевой — то есть наименьший масштаб преобразований, которые должен претерпеть код программы перед тем, как он сможет исполняться.
Эта двойственность появилась в 1950-е годы, при создании языков Планкалкюль и Фортран. При их разработке ставились прямые намерения обеспечить более краткую запись часто встречающихся конструкций (например, арифметических выражений), чем требовали процессоры того времени. В этих языках вводился новый слой абстракции и предполагались преобразования программ в машинный язык, поэтому их назвали языками «высокого уровня», то есть надстройкой, надслоением над языком машины. Однако вскоре стало ясно, что эти определения вовсе не обязательно идут бок о бок. Так, история знает случаи, когда язык, традиционно считающийся «высокоуровневым», реализовывался аппаратно (см. Лисп-машина, [англ.]), или когда язык, являющийся «низкоуровневым» на одной платформе, компилировался как «высокоуровневый» на другой (таким образом программы на CISC-ассемблере VAX использовались на RISC-машинах DEC Alpha — см. [англ.]). Тем не менее, до сих пор распространено заблуждение, что эти две трактовки являются не более, чем «двумя сторонами одной медали», и первое будто бы неизбежно означает второе.
По степени «высокоуровневости» языки принято делить на пять поколений.
К [англ.] относят, в первую очередь, машинные языки (или, на общеупотребимом жаргоне — машинные коды), то есть языки, реализованные непосредственно на аппаратном уровне.
Появившиеся вскоре после них «языки ассемблера» относят ко [англ.]. В простейшем случае они реализуют мнемонику над машинным языком для записи команд и их параметров (в частности, адресов в памяти), но многие языки ассемблера включают и весьма развитый макроязык; кроме того, даже в простейшем случае обратная разработка машинного кода не позволяет однозначно восстановить программу на ассемблере — например, невозможно восстановить имена переменных; могут быть нераспознаны недокументированные функции. Тем не менее, оба первых поколения общепринято относить к языкам низкого уровня.
К 1970-м годам сложность программ выросла настолько, что превысила способность программистов управляться с ними, и это привело к огромным убыткам и застою в развитии информационных технологий. Ответом на эту проблему стало появление массы языков высокого уровня, предлагающих самые разные способы управления сложностью (подробнее см. парадигма программирования и языки для программирования в мелком и крупном масштабе). Программы на языках «высокого уровня» гораздо легче модифицируются и совсем легко переносятся с компьютера на компьютер.
На практике, наибольшее распространение получили языки третьего поколения, которые лишь претендуют на звание «высокоуровневых», но реально предоставляют лишь те «высокоуровневые» конструкции, что находят однозначное соответствие инструкциям в машине фон Неймана.
Более «высокоуровневыми» принято считать языки четвёртого и пятого поколения.
К [англ.] относят языки запросов, языки опций и параметров, генераторы приложений, комбинированные пакеты баз данных. Наиболее значимой подгруппой в четвёртом поколении принято считать функциональные языки, большая часть из которых является языками высшего порядка .
Иногда выделяется категория языков [англ.], но она не является общепринятой — чаще используется термин «язык сверхвысокого уровня» (англ. very high level language). Это языки, реализация которых включает существенную алгоритмическую составляющую (то есть когда интерпретация небольшого исходного кода требует весьма сложных вычислений), поэтому порой также говорят, что языки пятого поколения — это фактически языки четвёртого поколения, дополненные базой знаний. Чаще всего так называют логические языки.
Язык Си является, вероятно, самым «низкоуровневым» в третьем поколении. Он изначально позиционировался как «высокоуровневый ассемблер» или «кроссплатформенный ассемблер»; его также часто называют «языком среднего уровня» или даже «языком поколения 2,5». Он позволяет в значительной степени контролировать способ реализации алгоритма с учётом свойств, типичных для весьма большого числа аппаратных , но есть платформы, под которые реализации Си (даже с в нестандартном виде) отсутствуют по причине принципиальной невозможности или нецелесообразности их создания. Классификация потомка Си, языка C++, вызывает споры: его нередко называют «высокоуровневым», несмотря на то, что технически его семантика и система типов мало отличаются от тех, на которых основан Си.
Со временем появились и другие языки среднего уровня, например, LLVM, C--. Они преимущественно предназначены не для написания кода человеком, а для генерации промежуточного кода из более высокоуровневых языков с тем, чтобы обеспечить лучшее разделение компиляторов на фронтенд и бэкенд.
В большинстве случаев языки высокого уровня порождают машинный код большего размера и исполняются медленнее. Однако некоторые языки высокого уровня для алгоритмически и структурно сложных программ могут давать заметное преимущество в эффективности, уступая низкоуровневым лишь на небольших и простых программах (подробнее см. эффективность языков). Иначе говоря, потенциальная эффективность языка меняется с повышением его «уровня» нелинейно и вообще неоднозначно. При этом скорость разработки и трудоёмкость модификации, устойчивость и другие показатели качества в сложных системах оказываются гораздо важнее предельно возможной скорости исполнения — они обеспечивают различие между программой, что работает, и той, что нет — так что экономически более целесообразна эволюция аппаратного обеспечения (исполнение большего числа инструкций в единицу времени) и методов оптимизирующей компиляции (более того, последние десятилетия эволюция аппаратного обеспечения движется в направлении поддержки методов оптимизирующей компиляции для языков высокого уровня). К примеру, автоматическая сборка мусора, присутствующая в большинстве высокоуровневых языков программирования, считается одним из важнейших улучшений, благотворно повлиявших на скорость разработки.
Поэтому в наши дни языки низкого уровня используются только в задачах системного программирования. Распространено ошибочное отождествление системного программирования с «низкоуровневым», основанное на мнении, что если необходим точный контроль за ресурсами, то язык сам не должен предполагать масштабных преобразований, иначе все усилия программиста окажутся напрасными. В действительности есть примеры, опровергающие это. Так, язык BitC является функциональным
языком высшего порядка , то есть представителем четвёртого поколения («высокоуровневым»), но целиком и полностью ориентирован именно на системное программирование и уверенно конкурирует по скорости с Си. Языки третьего поколения C# и Limbo разрабатывались для использования одновременно как в системном программировании (с целью повышения отказоустойчивости операционной системы), так и в прикладном — это обеспечивает единство платформы, что сокращает потери при трансляции.Безопасные и небезопасные языки
Современные компьютеры представляют сложные данные реального мира в виде чисел в памяти компьютера. Это вводит в дисциплину программирования риск человеческого фактора, в том числе вероятность ошибок доступа к памяти. Поэтому многие языки программирования сопровождаются средством контроля смысла операций над двоичными данными на основе сопровождающей их логической информации — системой типов. Однако существуют и бестиповые языки, например, Forth. Большинство языков ассемблера являются бестиповыми, но существуют и [англ.], нацеленные на обеспечение минимальной безопасности низкоуровневых программ.
Системы типов языков делятся на динамические (потомки Lisp, Smalltalk, APL) и статические, а последние, в свою очередь, делятся на неполиморфные (потомки Алгола и BCPL) и полиморфные (потомки ML). Кроме того, они делятся на явные (англ. explicit) и неявные (англ. implicit) — другими словами, требующие явной декларации типов для объектов в программе или статически выводящие их самостоятельно.
Системы типов бывают сильные и слабые. Сильная система типов назначает тип для всякого выражения раз и навсегда (когда бы конкретно это ни происходило — в динамике или в статике), а слабая позволяет впоследствии переназначать типы. Сильная типизация порой ошибочно отождествляется со статической.
В общем и целом, язык называется безопасным, если программы на нём, которые могут быть приняты компилятором как правильно построенные, в динамике никогда не выйдут за рамки допустимого поведения. Это не значит, что такие программы не содержат ошибок вообще. Термин «хорошее поведение программы» (англ. well-behavior) означает, что даже если программа содержит некий баг (в частности, логическую ошибку), то она тем не менее не способна нарушить целостность данных и обрушиться (англ. crash). Хотя термины неформальны, безопасность некоторых языков (например, Standard ML) математически доказуема. Безопасность других (например, Ada) была обеспечена ad hoc-образом, без обеспечения концептуальной целостности, что может обернуться катастрофами, если положиться на них в ответственных задачах (см. концептуальная целостность языков). Неформальная терминология была популяризована Робином Милнером, одним из авторов теории формальной верификации и собственно языка Standard ML.
Степень контроля ошибок и реакция языка на них могут различаться. Простейшие системы типов запрещают, к примеру, вычитать строку из целого числа. Однако целыми числами могут представляться и миллиметры, и дюймы, но было бы логической ошибкой вычитать дюймы из миллиметров. Развитые системы типов позволяют (а наиболее развитые — принуждают) внедрять в программу такую логическую информацию. Для ЭВМ она является избыточной и полностью удаляется при порождении машинного кода тем или иным образомStandard ML не допускает над данными никаких операций, кроме тех, что разрешены явно и формализованы; однако программы на нём всё же могут завершаться порождением необработанного исключения (например, при попытке деления на ноль). Его потомок, MLPolyR гарантирует также и отсутствие необработанных исключений. Такие языки называются «типобезопасными». Java и C# менее строги и контролируют лишь утечки памяти, поэтому в их контексте чаще используют более узкий термин «безопасность типов в отношении доступа к памяти» (англ. memory type safety) или (чаще) просто «безопасность доступа к памяти». Сильно динамически типизируемые языки отслеживают поведение программ в динамике (что влечёт снижение быстродействия) и реагируют на ошибки порождением исключения. Все эти языки ориентированы на практичность, предоставляя оптимальный компромисс между пресечением серьёзных сбоев и высокой скоростью разработки программ.
. В частности,Существуют языки, предназначенные для написания программ, которые верны по построению, то есть обеспечивают гарантию того, что исполнимая программа по структуре и поведению будет тождественна её спецификации (см. [англ.], зависимый тип). Как следствие, программы на таких языках часто называют «исполнимыми спецификациями» (см. Соответствие Карри — Говарда). Трудоёмкость разработки на таких языках возрастает на порядки, к тому же они требуют очень высокой квалификации разработчика — поэтому их применяют только в формальной верификации. Примерами таких языков служат Agda, Coq.
Языки Си и его потомок C++ являются небезопасными. В программах на них обширно встречаются ситуации ослабления типизации (приведение типов) и прямого её нарушения (каламбур типизации), так что ошибки доступа к памяти являются в них статистической нормой (но крах программы наступает далеко не сразу, что затрудняет поиск места ошибки в коде). Самые мощные системы статического анализа для них (такие, как PVS-Studio) способны обнаруживать не более 70 — 80 % ошибок, но их использование обходится очень дорого, как в финансовом смысле, так и с точки зрения трудоёмкости и наукоёмкости. Достоверно же гарантировать безотказность программ на этих языках невозможно, не прибегая к формальной верификации, что не только ещё дороже, но и требует специальных знаний. У Си есть и безопасные потомки, такие как Cyclone.
Язык Forth не претендует на звание «безопасного», но тем не менее на практике существование программ, способных повредить данные, почти исключено, так как содержащая потенциально опасную ошибку программа аварийно завершается на первом же тестовом запуске, принуждая к коррекции исходного кода. В сообществе Erlang принят подход «let it crash» (с англ. — «дай ей обрушиться»), также нацеленный на раннее выявление ошибок.
Компилируемые, интерпретируемые и встраиваемые языки
Можно выделить три принципиально разных способа реализации языков программирования: компиляция, интерпретация и встраивание. Распространено заблуждение, согласно которому способ реализации является присущим конкретному языку свойством. В действительности, это деление до определённой степени условно. В ряде случаев язык имеет формальную семантику, ориентированную на интерпретацию, но все или почти все его действительные реализации являются компиляторами, порой весьма эффективно оптимизирующими (примерами могут служить языки семейства ML, такие как Standard ML, Haskell). Есть языки, размывающие границы между интерпретацией и компиляцией — например, Forth.
Компиляция означает, что исходный код программы сначала преобразуется в целевой (машинный) код специальной программой, называемой компилятором — в результате получается исполнимый модуль, который уже может быть запущен на исполнение как отдельная программа. Интерпретация же означает, что исходный код выполняется непосредственно, команда за командой (иногда — с минимальной подготовкой, буквально после разбора исходного кода в AST),— так что программа просто не может быть запущена без наличия интерпретатора. Встраивание языка можно философски рассматривать как «реализацию без трансляции» — в том смысле, что такой язык является синтаксическим и семантическим подмножеством некого другого языка, без которого он не существует. Говоря же более точно, встраиваемые языки добавляют к сказанному ещё четыре способа реализации.
Естественный для языка способ реализации определяется временем связывания программных элементов с их характеристиками. В частности, в языках со статической типизацией переменные и другие объекты программы связываются с типом данных на этапе компиляции, а в случае типизации динамической — на этапе выполнения, как правило — в произвольной точке программы. Некоторые свойства элементов языка, такие как значение арифметических операторов или управляющих ключевых слов, могут быть связаны уже на этапе определения языка. В других языках возможно их переназначение (см. [англ.]). Раннее связывание обычно означает бо́льшую эффективность программы, в то время как позднее — большую гибкость, ценой которого является меньшая скорость и/или усложнение соответствующего этапа. Но даже из, казалось бы, очевидных случаев есть исключения — например, интенсиональный полиморфизм откладывает обработку статической типизации до этапа выполнения, но не замедляя, а повышая общее быстродействие (по крайней мере, в теории).
Для любого традиционно компилируемого языка (такого как Паскаль) можно написать интерпретатор. Но многие интерпретируемые языки предоставляют некоторые дополнительные возможности, такие как динамическая генерация кода (см. [англ.]), так что их компиляция должна быть динамической (см. динамическая компиляция). Таким образом, составной термин «язык + способ его реализации» в ряде случаев оказывается уместен. Кроме того, большинство современных «чистых» интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в некоторое высокоуровневое промежуточное представление (например, с разыменованием переменных и раскрытием макрокоманд). Большинство традиционно интерпретируемых или компилируемых языков могут реализовываться как встраиваемые, хотя метаязыков, которые были бы способны охватить другие языки как своё подмножество, не так много (наиболее ярким представителем является Lisp).
Как правило, скомпилированные программы выполняются быстрее и не требуют для выполнения дополнительных программ, так как уже переведены на машинный язык. Вместе с тем, при каждом изменении текста программы требуется её перекомпиляция, что замедляет процесс разработки. Кроме того, скомпилированная программа может выполняться только на том же типе компьютеров и, как правило, под той же операционной системой, на которую был рассчитан компилятор. Чтобы создать исполняемый файл для машины другого типа, требуется новая компиляция. Интерпретируемые языки позволяют запускать программы сразу же после изменения, причём на разных типах машин и операционных систем без дополнительных усилий, а гомоикони́чные — и вовсе динамически перемещать программу между разными машинами без прерывания её работы (наиболее общий случай сериализации), позволяя разрабатывать [англ.] (см. тж. системы высокой доступности). Портируемость интерпретируемой программы определяется только наличием реализаций интерпретаторов под те или иные аппаратные платформы. Ценой всего этого становятся заметные потери быстродействия; кроме того, если программа содержит фатальную ошибку, то об этом не будет известно, пока интерпретатор не дойдёт до её места в коде (в отличие от статически типобезопасных языков ).
Реализация некоторых языков, например, Java и C#, занимают промежуточную ступень между компиляцией и интерпретацией. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету» (Just-in-time compilation, JIT). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# — Common Language Runtime. Подобный подход в некотором смысле позволяет использовать плюсы как интерпретаторов, так и компиляторов.
Языки первого и высшего порядка
Начальные сведения
Математическая логика классифицируется по порядку — см. логика первого порядка и логика высшего порядка. Эта терминология естественным образом наследуется информатикой, образуя семантики, соответственно, первого и высшего порядка. Языки первого порядка (например, потомки Алгола, такие как Basic или классический Pascal Вирта) позволяют определять только зависимости первого порядка между величинами. Например, значение square x
зависит от значения x
. Такие зависимости называются функциями. Языки высшего порядка позволяют определять зависимости между зависимостями. Например, значение map f x
зависит от значений f
и x
, где значение f
само выражает абстрактную зависимость (другими словами, параметр f
варьируется над множеством функций определённой сигнатуры). Такие зависимости называются функциями высшего порядка. При этом в большинстве случаев говорят, что такой язык рассматривает зависимости (функции) как объекты первого класса, иначе говоря, допускает функции первого класса (некоторые языки, например Си, не поддерживают первоклассные функции, но предоставляют ограниченные возможности строить функции высшего порядка). Эти термины ввёл [англ.] в [англ.]. К языкам высшего порядка относятся почти все функциональные языки (исключения очень редки; примером функционального языка первого порядка долгое время являлся [англ.], но в 2018 году в него была добавлена поддержка первоклассных функций). С развитием систем типов различение порядков распространилось и на типы (см. конструктор типов).
Выразительность
Языки первого порядка позволяют воплощать в виде кода алгоритмы, но не архитектуру программ. По мнению [англ.], это ограничение унаследовано языком Алгол (а от него другими языками) из классической математики, где используются только константные операции и функции, однозначно распознаваемые вне контекста, и отсутствует систематичная нотация для произвольной работы с функциями (в качестве такой нотации в 1930-х годах было построено лямбда-исчисление, которое позже легло в основу языков высшего порядка). Схемы взаимодействия компонентов (процедур, функций, объектов, процессов и др.) для программ на языках первого порядка могут существовать лишь на условном уровне, вне самих программ. Со временем были обнаружены многократно повторяющиеся однотипные схемы такого рода, в результате чего вокруг них выстроилась самостоятельная методология — шаблоны проектирования. Языки высшего порядка позволяют воплощать такие схемы в виде исполнимого кода, пригодного для многократного использования (функций, предназначенных для преобразования и композиции других функций — см., например, конверторы и сканеры в SML). В результате, решения, которые на языках первого порядка могут быть представлены фрагментами программ (порой довольно сложными и громоздкими), на языках высшего порядка могут сокращаться до одной команды или вообще использования элемента семантики самого языка, не имеющего синтаксического выражения. Например, шаблон «Команда», часто применяемый в языках первого порядка, эквивалентен непосредственно самому понятию функции первого класса. То же распространяется и на более высокие слои языков — типизацию (см. полиморфизм в высших рода́х) и типизацию типизации (см. полиморфизм родо́в).
Сказанное преимущественно относится к языкам, семантика которых основана на лямбда-исчислении (потомки Lisp, ML). Однако некоторые языки иной природы также предоставляют возможность [англ.]. Примерами служат стековые языки (Forth) и определённая разновидность объектно-ориентированных языков (Smalltalk, CLOS, см. [англ.]).
Изучение
Введя терминологию «сущностей первого и второго класса», [англ.] тут же акцентировал внимание на том, что из личного опыта и обсуждений со множеством людей он убедился, что невероятно тяжело перестать думать о функциях как об объектах второго класса. То есть порядок языка имеет ярко выраженное психологическое влияние (см. гипотеза Сепира — Уорфа). Владение языками более высокого уровня поможет программисту думать в терминах более высокоуровневых абстракций.
Низкоуровневые же языки могут навязывать обратное, в связи с чем широко известно следующее высказывание:
Практически невозможно обучить хорошему программированию студентов, имевших опыт работы с Бейсиком: как потенциальные программисты они ментально исковерканы без надежды на восстановление.
Оригинальный текст (англ.)It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration— Эдсгер Дейкстра
Это значит, что само по себе использование языка высшего порядка не означает автоматически изменение архитектуры и повышение коэффициента повторного использования (см. серебряной пули нет) — определяющим фактором является умение конкретного разработчика применять соответствующие идиомы.
Понимание возможностей и ограничений высокоуровневых конструкций, базовых принципов их реализации не только дают программисту возможность наиболее эффективно использовать изученный им язык, но и позволят создавать и использовать аналогичные механизмы в случае разработки на языке, где они не реализованы.
Разработчику, владеющему бо́льшим спектром языков программирования, будет проще выбрать среди них инструмент, наиболее подходящий для решения стоящей перед ним задачи, изучить, в случае необходимости, новый язык или реализовать предметно-ориентированный язык, к которым, к примеру, можно отнести интерфейс командной строки достаточно сложной программы.
Парадигма программирования
Язык может технически допускать или не допускать, а также в той или иной степени поощрять или не поощрять реализацию определённых идиом и разработку в некоторой парадигме программирования (если таких парадигм несколько, язык называют мультипарадигменным).
Технически языки делятся, например, на допускающие побочные эффекты и не допускающие их. Во втором случае язык называют ссылочно-прозрачным и относят к «чисто функциональной парадигме». Также в качестве парадигмы иногда рассматриваются определённые свойства системы типов и стратегии вычисления языка (например, для параметрически полиморфных систем типов нередко говорят о реализации парадигмы обобщённого программирования) или наличие определённых семантических свойств (например, свойство гомоикони́чности, открывающее целый спектр разновидностей метапрограммирования).
Существует масса «языков, наследованных от математики»
, многие из которых формируют уникальные парадигмы. Яркими представителями являются Lisp, впервые воплотивший лямбда-исчисление и положивший таким образом начало функциональной парадигме; Smalltalk, впервые воплотивший объектно-ориентированную парадигму (появившаяся за много лет до него Симула поддерживала понятие класса, но воплощала структурную парадигму) и стековый язык Forth, воплощающий конкатенативную парадигму.Низкоуровневые языки ориентированы на специфику конкретного аппаратного обеспечения, и обычно не соотносятся с какой-либо парадигмой, кроме императивной (см. далее), хотя конкретный разработчик на них, разумеется, может идеологически следовать определённым тенденциям. Однако, некоторые архитектуры могут реализовывать нетипичные возможности, существенно влияющие на подход к декомпозиции задачи в низкоуровневом программировании, например, параллелизм на уровне команд.
С точки зрения общей философии программирования языки делятся на императивные и декларативные.
Императивные языки подразумевают программирование посредством пошагового инструктирования машины, детального указания уже придуманного программистом способа реализации технического задания (термин «императив» означает «приказной порядок»).
Декларативные языки подразумевают программирование посредством описания требуемого результата в терминах предметной области и возложение работы по получению способа реализации полностью или почти полностью на автоматику (компилятор, библиотеку, макроподсистему и др.) с применением методов [англ.]. На таких языках в большинстве случаев достаточно просто перекомпилировать программу под определенную и операционную систему, а адаптации исходного кода не требуется (термин «декларатив» означает «описание»).
Чем точнее язык позволяет контролировать, как требуемая функциональность будет исполняться на данном процессоре с учётом особенностей его архитектуры, тем легче обеспечить достоверно высокое быстродействие и компактность программ. Оборотной стороной медали является снижение портируемости: для переноса программы на другую аппаратную платформу её придётся перекодировать с нуля (а зачастую и перепроектировать — столь сильны могут быть различия между архитектурами процессоров), хотя в ряде случаев и удаётся обеспечить хорошую портируемость кода между большим числом . На декларативных языках в большинстве случаев достаточно просто перекомпилировать программу под определенную и операционную систему, а адаптации исходного кода не требуется. Порой для них применяется компиляция в языки более низкого уровня, в том числе в языки третьего поколения (в большинстве случаев это Си, но иногда в роли целевых платформ выступают Java, JavaScript, Ada и др.).
В соответствии с этим, нередко выделяются «как-языки» (языки, ориентированные на машину) и «что-языки» (языки, ориентированные на человека).
Распространено заблуждение относительно того, где находится верхний порог степени «высокоуровневости» или «декларативности»: глядя на программы на истинных что-языках, опытные программисты на как-языках зачастую не могут поверить, что перед ними действительно исполнимый код. Вследствие этого, однозначное отнесение языков третьего поколения к императивным (как-языкам) зачастую вызывает споры и попытки продемонстрировать на них «декларативные» фрагменты кода. В действительности, как выше отмечено
, языки третьего поколения предоставляют лишь те «высокоуровневые» конструкции, что находят однозначное соответствие инструкциям в машине фон-Неймана. Существуют , под которыми использование многих распространённых языков третьего поколения затруднено или невозможно, и в лучшем случае разрабатываются специализированные языки третьего поколения (как, например, Occam для транспьютеров, или шейдерные языки для графических процессоров). Кроме того, зачастую упускается из виду, что объектно-ориентированное программирование в большинстве случаев представляет собой однозначно заданную цепочку обмена объектов сообщениями с целью изменения их состояния, что подпадает под определение «императив» (исключение может составлять агентное моделирование).Что-языки могут использоваться не только для разработки прикладных программ под экзотичные системы, но даже для моделирования внутри языка модели выполнения самих этих систем (см., например, Clash).
Как и с другими видами классификации, это деление языков не является строгим, а представляет своего рода градацию. К тому же развитые механизмы абстракции позволяют повышать степень «декларативности» языка с исходно императивной семантикой (подробнее см. встраиваемый язык). Многие декларативные языки также предусматривают императивные возможности. Более того, для множества задач полностью автоматическое порождение по-настоящему эффективной реализации алгоритмически неразрешимо, так что на практике даже на что-языках нередко используются определённые алгоритмические ухищрения, хотя и существуют методы получения эффективных реализаций из основанных на определении (реализаций «в лоб»), такие как изобретённая в СССР суперкомпиляция. Но в целом, функциональные и логические языки принято относить к декларативным, а процедурные и объектно-ориентированные — к императивным.
Уже при использовании языков второго поколения начала формироваться парадигма процедурного программирования, требующая производить декомпозицию крупных процедур в цепочку иерархически связанных более мелких. С появлением языков третьего поколения сформировалось сперва структурное программирование как прямое развитие процедурного, а затем и модульное. Все эти парадигмы реализованы во всех поколениях языков, начиная с третьего, они применяются и в императивных, и в декларативных языках (например, в функциональных языках структурное программирование реализуется посредством лексической области видимости — см. [англ.] и замыкание).
Среди функциональных языков выделяются «чисто функциональные» (англ. purely functional, соответствующие выше упомянутой технической категории ссылочно-прозрачных); остальные называются «не чисто функциональными» (англ. impurely functional) или просто «языками высшего порядка» .
Среди языков логического программирования, помимо традиционного, выделяется несколько особых форм, например, программирование ограничениями.
Существует особый случай объектно-ориентированной парадигмы — [англ.] (см. также #Языки первого и высшего порядка). Распространено мнение, что во многих процедурных языках возможно идиоматическое изображение ООП, однако это неверно, если говорить об ООП высшего порядка.
Ещё по одной «шкале» можно выстроить языки по степени возможности избавиться от точек следования для реализации бесточечного стиля. По одну сторону в этом случае окажутся, например, Си и Паскаль, по другую — Joy, APL/J/K. Бесточечный стиль широко применяется в Haskell, поддерживается в OCaml.
Языки для программирования в мелком и крупном масштабе
Программы могут решать задачи [англ.]: одна программа строит график для заданной функции, а другая управляет документооборотом крупного предприятия. Различные языки программирования рассчитаны на разный исходный масштаб задачи и, что ещё более важно, по-разному справляются с ростом сложности программных систем. Ключевым качеством языка, от которого зависит, как меняется трудоёмкость разработки по мере наращивания системы, является абстракция, то есть возможность отделять смысл (поведение) компонента системы от способа его реализации.
Рост сложности любой программной системы принципиально ограничен тем пределом, до которого ещё можно сохранять контроль над ней: если объём информации, требуемый для осмысления компонента этой системы, превышает «вместимость» мозга одного человека, то этот компонент не будет до конца понят. Станет чрезвычайно тяжело дорабатывать его или исправлять ошибки, и от каждой корректировки можно ждать введения новых ошибок из-за этого неполного знания.
Оригинальный текст (англ.)There is a fundamental limit to complexity of any software system for it to be still manageable: if it requires more than «one brainfull» of information to understand a component of the system, then that component will not be understood fully. It will be extremely difficult to make enhancements or fix bugs, and each fix is likely to introduce further errors due to this incomplete knowledge.— Martin Ward, «Language Oriented Programming»
Такие показатели качества исходного кода, как тестируемость и модифицируемость, очевидным образом определяются коэффициентом повторного использования. Это может означать как применение разных функций к одному и тому же компоненту, так и возможность применять одну и ту же функцию к разным компонентам. Параметрически полиморфные (особенно выводящие) и динамические системы типов существенно повышают коэффициент повторного использования: например, функция, вычисляющая длину массива, будет применима к бесконечному множеству типов массивов. Если же язык требует в сигнатуре функции указывать конкретный способ реализации входных данных, то этот коэффициент резко страдает. Например, Pascal критиковался за необходимость всегда указывать конкретный размер массива, а C++ — за необходимость различать .
и ->
при обращении к компонентам [англ.]. Языки высшего порядка позволяют выделять схемы взаимодействия функций в многократно вызываемый блок кода (функцию высшего порядка), а наибольших значений повторное использование достигает при переходе к языку более высокого уровня — при необходимости специально разрабатываемого для данной задачи — в этом случае повторно используется язык, а не одна функция, а сама разработка языка может вестись с интенсивным повторным использованием компонентов компилятора.
С развитием языков появились особые (присущие исключительно программированию, не требовавшиеся ранее в математике) категории компонентов и зависимостей: монады, классы типов, полиморфные ветвления, аспекты и др. Их использование позволяет выражать бо́льшую функциональность в том же объёме кода, тем самым переводя [англ.] в более мелкий масштаб.
Другие фундаментальные проблемы, связанные со сложностью крупных систем, лежат вне самих программ: это взаимодействие разрабатывающих её программистов между собой, документирование и т. д. Помимо обеспечения абстракции, не последнюю роль в этом играет концептуальная целостность
выбранного языка программирования.Кроме свойств семантики языка, повторное использование может обеспечиваться посредством модульной структуры программной системы или комплекса. Более того, сколь бы гибким ни был язык, работа с огромными объёмами кодов, особенно множеством людей, требует их декомпозиции на модули тем или иным образом. Модульная структура подразумевает не просто разбиение монолитного исходного кода программы на множество текстовых файлов, а обеспечение абстракции в более крупном масштабе, то есть определение интерфейса для всякого логически завершённого фрагмента и сокрытие деталей его реализации. В зависимости от применённых в языке правил определения области видимости язык может допускать или не допускать автоматическое определение зависимостей. Если согласно правилам возможен конфликт имён, то автоопределение зависимостей невозможно, и тогда в заголовке модуля требуется явно перечислять имена модулей, компоненты которых в нём используются.
Некоторые языки (например, Basic или классический Pascal Вирта) ориентированы исключительно на разработку мелких, структурно простых программ. Они не обеспечивают ни развитой системы модулей, ни гибкости конкретных фрагментов. Язык Си создавался как «высокоуровневый ассемблер», что само по себе не предполагает разработку систем выше некоторого порога сложности, поэтому поддержка крупномасштабного программирования в него заложена также не была. Некоторые языки высокого и сверхвысокого уровня (Erlang, Smalltalk, Prolog) предоставляют в качестве базовых примитивных элементов концепции, которые в других языках представляются конструктивно и алгоритмически сложными (процессы, классы, базы знаний) — аналогично разнообразным математическим исчислениям (см. также концептуальная целостность языков). Поэтому такие языки нередко рассматриваются в роли предметно-специфичных — на них выглядят простыми некоторые (но далеко не все) задачи, которые на других языках выглядят сложными. Однако расширение функциональности в других аспектах на этих языках может оборачиваться затруднениями. Standard ML и его родственники расслаиваются на два языка, из которых один — «язык-ядро» (англ. core language) — ориентирован на разработку простых программ, а другой — «язык модулей» (англ. module language),— соответственно, на нелинейную компоновку их в сложные программные системы. Со временем были построены варианты слияния их воедино (1ML). Многие другие языки также включают системы модулей, но большинство из них являются языками модулей первого порядка . Язык модулей ML является единственным в своём роде языком модулей высшего порядка . Языки Lisp и Forth позволяют наращивать системы произвольно и безгранично, в том числе позволяя создавать встраиваемые предметно-специфичные языки внутри себя (как своё синтаксическое и семантическое подмножество) — поэтому их нередко называют метаязыками.
Наиболее популярным на сегодняшний день подходом к решению проблемы комплексирования является объектно-ориентированное программирование, хотя успешность его применения на протяжении десятилетий существования неоднократно подвергалась скепсису, и до сих пор отсутствуют достоверные данные о том, что он приносит выигрыш по сравнению с другими подходами по тем или иным показателям качества. Ему сопутствуют (а порой конкурируют) различные технологии регламентирования зависимостей между компонентами: метаклассы, контракты, прототипы, примеси, типажи и др.
Более мощным подходом исторически считалось использование различных форм метапрограммирования, то есть автоматизации самого процесса разработки на различных уровнях. Принципиально различается метапрограммирование внешнее по отношению к языку и доступное в самом языке. При использовании языков первого порядка
сложность растущих программных систем быстро переходит порог способностей человека по восприятию и переработке информации, поэтому применяются внешние средства предварительного визуального проектирования, позволяющие обозревать сложные схемы в упрощённом виде и в уменьшенном масштабе и затем автоматически порождать каркас кода — см. CASE. В сообществах разработчиков, использующих языки высшего порядка , доминирует прямо противоположный подход — пресекать саму возможность выхода сложности из-под контроля за счёт разделения информационных моделей на независимые составляющие и разработки средств автоматического преобразования одних моделей в другие — см. языково-ориентированное программирование.Концептуальная целостность языков
Фредерик Брукс и Ч. Э. Р. Хоар делают акцент на необходимости обеспечения концептуальной целостности информационных систем вообще и языков программирования в частности, чтобы в каждой части системы использовались сходные синтаксические и семантические формы и не требовалось осваивать помимо собственно состава системы также и правила её идиоматического использования. Хоар предсказывал, что сложность Ады станет причиной катастроф. Алан Кэй отделяет языки, являющиеся «стилем во плоти» (англ. crystalization of style) от прочих языков, являющихся «склеиванием возможностей» (англ. agglutination of features). Грег Нельсон и [англ.] выделяют в особую категорию «языки, наследованные от математики» (англ. mathematically-derived languages).
Эти акценты призывают к использованию языков, воплощающих некое математическое исчисление, аккуратно адаптированное для того, чтобы быть более практичным языком для разработки реальных программ. Такие языки отличаются , и хотя это означает необходимость вручную реализовывать многие распространённые идиомы, доступные в более популярных языках в качестве примитивов языка, выразительность таких языков в целом может быть существенно выше.
Лишь некоторые языки попадают под эту категорию; большинство же языков проектируются приоритетно исходя из возможности эффективной трансляции в машину Тьюринга. Многие языки опираются на общие теории, но при разработке они почти никогда не проверяются на безопасность совместного использования конкретных языковых элементов, являющихся частными приложениями этих теорий, что неизбежно приводит к несовместимости между реализациями языка. Эти проблемы либо игнорируются, либо начинают преподноситься как естественное явление (англ. «not a bug, but a feature»), но в действительности их причиной является то, что язык не был подвергнут математическому анализу.
Примеры математически обоснованных языков и воплощаемых ими математических моделей:
- Agda, [англ.], Idris — интуиционистская теория типов Мартин-Лёфа.
- APL и его потомки (J, K) — оригинальная семантика, не имеющая названия, воплощающая нотацию Айверсона для исчисления массивов (часто встречается термин «array languages»).
- Coq — исчисление индуктивных конструкций.
- Erlang — исчисление процессов (первоначально в форме модели акторов, позже также построено обоснование на
-исчислении).
- Forth — [англ.] и конкатенативный язык программирования.
- Haskell — теория категорий (включая «декартово замкнутую категорию», воплощающую лямбда-исчисление; категорию монад для моделирования побочных эффектов; расширение системы типов Хиндли — Милнера; систему родо́в; и др.).
- Joy — композиция функций и гомоморфизм (иначе говоря, чистый конкатенативный язык программирования и, как следствие, чистый функциональный).
- Lisp — лямбда-исчисление Чёрча (в том числе язык S-выражений, воплощающий нотацию пар Чёрча).
- Scheme — «облагороженный» диалект Лиспа (сильнее типизированный, в большей степени гомоиконичный, ограничивающийся [англ.] и соблюдающий [англ.]), дополненный нотацией продолжений.
- ML — типизированное лямбда-исчисление, то есть лямбда-исчисление, дополненное системой типов Хиндли — Милнера.
- Prolog — исчисление предикатов.
- Mercury — исчисление предикатов, дополненное системой типов Хиндли — Милнера.
- Smalltalk — теория множеств (с соблюдением [англ.]).
- SQL — исчисление кортежей (вариант реляционного исчисления, в свою очередь основанного на исчислении предикатов первого порядка).
- SGML и его потомки (HTML, XML) — нотация деревьев (важный случай графов).
- Unlambda — комбинаторная логика.
- Регулярные выражения.
- Рефал — оригинальная семантика Турчина, носящая название «Рефал-машины» или «Рефал-автомата», созданная на основе нормального алгоритма Маркова, воплощающая композицию теории автоматов, сопоставления с образцом и переписывания термов.
Наличие математического обоснования для языка может гарантировать (или, как минимум, обещать с очень высокой вероятностью) некоторые или все из следующих положительных свойств:
- Существенное повышение стабильности программ. В одних случаях — за счёт построения доказательства надёжности для самого языка (см. типобезопасность), существенного упрощения формальной верификации программ и даже получения языка, который сам является системой автоматического доказательства (Coq, Agda). В других случаях — за счёт раннего обнаружения ошибок на первых же пробных запусках программ (Forth и регулярные выражения).
- Обеспечение потенциально более высокой эффективности программ. Даже если семантика языка далека от архитектуры целевой платформы компиляции, к нему могут быть применимы формальные методики глобального анализа программ (хотя трудоёмкость написания даже тривиального транслятора может оказаться выше). Например, для языков Scheme и Standard ML существуют развитые полнопрограммно-оптимизирующие компиляторы и суперкомпиляторы, результат работы которых может уверенно конкурировать по скорости с языком низкого уровня Си и даже опережать последний (хотя ресурсоёмкость работы самих компиляторов оказывается значительно выше). Одна из самых быстрых СУБД — KDB — написана на языке K. Язык Scala (унаследовавший математику от ML) обеспечивает на платформе JVM более высокую скорость, чем «родной» для неё язык Java[источник не указан 2993 дня]. С другой стороны, Forth имеет репутацию одного из самых нетребовательных к ресурсам языков (менее требователен, чем Си) и используется для разработки приложений реального времени под самые маломощные ЭВМ; кроме того, транслятор Форта является одним из наименее трудоёмких в реализации на ассемблере.
- Заранее известный (неограниченный или, наоборот, чётко очерченный) предел роста сложности программных компонентов, систем и комплексов, которые можно выразить средствами этого языка с сохранением показателей качества. Языки, не имеющие математического обоснования (а именно такие наиболее часто применяются в мейнстриме: C++, Java, C#, Delphi и др.), на практике ограничивают реализуемую функциональность и/или снижают качество по мере усложнения системы, так как им присущи экспоненциальные кривые роста сложности как относительно работы одного отдельно взятого человека, так и относительно сложности управления проектом в целом. Прогнозируемая сложность системы приводит либо к поэтапной декомпозиции проекта на множество более мелких задач, каждая из которых решается соответствующим языком, либо к языково-ориентированному программированию для случая, когда адресуемой языком задачей является как раз описание семантик и/или символьные вычисления (Lisp, ML, Haskell, Рефал, Регулярные выражения). Языки с неограниченным пределом роста сложности программ нередко относят к метаязыкам (что в непосредственном толковании термина не верно, но практике сводимо, так как всякий мини-язык, выбранный для решения некоторой подзадачи в составе общей задачи, может быть представлен в виде синтаксического и семантического подмножества данного языка, не требуя трансляции).
- Удобство для человека при решении задач, на которые этот язык ориентирован по своей природе (см. проблемно-ориентированный язык), что в некоторой степени также способно (косвенно) повлиять на повышение стабильности результирующих программ за счёт повышения вероятности обнаружения ошибок в исходном коде и снижения дублирования кода.
Особые категории языков
- Учебные
- Предметно-специфичные
- Эзотерические
- Визуальные
Формальные преобразования и оптимизация
В. Ф. Турчин отмечает, что достоинства всякого формализованного языка определяются не только тем, сколь он удобен для непосредственного использования человеком, но и тем, в какой степени тексты на этом языке поддаются формальным преобразованиям.
Например, ссылочная прозрачность означает, что параметры функций не обязаны вычисляться перед вызовом — вместо этого фактически переданное выражение может быть целиком подставлено на место переменной в функции, и поведение функции от этого не изменится. Это открывает возможности почти произвольных [англ.]: могут устраняться ненужные промежуточные представления данных, редуцироваться сложные цепочки вычислений, подбираться оптимальное количество параллельных процессов, вводиться мемоизация, и пр. С другой стороны, это означает полное отсутствие побочных эффектов, а это делает реализацию некоторых алгоритмов заведомо менее эффективной, чем при использовании изменяемого состояния.
Для небольших и простых программ языки высокого уровня порождают машинный код большего размера и исполняются медленнее. Однако для алгоритмически и структурно сложных программ преимущество может быть на стороне некоторых языков высокого уровня, так как человек физически не способен выражать сложные концепции с учётом их эффективного исполнения на языке машины. К примеру, существует бенчмарк, на котором MLton и [англ.] уверенно опережают GCC. Есть масса частных причин, по которым автоматическая оптимизация в ходе трансляции языков высокого уровня даёт в принципе более высокую скорость исполнения, чем сознательный контроль способа реализации на языках низкого уровня. Например, имеются достоверные данные о том, что автоматическое управление памятью более эффективно, чем ручное, уже только при использовании динамического метода (см. сборка мусора), а существует и потенциально более эффективный статический метод (см. управление памятью на основе регионов). Далее, для каждого микроконтекста необходимо распределить регистры с учётом минимизации обращения к памяти, а это требует решения задачи раскраски графа. Такого рода особенностей машинной логики очень много, так что общая информационная сложность возрастает экспоненциально при каждом «шаге на уровень вниз», а компиляция языка высокого уровня может включать десятки таких шагов.
Существует множество стратегий автоматической оптимизации. Некоторые универсальны, другие могут быть применимы лишь к языкам определённой природы, а некоторые зависят от способа использования языка. Примером может служить оптимизация хвостовых вызовов и её частный случай — оптимизация хвостовой рекурсии. Хотя компиляторы многих языков осуществляют оптимизацию хвостовой рекурсии при определённых условиях, лишь некоторые языки способны семантически гарантировать оптимизацию хвостовых вызовов в общем случае. Стандарт языка Scheme требует, чтобы всякая реализация гарантировала её. Для многих функциональных языков она в принципе применима, но лишь оптимизирующие компиляторы её выполняют. В языках вроде Си или C++ она может производиться лишь в определённых случаях и лишь при использовании глобального анализа потока управления.
Языки высшего порядка в большинстве случаев вынуждены исполняться медленнее, чем языки первого порядка. Причины лежат как в самой декомпозиции линейного кода на цепочку вложенных вызовов, так и в вытекающих особенностях низкоуровневого представления функций (см. замыкание) и данных (обёрнутое (англ. boxed), теговое). Однако существуют техники агрессивной оптимизации программ, позволяющие редуцировать языки высшего порядка до языков первого порядка (см. дефункционализация, MLton, [англ.]).
Популярность языков
Трудно определить, какой язык программирования наиболее популярен, так как значение слова «популярность» зависит от контекста (в английском языке используется термин «usage», имеющий ещё более размытое значение). Один язык может отнимать наибольшее количество человеко-часов, на другом написано наибольшее число строк кода, третий занимает наибольшее процессорное время, а четвёртый наиболее часто служит исследовательской базой в академических кругах. Некоторые языки очень популярны для конкретных задач. Например, Кобол до сих пор доминирует в корпоративных дата-центрах, Фортран — в научных и инженерных приложениях, вариации языка Си — в системном программировании, а различные потомки ML — в формальной верификации[источник не указан 3023 дня]. Другие языки регулярно используются для создания самых разнообразных приложений.
Существуют различные метрики для измерения популярности языков, каждая из которых разработана с пристрастием к определённому смыслу понятия популярности:
- подсчёт числа вакансий, упоминающих язык;
- количество проданных книг (учебников или справочников);
- оценка количества строк кода, написанных на языке (что не принимает в расчёт редко публикуемые случаи использования языков);
- подсчёт упоминаний языка в запросах поисковиков.
Следует заметить, что высокие оценки по этим показателям не только никак не свидетельствуют о высоком техническом уровне языка и/или оптимизации расходов при его использовании, но и, напротив, порой могут говорить об обратном. Например, язык Кобол входит в число лидеров по количеству написанных на нём строк кода, но причиной этому является крайне низкий показатель модифицируемости кода, что делает этот код не повторно используемым, а legacy-кодом. Как следствие, поддержка программ на Коболе в кратковременной перспективе обходится значительно дороже, чем программ на большинстве современных языков, но переписывание их с нуля потребовало бы значительных единовременных вложений и может сравниваться только с долговременными расходами. Техническое несовершенство Кобола обусловлено тем, что его разрабатывали без привлечения экспертов в области информатики.
См. также
- Компьютерный язык
- Программирование
- Hello, world!
- Стандарт оформления кода
- Теория языка программирования
Примечания
- ISO/IEC/IEEE 24765:2010 Systems and software engineering — Vocabulary
- ISO/IEC 2382-1:1993, Information technology — Vocabulary — Part 1: Fundamental terms
- Sammar Qayyum, Saqib Ali. A Pragmatic Comparison of Four Different Programming Languages // ScienceOpen Preprints. — 2021-06-21. — doi:10.14293/S2199-1006.1.SOR-.PP5RV1O.v1. Архивировано 10 июня 2023 года.
- , et al. (2000). «Plankalkül: The First High-Level Programming Language and its Implementation». Institut für Informatik, Freie Universität Berlin, Technical Report B-3/2000. (full text) Архивная копия от 18 октября 2014 на Wayback Machine
- Computer Languages, 1989, 1. Невидимый конструктор § Создание кодов, понятных человеку, с. 16.
- Linda Null, Julia Lobur, The essentials of computer organization and architecture, Edition 2, Jones & Bartlett Publishers, 2006, ISBN 0-7637-3769-0, p. 435
- O'Reilly Media. History of programming languages (PDF). Дата обращения: 5 октября 2006. Архивировано из оригинала 28 февраля 2008 года.
- Frank da Cruz. IBM Punch Cards Архивная копия от 13 мая 2011 на Wayback Machine Columbia University Computing History Архивная копия от 23 мая 2011 на Wayback Machine.
- Richard L. Wexelblat: History of Programming Languages, Academic Press, 1981, chapter XIV.
- Пратт, 1979, 4.6. Сопоставление с образцом, с. 130—132.
- Пратт, 1979, 15. Снобол 4, с. 483—516.
- Пратт, Зелковиц, 2002, 8.4.2. Сопоставление с образцом, с. 369—372.
- François Labelle. Programming Language Usage Graph . SourceForge. Дата обращения: 21 июня 2006. Архивировано из оригинала 17 июня 2006 года.
- Hayes, Brian. The Semicolon Wars (англ.) // [англ.] : magazine. — 2006. — Vol. 94, no. 4. — P. 299—303.
- Tetsuro Fujise, Takashi Chikayama, Kazuaki Rokusawa, Akihiko Nakase (December 1994). «KLIC: A Portable Implementation of KL1» Proc. of FGCS '94, ICOT Tokyo, December 1994. http://www.icot.or.jp/ARCHIVE/HomePage-E.html Архивная копия от 25 сентября 2006 на Wayback Machine KLIC is a portable implementation of a concurrent logic programming language .
- Jim Bender. Mini-Bibliography on Modules for Functional Programming Languages . ReadScheme.org (15 марта 2004). Дата обращения: 27 сентября 2006. Архивировано из оригинала 24 сентября 2006 года.
- Stroustrup, Bjarne. Evolving a language in and for the real world: C++ 1991-2006 . Дата обращения: 16 января 2017. Архивировано 20 ноября 2007 года.
- Т. Пратт, М. Зелковиц. Языки программирования. Разработка и реализация. — 4. — Санкт-Петербург : Питер, 2002. — С. 203. — 688 с. — 4000 экз. — ISBN 5-318-00189-0.
- Страуструп Б. Дизайн и эволюция C++. — Санкт-Петербург : Питер, 2006. — С. 74—76. — 448 с. — 2000 экз. — ISBN 5-469-01217-4.
- Сейбел - Кодеры за работой, 2011, Глава 12. Кен Томпсон, с. 414.
- Зуев Е.А., Кротов А.Н., Сухомлин В.А. Язык программирования Си++: этапы эволюции и современное состояние (4 октября 1996). Дата обращения: 16 января 2017. Архивировано 18 января 2017 года.
- Paulson, «ML for the Working Programmer», 1996, с. 213.
- Paulson, «ML for the Working Programmer», 1996, с. 1.
- Брукс, 1995.
- Mernik, 2012, с. 2—12.
- Paulson, «ML for the Working Programmer», 1996, с. 9.
- Rick Byers. Garbage Collection Algorithms . courses.cs.washington.edu. — Project for CSEP 521, Winter 2007. Дата обращения: 28 декабря 2016. Архивировано 29 августа 2017 года.
- Appel - A Critique of Standard ML, 1992.
- Harper — Practical Foundations for Programming Languages, 2012, Chapter 4. Statics, с. 35.
- Mitchel, 2004, 6.2.1 Type Safety, с. 132—133.
- Comparison of static code analyzers: CppCat, Cppcheck, PVS-Studio and Visual Studio . Дата обращения: 25 октября 2016. Архивировано 26 октября 2016 года.
- Comparing PVS-Studio with other code analyzers . Дата обращения: 25 октября 2016. Архивировано 26 октября 2016 года.
- Пратт, 1979, 2.7. Связывание и время связывания, с. 46—51.
- Reynolds, «Theories of programming languages», 1998, 12.4 Deriving a First-Order Semantics.
- Strachey — Fundamental Concepts, 1967, 3.5.1. First and second class objects, с. 32—34.
- SICP.
- Harper — Practical Foundations for Programming Languages, 2012, 8.2 Higher-Order Functions, с. 67.
- Пратт, Зелковиц, 2002, 1.1 Зачем изучать языки программирования, с. 17—18.
- Bruce A. Tate. Foreword // Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages. — Pragmatic Bookshelf, 2010. — С. 14—16. — ISBN 978-1934356593.
- Пратт, Зелковиц, 2002, 1.1 Зачем изучать языки программирования, с. 18.
- Hudak, 1998.
- Paulson, "ML for the Working Programmer", 1996, с. 1.
- Clash Архивная копия от 4 января 2024 на Wayback Machine — встраиваемый DSL на Haskell, предназначенный для моделирования процессоров и генерации описаний на Verilog/VHDL
- Ахо, Ульман, 1992.
- Joyner, 1996, 2.2 Communication, abstraction and precision, с. 4.
- Ward, 1994.
- Paulson, «ML for the Working Programmer», 1996, с. 63—64.
- Kernigan about Pascal, 1981.
- Joyner, 1996, 3.17 ‘.’ and ‘->’, с. 26.
- Paulson, «ML for the Working Programmer», 1996, с. 177—178.
- Брукс, 1975, 1995.
- Брукс, 1975, 1995, Достижение концептуальной целостности, с. 30.
- C.A.R. Hoare — The Emperor’s Old Clothes, Communications of the ACM, 1981
- Алан Кэй. The Early History of Smalltalk. — Apple Computer, ACM SIGPLAN Notices, vol.28, № 3, March 1993. Архивировано 14 сентября 2012 года.
- Greg Nelson. Systems Programming with Modula-3. — NJ: Prentice Hall, Englewood Cliffs, 1991. — 288 с. — ISBN 978-0135904640.
- Commentary on SML, 1991, Aims of the Commentary, с. vii.
- Thomas Noll, Chanchal Kumar Roy. Modeling Erlang in the Pi–Calculus. — ACM 1-59593-066-3/05/0009, 2005. Архивировано 1 августа 2014 года.
- Design Principles Behind Smalltalk . Дата обращения: 3 июня 2014. Архивировано 19 июня 2014 года.
- kx: Calibrated performance . Дата обращения: 3 июня 2014. Архивировано 21 июня 2014 года.
- Luca Cardelli. Typeful programming. — IFIP State-of-the-Art Reports, Springer-Verlag, 1991. Архивировано 22 марта 2016 года.
- Ward, 1994: «There is a fundamental limit to complexity of any software system for it to be still manageable: if it requires more than «one brainfull» of information to understand a component of the system, then that component will not be understood fully. It will be extremely difficult to make enhancements or fix bugs, and each fix is likely to introduce further errors due to this incomplete knowledge.».
- Гласс, 2004.
- Czarnecki et al, 2004.
- Турчин В. Ф. Эквивалентные преобразования программ на РЕФАЛе: Труды ЦНИПИАСС 6: ЦНИПИАСС, 1974.
- B. Zorn. The Measured Cost of Conservative Garbage Collection. Technical Report CU-CS-573-92. // University of Colorado at Boulder. — 1993. — doi:10.1.1.14.1816.
- Ehud Lamm.
- Richard L. Conner. Cobol, your age is showing (англ.) // Computerworld : magazine. — International Data Group, 1984. — 14 May (vol. 18, no. 20). — P. ID/7—ID/18. — ISSN 0010-4841.
- Robert L. Mitchell. Cobol: Not Dead Yet . Computerworld (4 октября 2006). Дата обращения: 27 апреля 2014. Архивировано 27 апреля 2014 года.
Литература
- Гавриков М. М., Иванченко А. Н., Гринченков Д. В. Теоретические основы разработки и реализации языков программирования. — , 2013. — 178 с. — ISBN 978-5-406-02430-0.
- Криницкий Н. А., Миронов Г. А., Фролов Г. Д. Программирование. — ГИФМЛ, 1963. — 384 с.
- Братчиков И. Л. Синтаксис языков программирования. — Наука, 1975. — 230 с.
- Лавров С. С. Основные понятия и конструкции языков программирования. — Финансы и статистика, 1982. — 80 с.
- Christopher Strachey. Fundamental Concepts in Programming Languages ( (англ.)). — 1967. Архивировано 12 августа 2017 года.
- Повторно опубликовано: Christopher Strachey. Fundamental Concepts in Programming Languages ( (англ.)) // . — 2000. — Т. 13. — С. 11—49. — ISSN 1388-3690. — doi:10.1023/A:1010000313106.
- Харольд Абельсон, Джеральд Джей Сассман, Джули Сассман. Структура и интерпретация компьютерных программ (SICP).
- Фредерик Брукс. Мифический человеко-месяц или Как создаются программные системы. — Addison-Wesley, 1975, 1995. — ISBN ISBN 5-93286-005-7 (1-е изд.).
- Теренс Пратт. Языки программирования: разработка и реализация = Programming Language Design and Implementation (PLDI). — 1-е издание. — Мир, 1979.
- Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы: принципы, технологии и инструменты. — Addison-Wesley Publishing Company, Издательский дом «Вильямс», 1985, 2001, 2003. — 768 с. — ISBN 5-8459-0189-8 (рус.), 0-201-10088-6 (ориг.).
- Time-Life Books. Язык компьютера = Computer Languages. — М.: Мир, 1989. — Т. 2. — 240 с. — (Understanding Computers). — 100 000 экз. — ISBN 5-03-001148-X.
- [англ.]. Typeful programming ( (англ.)) // IFIP State-of-the-Art Reports. — Springer-Verlag, 1991. — Вып. Formal Description of Programming Concepts. — С. 431—507.
- Robin Milner, [англ.]. Commentary on Standard ML. — MIT Press, 1991. — ISBN 0-262-63132-7. Архивировано 1 декабря 2014 года.
- Альфред Ахо, Джеффри Ульман. Foundations of Computer Science. — Computer Science Press, 1992.
- Andrew W. Appel. A Critique of Standard ML. — Princeton University, revised version of CS-TR-364-92, 1992.
- Martin Ward. Language Oriented Programming. — Computer Science Department, Science Labs, 1994.
- Ian Joyner. A Critique of C++ and Programming and Language Trends of the 1990s - 3rd Edition. // копирайт и список изданий. — 1996.
- [англ.]. ML for the Working Programmer. — 2nd. — Cambridge, Great Britain: Cambridge University Press, 1996. — 492 с. — ISBN 0-521-57050-6 (твёрдый переплёт), 0-521-56543-X (мягкий переплёт).
- John C. Reynolds. Theories of programming languages. — Cambridge University Press, 1998. — ISBN 978-0-521-59414-1 (hardback), 978-0-521-10697-9 (paperback).
- Andrew W. Appel. Modern compiler implementation in ML (in C, in Java) (неопр.). — Cambridge, Great Britain: Cambridge University Press, 1998. — 538 с. — ISBN (ML) 0-521-58274-1 (hardback), 0-521-60764-7 (paperback).
- Paul Hudak. Modular Domain Specific Languages and Tools. — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998. Архивировано 17 октября 2013 года.
- Роберт У. Себеста. Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. — 5-е изд. — М.: , 2001. — 672 с. — 5000 экз. — ISBN 5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.).
- Вольфенгаген В. Э. Конструкции языков программирования. Приёмы описания. — М.: Центр ЮрИнфоР, 2001. — 276 с. — ISBN 5-89158-079-9.
- Паронджанов В. Д. Как улучшить работу ума. Алгоритмы без программистов — это очень просто! — М.: Дело, 2001. — 360 с. — ISBN 5-7749-0211-0.
- Pierce, Benjamin C. Types and Programming Languages. — MIT Press, 2002. — ISBN 0-262-16209-1.
- Перевод на русский язык: Пирс Б. Типы в языках программирования. — , 2012. — 680 с. — ISBN 978-5-7913-0082-9.
- Теренс Пратт, Марвин Зелковиц. Языки программирования: разработка и реализация. — 4-е издание. — Питер, 2002. — (Классика Computer Science). — ISBN 978-5-318-00189-5.
- Martin Campbell-Kelly. From Airline Reservations to Sonic the Hedgehog: A History of the Software Industry. — MIT Press, 2003. — 372 с. — (History of Computing). — ISBN 978-1422391761.
- Роберт Гласс. Факты и заблуждения профессионального программирования. — «Символ-Плюс», 2004. — 240 с. — ISBN 5-93286-092-8, 978-5-93286-092-2.
- John C. Mitchell. Concepts in Programming Languages. — Cambridge University Press, 2004. — ISBN 0-511-04091-1 (eBook in netLibrary); 0-521-78098-5 (hardback).
- K. Czarnecki, J. O’Donnell, J. Striegnitz, W. Taha. DSL implementation in metaocaml, template haskell, and C++. — University of Waterloo, University of Glasgow, Research Centre Julich, Rice University, 2004. Архивировано 5 марта 2016 года.
- Ф. Бьянкуцци, Ш. Уорден. Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования. — СПб.: , 2010. — 608 с. — ISBN 978-5-93286-170-7.
- Питер Сейбел. Кодеры за работой. Размышления о ремесле программиста. — Символ-Плюс, СПб. — 2011. — ISBN 978-5-93286-188-2, 978-1-4302-1948-4 (англ.).
- [англ.]. Practical Foundations for Programming Languages. — version 1.37 (revised 01.11.2014). — licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License., 2012. — 544 с. Архивная копия от 24 октября 2015 на Wayback Machine
- Marjan Mernik. Formal and Practical Aspects of Domain-Specific Languages. — IGI Global, 2012. — ISBN 978-1-4666-2092-6.
Ссылки
- The Language List (недоступная ссылка — история) (англ.) — более 2500 языков с кратким описанием
- Computer Languages History (англ.) — история языков программирования (с 1954 по май 2004) (содержит регулярно обновляемую диаграмму)
- Examples (недоступная ссылка — история) (англ.) — примеры программирования на 162 языках
- Programming Language Popularity (англ.) — регулярно обновляемое исследование популярности языков программирования
- 10 языков программирования, которые стоит изучать (2006 г.) Архивная копия от 9 ноября 2011 на Wayback Machine
- Programming Community Index (англ.) — регулярно обновляемый рейтинг популярности языков программирования
- Computer Language Shootout Benchmarks (недоступная ссылка — история) (англ.) — сравнение языков программирования по эффективности
- Programming Languages that are Loved (англ.) — сравнение языков программирования по «любви» и «ненависти» к ним
- Брайан Керниган. Why Pascal is Not My Favorite Programming Language. — 1981.
- Ehud Lamm. Hidden complexities of tail-call/tail-recursion optimization. LtU Classic Archives (англ.). Lambda the Ultimate (7 декабря 2003). Дата обращения: 30 ноября 2016.
В сносках к статье найдены неработоспособные вики-ссылки. |
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер
Yazy k programmi rovaniya formalnyj yazyk prednaznachennyj dlya zapisi kompyuternyh programm Yazyk programmirovaniya opredelyaet nabor leksicheskih sintaksicheskih i semanticheskih pravil opredelyayushih vneshnij vid programmy i dejstviya kotorye vypolnit ispolnitel obychno EVM pod eyo upravleniem So vremeni sozdaniya pervyh programmiruemyh mashin chelovechestvo pridumalo bolee vosmi tysyach yazykov programmirovaniya vklyuchaya ezotericheskie Kazhdyj god ih chislo uvelichivaetsya Nekotorymi yazykami umeet polzovatsya tolko nebolshoe chislo ih sobstvennyh razrabotchikov drugie stanovyatsya izvestny millionam lyudej Professionalnye programmisty mogut vladet neskolkimi yazykami programmirovaniya Yazyk programmirovaniya prednaznachen dlya napisaniya kompyuternyh programm kotorye predstavlyayut soboj nabor pravil pozvolyayushih kompyuteru vypolnit tot ili inoj vychislitelnyj process organizovat upravlenie razlichnymi obektami i t p Yazyk programmirovaniya otlichaetsya ot estestvennyh yazykov tem chto prednaznachen dlya upravleniya EVM v to vremya kak estestvennye yazyki ispolzuyutsya prezhde vsego dlya obsheniya lyudej mezhdu soboj Bolshinstvo yazykov programmirovaniya ispolzuet specialnye konstrukcii dlya opredeleniya i manipulirovaniya strukturami dannyh i upravleniya processom vychislenij Kak pravilo yazyk programmirovaniya opredelyaetsya ne tolko cherez specifikacii standarta yazyka formalno opredelyayushie ego sintaksis i semantiku no i cherez voplosheniya realizacii standarta programmnye sredstva obespechivayushie translyaciyu ili interpretaciyu programm na etom yazyke takie programmnye sredstva razlichayutsya po proizvoditelyu marke i variantu versii vremeni vypuska polnote voplosheniya standarta dopolnitelnym vozmozhnostyam mogut imet opredelyonnye oshibki ili osobennosti voplosheniya vliyayushie na praktiku ispolzovaniya yazyka ili dazhe na ego standart IstoriyaOsnovnaya statya Istoriya yazykov programmirovaniya Rannie etapy razvitiya Mozhno skazat chto pervye yazyki programmirovaniya voznikali eshyo do poyavleniya sovremennyh elektronnyh vychislitelnyh mashin uzhe v XIX veke byli izobreteny ustrojstva kotorye mozhno s dolej uslovnosti nazvat programmiruemymi k primeru muzykalnaya shkatulka i pozdnee mehanicheskoe pianino posredstvom metallicheskogo cilindra i Zhakkardovyj tkackij stanok 1804 posredstvom kartonnyh kart Dlya upravleniya imi ispolzovalis nabory instrukcij kotorye v ramkah sovremennoj klassifikacii mozhno schitat prototipami predmetno orientirovannyh yazykov programmirovaniya istochnik ne ukazan 817 dnej Znachimym mozhno schitat yazyk na kotorom ledi Ada Avgusta grafinya Lavlejs v 1842 godu napisala programmu dlya vychisleniya chisel Bernulli dlya analiticheskoj mashiny Charlza Bebbidzha stavshej by v sluchae realizacii pervym kompyuterom v mire hotya i mehanicheskim s parovym dvigatelem V 1930 1940 godah A Chyorch A Tyuring A Markov razrabotali matematicheskie abstrakcii lyambda ischislenie mashinu Tyuringa normalnye algoritmy sootvetstvenno dlya formalizacii algoritmov V eto zhe vremya v 1940 e gody poyavilis elektricheskie cifrovye kompyutery i byl razrabotan yazyk kotoryj mozhno schitat pervym vysokourovnevym yazykom programmirovaniya dlya EVM Plankalkul sozdannyj nemeckim inzhenerom K Cuze v period s 1943 po 1945 gody Programmisty EVM nachala 1950 h godov v osobennosti takih kak UNIVAC i IBM 701 pri sozdanii programm polzovalis neposredstvenno mashinnym kodom zapis programmy na kotorom sostoyala iz edinic i nulej i kotoryj prinyato schitat yazykom programmirovaniya pervogo pokoleniya pri etom raznye mashiny raznyh proizvoditelej ispolzovali razlichnye kody chto trebovalo perepisyvat programmu pri perehode na druguyu EVM Pervym prakticheski realizovannym yazykom stal v 1949 godu tak nazyvaemyj Kratkij kod v kotorom operacii i peremennye kodirovalis dvuhsimvolnymi sochetaniyami On byl razrabotan v kompanii Eckert Mauchly Computer Corporation vypuskavshej UNIVAC i sozdannoj odnim iz sotrudnikov Tyuringa Dzhonom Mokli Mokli poruchil svoim sotrudnikam razrabotat translyator matematicheskih formul odnako dlya 1940 h godov eta cel byla slishkom ambiciozna Kratkij kod byl realizovan s pomoshyu interpretatora Vskore na smenu takomu metodu programmirovaniya prishlo primenenie yazykov vtorogo pokoleniya takzhe ogranichennyh specifikaciyami konkretnyh mashin no bolee prostyh dlya ispolzovaniya chelovekom za schyot ispolzovaniya mnemonik simvolnyh oboznachenij mashinnyh komand i vozmozhnosti sopostavleniya imyon adresam v mashinnoj pamyati Oni tradicionno izvestny pod naimenovaniem yazykov assemblera i avtokodov Odnako pri ispolzovanii assemblera stanovilsya neobhodimym process perevoda programmy na yazyk mashinnyh kodov pered eyo vypolneniem dlya chego byli razrabotany specialnye programmy takzhe poluchivshie nazvanie assemblerov Sohranyalis i problemy s perenosimostyu programmy s EVM odnoj arhitektury na druguyu i neobhodimost dlya programmista pri reshenii zadachi myslit terminami nizkogo urovnya yachejka adres komanda Pozdnee yazyki vtorogo pokoleniya byli usovershenstvovany v nih poyavilas podderzhka makrokomand S serediny 1950 h nachali poyavlyatsya yazyki tretego pokoleniya takie kak Fortran Lisp i Kobol Yazyki programmirovaniya etogo tipa bolee abstraktny ih eshyo nazyvayut yazykami vysokogo urovnya i universalny ne imeyut zhyostkoj zavisimosti ot konkretnoj sistemy komand i konfiguracii periferijnyh ustrojstv Programma na yazyke vysokogo urovnya mozhet ispolnyatsya po krajnej mere v teorii na praktike obychno imeetsya ryad specificheskih versij ili dialektov realizacii yazyka na lyuboj EVM na kotoroj dlya etogo yazyka imeetsya translyator instrument perevodyashij programmu na yazyk mashiny posle chego ona mozhet byt vypolnena processorom Obnovlyonnye versii perechislennyh yazykov do sih por imeyut hozhdenie v razrabotke programmnogo obespecheniya i kazhdyj iz nih okazal opredelyonnoe vliyanie na posleduyushee razvitie yazykov programmirovaniya Togda zhe v konce 1950 h godov poyavilsya Algol takzhe posluzhivshij osnovoj dlya ryada dalnejshih razrabotok v etoj sfere Neobhodimo zametit chto na format i primenenie rannih yazykov programmirovaniya v znachitelnoj stepeni vliyali interfejsnye ogranicheniya Sovershenstvovanie V period 1960 h 1970 h godov byli razrabotany osnovnye paradigmy yazykov programmirovaniya ispolzuemye v nastoyashee vremya hotya vo mnogih aspektah etot process predstavlyal soboj lish uluchshenie idej i koncepcij zalozhennyh eshyo v pervyh yazykah tretego pokoleniya Yazyk APL okazal vliyanie na funkcionalnoe programmirovanie i stal pervym yazykom podderzhivavshim obrabotku massivov Yazyk PL 1 NPL byl razrabotan v 1960 h godah kak obedinenie luchshih chert Fortrana i Kobola Yazyk Snobol razrabotannyj i sovershenstvuemyj v techenie 1960 h godov orientirovannyj na obrabotku tekstov vvyol v chislo bazovyh operacij yazykov programmirovaniya sopostavlenie s obrazcom Yazyk Simula poyavivshijsya primerno v eto zhe vremya vpervye vklyuchal podderzhku obektno orientirovannogo programmirovaniya V seredine 1970 h gruppa specialistov predstavila yazyk Smalltalk kotoryj byl uzhe vsecelo obektno orientirovannym V period s 1969 po 1973 gody velas razrabotka yazyka Si populyarnogo i po sej den i stavshego osnovoj dlya mnozhestva posleduyushih yazykov naprimer stol populyarnyh kak C i Java V 1972 godu byl sozdan Prolog naibolee izvestnyj hotya i ne pervyj i daleko ne edinstvennyj yazyk logicheskogo programmirovaniya V 1973 godu v yazyke ML byla realizovana rasshirennaya sistema polimorfnoj tipizacii polozhivshaya nachalo tipizirovannym yazykam funkcionalnogo programmirovaniya Kazhdyj iz etih yazykov porodil po semejstvu potomkov i bolshinstvo sovremennyh yazykov programmirovaniya v konechnom schyote osnovano na odnom iz nih Krome togo v 1960 1970 h godah aktivno velis spory o neobhodimosti podderzhki strukturnogo programmirovaniya v teh ili inyh yazykah V chastnosti gollandskij specialist E Dejkstra vystupal v pechati s predlozheniyami o polnom otkaze ot ispolzovaniya instrukcij GOTO vo vseh vysokourovnevyh yazykah Razvivalis takzhe priyomy napravlennye na sokrashenie obyoma programm i povyshenie produktivnosti raboty programmista i polzovatelya Obedinenie i razvitie V 1980 e gody nastupil period kotoryj mozhno uslovno nazvat vremenem konsolidacii Yazyk C obedinil v sebe cherty obektno orientirovannogo i sistemnogo programmirovaniya pravitelstvo SShA standartizirovalo yazyk Ada proizvodnyj ot Paskalya i prednaznachennyj dlya ispolzovaniya v bortovyh sistemah upravleniya voennymi obektami v Yaponii i drugih stranah mira osushestvlyalis znachitelnye investicii v izuchenie perspektiv tak nazyvaemyh yazykov pyatogo pokoleniya kotorye vklyuchali by v sebya konstrukcii logicheskogo programmirovaniya Soobshestvo funkcionalnyh yazykov prinyalo v kachestve standarta ML i Lisp V celom etot period harakterizovalsya skoree oporoj na zalozhennyj v predydushem desyatiletii fundament nezheli razrabotkoj novyh paradigm Vazhnoj tendenciej kotoraya nablyudalas v razrabotke yazykov programmirovaniya dlya krupnomasshtabnyh sistem bylo sosredotochenie na primenenii modulej obyomnyh edinic organizacii koda Hotya nekotorye yazyki takie kak PL 1 uzhe podderzhivali sootvetstvuyushuyu funkcionalnost modulnaya sistema nashla svoyo otrazhenie i primenenie takzhe i v yazykah Modula 2 Oberon Ada i ML Chasto modulnye sistemy obedinyalis s konstrukciyami obobshyonnogo programmirovaniya Vazhnym napravleniem rabot stanovyatsya vizualnye graficheskie yazyki programmirovaniya v kotoryh process napisaniya programmy kak teksta zamenyaetsya na process risovaniya konstruirovaniya programmy v vide diagrammy na ekrane EVM Vizualnye yazyki obespechivayut naglyadnost i luchshee vospriyatie logiki programmy chelovekom V 1990 h godah v svyazi s aktivnym razvitiem Interneta rasprostranenie poluchili yazyki pozvolyayushie sozdavat scenarii dlya veb stranic glavnym obrazom Perl razvivshijsya iz skriptovogo instrumenta dlya Unix sistem i Java Vozrastala takzhe i populyarnost tehnologij virtualizacii Eti izmeneniya odnako takzhe ne predstavlyali soboj fundamentalnyh novacij yavlyayas skoree sovershenstvovaniem uzhe sushestvovavshih paradigm i yazykov v poslednem sluchae glavnym obrazom semejstva Si V nastoyashee vremya razvitie yazykov programmirovaniya idyot v napravlenii povysheniya bezopasnosti i nadyozhnosti sozdaniya novyh form modulnoj organizacii koda i integracii s bazami dannyh Specifikaciya yazykovStandartizaciya Dlya mnogih shiroko rasprostranyonnyh yazykov programmirovaniya sozdany mezhdunarodnye standarty Specialnye organizacii provodyat regulyarnoe obnovlenie i publikaciyu specifikacij i formalnyh opredelenij sootvetstvuyushego yazyka V ramkah takih komitetov prodolzhaetsya razrabotka i modernizaciya yazykov programmirovaniya i reshayutsya voprosy o rasshirenii ili podderzhke uzhe sushestvuyushih i novyh yazykovyh konstrukcij Alfavit Sovremennye yazyki programmirovaniya shiroko ispolzuyut multiyazychnye simvoly Yunikoda Delphi 2006 C Java Rust dlya identifikatorov i hraneniya ishodnogo koda Istoricheski do nachala 2000 h godov v yazykah primenyalas 7 i bitnaya kodirovka ASCII prinyataya standartom v SShA Rannie yazyki voznikshie v epohu 6 bitnyh simvolov ispolzovali bolee ogranichennyj nabor Naprimer alfavit Fortrana vklyuchaet 49 simvolov vklyuchaya probel A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 Upravlyayushie simvoly ASCII ispolzuyutsya ogranichenno dopuskayutsya tolko vozvrat karetki CR perevod stroki LF i gorizontalnaya tabulyaciya HT inogda takzhe vertikalnaya tabulyaciya VT i perehod k sleduyushej stranice FF Zametnym isklyucheniem yavlyaetsya yazyk APL v kotorom ispolzuetsya ochen mnogo specialnyh simvolov Ispolzovanie simvolov za predelami 7 bitnogo ASCII naprimer simvolov KOI8 R zavisit ot realizacii inogda oni razreshayutsya tolko v kommentariyah i simvolnyh strokovyh konstantah a inogda i v identifikatorah V SSSR i sovremennoj Rossii sushestvuyut yazyki gde vse klyuchevye slova pishutsya russkimi bukvami naprimer vstroennyj yazyk programmirovaniya 1S Predpriyatie i uchebnye yazyki programmirovaniya psevdokod shkolnyj algoritmicheskij yazyk sistemy KuMir i yazyk RAPIRA Rasshirenie nabora ispolzuemyh simvolov vne latinskogo alfavita osnovano na tom chto mnogie proekty po razrabotke programmnogo obespecheniya yavlyayutsya mezhdunarodnymi a tak zhe populyarizaciej graficheskih simvolov iz naborov emotikonov Grammatika Etot razdel nuzhno dopolnit Pozhalujsta uluchshite i dopolnite razdel 24 noyabrya 2016 Kontekstno svobodnaya grammatika Kontekstno zavisimaya grammatika Regulyarnyj yazyk regulyarnye vyrazheniya Grammatika s frazovoj strukturoj LL n LALR 1 Yacc ANTLR Parsec AST angl angl angl Semantika Osnovnaya statya Semantika programmirovanie Sushestvuet neskolko podhodov k opredeleniyu semantiki yazykov programmirovaniya Osnovnyh tri i Pri opisanii semantiki v ramkah operacionnogo podhoda obychno ispolnenie konstrukcij yazyka programmirovaniya interpretiruetsya s pomoshyu nekotoroj voobrazhaemoj abstraktnoj EVM Aksiomaticheskaya semantika opisyvaet posledstviya vypolneniya konstrukcij yazyka s pomoshyu yazyka logiki i zadaniya pred i postuslovij Denotacionnaya semantika operiruet ponyatiyami tipichnymi dlya matematiki mnozhestva sootvetstviya a takzhe suzhdeniya utverzhdeniya i dr KlassifikaciyaNe sushestvuet obsheprinyatoj sistematichnoj taksonomii yazykov programmirovaniya Est mnozhestvo chert soglasno kotorym mozhno proizvodit klassifikaciyu yazykov prichyom odni iz nih odnoznachno provodyat razdely mezhdu yazykami na osnove tehnicheskih svojstv drugie osnovyvayutsya na dominiruyushih priznakah imeyut isklyucheniya i bolee uslovny a treti polnostyu subektivny i neredko soprovozhdayutsya zabluzhdeniyami no na praktike vesma rasprostraneny Konkretnyj yazyk programmirovaniya v podavlyayushem bolshinstve sluchaev imeet bolee odnogo yazyka predka Mnogie yazyki sozdayutsya kak sochetanie elementov razlichnyh yazykov V odnih sluchayah takoe sochetanie prohodit matematicheskij analiz na predmet neprotivorechivosti sm naprimer Opredelenie Standard ML v drugih yazyk formiruetsya ishodya iz prakticheskih potrebnostej dlya resheniya aktualnyh problem s celyu polucheniya kommercheskogo uspeha no pri etom bez soblyudeniya matematicheskoj strogosti i so vklyucheniem v yazyk vzaimoisklyuchayushih idej kak v sluchae C Yazyki nizkogo i vysokogo urovnya Formalno yazyk programmirovaniya ne imeet takogo kriteriya kak uroven Uslovno etot termin obychno oznachaet odno iz dvuh priblizhennost yazyka programmirovaniya k estestvennomu chelovecheskomu yazyku i obrazu mysli udalyonnost semantiki yazyka programmirovaniya ot mashinnogo koda celevoj to est naimenshij masshtab preobrazovanij kotorye dolzhen preterpet kod programmy pered tem kak on smozhet ispolnyatsya Eta dvojstvennost poyavilas v 1950 e gody pri sozdanii yazykov Plankalkyul i Fortran Pri ih razrabotke stavilis pryamye namereniya obespechit bolee kratkuyu zapis chasto vstrechayushihsya konstrukcij naprimer arifmeticheskih vyrazhenij chem trebovali processory togo vremeni V etih yazykah vvodilsya novyj sloj abstrakcii i predpolagalis preobrazovaniya programm v mashinnyj yazyk poetomu ih nazvali yazykami vysokogo urovnya to est nadstrojkoj nadsloeniem nad yazykom mashiny Odnako vskore stalo yasno chto eti opredeleniya vovse ne obyazatelno idut bok o bok Tak istoriya znaet sluchai kogda yazyk tradicionno schitayushijsya vysokourovnevym realizovyvalsya apparatno sm Lisp mashina angl ili kogda yazyk yavlyayushijsya nizkourovnevym na odnoj platforme kompilirovalsya kak vysokourovnevyj na drugoj takim obrazom programmy na CISC assemblere VAX ispolzovalis na RISC mashinah DEC Alpha sm angl Tem ne menee do sih por rasprostraneno zabluzhdenie chto eti dve traktovki yavlyayutsya ne bolee chem dvumya storonami odnoj medali i pervoe budto by neizbezhno oznachaet vtoroe Po stepeni vysokourovnevosti yazyki prinyato delit na pyat pokolenij K angl otnosyat v pervuyu ochered mashinnye yazyki ili na obsheupotrebimom zhargone mashinnye kody to est yazyki realizovannye neposredstvenno na apparatnom urovne Poyavivshiesya vskore posle nih yazyki assemblera otnosyat ko angl V prostejshem sluchae oni realizuyut mnemoniku nad mashinnym yazykom dlya zapisi komand i ih parametrov v chastnosti adresov v pamyati no mnogie yazyki assemblera vklyuchayut i vesma razvityj makroyazyk krome togo dazhe v prostejshem sluchae obratnaya razrabotka mashinnogo koda ne pozvolyaet odnoznachno vosstanovit programmu na assemblere naprimer nevozmozhno vosstanovit imena peremennyh mogut byt neraspoznany nedokumentirovannye funkcii Tem ne menee oba pervyh pokoleniya obsheprinyato otnosit k yazykam nizkogo urovnya K 1970 m godam slozhnost programm vyrosla nastolko chto prevysila sposobnost programmistov upravlyatsya s nimi i eto privelo k ogromnym ubytkam i zastoyu v razvitii informacionnyh tehnologij Otvetom na etu problemu stalo poyavlenie massy yazykov vysokogo urovnya predlagayushih samye raznye sposoby upravleniya slozhnostyu podrobnee sm paradigma programmirovaniya i yazyki dlya programmirovaniya v melkom i krupnom masshtabe Programmy na yazykah vysokogo urovnya gorazdo legche modificiruyutsya i sovsem legko perenosyatsya s kompyutera na kompyuter Na praktike naibolshee rasprostranenie poluchili yazyki tretego pokoleniya kotorye lish pretenduyut na zvanie vysokourovnevyh no realno predostavlyayut lish te vysokourovnevye konstrukcii chto nahodyat odnoznachnoe sootvetstvie instrukciyam v mashine fon Nejmana Bolee vysokourovnevymi prinyato schitat yazyki chetvyortogo i pyatogo pokoleniya K angl otnosyat yazyki zaprosov yazyki opcij i parametrov generatory prilozhenij kombinirovannye pakety baz dannyh Naibolee znachimoj podgruppoj v chetvyortom pokolenii prinyato schitat funkcionalnye yazyki bolshaya chast iz kotoryh yavlyaetsya yazykami vysshego poryadka Inogda vydelyaetsya kategoriya yazykov angl no ona ne yavlyaetsya obsheprinyatoj chashe ispolzuetsya termin yazyk sverhvysokogo urovnya angl very high level language Eto yazyki realizaciya kotoryh vklyuchaet sushestvennuyu algoritmicheskuyu sostavlyayushuyu to est kogda interpretaciya nebolshogo ishodnogo koda trebuet vesma slozhnyh vychislenij poetomu poroj takzhe govoryat chto yazyki pyatogo pokoleniya eto fakticheski yazyki chetvyortogo pokoleniya dopolnennye bazoj znanij Chashe vsego tak nazyvayut logicheskie yazyki Yazyk Si yavlyaetsya veroyatno samym nizkourovnevym v tretem pokolenii On iznachalno pozicionirovalsya kak vysokourovnevyj assembler ili krossplatformennyj assembler ego takzhe chasto nazyvayut yazykom srednego urovnya ili dazhe yazykom pokoleniya 2 5 On pozvolyaet v znachitelnoj stepeni kontrolirovat sposob realizacii algoritma s uchyotom svojstv tipichnyh dlya vesma bolshogo chisla apparatnyh no est platformy pod kotorye realizacii Si dazhe s v nestandartnom vide otsutstvuyut po prichine principialnoj nevozmozhnosti ili necelesoobraznosti ih sozdaniya Klassifikaciya potomka Si yazyka C vyzyvaet spory ego neredko nazyvayut vysokourovnevym nesmotrya na to chto tehnicheski ego semantika i sistema tipov malo otlichayutsya ot teh na kotoryh osnovan Si So vremenem poyavilis i drugie yazyki srednego urovnya naprimer LLVM C Oni preimushestvenno prednaznacheny ne dlya napisaniya koda chelovekom a dlya generacii promezhutochnogo koda iz bolee vysokourovnevyh yazykov s tem chtoby obespechit luchshee razdelenie kompilyatorov na frontend i bekend V bolshinstve sluchaev yazyki vysokogo urovnya porozhdayut mashinnyj kod bolshego razmera i ispolnyayutsya medlennee Odnako nekotorye yazyki vysokogo urovnya dlya algoritmicheski i strukturno slozhnyh programm mogut davat zametnoe preimushestvo v effektivnosti ustupaya nizkourovnevym lish na nebolshih i prostyh programmah podrobnee sm effektivnost yazykov Inache govorya potencialnaya effektivnost yazyka menyaetsya s povysheniem ego urovnya nelinejno i voobshe neodnoznachno Pri etom skorost razrabotki i trudoyomkost modifikacii ustojchivost i drugie pokazateli kachestva v slozhnyh sistemah okazyvayutsya gorazdo vazhnee predelno vozmozhnoj skorosti ispolneniya oni obespechivayut razlichie mezhdu programmoj chto rabotaet i toj chto net tak chto ekonomicheski bolee celesoobrazna evolyuciya apparatnogo obespecheniya ispolnenie bolshego chisla instrukcij v edinicu vremeni i metodov optimiziruyushej kompilyacii bolee togo poslednie desyatiletiya evolyuciya apparatnogo obespecheniya dvizhetsya v napravlenii podderzhki metodov optimiziruyushej kompilyacii dlya yazykov vysokogo urovnya K primeru avtomaticheskaya sborka musora prisutstvuyushaya v bolshinstve vysokourovnevyh yazykov programmirovaniya schitaetsya odnim iz vazhnejshih uluchshenij blagotvorno povliyavshih na skorost razrabotki Poetomu v nashi dni yazyki nizkogo urovnya ispolzuyutsya tolko v zadachah sistemnogo programmirovaniya Rasprostraneno oshibochnoe otozhdestvlenie sistemnogo programmirovaniya s nizkourovnevym osnovannoe na mnenii chto esli neobhodim tochnyj kontrol za resursami to yazyk sam ne dolzhen predpolagat masshtabnyh preobrazovanij inache vse usiliya programmista okazhutsya naprasnymi V dejstvitelnosti est primery oprovergayushie eto Tak yazyk BitC yavlyaetsya funkcionalnym yazykom vysshego poryadka to est predstavitelem chetvyortogo pokoleniya vysokourovnevym no celikom i polnostyu orientirovan imenno na sistemnoe programmirovanie i uverenno konkuriruet po skorosti s Si Yazyki tretego pokoleniya C i Limbo razrabatyvalis dlya ispolzovaniya odnovremenno kak v sistemnom programmirovanii s celyu povysheniya otkazoustojchivosti operacionnoj sistemy tak i v prikladnom eto obespechivaet edinstvo platformy chto sokrashaet poteri pri translyacii Bezopasnye i nebezopasnye yazyki Sovremennye kompyutery predstavlyayut slozhnye dannye realnogo mira v vide chisel v pamyati kompyutera Eto vvodit v disciplinu programmirovaniya risk chelovecheskogo faktora v tom chisle veroyatnost oshibok dostupa k pamyati Poetomu mnogie yazyki programmirovaniya soprovozhdayutsya sredstvom kontrolya smysla operacij nad dvoichnymi dannymi na osnove soprovozhdayushej ih logicheskoj informacii sistemoj tipov Odnako sushestvuyut i bestipovye yazyki naprimer Forth Bolshinstvo yazykov assemblera yavlyayutsya bestipovymi no sushestvuyut i angl nacelennye na obespechenie minimalnoj bezopasnosti nizkourovnevyh programm Sistemy tipov yazykov delyatsya na dinamicheskie potomki Lisp Smalltalk APL i staticheskie a poslednie v svoyu ochered delyatsya na nepolimorfnye potomki Algola i BCPL i polimorfnye potomki ML Krome togo oni delyatsya na yavnye angl explicit i neyavnye angl implicit drugimi slovami trebuyushie yavnoj deklaracii tipov dlya obektov v programme ili staticheski vyvodyashie ih samostoyatelno Sistemy tipov byvayut silnye i slabye Silnaya sistema tipov naznachaet tip dlya vsyakogo vyrazheniya raz i navsegda kogda by konkretno eto ni proishodilo v dinamike ili v statike a slabaya pozvolyaet vposledstvii perenaznachat tipy Silnaya tipizaciya poroj oshibochno otozhdestvlyaetsya so staticheskoj V obshem i celom yazyk nazyvaetsya bezopasnym esli programmy na nyom kotorye mogut byt prinyaty kompilyatorom kak pravilno postroennye v dinamike nikogda ne vyjdut za ramki dopustimogo povedeniya Eto ne znachit chto takie programmy ne soderzhat oshibok voobshe Termin horoshee povedenie programmy angl well behavior oznachaet chto dazhe esli programma soderzhit nekij bag v chastnosti logicheskuyu oshibku to ona tem ne menee ne sposobna narushit celostnost dannyh i obrushitsya angl crash Hotya terminy neformalny bezopasnost nekotoryh yazykov naprimer Standard ML matematicheski dokazuema Bezopasnost drugih naprimer Ada byla obespechena ad hoc obrazom bez obespecheniya konceptualnoj celostnosti chto mozhet obernutsya katastrofami esli polozhitsya na nih v otvetstvennyh zadachah sm konceptualnaya celostnost yazykov Neformalnaya terminologiya byla populyarizovana Robinom Milnerom odnim iz avtorov teorii formalnoj verifikacii i sobstvenno yazyka Standard ML Stepen kontrolya oshibok i reakciya yazyka na nih mogut razlichatsya Prostejshie sistemy tipov zapreshayut k primeru vychitat stroku iz celogo chisla Odnako celymi chislami mogut predstavlyatsya i millimetry i dyujmy no bylo by logicheskoj oshibkoj vychitat dyujmy iz millimetrov Razvitye sistemy tipov pozvolyayut a naibolee razvitye prinuzhdayut vnedryat v programmu takuyu logicheskuyu informaciyu Dlya EVM ona yavlyaetsya izbytochnoj i polnostyu udalyaetsya pri porozhdenii mashinnogo koda tem ili inym obrazom V chastnosti Standard ML ne dopuskaet nad dannymi nikakih operacij krome teh chto razresheny yavno i formalizovany odnako programmy na nyom vsyo zhe mogut zavershatsya porozhdeniem neobrabotannogo isklyucheniya naprimer pri popytke deleniya na nol Ego potomok MLPolyR garantiruet takzhe i otsutstvie neobrabotannyh isklyuchenij Takie yazyki nazyvayutsya tipobezopasnymi Java i C menee strogi i kontroliruyut lish utechki pamyati poetomu v ih kontekste chashe ispolzuyut bolee uzkij termin bezopasnost tipov v otnoshenii dostupa k pamyati angl memory type safety ili chashe prosto bezopasnost dostupa k pamyati Silno dinamicheski tipiziruemye yazyki otslezhivayut povedenie programm v dinamike chto vlechyot snizhenie bystrodejstviya i reagiruyut na oshibki porozhdeniem isklyucheniya Vse eti yazyki orientirovany na praktichnost predostavlyaya optimalnyj kompromiss mezhdu presecheniem seryoznyh sboev i vysokoj skorostyu razrabotki programm Sushestvuyut yazyki prednaznachennye dlya napisaniya programm kotorye verny po postroeniyu to est obespechivayut garantiyu togo chto ispolnimaya programma po strukture i povedeniyu budet tozhdestvenna eyo specifikacii sm angl zavisimyj tip Kak sledstvie programmy na takih yazykah chasto nazyvayut ispolnimymi specifikaciyami sm Sootvetstvie Karri Govarda Trudoyomkost razrabotki na takih yazykah vozrastaet na poryadki k tomu zhe oni trebuyut ochen vysokoj kvalifikacii razrabotchika poetomu ih primenyayut tolko v formalnoj verifikacii Primerami takih yazykov sluzhat Agda Coq Yazyki Si i ego potomok C yavlyayutsya nebezopasnymi V programmah na nih obshirno vstrechayutsya situacii oslableniya tipizacii privedenie tipov i pryamogo eyo narusheniya kalambur tipizacii tak chto oshibki dostupa k pamyati yavlyayutsya v nih statisticheskoj normoj no krah programmy nastupaet daleko ne srazu chto zatrudnyaet poisk mesta oshibki v kode Samye moshnye sistemy staticheskogo analiza dlya nih takie kak PVS Studio sposobny obnaruzhivat ne bolee 70 80 oshibok no ih ispolzovanie obhoditsya ochen dorogo kak v finansovom smysle tak i s tochki zreniya trudoyomkosti i naukoyomkosti Dostoverno zhe garantirovat bezotkaznost programm na etih yazykah nevozmozhno ne pribegaya k formalnoj verifikacii chto ne tolko eshyo dorozhe no i trebuet specialnyh znanij U Si est i bezopasnye potomki takie kak Cyclone Yazyk Forth ne pretenduet na zvanie bezopasnogo no tem ne menee na praktike sushestvovanie programm sposobnyh povredit dannye pochti isklyucheno tak kak soderzhashaya potencialno opasnuyu oshibku programma avarijno zavershaetsya na pervom zhe testovom zapuske prinuzhdaya k korrekcii ishodnogo koda V soobshestve Erlang prinyat podhod let it crash s angl daj ej obrushitsya takzhe nacelennyj na rannee vyyavlenie oshibok Kompiliruemye interpretiruemye i vstraivaemye yazyki Mozhno vydelit tri principialno raznyh sposoba realizacii yazykov programmirovaniya kompilyaciya interpretaciya i vstraivanie Rasprostraneno zabluzhdenie soglasno kotoromu sposob realizacii yavlyaetsya prisushim konkretnomu yazyku svojstvom V dejstvitelnosti eto delenie do opredelyonnoj stepeni uslovno V ryade sluchaev yazyk imeet formalnuyu semantiku orientirovannuyu na interpretaciyu no vse ili pochti vse ego dejstvitelnye realizacii yavlyayutsya kompilyatorami poroj vesma effektivno optimiziruyushimi primerami mogut sluzhit yazyki semejstva ML takie kak Standard ML Haskell Est yazyki razmyvayushie granicy mezhdu interpretaciej i kompilyaciej naprimer Forth Kompilyaciya oznachaet chto ishodnyj kod programmy snachala preobrazuetsya v celevoj mashinnyj kod specialnoj programmoj nazyvaemoj kompilyatorom v rezultate poluchaetsya ispolnimyj modul kotoryj uzhe mozhet byt zapushen na ispolnenie kak otdelnaya programma Interpretaciya zhe oznachaet chto ishodnyj kod vypolnyaetsya neposredstvenno komanda za komandoj inogda s minimalnoj podgotovkoj bukvalno posle razbora ishodnogo koda v AST tak chto programma prosto ne mozhet byt zapushena bez nalichiya interpretatora Vstraivanie yazyka mozhno filosofski rassmatrivat kak realizaciyu bez translyacii v tom smysle chto takoj yazyk yavlyaetsya sintaksicheskim i semanticheskim podmnozhestvom nekogo drugogo yazyka bez kotorogo on ne sushestvuet Govorya zhe bolee tochno vstraivaemye yazyki dobavlyayut k skazannomu eshyo chetyre sposoba realizacii Estestvennyj dlya yazyka sposob realizacii opredelyaetsya vremenem svyazyvaniya programmnyh elementov s ih harakteristikami V chastnosti v yazykah so staticheskoj tipizaciej peremennye i drugie obekty programmy svyazyvayutsya s tipom dannyh na etape kompilyacii a v sluchae tipizacii dinamicheskoj na etape vypolneniya kak pravilo v proizvolnoj tochke programmy Nekotorye svojstva elementov yazyka takie kak znachenie arifmeticheskih operatorov ili upravlyayushih klyuchevyh slov mogut byt svyazany uzhe na etape opredeleniya yazyka V drugih yazykah vozmozhno ih perenaznachenie sm angl Rannee svyazyvanie obychno oznachaet bo lshuyu effektivnost programmy v to vremya kak pozdnee bolshuyu gibkost cenoj kotorogo yavlyaetsya menshaya skorost i ili uslozhnenie sootvetstvuyushego etapa No dazhe iz kazalos by ochevidnyh sluchaev est isklyucheniya naprimer intensionalnyj polimorfizm otkladyvaet obrabotku staticheskoj tipizacii do etapa vypolneniya no ne zamedlyaya a povyshaya obshee bystrodejstvie po krajnej mere v teorii Dlya lyubogo tradicionno kompiliruemogo yazyka takogo kak Paskal mozhno napisat interpretator No mnogie interpretiruemye yazyki predostavlyayut nekotorye dopolnitelnye vozmozhnosti takie kak dinamicheskaya generaciya koda sm angl tak chto ih kompilyaciya dolzhna byt dinamicheskoj sm dinamicheskaya kompilyaciya Takim obrazom sostavnoj termin yazyk sposob ego realizacii v ryade sluchaev okazyvaetsya umesten Krome togo bolshinstvo sovremennyh chistyh interpretatorov ne ispolnyayut konstrukcii yazyka neposredstvenno a kompiliruyut ih v nekotoroe vysokourovnevoe promezhutochnoe predstavlenie naprimer s razymenovaniem peremennyh i raskrytiem makrokomand Bolshinstvo tradicionno interpretiruemyh ili kompiliruemyh yazykov mogut realizovyvatsya kak vstraivaemye hotya metayazykov kotorye byli by sposobny ohvatit drugie yazyki kak svoyo podmnozhestvo ne tak mnogo naibolee yarkim predstavitelem yavlyaetsya Lisp Kak pravilo skompilirovannye programmy vypolnyayutsya bystree i ne trebuyut dlya vypolneniya dopolnitelnyh programm tak kak uzhe perevedeny na mashinnyj yazyk Vmeste s tem pri kazhdom izmenenii teksta programmy trebuetsya eyo perekompilyaciya chto zamedlyaet process razrabotki Krome togo skompilirovannaya programma mozhet vypolnyatsya tolko na tom zhe tipe kompyuterov i kak pravilo pod toj zhe operacionnoj sistemoj na kotoruyu byl rasschitan kompilyator Chtoby sozdat ispolnyaemyj fajl dlya mashiny drugogo tipa trebuetsya novaya kompilyaciya Interpretiruemye yazyki pozvolyayut zapuskat programmy srazu zhe posle izmeneniya prichyom na raznyh tipah mashin i operacionnyh sistem bez dopolnitelnyh usilij a gomoikoni chnye i vovse dinamicheski peremeshat programmu mezhdu raznymi mashinami bez preryvaniya eyo raboty naibolee obshij sluchaj serializacii pozvolyaya razrabatyvat angl sm tzh sistemy vysokoj dostupnosti Portiruemost interpretiruemoj programmy opredelyaetsya tolko nalichiem realizacij interpretatorov pod te ili inye apparatnye platformy Cenoj vsego etogo stanovyatsya zametnye poteri bystrodejstviya krome togo esli programma soderzhit fatalnuyu oshibku to ob etom ne budet izvestno poka interpretator ne dojdyot do eyo mesta v kode v otlichie ot staticheski tipobezopasnyh yazykov Realizaciya nekotoryh yazykov naprimer Java i C zanimayut promezhutochnuyu stupen mezhdu kompilyaciej i interpretaciej A imenno programma kompiliruetsya ne v mashinnyj yazyk a v mashinno nezavisimyj kod nizkogo urovnya bajt kod Dalee bajt kod vypolnyaetsya virtualnoj mashinoj Dlya vypolneniya bajt koda obychno ispolzuetsya interpretaciya hotya otdelnye ego chasti dlya uskoreniya raboty programmy mogut byt translirovany v mashinnyj kod neposredstvenno vo vremya vypolneniya programmy po tehnologii kompilyacii na letu Just in time compilation JIT Dlya Java bajt kod ispolnyaetsya virtualnoj mashinoj Java Java Virtual Machine JVM dlya C Common Language Runtime Podobnyj podhod v nekotorom smysle pozvolyaet ispolzovat plyusy kak interpretatorov tak i kompilyatorov Yazyki pervogo i vysshego poryadka Nachalnye svedeniya Matematicheskaya logika klassificiruetsya po poryadku sm logika pervogo poryadka i logika vysshego poryadka Eta terminologiya estestvennym obrazom nasleduetsya informatikoj obrazuya semantiki sootvetstvenno pervogo i vysshego poryadka Yazyki pervogo poryadka naprimer potomki Algola takie kak Basic ili klassicheskij Pascal Virta pozvolyayut opredelyat tolko zavisimosti pervogo poryadka mezhdu velichinami Naprimer znachenie square x zavisit ot znacheniya x Takie zavisimosti nazyvayutsya funkciyami Yazyki vysshego poryadka pozvolyayut opredelyat zavisimosti mezhdu zavisimostyami Naprimer znachenie a href wiki Map D0 BF D1 80 D0 BE D0 B3 D1 80 D0 B0 D0 BC D0 BC D0 B8 D1 80 D0 BE D0 B2 D0 B0 D0 BD D0 B8 D0 B5 title Map programmirovanie map a f x zavisit ot znachenij f i x gde znachenie f samo vyrazhaet abstraktnuyu zavisimost drugimi slovami parametr f variruetsya nad mnozhestvom funkcij opredelyonnoj signatury Takie zavisimosti nazyvayutsya funkciyami vysshego poryadka Pri etom v bolshinstve sluchaev govoryat chto takoj yazyk rassmatrivaet zavisimosti funkcii kak obekty pervogo klassa inache govorya dopuskaet funkcii pervogo klassa nekotorye yazyki naprimer Si ne podderzhivayut pervoklassnye funkcii no predostavlyayut ogranichennye vozmozhnosti stroit funkcii vysshego poryadka Eti terminy vvyol angl v angl K yazykam vysshego poryadka otnosyatsya pochti vse funkcionalnye yazyki isklyucheniya ochen redki primerom funkcionalnogo yazyka pervogo poryadka dolgoe vremya yavlyalsya angl no v 2018 godu v nego byla dobavlena podderzhka pervoklassnyh funkcij S razvitiem sistem tipov razlichenie poryadkov rasprostranilos i na tipy sm konstruktor tipov Vyrazitelnost Yazyki pervogo poryadka pozvolyayut voploshat v vide koda algoritmy no ne arhitekturu programm Po mneniyu angl eto ogranichenie unasledovano yazykom Algol a ot nego drugimi yazykami iz klassicheskoj matematiki gde ispolzuyutsya tolko konstantnye operacii i funkcii odnoznachno raspoznavaemye vne konteksta i otsutstvuet sistematichnaya notaciya dlya proizvolnoj raboty s funkciyami v kachestve takoj notacii v 1930 h godah bylo postroeno lyambda ischislenie kotoroe pozzhe leglo v osnovu yazykov vysshego poryadka Shemy vzaimodejstviya komponentov procedur funkcij obektov processov i dr dlya programm na yazykah pervogo poryadka mogut sushestvovat lish na uslovnom urovne vne samih programm So vremenem byli obnaruzheny mnogokratno povtoryayushiesya odnotipnye shemy takogo roda v rezultate chego vokrug nih vystroilas samostoyatelnaya metodologiya shablony proektirovaniya Yazyki vysshego poryadka pozvolyayut voploshat takie shemy v vide ispolnimogo koda prigodnogo dlya mnogokratnogo ispolzovaniya funkcij prednaznachennyh dlya preobrazovaniya i kompozicii drugih funkcij sm naprimer konvertory i skanery v SML V rezultate resheniya kotorye na yazykah pervogo poryadka mogut byt predstavleny fragmentami programm poroj dovolno slozhnymi i gromozdkimi na yazykah vysshego poryadka mogut sokrashatsya do odnoj komandy ili voobshe ispolzovaniya elementa semantiki samogo yazyka ne imeyushego sintaksicheskogo vyrazheniya Naprimer shablon Komanda chasto primenyaemyj v yazykah pervogo poryadka ekvivalenten neposredstvenno samomu ponyatiyu funkcii pervogo klassa To zhe rasprostranyaetsya i na bolee vysokie sloi yazykov tipizaciyu sm polimorfizm v vysshih roda h i tipizaciyu tipizacii sm polimorfizm rodo v Skazannoe preimushestvenno otnositsya k yazykam semantika kotoryh osnovana na lyambda ischislenii potomki Lisp ML Odnako nekotorye yazyki inoj prirody takzhe predostavlyayut vozmozhnost angl Primerami sluzhat stekovye yazyki Forth i opredelyonnaya raznovidnost obektno orientirovannyh yazykov Smalltalk CLOS sm angl Izuchenie Vvedya terminologiyu sushnostej pervogo i vtorogo klassa angl tut zhe akcentiroval vnimanie na tom chto iz lichnogo opyta i obsuzhdenij so mnozhestvom lyudej on ubedilsya chto neveroyatno tyazhelo perestat dumat o funkciyah kak ob obektah vtorogo klassa To est poryadok yazyka imeet yarko vyrazhennoe psihologicheskoe vliyanie sm gipoteza Sepira Uorfa Vladenie yazykami bolee vysokogo urovnya pomozhet programmistu dumat v terminah bolee vysokourovnevyh abstrakcij Nizkourovnevye zhe yazyki mogut navyazyvat obratnoe v svyazi s chem shiroko izvestno sleduyushee vyskazyvanie Prakticheski nevozmozhno obuchit horoshemu programmirovaniyu studentov imevshih opyt raboty s Bejsikom kak potencialnye programmisty oni mentalno iskoverkany bez nadezhdy na vosstanovlenie Originalnyj tekst angl It is practically impossible to teach good programming to students that have had a prior exposure to BASIC as potential programmers they are mentally mutilated beyond hope of regeneration Edsger Dejkstra Eto znachit chto samo po sebe ispolzovanie yazyka vysshego poryadka ne oznachaet avtomaticheski izmenenie arhitektury i povyshenie koefficienta povtornogo ispolzovaniya sm serebryanoj puli net opredelyayushim faktorom yavlyaetsya umenie konkretnogo razrabotchika primenyat sootvetstvuyushie idiomy Ponimanie vozmozhnostej i ogranichenij vysokourovnevyh konstrukcij bazovyh principov ih realizacii ne tolko dayut programmistu vozmozhnost naibolee effektivno ispolzovat izuchennyj im yazyk no i pozvolyat sozdavat i ispolzovat analogichnye mehanizmy v sluchae razrabotki na yazyke gde oni ne realizovany Razrabotchiku vladeyushemu bo lshim spektrom yazykov programmirovaniya budet proshe vybrat sredi nih instrument naibolee podhodyashij dlya resheniya stoyashej pered nim zadachi izuchit v sluchae neobhodimosti novyj yazyk ili realizovat predmetno orientirovannyj yazyk k kotorym k primeru mozhno otnesti interfejs komandnoj stroki dostatochno slozhnoj programmy Paradigma programmirovaniya Osnovnaya statya Paradigma programmirovaniya Yazyk mozhet tehnicheski dopuskat ili ne dopuskat a takzhe v toj ili inoj stepeni pooshryat ili ne pooshryat realizaciyu opredelyonnyh idiom i razrabotku v nekotoroj paradigme programmirovaniya esli takih paradigm neskolko yazyk nazyvayut multiparadigmennym Tehnicheski yazyki delyatsya naprimer na dopuskayushie pobochnye effekty i ne dopuskayushie ih Vo vtorom sluchae yazyk nazyvayut ssylochno prozrachnym i otnosyat k chisto funkcionalnoj paradigme Takzhe v kachestve paradigmy inogda rassmatrivayutsya opredelyonnye svojstva sistemy tipov i strategii vychisleniya yazyka naprimer dlya parametricheski polimorfnyh sistem tipov neredko govoryat o realizacii paradigmy obobshyonnogo programmirovaniya ili nalichie opredelyonnyh semanticheskih svojstv naprimer svojstvo gomoikoni chnosti otkryvayushee celyj spektr raznovidnostej metaprogrammirovaniya Sushestvuet massa yazykov nasledovannyh ot matematiki mnogie iz kotoryh formiruyut unikalnye paradigmy Yarkimi predstavitelyami yavlyayutsya Lisp vpervye voplotivshij lyambda ischislenie i polozhivshij takim obrazom nachalo funkcionalnoj paradigme Smalltalk vpervye voplotivshij obektno orientirovannuyu paradigmu poyavivshayasya za mnogo let do nego Simula podderzhivala ponyatie klassa no voploshala strukturnuyu paradigmu i stekovyj yazyk Forth voploshayushij konkatenativnuyu paradigmu Nizkourovnevye yazyki orientirovany na specifiku konkretnogo apparatnogo obespecheniya i obychno ne sootnosyatsya s kakoj libo paradigmoj krome imperativnoj sm dalee hotya konkretnyj razrabotchik na nih razumeetsya mozhet ideologicheski sledovat opredelyonnym tendenciyam Odnako nekotorye arhitektury mogut realizovyvat netipichnye vozmozhnosti sushestvenno vliyayushie na podhod k dekompozicii zadachi v nizkourovnevom programmirovanii naprimer parallelizm na urovne komand S tochki zreniya obshej filosofii programmirovaniya yazyki delyatsya na imperativnye i deklarativnye Imperativnye yazyki podrazumevayut programmirovanie posredstvom poshagovogo instruktirovaniya mashiny detalnogo ukazaniya uzhe pridumannogo programmistom sposoba realizacii tehnicheskogo zadaniya termin imperativ oznachaet prikaznoj poryadok Deklarativnye yazyki podrazumevayut programmirovanie posredstvom opisaniya trebuemogo rezultata v terminah predmetnoj oblasti i vozlozhenie raboty po polucheniyu sposoba realizacii polnostyu ili pochti polnostyu na avtomatiku kompilyator biblioteku makropodsistemu i dr s primeneniem metodov angl Na takih yazykah v bolshinstve sluchaev dostatochno prosto perekompilirovat programmu pod opredelennuyu i operacionnuyu sistemu a adaptacii ishodnogo koda ne trebuetsya termin deklarativ oznachaet opisanie Chem tochnee yazyk pozvolyaet kontrolirovat kak trebuemaya funkcionalnost budet ispolnyatsya na dannom processore s uchyotom osobennostej ego arhitektury tem legche obespechit dostoverno vysokoe bystrodejstvie i kompaktnost programm Oborotnoj storonoj medali yavlyaetsya snizhenie portiruemosti dlya perenosa programmy na druguyu apparatnuyu platformu eyo pridyotsya perekodirovat s nulya a zachastuyu i pereproektirovat stol silny mogut byt razlichiya mezhdu arhitekturami processorov hotya v ryade sluchaev i udayotsya obespechit horoshuyu portiruemost koda mezhdu bolshim chislom Na deklarativnyh yazykah v bolshinstve sluchaev dostatochno prosto perekompilirovat programmu pod opredelennuyu i operacionnuyu sistemu a adaptacii ishodnogo koda ne trebuetsya Poroj dlya nih primenyaetsya kompilyaciya v yazyki bolee nizkogo urovnya v tom chisle v yazyki tretego pokoleniya v bolshinstve sluchaev eto Si no inogda v roli celevyh platform vystupayut Java JavaScript Ada i dr V sootvetstvii s etim neredko vydelyayutsya kak yazyki yazyki orientirovannye na mashinu i chto yazyki yazyki orientirovannye na cheloveka Rasprostraneno zabluzhdenie otnositelno togo gde nahoditsya verhnij porog stepeni vysokourovnevosti ili deklarativnosti glyadya na programmy na istinnyh chto yazykah opytnye programmisty na kak yazykah zachastuyu ne mogut poverit chto pered nimi dejstvitelno ispolnimyj kod Vsledstvie etogo odnoznachnoe otnesenie yazykov tretego pokoleniya k imperativnym kak yazykam zachastuyu vyzyvaet spory i popytki prodemonstrirovat na nih deklarativnye fragmenty koda V dejstvitelnosti kak vyshe otmecheno yazyki tretego pokoleniya predostavlyayut lish te vysokourovnevye konstrukcii chto nahodyat odnoznachnoe sootvetstvie instrukciyam v mashine fon Nejmana Sushestvuyut pod kotorymi ispolzovanie mnogih rasprostranyonnyh yazykov tretego pokoleniya zatrudneno ili nevozmozhno i v luchshem sluchae razrabatyvayutsya specializirovannye yazyki tretego pokoleniya kak naprimer Occam dlya transpyuterov ili shejdernye yazyki dlya graficheskih processorov Krome togo zachastuyu upuskaetsya iz vidu chto obektno orientirovannoe programmirovanie v bolshinstve sluchaev predstavlyaet soboj odnoznachno zadannuyu cepochku obmena obektov soobsheniyami s celyu izmeneniya ih sostoyaniya chto podpadaet pod opredelenie imperativ isklyuchenie mozhet sostavlyat agentnoe modelirovanie Chto yazyki mogut ispolzovatsya ne tolko dlya razrabotki prikladnyh programm pod ekzotichnye sistemy no dazhe dlya modelirovaniya vnutri yazyka modeli vypolneniya samih etih sistem sm naprimer Clash Kak i s drugimi vidami klassifikacii eto delenie yazykov ne yavlyaetsya strogim a predstavlyaet svoego roda gradaciyu K tomu zhe razvitye mehanizmy abstrakcii pozvolyayut povyshat stepen deklarativnosti yazyka s ishodno imperativnoj semantikoj podrobnee sm vstraivaemyj yazyk Mnogie deklarativnye yazyki takzhe predusmatrivayut imperativnye vozmozhnosti Bolee togo dlya mnozhestva zadach polnostyu avtomaticheskoe porozhdenie po nastoyashemu effektivnoj realizacii algoritmicheski nerazreshimo tak chto na praktike dazhe na chto yazykah neredko ispolzuyutsya opredelyonnye algoritmicheskie uhishreniya hotya i sushestvuyut metody polucheniya effektivnyh realizacij iz osnovannyh na opredelenii realizacij v lob takie kak izobretyonnaya v SSSR superkompilyaciya No v celom funkcionalnye i logicheskie yazyki prinyato otnosit k deklarativnym a procedurnye i obektno orientirovannye k imperativnym Uzhe pri ispolzovanii yazykov vtorogo pokoleniya nachala formirovatsya paradigma procedurnogo programmirovaniya trebuyushaya proizvodit dekompoziciyu krupnyh procedur v cepochku ierarhicheski svyazannyh bolee melkih S poyavleniem yazykov tretego pokoleniya sformirovalos sperva strukturnoe programmirovanie kak pryamoe razvitie procedurnogo a zatem i modulnoe Vse eti paradigmy realizovany vo vseh pokoleniyah yazykov nachinaya s tretego oni primenyayutsya i v imperativnyh i v deklarativnyh yazykah naprimer v funkcionalnyh yazykah strukturnoe programmirovanie realizuetsya posredstvom leksicheskoj oblasti vidimosti sm angl i zamykanie Sredi funkcionalnyh yazykov vydelyayutsya chisto funkcionalnye angl purely functional sootvetstvuyushie vyshe upomyanutoj tehnicheskoj kategorii ssylochno prozrachnyh ostalnye nazyvayutsya ne chisto funkcionalnymi angl impurely functional ili prosto yazykami vysshego poryadka Sredi yazykov logicheskogo programmirovaniya pomimo tradicionnogo vydelyaetsya neskolko osobyh form naprimer programmirovanie ogranicheniyami Sushestvuet osobyj sluchaj obektno orientirovannoj paradigmy angl sm takzhe Yazyki pervogo i vysshego poryadka Rasprostraneno mnenie chto vo mnogih procedurnyh yazykah vozmozhno idiomaticheskoe izobrazhenie OOP odnako eto neverno esli govorit ob OOP vysshego poryadka Eshyo po odnoj shkale mozhno vystroit yazyki po stepeni vozmozhnosti izbavitsya ot tochek sledovaniya dlya realizacii bestochechnogo stilya Po odnu storonu v etom sluchae okazhutsya naprimer Si i Paskal po druguyu Joy APL J K Bestochechnyj stil shiroko primenyaetsya v Haskell podderzhivaetsya v OCaml Yazyki dlya programmirovaniya v melkom i krupnom masshtabe Osnovnaya statya Programmirovanie v krupnom i melkom masshtabe angl Programmy mogut reshat zadachi angl odna programma stroit grafik dlya zadannoj funkcii a drugaya upravlyaet dokumentooborotom krupnogo predpriyatiya Razlichnye yazyki programmirovaniya rasschitany na raznyj ishodnyj masshtab zadachi i chto eshyo bolee vazhno po raznomu spravlyayutsya s rostom slozhnosti programmnyh sistem Klyuchevym kachestvom yazyka ot kotorogo zavisit kak menyaetsya trudoyomkost razrabotki po mere narashivaniya sistemy yavlyaetsya abstrakciya to est vozmozhnost otdelyat smysl povedenie komponenta sistemy ot sposoba ego realizacii Rost slozhnosti lyuboj programmnoj sistemy principialno ogranichen tem predelom do kotorogo eshyo mozhno sohranyat kontrol nad nej esli obyom informacii trebuemyj dlya osmysleniya komponenta etoj sistemy prevyshaet vmestimost mozga odnogo cheloveka to etot komponent ne budet do konca ponyat Stanet chrezvychajno tyazhelo dorabatyvat ego ili ispravlyat oshibki i ot kazhdoj korrektirovki mozhno zhdat vvedeniya novyh oshibok iz za etogo nepolnogo znaniya Originalnyj tekst angl There is a fundamental limit to complexity of any software system for it to be still manageable if it requires more than one brainfull of information to understand a component of the system then that component will not be understood fully It will be extremely difficult to make enhancements or fix bugs and each fix is likely to introduce further errors due to this incomplete knowledge Martin Ward Language Oriented Programming Takie pokazateli kachestva ishodnogo koda kak testiruemost i modificiruemost ochevidnym obrazom opredelyayutsya koefficientom povtornogo ispolzovaniya Eto mozhet oznachat kak primenenie raznyh funkcij k odnomu i tomu zhe komponentu tak i vozmozhnost primenyat odnu i tu zhe funkciyu k raznym komponentam Parametricheski polimorfnye osobenno vyvodyashie i dinamicheskie sistemy tipov sushestvenno povyshayut koefficient povtornogo ispolzovaniya naprimer funkciya vychislyayushaya dlinu massiva budet primenima k beskonechnomu mnozhestvu tipov massivov Esli zhe yazyk trebuet v signature funkcii ukazyvat konkretnyj sposob realizacii vhodnyh dannyh to etot koefficient rezko stradaet Naprimer Pascal kritikovalsya za neobhodimost vsegda ukazyvat konkretnyj razmer massiva a C za neobhodimost razlichat i gt pri obrashenii k komponentam angl Yazyki vysshego poryadka pozvolyayut vydelyat shemy vzaimodejstviya funkcij v mnogokratno vyzyvaemyj blok koda funkciyu vysshego poryadka a naibolshih znachenij povtornoe ispolzovanie dostigaet pri perehode k yazyku bolee vysokogo urovnya pri neobhodimosti specialno razrabatyvaemogo dlya dannoj zadachi v etom sluchae povtorno ispolzuetsya yazyk a ne odna funkciya a sama razrabotka yazyka mozhet vestis s intensivnym povtornym ispolzovaniem komponentov kompilyatora S razvitiem yazykov poyavilis osobye prisushie isklyuchitelno programmirovaniyu ne trebovavshiesya ranee v matematike kategorii komponentov i zavisimostej monady klassy tipov polimorfnye vetvleniya aspekty i dr Ih ispolzovanie pozvolyaet vyrazhat bo lshuyu funkcionalnost v tom zhe obyome koda tem samym perevodya angl v bolee melkij masshtab Drugie fundamentalnye problemy svyazannye so slozhnostyu krupnyh sistem lezhat vne samih programm eto vzaimodejstvie razrabatyvayushih eyo programmistov mezhdu soboj dokumentirovanie i t d Pomimo obespecheniya abstrakcii ne poslednyuyu rol v etom igraet konceptualnaya celostnost vybrannogo yazyka programmirovaniya Krome svojstv semantiki yazyka povtornoe ispolzovanie mozhet obespechivatsya posredstvom modulnoj struktury programmnoj sistemy ili kompleksa Bolee togo skol by gibkim ni byl yazyk rabota s ogromnymi obyomami kodov osobenno mnozhestvom lyudej trebuet ih dekompozicii na moduli tem ili inym obrazom Modulnaya struktura podrazumevaet ne prosto razbienie monolitnogo ishodnogo koda programmy na mnozhestvo tekstovyh fajlov a obespechenie abstrakcii v bolee krupnom masshtabe to est opredelenie interfejsa dlya vsyakogo logicheski zavershyonnogo fragmenta i sokrytie detalej ego realizacii V zavisimosti ot primenyonnyh v yazyke pravil opredeleniya oblasti vidimosti yazyk mozhet dopuskat ili ne dopuskat avtomaticheskoe opredelenie zavisimostej Esli soglasno pravilam vozmozhen konflikt imyon to avtoopredelenie zavisimostej nevozmozhno i togda v zagolovke modulya trebuetsya yavno perechislyat imena modulej komponenty kotoryh v nyom ispolzuyutsya Nekotorye yazyki naprimer Basic ili klassicheskij Pascal Virta orientirovany isklyuchitelno na razrabotku melkih strukturno prostyh programm Oni ne obespechivayut ni razvitoj sistemy modulej ni gibkosti konkretnyh fragmentov Yazyk Si sozdavalsya kak vysokourovnevyj assembler chto samo po sebe ne predpolagaet razrabotku sistem vyshe nekotorogo poroga slozhnosti poetomu podderzhka krupnomasshtabnogo programmirovaniya v nego zalozhena takzhe ne byla Nekotorye yazyki vysokogo i sverhvysokogo urovnya Erlang Smalltalk Prolog predostavlyayut v kachestve bazovyh primitivnyh elementov koncepcii kotorye v drugih yazykah predstavlyayutsya konstruktivno i algoritmicheski slozhnymi processy klassy bazy znanij analogichno raznoobraznym matematicheskim ischisleniyam sm takzhe konceptualnaya celostnost yazykov Poetomu takie yazyki neredko rassmatrivayutsya v roli predmetno specifichnyh na nih vyglyadyat prostymi nekotorye no daleko ne vse zadachi kotorye na drugih yazykah vyglyadyat slozhnymi Odnako rasshirenie funkcionalnosti v drugih aspektah na etih yazykah mozhet oborachivatsya zatrudneniyami Standard ML i ego rodstvenniki rasslaivayutsya na dva yazyka iz kotoryh odin yazyk yadro angl core language orientirovan na razrabotku prostyh programm a drugoj yazyk modulej angl module language sootvetstvenno na nelinejnuyu komponovku ih v slozhnye programmnye sistemy So vremenem byli postroeny varianty sliyaniya ih voedino 1ML Mnogie drugie yazyki takzhe vklyuchayut sistemy modulej no bolshinstvo iz nih yavlyayutsya yazykami modulej pervogo poryadka Yazyk modulej ML yavlyaetsya edinstvennym v svoyom rode yazykom modulej vysshego poryadka Yazyki Lisp i Forth pozvolyayut narashivat sistemy proizvolno i bezgranichno v tom chisle pozvolyaya sozdavat vstraivaemye predmetno specifichnye yazyki vnutri sebya kak svoyo sintaksicheskoe i semanticheskoe podmnozhestvo poetomu ih neredko nazyvayut metayazykami Naibolee populyarnym na segodnyashnij den podhodom k resheniyu problemy kompleksirovaniya yavlyaetsya obektno orientirovannoe programmirovanie hotya uspeshnost ego primeneniya na protyazhenii desyatiletij sushestvovaniya neodnokratno podvergalas skepsisu i do sih por otsutstvuyut dostovernye dannye o tom chto on prinosit vyigrysh po sravneniyu s drugimi podhodami po tem ili inym pokazatelyam kachestva Emu soputstvuyut a poroj konkuriruyut razlichnye tehnologii reglamentirovaniya zavisimostej mezhdu komponentami metaklassy kontrakty prototipy primesi tipazhi i dr Bolee moshnym podhodom istoricheski schitalos ispolzovanie razlichnyh form metaprogrammirovaniya to est avtomatizacii samogo processa razrabotki na razlichnyh urovnyah Principialno razlichaetsya metaprogrammirovanie vneshnee po otnosheniyu k yazyku i dostupnoe v samom yazyke Pri ispolzovanii yazykov pervogo poryadka slozhnost rastushih programmnyh sistem bystro perehodit porog sposobnostej cheloveka po vospriyatiyu i pererabotke informacii poetomu primenyayutsya vneshnie sredstva predvaritelnogo vizualnogo proektirovaniya pozvolyayushie obozrevat slozhnye shemy v uproshyonnom vide i v umenshennom masshtabe i zatem avtomaticheski porozhdat karkas koda sm CASE V soobshestvah razrabotchikov ispolzuyushih yazyki vysshego poryadka dominiruet pryamo protivopolozhnyj podhod presekat samu vozmozhnost vyhoda slozhnosti iz pod kontrolya za schyot razdeleniya informacionnyh modelej na nezavisimye sostavlyayushie i razrabotki sredstv avtomaticheskogo preobrazovaniya odnih modelej v drugie sm yazykovo orientirovannoe programmirovanie Konceptualnaya celostnost yazykov Frederik Bruks i Ch E R Hoar delayut akcent na neobhodimosti obespecheniya konceptualnoj celostnosti informacionnyh sistem voobshe i yazykov programmirovaniya v chastnosti chtoby v kazhdoj chasti sistemy ispolzovalis shodnye sintaksicheskie i semanticheskie formy i ne trebovalos osvaivat pomimo sobstvenno sostava sistemy takzhe i pravila eyo idiomaticheskogo ispolzovaniya Hoar predskazyval chto slozhnost Ady stanet prichinoj katastrof Alan Kej otdelyaet yazyki yavlyayushiesya stilem vo ploti angl crystalization of style ot prochih yazykov yavlyayushihsya skleivaniem vozmozhnostej angl agglutination of features Greg Nelson i angl vydelyayut v osobuyu kategoriyu yazyki nasledovannye ot matematiki angl mathematically derived languages Eti akcenty prizyvayut k ispolzovaniyu yazykov voploshayushih nekoe matematicheskoe ischislenie akkuratno adaptirovannoe dlya togo chtoby byt bolee praktichnym yazykom dlya razrabotki realnyh programm Takie yazyki otlichayutsya i hotya eto oznachaet neobhodimost vruchnuyu realizovyvat mnogie rasprostranyonnye idiomy dostupnye v bolee populyarnyh yazykah v kachestve primitivov yazyka vyrazitelnost takih yazykov v celom mozhet byt sushestvenno vyshe Lish nekotorye yazyki popadayut pod etu kategoriyu bolshinstvo zhe yazykov proektiruyutsya prioritetno ishodya iz vozmozhnosti effektivnoj translyacii v mashinu Tyuringa Mnogie yazyki opirayutsya na obshie teorii no pri razrabotke oni pochti nikogda ne proveryayutsya na bezopasnost sovmestnogo ispolzovaniya konkretnyh yazykovyh elementov yavlyayushihsya chastnymi prilozheniyami etih teorij chto neizbezhno privodit k nesovmestimosti mezhdu realizaciyami yazyka Eti problemy libo ignoriruyutsya libo nachinayut prepodnositsya kak estestvennoe yavlenie angl not a bug but a feature no v dejstvitelnosti ih prichinoj yavlyaetsya to chto yazyk ne byl podvergnut matematicheskomu analizu Primery matematicheski obosnovannyh yazykov i voploshaemyh imi matematicheskih modelej Agda angl Idris intuicionistskaya teoriya tipov Martin Lyofa APL i ego potomki J K originalnaya semantika ne imeyushaya nazvaniya voploshayushaya notaciyu Ajversona dlya ischisleniya massivov chasto vstrechaetsya termin array languages Coq ischislenie induktivnyh konstrukcij Erlang ischislenie processov pervonachalno v forme modeli aktorov pozzhe takzhe postroeno obosnovanie na p displaystyle pi ischislenii Forth angl i konkatenativnyj yazyk programmirovaniya Haskell teoriya kategorij vklyuchaya dekartovo zamknutuyu kategoriyu voploshayushuyu lyambda ischislenie kategoriyu monad dlya modelirovaniya pobochnyh effektov rasshirenie sistemy tipov Hindli Milnera sistemu rodo v i dr Joy kompoziciya funkcij i gomomorfizm inache govorya chistyj konkatenativnyj yazyk programmirovaniya i kak sledstvie chistyj funkcionalnyj Lisp lyambda ischislenie Chyorcha v tom chisle yazyk S vyrazhenij voploshayushij notaciyu par Chyorcha Scheme oblagorozhennyj dialekt Lispa silnee tipizirovannyj v bolshej stepeni gomoikonichnyj ogranichivayushijsya angl i soblyudayushij angl dopolnennyj notaciej prodolzhenij ML tipizirovannoe lyambda ischislenie to est lyambda ischislenie dopolnennoe sistemoj tipov Hindli Milnera Prolog ischislenie predikatov Mercury ischislenie predikatov dopolnennoe sistemoj tipov Hindli Milnera Smalltalk teoriya mnozhestv s soblyudeniem angl SQL ischislenie kortezhej variant relyacionnogo ischisleniya v svoyu ochered osnovannogo na ischislenii predikatov pervogo poryadka SGML i ego potomki HTML XML notaciya derevev vazhnyj sluchaj grafov Unlambda kombinatornaya logika Regulyarnye vyrazheniya Refal originalnaya semantika Turchina nosyashaya nazvanie Refal mashiny ili Refal avtomata sozdannaya na osnove normalnogo algoritma Markova voploshayushaya kompoziciyu teorii avtomatov sopostavleniya s obrazcom i perepisyvaniya termov Nalichie matematicheskogo obosnovaniya dlya yazyka mozhet garantirovat ili kak minimum obeshat s ochen vysokoj veroyatnostyu nekotorye ili vse iz sleduyushih polozhitelnyh svojstv Sushestvennoe povyshenie stabilnosti programm V odnih sluchayah za schyot postroeniya dokazatelstva nadyozhnosti dlya samogo yazyka sm tipobezopasnost sushestvennogo uprosheniya formalnoj verifikacii programm i dazhe polucheniya yazyka kotoryj sam yavlyaetsya sistemoj avtomaticheskogo dokazatelstva Coq Agda V drugih sluchayah za schyot rannego obnaruzheniya oshibok na pervyh zhe probnyh zapuskah programm Forth i regulyarnye vyrazheniya Obespechenie potencialno bolee vysokoj effektivnosti programm Dazhe esli semantika yazyka daleka ot arhitektury celevoj platformy kompilyacii k nemu mogut byt primenimy formalnye metodiki globalnogo analiza programm hotya trudoyomkost napisaniya dazhe trivialnogo translyatora mozhet okazatsya vyshe Naprimer dlya yazykov Scheme i Standard ML sushestvuyut razvitye polnoprogrammno optimiziruyushie kompilyatory i superkompilyatory rezultat raboty kotoryh mozhet uverenno konkurirovat po skorosti s yazykom nizkogo urovnya Si i dazhe operezhat poslednij hotya resursoyomkost raboty samih kompilyatorov okazyvaetsya znachitelno vyshe Odna iz samyh bystryh SUBD KDB napisana na yazyke K Yazyk Scala unasledovavshij matematiku ot ML obespechivaet na platforme JVM bolee vysokuyu skorost chem rodnoj dlya neyo yazyk Java istochnik ne ukazan 2993 dnya S drugoj storony Forth imeet reputaciyu odnogo iz samyh netrebovatelnyh k resursam yazykov menee trebovatelen chem Si i ispolzuetsya dlya razrabotki prilozhenij realnogo vremeni pod samye malomoshnye EVM krome togo translyator Forta yavlyaetsya odnim iz naimenee trudoyomkih v realizacii na assemblere Zaranee izvestnyj neogranichennyj ili naoborot chyotko ocherchennyj predel rosta slozhnosti programmnyh komponentov sistem i kompleksov kotorye mozhno vyrazit sredstvami etogo yazyka s sohraneniem pokazatelej kachestva Yazyki ne imeyushie matematicheskogo obosnovaniya a imenno takie naibolee chasto primenyayutsya v mejnstrime C Java C Delphi i dr na praktike ogranichivayut realizuemuyu funkcionalnost i ili snizhayut kachestvo po mere uslozhneniya sistemy tak kak im prisushi eksponencialnye krivye rosta slozhnosti kak otnositelno raboty odnogo otdelno vzyatogo cheloveka tak i otnositelno slozhnosti upravleniya proektom v celom Prognoziruemaya slozhnost sistemy privodit libo k poetapnoj dekompozicii proekta na mnozhestvo bolee melkih zadach kazhdaya iz kotoryh reshaetsya sootvetstvuyushim yazykom libo k yazykovo orientirovannomu programmirovaniyu dlya sluchaya kogda adresuemoj yazykom zadachej yavlyaetsya kak raz opisanie semantik i ili simvolnye vychisleniya Lisp ML Haskell Refal Regulyarnye vyrazheniya Yazyki s neogranichennym predelom rosta slozhnosti programm neredko otnosyat k metayazykam chto v neposredstvennom tolkovanii termina ne verno no praktike svodimo tak kak vsyakij mini yazyk vybrannyj dlya resheniya nekotoroj podzadachi v sostave obshej zadachi mozhet byt predstavlen v vide sintaksicheskogo i semanticheskogo podmnozhestva dannogo yazyka ne trebuya translyacii Udobstvo dlya cheloveka pri reshenii zadach na kotorye etot yazyk orientirovan po svoej prirode sm problemno orientirovannyj yazyk chto v nekotoroj stepeni takzhe sposobno kosvenno povliyat na povyshenie stabilnosti rezultiruyushih programm za schyot povysheniya veroyatnosti obnaruzheniya oshibok v ishodnom kode i snizheniya dublirovaniya koda Osobye kategorii yazykov Uchebnye Predmetno specifichnye Ezotericheskie VizualnyeFormalnye preobrazovaniya i optimizaciyaV F Turchin otmechaet chto dostoinstva vsyakogo formalizovannogo yazyka opredelyayutsya ne tolko tem skol on udoben dlya neposredstvennogo ispolzovaniya chelovekom no i tem v kakoj stepeni teksty na etom yazyke poddayutsya formalnym preobrazovaniyam Naprimer ssylochnaya prozrachnost oznachaet chto parametry funkcij ne obyazany vychislyatsya pered vyzovom vmesto etogo fakticheski peredannoe vyrazhenie mozhet byt celikom podstavleno na mesto peremennoj v funkcii i povedenie funkcii ot etogo ne izmenitsya Eto otkryvaet vozmozhnosti pochti proizvolnyh angl mogut ustranyatsya nenuzhnye promezhutochnye predstavleniya dannyh reducirovatsya slozhnye cepochki vychislenij podbiratsya optimalnoe kolichestvo parallelnyh processov vvoditsya memoizaciya i pr S drugoj storony eto oznachaet polnoe otsutstvie pobochnyh effektov a eto delaet realizaciyu nekotoryh algoritmov zavedomo menee effektivnoj chem pri ispolzovanii izmenyaemogo sostoyaniya Dlya nebolshih i prostyh programm yazyki vysokogo urovnya porozhdayut mashinnyj kod bolshego razmera i ispolnyayutsya medlennee Odnako dlya algoritmicheski i strukturno slozhnyh programm preimushestvo mozhet byt na storone nekotoryh yazykov vysokogo urovnya tak kak chelovek fizicheski ne sposoben vyrazhat slozhnye koncepcii s uchyotom ih effektivnogo ispolneniya na yazyke mashiny K primeru sushestvuet benchmark na kotorom MLton i angl uverenno operezhayut GCC Est massa chastnyh prichin po kotorym avtomaticheskaya optimizaciya v hode translyacii yazykov vysokogo urovnya dayot v principe bolee vysokuyu skorost ispolneniya chem soznatelnyj kontrol sposoba realizacii na yazykah nizkogo urovnya Naprimer imeyutsya dostovernye dannye o tom chto avtomaticheskoe upravlenie pamyatyu bolee effektivno chem ruchnoe uzhe tolko pri ispolzovanii dinamicheskogo metoda sm sborka musora a sushestvuet i potencialno bolee effektivnyj staticheskij metod sm upravlenie pamyatyu na osnove regionov Dalee dlya kazhdogo mikrokonteksta neobhodimo raspredelit registry s uchyotom minimizacii obrasheniya k pamyati a eto trebuet resheniya zadachi raskraski grafa Takogo roda osobennostej mashinnoj logiki ochen mnogo tak chto obshaya informacionnaya slozhnost vozrastaet eksponencialno pri kazhdom shage na uroven vniz a kompilyaciya yazyka vysokogo urovnya mozhet vklyuchat desyatki takih shagov Sushestvuet mnozhestvo strategij avtomaticheskoj optimizacii Nekotorye universalny drugie mogut byt primenimy lish k yazykam opredelyonnoj prirody a nekotorye zavisyat ot sposoba ispolzovaniya yazyka Primerom mozhet sluzhit optimizaciya hvostovyh vyzovov i eyo chastnyj sluchaj optimizaciya hvostovoj rekursii Hotya kompilyatory mnogih yazykov osushestvlyayut optimizaciyu hvostovoj rekursii pri opredelyonnyh usloviyah lish nekotorye yazyki sposobny semanticheski garantirovat optimizaciyu hvostovyh vyzovov v obshem sluchae Standart yazyka Scheme trebuet chtoby vsyakaya realizaciya garantirovala eyo Dlya mnogih funkcionalnyh yazykov ona v principe primenima no lish optimiziruyushie kompilyatory eyo vypolnyayut V yazykah vrode Si ili C ona mozhet proizvoditsya lish v opredelyonnyh sluchayah i lish pri ispolzovanii globalnogo analiza potoka upravleniya Yazyki vysshego poryadka v bolshinstve sluchaev vynuzhdeny ispolnyatsya medlennee chem yazyki pervogo poryadka Prichiny lezhat kak v samoj dekompozicii linejnogo koda na cepochku vlozhennyh vyzovov tak i v vytekayushih osobennostyah nizkourovnevogo predstavleniya funkcij sm zamykanie i dannyh obyornutoe angl boxed tegovoe Odnako sushestvuyut tehniki agressivnoj optimizacii programm pozvolyayushie reducirovat yazyki vysshego poryadka do yazykov pervogo poryadka sm defunkcionalizaciya MLton angl Populyarnost yazykovOsnovnaya statya Izmerenie populyarnosti yazykov angl Trudno opredelit kakoj yazyk programmirovaniya naibolee populyaren tak kak znachenie slova populyarnost zavisit ot konteksta v anglijskom yazyke ispolzuetsya termin usage imeyushij eshyo bolee razmytoe znachenie Odin yazyk mozhet otnimat naibolshee kolichestvo cheloveko chasov na drugom napisano naibolshee chislo strok koda tretij zanimaet naibolshee processornoe vremya a chetvyortyj naibolee chasto sluzhit issledovatelskoj bazoj v akademicheskih krugah Nekotorye yazyki ochen populyarny dlya konkretnyh zadach Naprimer Kobol do sih por dominiruet v korporativnyh data centrah Fortran v nauchnyh i inzhenernyh prilozheniyah variacii yazyka Si v sistemnom programmirovanii a razlichnye potomki ML v formalnoj verifikacii istochnik ne ukazan 3023 dnya Drugie yazyki regulyarno ispolzuyutsya dlya sozdaniya samyh raznoobraznyh prilozhenij Sushestvuyut razlichnye metriki dlya izmereniya populyarnosti yazykov kazhdaya iz kotoryh razrabotana s pristrastiem k opredelyonnomu smyslu ponyatiya populyarnosti podschyot chisla vakansij upominayushih yazyk kolichestvo prodannyh knig uchebnikov ili spravochnikov ocenka kolichestva strok koda napisannyh na yazyke chto ne prinimaet v raschyot redko publikuemye sluchai ispolzovaniya yazykov podschyot upominanij yazyka v zaprosah poiskovikov Sleduet zametit chto vysokie ocenki po etim pokazatelyam ne tolko nikak ne svidetelstvuyut o vysokom tehnicheskom urovne yazyka i ili optimizacii rashodov pri ego ispolzovanii no i naprotiv poroj mogut govorit ob obratnom Naprimer yazyk Kobol vhodit v chislo liderov po kolichestvu napisannyh na nyom strok koda no prichinoj etomu yavlyaetsya krajne nizkij pokazatel modificiruemosti koda chto delaet etot kod ne povtorno ispolzuemym a legacy kodom Kak sledstvie podderzhka programm na Kobole v kratkovremennoj perspektive obhoditsya znachitelno dorozhe chem programm na bolshinstve sovremennyh yazykov no perepisyvanie ih s nulya potrebovalo by znachitelnyh edinovremennyh vlozhenij i mozhet sravnivatsya tolko s dolgovremennymi rashodami Tehnicheskoe nesovershenstvo Kobola obuslovleno tem chto ego razrabatyvali bez privlecheniya ekspertov v oblasti informatiki Sm takzheKompyuternyj yazyk Programmirovanie Hello world Standart oformleniya koda Teoriya yazyka programmirovaniyaPrimechaniyaISO IEC IEEE 24765 2010 Systems and software engineering Vocabulary ISO IEC 2382 1 1993 Information technology Vocabulary Part 1 Fundamental terms Sammar Qayyum Saqib Ali A Pragmatic Comparison of Four Different Programming Languages ScienceOpen Preprints 2021 06 21 doi 10 14293 S2199 1006 1 SOR PP5RV1O v1 Arhivirovano 10 iyunya 2023 goda et al 2000 Plankalkul The First High Level Programming Language and its Implementation Institut fur Informatik Freie Universitat Berlin Technical Report B 3 2000 full text Arhivnaya kopiya ot 18 oktyabrya 2014 na Wayback Machine Computer Languages 1989 1 Nevidimyj konstruktor Sozdanie kodov ponyatnyh cheloveku s 16 Linda Null Julia Lobur The essentials of computer organization and architecture Edition 2 Jones amp Bartlett Publishers 2006 ISBN 0 7637 3769 0 p 435 O Reilly Media History of programming languages neopr PDF Data obrasheniya 5 oktyabrya 2006 Arhivirovano iz originala 28 fevralya 2008 goda Frank da Cruz IBM Punch Cards Arhivnaya kopiya ot 13 maya 2011 na Wayback Machine Columbia University Computing History Arhivnaya kopiya ot 23 maya 2011 na Wayback Machine Richard L Wexelblat History of Programming Languages Academic Press 1981 chapter XIV Pratt 1979 4 6 Sopostavlenie s obrazcom s 130 132 Pratt 1979 15 Snobol 4 s 483 516 Pratt Zelkovic 2002 8 4 2 Sopostavlenie s obrazcom s 369 372 Francois Labelle Programming Language Usage Graph neopr SourceForge Data obrasheniya 21 iyunya 2006 Arhivirovano iz originala 17 iyunya 2006 goda Hayes Brian The Semicolon Wars angl angl magazine 2006 Vol 94 no 4 P 299 303 Tetsuro Fujise Takashi Chikayama Kazuaki Rokusawa Akihiko Nakase December 1994 KLIC A Portable Implementation of KL1 Proc of FGCS 94 ICOT Tokyo December 1994 http www icot or jp ARCHIVE HomePage E html Arhivnaya kopiya ot 25 sentyabrya 2006 na Wayback Machine KLIC is a portable implementation of a concurrent logic programming language Jim Bender Mini Bibliography on Modules for Functional Programming Languages neopr ReadScheme org 15 marta 2004 Data obrasheniya 27 sentyabrya 2006 Arhivirovano iz originala 24 sentyabrya 2006 goda Stroustrup Bjarne Evolving a language in and for the real world C 1991 2006 neopr Data obrasheniya 16 yanvarya 2017 Arhivirovano 20 noyabrya 2007 goda T Pratt M Zelkovic Yazyki programmirovaniya Razrabotka i realizaciya 4 Sankt Peterburg Piter 2002 S 203 688 s 4000 ekz ISBN 5 318 00189 0 Straustrup B Dizajn i evolyuciya C Sankt Peterburg Piter 2006 S 74 76 448 s 2000 ekz ISBN 5 469 01217 4 Sejbel Kodery za rabotoj 2011 Glava 12 Ken Tompson s 414 Zuev E A Krotov A N Suhomlin V A Yazyk programmirovaniya Si etapy evolyucii i sovremennoe sostoyanie neopr 4 oktyabrya 1996 Data obrasheniya 16 yanvarya 2017 Arhivirovano 18 yanvarya 2017 goda Paulson ML for the Working Programmer 1996 s 213 Paulson ML for the Working Programmer 1996 s 1 Bruks 1995 Mernik 2012 s 2 12 Paulson ML for the Working Programmer 1996 s 9 Rick Byers Garbage Collection Algorithms neopr courses cs washington edu Project for CSEP 521 Winter 2007 Data obrasheniya 28 dekabrya 2016 Arhivirovano 29 avgusta 2017 goda Appel A Critique of Standard ML 1992 Harper Practical Foundations for Programming Languages 2012 Chapter 4 Statics s 35 Mitchel 2004 6 2 1 Type Safety s 132 133 Comparison of static code analyzers CppCat Cppcheck PVS Studio and Visual Studio neopr Data obrasheniya 25 oktyabrya 2016 Arhivirovano 26 oktyabrya 2016 goda Comparing PVS Studio with other code analyzers neopr Data obrasheniya 25 oktyabrya 2016 Arhivirovano 26 oktyabrya 2016 goda Pratt 1979 2 7 Svyazyvanie i vremya svyazyvaniya s 46 51 Reynolds Theories of programming languages 1998 12 4 Deriving a First Order Semantics Strachey Fundamental Concepts 1967 3 5 1 First and second class objects s 32 34 SICP Harper Practical Foundations for Programming Languages 2012 8 2 Higher Order Functions s 67 Pratt Zelkovic 2002 1 1 Zachem izuchat yazyki programmirovaniya s 17 18 Bruce A Tate Foreword Seven Languages in Seven Weeks A Pragmatic Guide to Learning Programming Languages Pragmatic Bookshelf 2010 S 14 16 ISBN 978 1934356593 Pratt Zelkovic 2002 1 1 Zachem izuchat yazyki programmirovaniya s 18 Hudak 1998 Paulson ML for the Working Programmer 1996 s 1 Clash Arhivnaya kopiya ot 4 yanvarya 2024 na Wayback Machine vstraivaemyj DSL na Haskell prednaznachennyj dlya modelirovaniya processorov i generacii opisanij na Verilog VHDL Aho Ulman 1992 Joyner 1996 2 2 Communication abstraction and precision s 4 Ward 1994 Paulson ML for the Working Programmer 1996 s 63 64 Kernigan about Pascal 1981 Joyner 1996 3 17 and gt s 26 Paulson ML for the Working Programmer 1996 s 177 178 Bruks 1975 1995 Bruks 1975 1995 Dostizhenie konceptualnoj celostnosti s 30 C A R Hoare The Emperor s Old Clothes Communications of the ACM 1981 Alan Kej The Early History of Smalltalk Apple Computer ACM SIGPLAN Notices vol 28 3 March 1993 Arhivirovano 14 sentyabrya 2012 goda Greg Nelson Systems Programming with Modula 3 NJ Prentice Hall Englewood Cliffs 1991 288 s ISBN 978 0135904640 Commentary on SML 1991 Aims of the Commentary s vii Thomas Noll Chanchal Kumar Roy Modeling Erlang in the Pi Calculus ACM 1 59593 066 3 05 0009 2005 Arhivirovano 1 avgusta 2014 goda Design Principles Behind Smalltalk neopr Data obrasheniya 3 iyunya 2014 Arhivirovano 19 iyunya 2014 goda kx Calibrated performance neopr Data obrasheniya 3 iyunya 2014 Arhivirovano 21 iyunya 2014 goda Luca Cardelli Typeful programming IFIP State of the Art Reports Springer Verlag 1991 Arhivirovano 22 marta 2016 goda Ward 1994 There is a fundamental limit to complexity of any software system for it to be still manageable if it requires more than one brainfull of information to understand a component of the system then that component will not be understood fully It will be extremely difficult to make enhancements or fix bugs and each fix is likely to introduce further errors due to this incomplete knowledge Glass 2004 Czarnecki et al 2004 Turchin V F Ekvivalentnye preobrazovaniya programm na REFALe Trudy CNIPIASS 6 CNIPIASS 1974 B Zorn The Measured Cost of Conservative Garbage Collection Technical Report CU CS 573 92 University of Colorado at Boulder 1993 doi 10 1 1 14 1816 Ehud Lamm Richard L Conner Cobol your age is showing angl Computerworld magazine International Data Group 1984 14 May vol 18 no 20 P ID 7 ID 18 ISSN 0010 4841 Robert L Mitchell Cobol Not Dead Yet neopr Computerworld 4 oktyabrya 2006 Data obrasheniya 27 aprelya 2014 Arhivirovano 27 aprelya 2014 goda LiteraturaGavrikov M M Ivanchenko A N Grinchenkov D V Teoreticheskie osnovy razrabotki i realizacii yazykov programmirovaniya 2013 178 s ISBN 978 5 406 02430 0 Krinickij N A Mironov G A Frolov G D Programmirovanie GIFML 1963 384 s Bratchikov I L Sintaksis yazykov programmirovaniya Nauka 1975 230 s Lavrov S S Osnovnye ponyatiya i konstrukcii yazykov programmirovaniya Finansy i statistika 1982 80 s Christopher Strachey Fundamental Concepts in Programming Languages angl 1967 Arhivirovano 12 avgusta 2017 goda Povtorno opublikovano Christopher Strachey Fundamental Concepts in Programming Languages angl 2000 T 13 S 11 49 ISSN 1388 3690 doi 10 1023 A 1010000313106 Harold Abelson Dzherald Dzhej Sassman Dzhuli Sassman Struktura i interpretaciya kompyuternyh programm SICP Frederik Bruks Mificheskij cheloveko mesyac ili Kak sozdayutsya programmnye sistemy Addison Wesley 1975 1995 ISBN ISBN 5 93286 005 7 1 e izd Terens Pratt Yazyki programmirovaniya razrabotka i realizaciya Programming Language Design and Implementation PLDI 1 e izdanie Mir 1979 Alfred Aho Ravi Seti Dzheffri Ulman Kompilyatory principy tehnologii i instrumenty Addison Wesley Publishing Company Izdatelskij dom Vilyams 1985 2001 2003 768 s ISBN 5 8459 0189 8 rus 0 201 10088 6 orig Time Life Books Yazyk kompyutera Computer Languages M Mir 1989 T 2 240 s Understanding Computers 100 000 ekz ISBN 5 03 001148 X angl Typeful programming angl IFIP State of the Art Reports Springer Verlag 1991 Vyp Formal Description of Programming Concepts S 431 507 Robin Milner angl Commentary on Standard ML MIT Press 1991 ISBN 0 262 63132 7 Arhivirovano 1 dekabrya 2014 goda Alfred Aho Dzheffri Ulman Foundations of Computer Science Computer Science Press 1992 Andrew W Appel A Critique of Standard ML Princeton University revised version of CS TR 364 92 1992 Martin Ward Language Oriented Programming Computer Science Department Science Labs 1994 Ian Joyner A Critique of C and Programming and Language Trends of the 1990s 3rd Edition kopirajt i spisok izdanij 1996 angl ML for the Working Programmer 2nd Cambridge Great Britain Cambridge University Press 1996 492 s ISBN 0 521 57050 6 tvyordyj pereplyot 0 521 56543 X myagkij pereplyot John C Reynolds Theories of programming languages Cambridge University Press 1998 ISBN 978 0 521 59414 1 hardback 978 0 521 10697 9 paperback Andrew W Appel Modern compiler implementation in ML in C in Java neopr Cambridge Great Britain Cambridge University Press 1998 538 s ISBN ML 0 521 58274 1 hardback 0 521 60764 7 paperback Paul Hudak Modular Domain Specific Languages and Tools IEEE Computer Society Press Department of Computer Science Yale University 1998 Arhivirovano 17 oktyabrya 2013 goda Robert U Sebesta Osnovnye koncepcii yazykov programmirovaniya Concepts of Programming Languages Per s angl 5 e izd M 2001 672 s 5000 ekz ISBN 5 8459 0192 8 rus ISBN 0 201 75295 6 angl Volfengagen V E Konstrukcii yazykov programmirovaniya Priyomy opisaniya M Centr YurInfoR 2001 276 s ISBN 5 89158 079 9 Parondzhanov V D Kak uluchshit rabotu uma Algoritmy bez programmistov eto ochen prosto M Delo 2001 360 s ISBN 5 7749 0211 0 Pierce Benjamin C Types and Programming Languages MIT Press 2002 ISBN 0 262 16209 1 Perevod na russkij yazyk Pirs B Tipy v yazykah programmirovaniya 2012 680 s ISBN 978 5 7913 0082 9 Terens Pratt Marvin Zelkovic Yazyki programmirovaniya razrabotka i realizaciya 4 e izdanie Piter 2002 Klassika Computer Science ISBN 978 5 318 00189 5 Martin Campbell Kelly From Airline Reservations to Sonic the Hedgehog A History of the Software Industry MIT Press 2003 372 s History of Computing ISBN 978 1422391761 Robert Glass Fakty i zabluzhdeniya professionalnogo programmirovaniya Simvol Plyus 2004 240 s ISBN 5 93286 092 8 978 5 93286 092 2 John C Mitchell Concepts in Programming Languages Cambridge University Press 2004 ISBN 0 511 04091 1 eBook in netLibrary 0 521 78098 5 hardback K Czarnecki J O Donnell J Striegnitz W Taha DSL implementation in metaocaml template haskell and C University of Waterloo University of Glasgow Research Centre Julich Rice University 2004 Arhivirovano 5 marta 2016 goda F Byankucci Sh Uorden Pionery programmirovaniya Dialogi s sozdatelyami naibolee populyarnyh yazykov programmirovaniya SPb 2010 608 s ISBN 978 5 93286 170 7 Piter Sejbel Kodery za rabotoj Razmyshleniya o remesle programmista Simvol Plyus SPb 2011 ISBN 978 5 93286 188 2 978 1 4302 1948 4 angl angl Practical Foundations for Programming Languages version 1 37 revised 01 11 2014 licensed under the Creative Commons Attribution Noncommercial No Derivative Works 3 0 United States License 2012 544 s Arhivnaya kopiya ot 24 oktyabrya 2015 na Wayback Machine Marjan Mernik Formal and Practical Aspects of Domain Specific Languages IGI Global 2012 ISBN 978 1 4666 2092 6 SsylkiMediafajly na Vikisklade The Language List nedostupnaya ssylka istoriya angl bolee 2500 yazykov s kratkim opisaniem Computer Languages History angl istoriya yazykov programmirovaniya s 1954 po maj 2004 soderzhit regulyarno obnovlyaemuyu diagrammu Examples nedostupnaya ssylka istoriya angl primery programmirovaniya na 162 yazykah Programming Language Popularity angl regulyarno obnovlyaemoe issledovanie populyarnosti yazykov programmirovaniya 10 yazykov programmirovaniya kotorye stoit izuchat 2006 g Arhivnaya kopiya ot 9 noyabrya 2011 na Wayback Machine Programming Community Index angl regulyarno obnovlyaemyj rejting populyarnosti yazykov programmirovaniya Computer Language Shootout Benchmarks nedostupnaya ssylka istoriya angl sravnenie yazykov programmirovaniya po effektivnosti Programming Languages that are Loved angl sravnenie yazykov programmirovaniya po lyubvi i nenavisti k nim Brajan Kernigan Why Pascal is Not My Favorite Programming Language 1981 Ehud Lamm Hidden complexities of tail call tail recursion optimization LtU Classic Archives angl Lambda the Ultimate 7 dekabrya 2003 Data obrasheniya 30 noyabrya 2016 V snoskah k state najdeny nerabotosposobnye viki ssylki Ispravte korotkie primechaniya ustanovlennye cherez shablon sfn ili ego analogi v sootvetstvii s instrukciej k shablonu ili dobavte nedostayushie publikacii v razdel istochnikov Spisok snosok Paulson ML for the Working Programmer 1996 Bruks 1995 17 oktyabrya 2023