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

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

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

Были созданы тысячи различных языков программирования. И с каждым годом их становится все больше. Многие языки программирования пишутся в императивной форме (т. е. в виде последовательности выполняемых операций). В то время как другие языки используют декларативную форму (т. е. задается желаемый результат. А не способ его достижения).

Описание языка программирования обычно делится на два компонента: синтаксис (форма) и семантика (значение). Некоторые языки определяются документом спецификации (например. Язык программирования C определяется стандартом ISO). В то время как другие языки (такие как Perl) имеют доминирующую реализацию, которая рассматривается как ссылка. Некоторые языки имеют и то, и другое. Причем базовый язык определяется стандартом. А расширения. Взятые из доминирующей реализации. Являются общими.

Определения

Язык программирования-это нотация для написания программ, которые являются спецификациями вычисления или алгоритма.[2] Некоторые авторы ограничивают термин «язык программирования» теми языками. Которые могут выражать все возможные алгоритмы.[2][3] Черты, часто считающиеся важными для того. Что составляет язык программирования, включают:

Функция и цель
Язык компьютерного программирования

-это язык , используемый для написания компьютерных программ, который включает в себя компьютер , выполняющий какие-то вычисления[4] или алгоритм и, возможно. Управляющий внешними устройствами. Такими как принтеры, дисководы, роботы[5] и т. Д. Например, PostScript программы часто создаются другой программой для управления компьютерным принтером или дисплеем. В более общем смысле язык программирования может описывать вычисления на некоторой. Возможно абстрактной, машине.

Общепринято. Что полная спецификация языка программирования включает в себя описание, возможно. Идеализированное. Машины или процессора для этого языка.[6] В большинстве практических контекстов язык программирования включает в себя компьютер; следовательно. Языки программирования обычно определяются и изучаются таким образом.[7] Языки программирования отличаются от естественных языков в том. Что естественные языки используются только для взаимодействия между людьми. В то время как языки программирования также позволяют людям передавать инструкции машинам.

Абстракции
Языки программирования обычно содержат

абстракции для определения и управления структурами данных или управления потоком выполнения. Практическая необходимость того. Чтобы язык программирования поддерживал адекватные абстракции. Выражается принципом абстракции.[8] Этот принцип иногда формулируется как рекомендация программисту правильно использовать такие абстракции.[9]

Выразительная сила
Теория вычислений классифицирует языки по вычислениям. Которые они способны выражать. Все языки Тьюринга могут реализовать один и тот же набор алгоритмов. ANSI/ISO SQL-92 и Charity являются примерами языков. Которые не являются полными по Тьюрингу. Но часто называются языками программирования.

[10][11]

Языки разметки , такие как XML, HTMLили troff, которые определяют структурированные данные, обычно не считаются языками программирования.[12][13][14] Языки программирования могут, однако. Совместно использовать синтаксис с языками разметки. Если определена вычислительная семантика. Например, XSLT-это полный язык Тьюринга. Полностью использующий синтаксис XML.[15][16][17] Кроме того, LaTeX, который в основном используется для структурирования документов. Также содержит полное подмножество Тьюринга.[18][19]

Термин компьютерный язык иногда используется взаимозаменяемо с языком программирования.[20] Однако использование обоих терминов варьируется у разных авторов. Включая точный объем каждого из них. Одно использование описывает языки программирования как подмножество компьютерных языков.Точно так же языки. Используемые в вычислениях. Которые имеют иную цель. Чем выражение компьютерных программ. Являются обобщенно обозначенными компьютерными языками. Например. Языки разметки иногда называют компьютерными языками. Чтобы подчеркнуть. Что они не предназначены для программирования.[22]

Другое использование рассматривает языки программирования как теоретические конструкции для программирования абстрактных машин, а компьютерные языки-как их подмножество. Которое работает на физических компьютерах. Имеющих конечные аппаратные ресурсы.[23]Джон К. Рейнольдс подчеркивает. Что формальная спецификация языки-это такие же языки программирования. Как и языки. Предназначенные для выполнения. Он также утверждает. Что текстовые и даже графические форматы ввода. Влияющие на поведение компьютера. Являются языками программирования. Несмотря на то. Что они обычно не являются полными по Тьюрингу. И отмечает. Что незнание концепций языка программирования является причиной многих недостатков в форматах ввода.[24]

Ранние разработки

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

Чуть позже программы могли быть написаны на машинном языке, где программист записывает каждую команду в числовой форме . Которую аппаратное обеспечение может выполнить непосредственно. Например, инструкция для добавления значения в две ячейки памяти может состоять из 3 чисел: Программы, в десятичной или двоичной форме. Считывались с перфокарт, бумажной ленты, магнитной ленты или переключались на переключателях на передней панели компьютера. Машинные языки позже были названы языками программирования первого поколения (1GL).

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

Первые языки программирования высокого уровня, или языки программирования третьего поколения (3GL). Были написаны в 1950-х годах. Ранний язык программирования высокого уровня . Предназначенный для компьютера. Был Plankalkül, разработанный для немецкого Z3 Конрадом Цузе между 1943 и 1945 годами. Однако он не был реализован до 1998 и 2000 годов.]

Короткий код Джона Мочли. Предложенный в 1949 году. Был одним из первых языков высокого уровня . Когда-либо разработанных для электронной вычислительноймашины .[26] В отличие от машинного кода, короткие операторы кода представляли математические выражения в понятной форме. Однако программу приходилось переводить в машинный код каждый раз. Когда она выполнялась. Что делало процесс намного медленнее. Чем выполнение эквивалентного машинного кода.

В Манчестерском университетеАлик Гленни разработал автокод в начале 1950-х годов. В качестве языка программированияон использовал компилятор для автоматического преобразования языка в машинный код. Первый код и компилятор был разработан в 1952 году для компьютера Mark 1 в Манчестерском университете и считается первым скомпилированным языком программирования высокого уровня.[27][28]

Второй автокод был разработан для Mark 1 Р. А. Брукером в 1954 году и назывался Брукер также разработал автокод для Ферранти Меркьюри в 1950-х годах совместно с Манчестерским университетом. Версия для EDSAC 2 была разработана Д. Ф. Хартли из Математической лаборатории Кембриджского университета в 1961 году. Известный как EDSAC 2 Autocode. Он был прямым развитием Mercury Autocode. Адаптированным к местным условиям. И был известен своей оптимизацией объектного кода и диагностикой исходного языка. Которые были продвинуты в то время. Современный. Но отдельный поток разработки, Atlas Autocode был разработан для машины Atlas 1 Манчестерского университета.

В 1954 году ФОРТРАН был изобретен в IBM Джоном Бэкусом. Это был первый широко используемый язык программирования высокого уровня общего назначения, который имеет функциональную реализацию. А не просто дизайн на бумаге.[29][30] Это по-прежнему популярный язык для высокопроизводительных вычислений[31] и используется для программ. Которые оценивают и ранжируют самые быстрые в мире суперкомпьютеры.]

Еще один ранний язык программирования был разработан Грейс Хоппер в США. Названный FLOW-MATIC. Он был разработан для UNIVAC I в Remington Rand в период с 1955 по 1959 год. Хоппер обнаружила. Что клиенты. Занимающиеся обработкой бизнес-данных. Испытывают дискомфорт от математических обозначений. И в начале 1955 года она и ее команда написали спецификацию для английского языка программирования и реализовали прототип. Компилятор FLOW-MATIC стал общедоступным в начале 1958 года и был существенно завершен в 1959 году.[34] FLOW-MATIC оказал большое влияние на разработку COBOL, так как только он и его прямой потомок АЙМАКО были фактически использованы в то время.[35]

Уточнение

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

Период с 1960-х по конец 1970-х годов привел к развитию основных языковых парадигм. Используемых в настоящее время:

Каждый из этих языков породил потомков. И большинство современных языков программирования считают. По крайней мере. Один из них в своей родословной.

1960-е и 1970-е годы также произошли существенные дебаты по поводу достоинств структурного программирования, и есть ли языки программирования должны быть предназначены для его обслуживания.[38]э. Дейкстры, в известном 1968 письме. Опубликованном в связи АСМ, утверждали. Что переход отчетности должны быть устранены все [39]

Консолидация и рост

Подборка учебников. Которые учат программированию. На языках как популярных. Так и малоизвестных. Это лишь некоторые из тысяч языков программирования и диалектов. Созданных за всю историю.

1980 — е годы были годами относительной консолидации. C++ комбинированное объектно-ориентированное и системное программирование. Правительство США стандартизировало Ada-язык системного программирования . Производный от языка Pascal и предназначенный для использования оборонными подрядчиками. В Японии и других странах огромные суммы были потрачены на изучение так называемых языков , которые включали в себя логические конструкции программирования.[40] Сообщество функциональных языков перешло к стандартизации ML и Lisp. Вместо того. Чтобы изобретать новые парадигмы. Все эти движения развивали идеи. Изобретенные в предыдущие десятилетия.

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

Быстрый рост Интернета в середине 1990-х годов создал возможности для новых языков. Perl, первоначально скриптовый инструмент Unix. Впервые выпущенный в 1987 году. Стал распространенным в динамических веб-сайтах. Java стала использоваться для программирования на стороне сервера. И виртуальные машины с байт-кодом снова стали популярными в коммерческих условиях с их обещанием Писать один раз. Работать где угодноUCSD Pascal был популярен некоторое время в начале 1980-х годов). Эти разработки не были принципиально новыми; скорее. Они были усовершенствованиями многих существующих языков и парадигм (хотя их синтаксис часто основывался на семействе языков программирования Си).

Эволюция языка программирования продолжается как в промышленности. Так и в научных исследованиях. Текущие направления включают проверку безопасности и надежности, новые виды модульности (миксины, делегаты, аспекты) и интеграцию баз данных. Такие как LINQ от Microsoft.

Языки программирования четвертого поколения (4GL)-это языки программирования. Которые стремятся обеспечить более высокий уровень абстракции внутренних деталей аппаратного обеспечения компьютера, чем 3GLs. Языки программирования пятого поколения (5GL) — это языки программирования. Основанные на решении задач с использованием ограничений. Заданных программе. А не с использованием алгоритма, написанного программистом.

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

Синтаксис

Подсветка синтаксиса часто используется для помощи программистам в распознавании элементов исходного кода. Язык выше-Python.

Поверхностная форма языка программирования известна как его синтаксис. Большинство языков программирования являются чисто текстовыми; они используют последовательности текста. Включая слова. Цифры и знаки препинания. Как и письменные естественные языки. С другой стороны. Есть некоторые языки программирования. Которые являются более графическими по своей природе. Используя визуальные отношения между символами. Чтобы указать программу.

Синтаксис языка описывает возможные комбинации символов. Которые образуют синтаксически правильную программу. Значение, придаваемое комбинации символов. Обрабатывается семантикой (либо формальной, либо жестко закодированной в эталонной реализации). Поскольку большинство языков являются текстовыми. В этой статье рассматривается текстовый синтаксис.

Синтаксис языка программирования обычно определяется с помощью комбинации регулярных выражений (для лексической структуры) и формы Бэкуса–Наура (для грамматической структуры). Ниже приведена простая грамматика. Основанная на Лиспе:

выражение ::= atom | list atom ::= number | symbol number ::= [+-]?['0'-'9']+ символ ::= ['A'-'Z::= '(' выражение* ')' 

Эта грамматика определяет следующее:

  • выражение-это либо атом, либо список;
  • атом-это либо число, либо символ;
  • число — это непрерывная последовательность из одной или нескольких десятичных цифр. Необязательно предшествующая знаку плюс или минус;
  • символ-это буква. За которой следует ноль или более любых символов (исключая пробелы);
  • список — это совпадающая пара скобок с нулем или более выражений внутри.

Ниже приведены примеры хорошо сформированных последовательностей лексем в этой грамматике: 12345, ()и (a b c232 (1)).

Не все синтаксически корректные программы семантически корректны. Многие синтаксически корректные программы. Тем не менее. Плохо сформированы в соответствии с правилами языка и могут (в зависимости от спецификации языка и обоснованности реализации) привести к ошибке при переводе или выполнении. В некоторых случаях такие программы могут проявлять неопределенное поведение. Даже если программа четко определена в рамках языка. Она все равно может иметь значение. Которое не предназначено человеком. Который ее написал.

Используя естественный язык в качестве примера. Может оказаться невозможным присвоить значение грамматически правильному предложению или предложение может быть ложным:

Следующий фрагмент языка Си синтаксически корректен. Но выполняет операции. Которые не определены семантически (операция *p >> 4не имеет значения для значения. Имеющего сложный тип, и p->imне определена. Поскольку значение pявляется нулевым указателем):

complex *p = NULL; complex abs_p = sqrt(*p >>>> > 4 + p->>im); 

Если бы объявление типа в первой строке было опущено. Программа вызвала бы ошибку для неопределенной переменной Однако программа все равно будет синтаксически корректной. Поскольку объявления типов предоставляют только семантическую информацию.

Грамматика, необходимая для определения языка программирования. Может быть классифицирована по его положению в иерархии Хомского. Синтаксис большинства языков программирования может быть задан с помощью грамматики типа 2, то есть они являются контекстно-свободными грамматиками.[42] Некоторые языки. Включая Perl и Lisp. Содержат конструкции. Которые позволяют выполнять их на этапе синтаксического анализа. Языки , имеющие конструкции. Позволяющие программисту изменять поведение синтаксического анализатора. Делают синтаксический анализ неразрешимой проблемойи, как правило. Стирают различие между синтаксическим анализом и исполнением.[43] В отличие от макросистемы Lisp и Perl BEGIN блоки. Которые могут содержать общие вычисления. Макросы C являются просто заменой строк и не требуют выполнения кода.[44]

Семантика

Термин синтаксису).

Статическая семантика

Статическая семантика определяет ограничения на структуру допустимых текстов. Которые трудно или невозможно выразить в стандартных синтаксических формализмах.[2] Для компилируемых языков статическая семантика по существу включает в себя те семантические правила. Которые могут быть проверены во время компиляции. Примеры включают проверку того. Что каждый идентификатор объявлен перед его использованием (в языках. Требующих таких объявлений) или что метки на плечах оператора case различны.] Многие важные ограничения этого типа. Такие как проверка того. Что идентификаторы используются в соответствующем контексте (например. Не добавлять целое число к имени функции) или что вызовы подпрограмм имеют соответствующее число и тип аргументов. Могут быть применены путем определения их как правил в логике, называемой системой типов. Другие формы статического анализа, такие как анализ потока данных, также могут быть частью статической семантики. Более новые языки программирования . Такие как Java и C#, имеют определенный анализ присваиваний, форму анализа потока данных. Как часть их статической семантики.

Динамическая семантика

После того. Как данные были заданы. Машина должна быть проинструктирована выполнять операции с данными. Например, семантика может определять стратегию, с помощью которой выражения оцениваются в значения. Или способ. Которым управляющие структуры условно выполняют операторы. Динамическая семантика (также известная как семантика выполнения) языка определяет. Как и когда различные конструкции языка должны производить поведение программы. Существует множество способов определения семантики выполнения. Естественный язык часто используется для определения семантики выполнения языков. Обычно используемых на практике. Значительное количество научных исследований было посвящено формальной семантике языков программирования, которые позволяют формально определять семантику выполнения. Результаты этой области исследований нашли ограниченное применение для разработки и реализации языка программирования за пределами академических кругов.

Система типов

Система типов определяет . Как язык программирования классифицирует значения и выражения в типы, как он может манипулировать этими типами и как они взаимодействуют. Целью системы типов является проверка и. Как правило. Обеспечение определенного уровня корректности в программах. Написанных на этом языке. Путем обнаружения определенных неправильных операций. Любая разрешимая система типов предполагает компромисс: в то время как она отвергает многие неправильные программы. Она также может запретить некоторые правильные. Хотя и необычные программы. Чтобы обойти этот недостаток. В ряде языков есть лазейки типа, обычно непроверенные приведения это может быть использовано программистом для явного разрешения обычно запрещенной операции между различными типами. В большинстве типизированных языков система типов используется только для проверки типов программ. Но ряд языков. Обычно функциональных, выводят типы, освобождая программиста от необходимости писать аннотации типов. Формальное проектирование и изучение систем типов известно как теория типов.

Типизированные и нетипизированные языки

Язык типизируется, если спецификация каждой операции определяет типы данных. К которым эта операция применима.Например, данные . Представленные "this text between the quotes"строкой, и во многих языках программирования деление числа на строку не имеет никакого смысла и не будет выполнено. Недопустимая операция может быть обнаружена при компиляции программы ( Многие языки позволяют функции. Называемой обработчиком исключений. Обрабатывать это исключение и, например. Всегда возвращать

Частным случаем типизированных языков являются однотипные языки. Это часто скриптовые языки или языки разметки. Такие как REXX или SGML, и имеют только один тип данных[сомнительный обсуждение]— чаще всего символьные строки. Которые используются как для символьных. Так и для числовых данных.

Напротив, нетипизированный язык, такой как большинство языков ассемблера, позволяет выполнять любую операцию с любыми данными. Обычно последовательностями битов различной длины.[46] Высокоуровневые нетипизированные языки включают BCPL, Tclи некоторые разновидности Forth.

На практике. Хотя немногие языки считаются типизированными из теории типов (проверяя или отвергая все операции). Большинство современных языков предлагают определенную степень типизации.[46] Многие производственные языки предоставляют средства для обхода или подрыва системы типов. Торгуя безопасностью типов для более тонкого контроля над выполнением программы (см.

Статический и динамический ввод

В статической типизациивсе выражения имеют свои типы . Определенные до выполнения программы. Как правило. Во время компиляции. Например, 1 и (2+2) являются целочисленными выражениями; они не могут быть переданы в функцию. Которая ожидает строку. Или сохранены в переменной. Которая определена для хранения дат.[46]

Статически типизированные языки могут быть либо явно типизированными, либо типизированными. В первом случае программист должен явно писать типы в определенных текстовых позициях (например, в объявлениях переменных). Во втором случае компилятор выводит типы выражений и объявлений на основе контекста. Большинство основных статически типизированных языков. Таких как C++, C# и Java, явно типизированы. Полный вывод типов традиционно ассоциировался с менее распространенными языками. Такими как Haskell и ML. Однако многие явно типизированные языки поддерживают частичный вывод типов; например, C++, Java и C# все выводят типы в определенных ограниченных случаях.[47] Кроме того, некоторые языки программирования допускают автоматическое преобразование некоторых типов в другие типы; например. Int может использоваться там. Где программа ожидает float.

Динамическая типизация, также называемая латентной типизацией, определяет типобезопасность операций во время выполнения; другими словами. Типы ассоциируются со значениями во время выполнения, а не с текстовыми выражениями.[46] Как и в случае языков с выводом типов. Динамически типизированные языки не требуют от программиста написания явных аннотаций типов к выражениям. Помимо прочего. Это может позволить одной переменной ссылаться на значения разных типов в разных точках выполнения программы. Однако ошибки типа не могут быть автоматически обнаружены до тех пор. Пока фрагмент кода не будет фактически выполнен. Что может привести к отладке гораздо сложнее. Lisp, Smalltalk, Perl, Python, JavaScriptи Ruby являются примерами динамически типизированных языков.

Слабая и сильная типизация

Слабая типизация позволяет обрабатывать значение одного типа как другое, например. Рассматривать строку как число.[46] Иногда это может быть полезно. Но также может позволить некоторым видам ошибок программы остаться незамеченными во время компиляции и даже во время выполнения.

Сильная типизация предотвращает эти ошибки программы. Попытка выполнить операцию над неправильным типом значения вызывает ошибку.[46] Строго типизированные языки часто называют типобезопасными или безопасными.

Альтернативное определение термина Perl и JavaScript, которые допускают большое количество неявных преобразований типов. Например, в JavaScript выражение 2 * xнеявно преобразуется xв число. И это преобразование выполняется успешно. Даже если xоно являетсяnull,undefined, an Arrayили строкой букв. Такие неявные преобразования часто полезны. Но они могут маскировать ошибки программирования. Сильное и статическое в настоящее время обычно считаются ортогональными понятиями. Но использование в литературе отличается. Некоторые используют термин сильно. Статически типизированного, или. Что еще более запутанно. Означает просто статически типизированный. Таким образом, C был назван как сильно типизированным. Так и слабо. Статически типизированным.[48][49]

Некоторым профессиональным программистам может показаться странным. Что язык Си может быть Однако обратите внимание. Что использование универсального указателя. Указателя void*, действительно позволяет приводить указатели к другим указателям без необходимости выполнять явное приведение. Это очень похоже на то. Как каким-то образом привести массив байтов к любому типу данных в C без использования явного приведения. Такого как (int)or (char).

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

Большинство языков программирования имеют соответствующую базовую библиотеку (иногда называемую Основные библиотеки обычно включают определения часто используемых алгоритмов. Структур данных и механизмов ввода и вывода.

Граница между языком и его основной библиотекой отличается от языка к языку. В некоторых случаях разработчики языка могут рассматривать библиотеку как отдельную сущность от языка. Однако основная библиотека языка часто рассматривается пользователями как часть языка. И некоторые языковые спецификации даже требуют. Чтобы эта библиотека была доступна во всех реализациях. Действительно. Некоторые языки устроены так. Что значения некоторых синтаксических конструкций даже не могут быть описаны без обращения к основной библиотеке. Например, в Java Строковый литерал определяется как экземпляр java.lang.Stringкласса; аналогично в Smalltalkанонимное выражение функции (BlockContextкласса библиотеки. И наоборот, Scheme содержит множество когерентных подмножеств. Достаточных для построения остальной части языка в виде библиотечных макросов. И поэтому разработчики языка даже не утруждают себя определением того. Какие части языка должны быть реализованы как языковые конструкции. А какие-как части библиотеки.

Проектирование и реализация

Языки программирования обладают общими свойствами с естественными языками. Связанными с их назначением в качестве средств коммуникации. Имеют синтаксическую форму. Отдельную от ее семантики. И демонстрируют языковые семейства родственных языков, ветвящихся друг от друга. Существенным отличием является то. Что язык программирования может быть полностью описан и изучен во всей его полноте. Поскольку он имеет точное и конечное определение.[52] Напротив, естественные языки имеют изменяющиеся значения. Данные их пользователями в различных сообществах. Хотя сконструированные языки также являются искусственными языками. Разработанными с нуля с определенной целью. Им не хватает точного и полного семантического определения. Которое имеет язык программирования.

Многие языки программирования были разработаны с нуля. Изменены для удовлетворения новых потребностей и объединены с другими языками. Многие из них со временем вышли из употребления. Хотя были попытки создать один [53] Потребность в различных языках программирования возникает из-за разнообразия контекстов. В которых используются языки:

  • Программы варьируются от крошечных сценариев. Написанных отдельными любителями. До огромных систем. Написанных сотнями программистов.
  • Опыт программистов варьируется от новичков. Которым прежде всего нужна простота. До экспертов. Которым может быть комфортно со значительной сложностью.
  • Программы должны сбалансировать скорость. Размер и простоту в системах от микроконтроллеров до суперкомпьютеров.
  • Программы могут быть написаны один раз и не изменяться в течение нескольких поколений. Или они могут подвергаться постоянным модификациям.
  • Программисты могут просто отличаться своими вкусами: они могут привыкнуть обсуждать проблемы и выражать их на определенном языке.

Одной из распространенных тенденций в развитии языков программирования было увеличение возможностей решения задач с использованием более высокого уровня абстракции Самые ранние языки программирования были очень тесно связаны с базовым аппаратным обеспечением компьютера. По мере развития новых языков программирования были добавлены функции. Которые позволяют программистам выражать идеи. Более удаленные от простого перевода в базовые аппаратные инструкции. Поскольку программисты менее привязаны к сложности компьютера. Их программы могут делать больше вычислений с меньшими усилиями со стороны программиста. Это позволяет им писать больше функциональных возможностей в единицу времени[54].]

Программирование на естественном языке было предложено как способ устранения необходимости в специализированном языке программирования. Однако эта цель остается далекой. И ее преимущества открыты для обсуждения. Эдсгер У. Дейкстра занял позицию. Что использование формального языка необходимо для предотвращения введения бессмысленных конструкций. И отверг программирование на естественном языке как Алан Перлис также пренебрежительно отнесся к этой идее.[56] Гибридные подходы были приняты в структурированном английском и SQL.

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

Спецификация

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

Спецификация языка программирования может принимать несколько форм. Включая следующие:

Реализация

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

Вывод компилятора может выполняться аппаратно или программой. Называемой интерпретатором. В некоторых реализациях. Использующих подход интерпретатора. Нет четкой границы между компиляцией и интерпретацией. Например, некоторые реализации БАЗОВОЙ компиляции. А затем выполнить исходную строку в то время.

Программы. Которые выполняются непосредственно на оборудовании. Обычно работают гораздо быстрее, чем те. Которые интерпретируются в программном обеспечении.[60][требуется лучший источник]

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

Проприетарные языки

Хотя большинство наиболее часто используемых языков программирования имеют полностью открытые спецификации и реализации. Многие языки программирования существуют только как проприетарные языки программирования с реализацией. Доступной только от одного поставщика. Который может утверждать. Что такой проприетарный язык является их интеллектуальной собственностью. Проприетарные языки программирования обычно являются доменными языками или внутренними языками сценариев для одного продукта; некоторые проприетарные языки используются только внутри поставщика. В то время как другие доступны внешним пользователям.

Некоторые языки программирования существуют на границе между собственными и открытыми; например, Oracle Corporation утверждает права собственности на некоторые аспекты языка программирования Java[61], а язык программирования Microsoft C#. Который имеет открытые реализации большинства частей системы. Также имеет среду CLR в качестве закрытой среды.[62]

Многие проприетарные языки широко используются. Несмотря на их проприетарный характер; примеры включают MATLAB, VBScriptи Wolfram Language. Некоторые языки могут сделать переход от закрытого к открытому; например, Erlang изначально был внутренним языком программирования Ericsson.[63]

Были созданы тысячи различных языков программирования. В основном в области вычислительной техники.Отдельные программные проекты обычно используют пять или более языков программирования.]

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

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

Программы для компьютера могут выполняться в пакетном режиме без участия человека. Или пользователь может вводить команды в интерактивном сеансе интерпретатора. В этом случае Когда язык может запускать свои команды через интерпретатор (например, оболочку Unix или другой интерфейс командной строки) без компиляции. Он называется языком сценариев[67].]

Измерение использования языка

Определить, какой язык программирования является наиболее широко используемым, сложно. Так как определение использования зависит от контекста. Один язык может занимать большее количество часов программиста. Другой-больше строк кода. А третий может потреблять больше всего процессорного времени. Некоторые языки очень популярны для конкретных видов приложений. Например, COBOL по-прежнему сильна в корпоративном центре обработки данных. Часто на больших мэйнфреймах;Fortran-в научных и инженерных приложениях; Ada-в аэрокосмических. Транспортных, военных. В реальном времени и встраиваемых приложениях; и C в встраиваемых приложениях и операционных системах. Другие языки регулярно используются для написания различных приложений.

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

  • подсчет количества объявлений о вакансиях. В которых упоминается этот язык[70]
  • количество проданных книг. Которые учат или описывают язык[71]
  • оценки количества существующих строк кода. Написанных на этом языке. – которые могут недооценивать языки. Не часто встречающиеся в публичных поисковыхсистемах [72]
  • количество ссылок на язык (то есть на название языка). Найденных с помощью веб-поисковой системы.

Объединение и усреднение информации с различных интернет-сайтов. Stackify.com десять самых популярных языков программирования (в порядке убывания общей популярности): Java, C, C++, Python, C#, JavaScript, VB .NET, R, PHPи MATLAB.]

Диалекты, вкусы и реализации

Диалект языка программирования или языка обмена данными-это (относительно небольшая) вариация или расширение языка. Не изменяющее его внутренней природы. С такими языками . Как Scheme и Forth, стандарты могут считаться недостаточными. Неадекватными или незаконными исполнителями. Поэтому часто они будут отклоняться от стандарта. Создавая новый диалект. В других случаях диалект создается для использования в специфичном для предметной области языке, часто в подмножестве. В мире Lisp большинство языков. Использующих базовое S-выражение синтаксис и лисп-подобная семантика считаются лисп-диалектами. Хотя они сильно различаются. Как, скажем, Racket и Clojure. Поскольку один язык обычно имеет несколько диалектов. Неопытному программисту может стать довольно трудно найти нужную документацию. Базовый язык программирования имеет много диалектов.

Взрыв диалектов Форт привел к высказыванию: одного Форта.

Для языков программирования не существует общей схемы классификации. Данный язык программирования обычно не имеет ни одного языка-предка. Языки обычно возникают путем объединения элементов нескольких предшествующих языков с новыми идеями. Циркулирующими в то время. Идеи, зародившиеся в одном языке. Будут распространяться по семейству родственных языков. А затем внезапно перескакивать через семейные разрывы. Чтобы появиться в совершенно другой семье.

Задача усложняется еще и тем. Что языки можно классифицировать по нескольким осям. Например, Java является одновременно объектно-ориентированным языком (поскольку он поощряет объектно-ориентированную организацию) и параллельным языком (поскольку он содержит встроенные конструкции для параллельного запуска нескольких потоков). Python-это объектно-ориентированный скриптовый язык.

В общих чертах языки программирования делятся на парадигмы программирования и классификацию по предполагаемой области использования, при этом языки программирования общего назначения отличаются от языков программирования конкретнойобласти . Традиционно языки программирования рассматривались как описывающие вычисления в терминах императивных предложений. Т. е. выдающих команды. Их обычно называют императивным программированием языки. Большое количество исследований в языках программирования. Были направлены на размывание грань между программой как набор инструкций и программ как утверждение о желаемом ответе. Который является главной особенностью декларативного программирования.[74] более изысканным парадигм числе процедурное программирование, объектно-ориентированное программирование, функциональное программированиеи логическое программирование; в некоторых языках являются гибридами парадигм или мультипарадигмальная. Язык ассемблера это не столько парадигма. Сколько прямая модель базовой архитектуры машины. По назначению языки программирования могут рассматриваться как языки общего назначения, системные языки программирования, языки сценариев . Доменные языки или параллельные/распределенные языки (или их комбинация).Некоторые языки общего назначения были разработаны в основном с образовательными целями.[76]

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

  1. ^
  2. ^ b c Aaby, Anthony (2004). Введение в языки программирования. Архивировано с оригинала 8 ноября 2012года . Извлечено 29 сентября 2012года .
  3. ^ В математическом плане это означает. Что язык программирования является полным Тьюринга MacLennan. Bruce J. (1987). Принципы языков программирования. Издательство Оксфордского университета, стр. 1. ISBN 978-0-19-511306-8.
  4. ^ ACM SIGPLAN (2003). . Архивировано с оригинала 22 июня 2006 г.:
  5. ^ Дин, Том (2002). . Создание Интеллектуальных Роботов. Факультет компьютерных наук Университета Брауна. Архивирован с оригинала 29 октября 2006 года.
  6. ^ Р. Narasimahan. Programming Languages and Computers: A Unified Metatheory, pp. 189-247 in Franz Alt, Morris Rubinoff (eds.) Достижения в области компьютеров, Том 8, Academic Press, 1994, ISBN 0-12-012108-5, стр. 193 : [источник приводит множество ссылок в поддержку этого утверждения]
  7. ^ Бен Ари, Мордехай (1996). Понимание Языков программирования. Джон Уайли и сыновья. Программы и языки могут быть определены как чисто формальные математические объекты. Однако программы интересуют больше людей. Чем другие математические объекты. Такие как группы. Именно потому. Что можно использовать программу—последовательность символов—для управления выполнением компьютера. Хотя мы настоятельно рекомендуем изучать теорию программирования. Этот текст. Как правило. Ограничивается изучением программ. Выполняемых на компьютере.
  8. Дэвид А. Шмидт, Структура типизированных языков программирования, MIT Press, 1994, ISBN 0-262-19349-3, стр. 32
  9. ^ Пирс, Бенджамин (2002). Типы и языки программирования. MIT Press. p. 339. ISBN 978-0-262-16209-8.
  10. ^ Корпорация цифрового оборудования. . ISO/IEC 9075:1992, Язык баз данных SQL. Архивирован с оригинала 21 июня 2006года . Извлечено 29 июня 2006года .
  11. ^ Благотворительная группа развития (декабрь 1996). . Архивирован с оригинала 18 июля 2006 г.,
  12. ^ XML в 10 пунктах Архивирован 6 сентября 2009 года на Wayback Machine W3C, 1999,
  13. ^ Пауэлл, Томас (2003). HTML и XHTML: полная ссылка. McGraw-Hill. p. 25. ISBN 978-0-07-222942-4. HTML-это не язык программирования.
  14. ^ Дайкс, Люсинда; Титтель, Эд (2005). XML для чайников (4-е изд.). Уайли, стр. ISBN 978-0-7645-8845-7. …это язык разметки. А не язык программирования.
  15. ^ . IBM.com. 20 апреля 2005 г. Архивировано с оригинала 11 мая 2011 г.
  16. ^ . Msdn.microsoft.com. Архивирован с оригинала 3 февраля 2011года . Извлечено 3 декабря 2010года .
  17. ^ Скотт, Майкл (2006). Прагматика языка программирования. Morgan Kaufmann. p. 802. ISBN 978-0-12-633951-2. XSLT, хотя и является узкоспециализированным для преобразования XML. Является полным языком программирования Тьюринга.
  18. ^ Oetiker, Tobias; Partl, Hubert; Hyna, Irene; Schlegl, Elisabeth (20 June 2016). (Версия 5.06). tobi.oetiker.chс. 1-157. Архивирован (PDF) с оригинала 14 марта 2017 года.
  19. ^ Сиропулос, Апостолос; Антонис Цоломитис; Ник Софрониу (2003). Цифровая типография с использованием LaTeX. Springer-Verlag, стр. ISBN 978-0-387-95217-8. TeX-это не только отличный движок набора текста. Но и настоящий язык программирования.
  20. ^ Роберт А. Эдмундс, Стандартный глоссарий компьютерной терминологии Прентис-Холла, Прентис-Холл, 1985, с. 91
  21. ^ Pascal Lando. Anne Lapujade. Gilles Kassel и Frédéric Fürst, Towards a General Ontology of Computer Programs Archived 7 July 2015 at the Wayback Machine, ICSOFT 2007 Archived 27 April 2010 at the Wayback Machine, pp. 163-170
  22. ^ S. K. Bajpai, Introduction To Computers And C Programming, New Age International, 2007, ISBN 81-224-1379-X, с. 346
  23. ^ Р. Narasimahan. Programming Languages and Computers: A Unified Metatheory, pp. 189-247 in Franz Alt, Morris Rubinoff (eds.) Достижения в области компьютеров, Том 8, Academic Press, 1994, ISBN 0-12-012108-5, стр. 215: В компьютерном языке существует только конечное число имен—или регистров—которые могут принимать только конечное число значений—или состояний—и эти состояния далее не различаются в терминах каких-либо других атрибутов. [авторская сноска:] Это может звучать как трюизм. Но его последствия далеко идущие. Например, это означало бы. Что любая модель для языков программирования. Фиксируя определенные ее параметры или особенности. Должна быть естественным образом сведена к модели для компьютерных языков.
  24. ^ John C. Reynolds, SIGPLAN Notices, Volume 43, Issue 11, November 2008, p.109
  25. ^ Rojas, Raúl, et al. (2000). Institut für Informatik. Freie Universität Berlin. Technical Report B-3/2000. (полный текст) Архивировано 18 октября 2014 года в Wayback Machine
  26. ^ Себеста, У. Концепции языков программирования. 2006;М6 14:18 с. 44. ISBN 0-321-33025-0
  27. ^ Кнут, Дональд Э.; Пардо, Луис Трабб. Энциклопедия компьютерных наук и технологий. 7: 419–493.
  28. ^ Питер Дж. Бентли (2012). Оцифровка: Наука о компьютерах и о том. Как она формирует наш мир. Oxford University Press. p. 87. ISBN 9780199693795. Архивирован с оригинала 29 августа 2016 года.
  29. ^ . Новости Эн-Би-си. 20 марта 2007года . Извлечено 25 апреля 2010года .
  30. ^ . Math.grin.edu. Архивировано с оригинала 15 июля 2010года . Извлечено 25 апреля 2010года .
  31. ^ Юджин Лох (18 июня 2010). . Очередь. 8 (6). Архивирован с оригинала 4 марта 2016 года.
  32. ^ . Архивирован с оригинала 15 февраля 2015года . Проверено 21 февраля 2015года .
  33. ^ Хоппер (1978) с. 16.
  34. ^ Sammet (1969) p. 316
  35. ^ Sammet (1978) p. 204.
  36. Ричард Л. Вексельблат: История языков программирования, Academic Press, 1981, глава XIV.
  37. ^ François Labelle. . SourceForge. Архивирован с оригинала 17 июня 2006года . Извлечено 21 июня 2006года .. Это сравнение анализирует тенденции в количестве проектов. Размещенных в популярном репозитории программирования сообщества. В течение большинства лет сравнения C лидирует со значительным отрывом; в 2006 году Java обгоняет C. Но комбинация C/C++ по-прежнему значительно лидирует.
  38. ^ Хейс, Брайан (2006). Американский ученый. 94 (4): 299–303. doi:10.1511/2006.60.299.
  39. ^ Dijkstra, Edsger W. (март 1968). (PDF). Коммуникации АСМ. 11 (3): 147–148. doi:10.1145/362929.362947. S2CID 17469809. Архивирован (PDF) с оригинала 13 мая 2014 года.
  40. Тэцуро Фудзисе. Такаси Чикаяма. Кадзуаки Рокусава. Акихико Накасе (декабрь 1994). Proc. of FGCS ’94, ICOT Tokyo. December 1994. . Архивирован с оригинала 25 сентября 2006года . Извлечено 9 октября 2006г.CS1 maint: archived copy as title (link) KLIC-это портативная реализация параллельного логического языка программирования KL1.
  41. ^ Джим Бендер (15 марта 2004). . ReadScheme.org. Архивирован с оригинала 24 сентября 2006 года.
  42. ^ Майкл Сипсер (1996). Введение в теорию вычислений. Издательство PWS Publishing. ISBN 978-0-534-94728-6. Раздел 2.2: Pushdown Automata. Стр. 101–114.
  43. ^ Джеффри Кеглер, Perl и неразрешимость Архивированы 17 августа 2009 года в the Wayback MachineThe Perl Review. Статьи 2 и 3 доказывают. Используя соответственно теорему Райса и прямую редукцию к проблеме остановки, что синтаксический анализ программ Perl в общем случае неразрешим.
  44. ^ Marty Hall, 1995, Lecture Notes: Macros Archived 6 August 2013 at the Wayback Machine, PostScript version Archived 17 August 2000 at the Wayback Machine
  45. ^ Майкл Ли Скотт, Прагматика языка программирования, Издание 2, Морган Кауфман, 2006, ISBN 0-12-633951-1, стр. 18-19
  46. ^ b c d e f g Эндрю Кук. . Архивирован с оригинала 15 августа 2012года . Извлечено 13 июля 2012года .
  47. В частности. Экземпляры универсальных типов выводятся для определенных форм выражений. Тип вывода в ASUS Ява—исследования языка. Который послужил основой для Java 1.5 сопряжена параметрический полиморфизм расширения—рассматривается в двух неофициальные рукописи из типов рассылки: универсального типа Java вывод является необоснованным Архивировано 29 января 2007 года в спорте (Алан Джеффри, 17 декабря 2001 года) и звук универсального типа Java вывод Архивировано 29 января 2007 года в спорте (Мартин Одерский, 15 января 2002 г.). Система типов C#аналогична Java и использует аналогичную схему вывода частичных типов.
  48. ^ . 20 февраля 1998 года. Архивирован с оригинала 14 июля 2006 года.
  49. ^ Лука Карделли и Питер Вегнер. . Рукопись (1985). Архивирован с оригинала 19 июня 2006 года.
  50. ^ Стивен Р. Фишер, История языка, Reaktion Books, 2003, ISBN 1-86189-080-X, стр. 205
  51. ^ Éric Lévénez (2011). . Архивировано с оригинала 7 января 2006 года.
  52. ^ Цзин Хуан. Естественный язык. Архивирован с оригинала 3 сентября 2009 года.
  53. ^ IBM в первом издании PL/I, например. Довольно амбициозно назвала свое руководство Универсальным языком программирования PL/I (IBM Library; 1966). Название отражало цели IBM в отношении неограниченных возможностей подмножеств: . Энциклопедия математики. Архивирован с оригинала 26 апреля 2012года . Извлечено 29 июня 2006г.). У Ады и УНКОЛА были схожие ранние цели.
  54. ^ Фредерик П. Брукс — младший: Мифический Человек-месяц, Аддисон-Уэсли, 1982, с. 93-94
  55. ^ Dijkstra, Edsger W. О глупости Архивирован 20 января 2008 года на машине Wayback EWD667.
  56. ^ Перлис, Алан (сентябрь 1982). . SIGPLAN Notices Vol. 17, No. 9. pp. 7-13. Архивировано с оригинала 17 января 1999 года.
  57. ^ Мильнер, Р.; М. Тофте; Р. Харпер; Д. Маккуин (1997). Определение стандарта ML (пересмотрено). MIT Press. ISBN 978-0-262-63181-5.
  58. ^ Келси, Ричард; Уильям Клингер; Джонатан Рис (февраль 1998). . Пересмотренный5 Отчет по алгоритмической языковой схеме. Архивирован с оригинала 6 июля 2006 года.
  59. ^ ANSI – Язык программирования Rexx. X3-274.1996
  60. ^ Стив, Макконнелл (2004). Полный код (Второе изд.). Редмонд, Вашингтон. Стр. 590, 600. ISBN 0735619670. OCLC 54974573.
  61. ^ См.: Oracle America, Inc. v. Google, Inc.
  62. ^ . ComputerScience.org. Извлечено 13 мая 2018года .
  63. ^ . ibm.com. 10 мая 2011года . Получено 13 мая 2018года .
  64. ^ . Австралия: Университет Мердока. Архивирован с оригинала 20 февраля 2011года . Извлечено 1 июня 2009года . На этом сайте перечислены 8512 языков.
  65. ^ Майер, Филипп; Бауэр, Александр (2015). Эмпирический анализ использования нескольких языков программирования в проектах с открытым исходнымкодом . Материалы 19 – й Международной конференции по оценке и оценке в программной инженерии-EASE ’15. Нью-Йорк, Нью-Йорк, США: ACM. pp. 4:1-4:10. doi:10.1145/2745802.2745805. ISBN 978-1-4503-3350-4. Результаты: Мы обнаружили (а) среднее число из 5 языков на проект с явно доминирующим основным языком общего назначения и 5 часто используемыми типами DSL. (б) значительное влияние размера. Количества коммитов и основного языка на количество языков. А также отсутствие значительного влияния возраста и количества участников. И (в) три языковые экосистемы. Сгруппированные вокруг XML. Shell/Make и HTML/CSS. Выводы: Многоязычное программирование. По-видимому. Широко распространено в проектах с открытым исходным кодом и является фактором. Который необходимо учитывать при разработке и обслуживании таких программных систем.
  66. ^ Абельсон, Сассман и Сассман. . Архивирован с оригинала 26 февраля 2009года . Извлечено 3 марта 2009г.CS1 maint: несколько имен: список авторов (ссылка)
  67. ^ Браун Вики (1999). . mactech.com. Архивирован с оригинала 2 декабря 2017 года.
  68. ^ Джорджина Свон (21 сентября 2009). . computerworld.com.au. Архивировано с оригинала 19 октября 2013года . Проверено 19 октября 2013года .
  69. ^ Эд Эйри (3 мая 2012). . developer.com. Архивирован с оригинала 19 октября 2013года . Проверено 19 октября 2013года .
  70. ^ Николас Энтикнэп. . Компьютерный еженедельник. Архивирован с оригинала 26 октября 2011года . Проверено 14 июня 2013года .
  71. ^ . Radar.oreilly.com. 2 августа 2006 года. Архивирован с оригинала 17 мая 2008 года.
  72. ^ Bieman, J. M.; Мердок, В., Поиск кода во всемирной паутине: предварительное расследование. Труды Первого Международного семинара IEEE по анализу и манипулированию исходным кодом, 2001
  73. ^ . stackify.com 18 декабря 2017года . Извлечено 29 августа 2018года .
  74. ^ Карл А. Гюнтер, Семантика языков программирования: структуры и методы, MIT Press, 1992, ISBN 0-262-57095-5, стр. 1
  75. ^ . Архивирован с оригинала 20 октября 2007 года.
  76. ^ Wirth, Niklaus (1993). Вторая конференция ACM SIGPLAN по истории языков программирования — HOPL-II. 2-я конференция ACM SIGPLAN по истории языков программирования . 28. стр. 333-342. CiteSeerX 10.1.1.475.6989. doi:10.1145/154766.155378. ISBN 978-0-89791-570-0. S2CID 9783524.

Дальнейшее чтение

Внешние ссылки