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

Страница защищена ожидающими изменениями
Из Википедии, бесплатной энциклопедии

Исходный код компьютерной программы на C. языке Серые линии — это комментарии , объясняющие программу людям. При компиляции и запуске он выдаст вывод « Hello, world! ».

Язык программирования — это система обозначений для написания компьютерных программ . [1]

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

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

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

Определения [ править ]

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

языки против языков Компьютерные программирования

Термин «язык программирования» иногда используется как синоним языка программирования. [2] Однако использование обоих терминов варьируется среди авторов, включая точную сферу применения каждого из них. Одно использование описывает языки программирования как подмножество языков программирования. [3] Точно так же языки, используемые в вычислительной технике и преследующие другую цель, чем выражение компьютерных программ, обычно называются компьютерными языками. Например, языки разметки иногда называют компьютерными языками, чтобы подчеркнуть, что они не предназначены для использования в программировании. [4] Один из способов классификации компьютерных языков — это вычисления, которые они способны выражать, как описано в теории вычислений . Большинство практических языков программирования являются полными по Тьюрингу . [5] и все полные по Тьюрингу языки могут реализовать один и тот же набор алгоритмов . ANSI/ISO SQL-92 и Charity являются примерами языков, которые не являются полными по Тьюрингу, но их часто называют языками программирования. [6] [7] Однако некоторые авторы ограничивают термин «язык программирования» полными по Тьюрингу языками. [1] [8]

Другое использование рассматривает языки программирования как теоретические конструкции для программирования абстрактных машин и компьютерные языки как их подмножество, которое работает на физических компьютерах с ограниченными аппаратными ресурсами. [9] Джон К. Рейнольдс подчеркивает, что языки формальных спецификаций являются такими же языками программирования, как и языки, предназначенные для выполнения. Он также утверждает, что текстовые и даже графические форматы ввода, которые влияют на поведение компьютера, являются языками программирования, несмотря на то, что они обычно не являются полными по Тьюрингу, и отмечает, что незнание концепций языков программирования является причиной многих недостатков входных форматов. [10]

Домен и цель [ править ]

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

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

Абстракции [ править ]

Языки программирования обычно содержат абстракции для определения структур данных и управления ими или управления потоком выполнения . Практическая необходимость того, чтобы язык программирования поддерживал адекватные абстракции, выражается принципом абстракции . [20] Этот принцип иногда формулируется как рекомендация программисту правильно использовать такие абстракции. [21]

История [ править ]

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

Первые программируемые компьютеры были изобретены в конце 1940-х годов, а вместе с ними и первые языки программирования. [22] Самые ранние компьютеры были запрограммированы на языках программирования первого поколения (1GL), машинном языке (простые инструкции, которые могли напрямую выполняться процессором). Этот код было очень сложно отлаживать, и его нельзя было переносить между разными компьютерными системами. [23] Чтобы упростить программирование, были изобретены языки ассемблера (или языки программирования второго поколения — 2GL), отличающиеся от машинного языка, чтобы сделать программы более понятными для человека, хотя они не увеличили переносимость. [24]

Первоначально аппаратные ресурсы были скудными и дорогими, а человеческие ресурсы были дешевле. Поэтому предпочтение отдавалось громоздким языкам, использование которых требовало много времени, но было ближе к аппаратному обеспечению для более высокой эффективности. [25] Появление языков программирования высокого уровня ( языков программирования третьего поколения — 3GL) произвело революцию в программировании. Эти языки абстрагировали детали аппаратного обеспечения и вместо этого были разработаны для выражения алгоритмов, которые людям было бы легче понять. Например, арифметические выражения теперь можно было записывать в символьной записи, а затем переводить в машинный код, который могло выполнять оборудование. [24] В 1957 году Фортран был изобретен (FORmula TRANslation). Часто считается первым компилируемым языком программирования высокого уровня. [24] [26] Фортран продолжает использоваться и в двадцать первом веке. [27]

1960-е и 1970-е годы [ править ]

Два человека используют IBM 704 мэйнфрейм — первое оборудование, поддерживающее арифметику с плавающей запятой , — в 1957 году. язык Фортран . Для этой машины был разработан [28] [27]

Примерно в 1960 году были разработаны первые мэйнфреймы — компьютеры общего назначения, хотя ими могли управлять только профессионалы, а стоимость была чрезвычайно высокой. Данные и инструкции вводились с помощью перфокарт , а это означает, что во время работы программы ввод данных невозможен. Поэтому языки, разработанные в настоящее время, рассчитаны на минимальное взаимодействие. [29] После изобретения микропроцессора компьютеры в 1970-х годах резко стали дешевле. [30] Новые компьютеры также позволили расширить взаимодействие с пользователем, что поддерживалось новыми языками программирования. [31]

Lisp , реализованный в 1958 году, был первым функциональным языком программирования . [32] В отличие от Фортрана, он поддерживает рекурсию и условные выражения . [33] а также было введено динамическое управление памятью в куче и автоматическая сборка мусора . [34] В течение следующих десятилетий Лисп доминировал в приложениях искусственного интеллекта . [35] В 1978 году другой функциональный язык, ML , представил выводимые типы и полиморфные параметры . [31] [36]

После того, как АЛГОЛ (АЛГОРитмический язык) был выпущен в 1958 и 1960 годах, [37] он стал стандартом в компьютерной литературе для описания алгоритмов . Хотя его коммерческий успех был ограниченным, большинство популярных императивных языков, включая C , Pascal , Ada , C++ , Java и C# , прямо или косвенно произошли от ALGOL 60. [38] [27] Среди его нововведений, принятых более поздними языками программирования, была большая переносимость и первое использование свободной контекстно - грамматики BNF . [39] Simula , первый язык, поддерживающий объектно-ориентированное программирование (включая подтипы , динамическую диспетчеризацию и наследование ), также произошел от ALGOL и достиг коммерческого успеха. [40] C, еще один потомок АЛГОЛА, сохранил популярность и в двадцать первом веке. C обеспечивает доступ к машинным операциям более низкого уровня, чем другие современные языки. Его мощность и эффективность, частично обеспечиваемые гибкими операциями с указателями , достигаются за счет усложнения написания правильного кода. [31]

Пролог , разработанный в 1972 году, был первым языком логического программирования , взаимодействующим с компьютером с использованием формальной логической записи. [41] [42] При логическом программировании программист указывает желаемый результат и позволяет интерпретатору решить, как его достичь. [43] [42]

1980-е - 2000-е годы [ править ]

Небольшая подборка учебников по языкам программирования

В 1980-е годы изобретение персонального компьютера изменило роли, для которых использовались языки программирования. [44] Новые языки, представленные в 1980-х годах, включали C++, расширенную версию C, которая может компилировать программы на C, но также поддерживает классы и наследование . [45] В Ada и других новых языках появилась поддержка параллелизма . [46] Правительство Японии вложило значительные средства в так называемые языки пятого поколения , которые добавили поддержку параллелизма в конструкции логического программирования, но эти языки уступали по производительности другим языкам, поддерживающим параллелизм. [47] [48]

В связи с быстрым ростом Интернета и Всемирной паутины в 1990-х годах были введены новые языки программирования для поддержки веб-страниц и сетей . [49] Java , основанная на C++ и разработанная для повышения переносимости между системами и обеспечения безопасности, пользовалась огромным успехом, поскольку эти функции необходимы для многих интернет-приложений. [50] [51] Еще одним достижением стали динамически типизированные языки сценариев Python , JavaScript , PHP и Ruby — предназначенные для быстрого создания небольших программ, которые координируют существующие приложения . Благодаря интеграции с HTML они также используются для создания веб-страниц, размещаемых на серверах . [52] [53]

2000-е по настоящее время [ править ]

В 2000-е годы наблюдался спад в разработке новых языков программирования, получивших широкую популярность. [54] Одним из нововведений стало сервис-ориентированное программирование , предназначенное для использования распределенных систем , компоненты которых соединены сетью. Службы аналогичны объектам в объектно-ориентированном программировании, но выполняются в отдельном процессе. [55] C# и F# объединили идеи императивного и функционального программирования. [56] После 2010 года несколько новых языков — Rust , Go , Swift , Zig и Carbon — конкурировали за критически важное для производительности программное обеспечение, для которого исторически использовался C. [57] Большинство новых языков программирования используют статическую типизацию, в то время как несколько новых языков используют динамическую типизацию , например Ring и Julia . [58] [59]

Некоторые из новых языков программирования классифицируются как языки визуального программирования, такие как Scratch , LabVIEW и PWCT . Кроме того, некоторые из этих языков сочетают использование текстового и визуального программирования, например Ballerina . [60] [61] [62] [63] Кроме того, эта тенденция привела к разработке проектов, которые помогают в разработке новых VPL, таких как Blockly от Google . [64] Многие игровые движки, такие как Unreal и Unity, также добавили поддержку визуальных сценариев. [65] [66]

Элементы [ править ]

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

Синтаксис [ править ]

Дерево разбора кода Python с токенизацией вставки
Подсветка синтаксиса часто используется, чтобы помочь программистам распознавать элементы исходного кода. Язык выше — Python .

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

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

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

выражение  ::=  атом |   список 
  атом  ::=  число |   символ 
  число  ::=  [+-]?['0'-'9']+ 
  символ  ::=  ['A'-'Z''a'-'z'].* 
  список  ::=  '(' выражение* ')' 
 

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

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

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

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

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

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

комплекс   *  р   =   NULL  ; 
  комплекс   abs_p   =   sqrt  (  *  p   >>   4   +   p  ->  im  ); 

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

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

Семантика [ править ]

Термин семантика относится к значению языков, а не к их форме ( синтаксису ).

Статическая семантика [ править ]

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

Динамическая семантика [ править ]

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

Типовая система [ править ]

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

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

Язык считается типизированным , если спецификация каждой операции определяет типы данных, к которым эта операция применима. [71] Например, данные, представленные "this text between the quotes"— это строка , и во многих языках программирования деление числа на строку не имеет смысла и не будет выполнено. Недопустимая операция может быть обнаружена во время компиляции программы («статическая» проверка типа) и будет отклонена компилятором с сообщением об ошибке компиляции, или она может быть обнаружена во время работы программы («динамическая» проверка типа), что приводит к времени выполнения в исключении . Многие языки позволяют функции, называемой обработчиком исключений, обрабатывать это исключение и, например, всегда возвращать в качестве результата «-1».

Особым случаем типизированных языков являются однотипные языки. Часто это языки сценариев или разметки, такие как REXX или SGML , и имеют только один тип данных. [ сомнительно ] –— чаще всего это строки символов, которые используются как для символьных, так и для числовых данных.

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

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

Статическая и динамическая типизация [ править ]

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

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

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

Слабая и строгая типизация [ править ]

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

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

Альтернативное определение «слабо типизированного» относится к таким языкам, как Perl , Ring и JavaScript , которые допускают большое количество неявных преобразований типов. Например, в JavaScript выражение 2 * x неявно преобразует x в число, и это преобразование будет успешным, даже если x является null, undefined, Arrayили строку букв. Такие неявные преобразования часто полезны, но они могут маскировать ошибки программирования. Сильный и статический сейчас обычно считаются ортогональными понятиями, но их использование в литературе различается. Некоторые используют термин «строго типизированный» для обозначения строго, статически типизированного или, что еще более запутанно, для обозначения просто статически типизированного . Таким образом, C называют как строго типизированным, так и слабо, статически типизированным. [74] [75] [76]

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

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

Большинство языков программирования имеют связанную базовую библиотеку (иногда известную как «стандартная библиотека», особенно если она включена как часть опубликованного языкового стандарта), которая обычно предоставляется во всех реализациях языка. Базовые библиотеки обычно включают определения часто используемых алгоритмов, структур данных и механизмов ввода и вывода.

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

Параллельность [ править ]

При вычислениях несколько инструкций могут выполняться одновременно. Многие языки программирования поддерживают параллелизм на уровне инструкций и подпрограмм. [77] К XXI веку дополнительная вычислительная мощность компьютеров все чаще обеспечивалась за счет использования дополнительных процессоров, что требует от программистов разработки программного обеспечения, которое использует несколько процессоров одновременно для достижения улучшенной производительности. [78] Интерпретируемые языки, такие как Python и Ruby, не поддерживают одновременное использование нескольких процессоров. [79] Другие языки программирования поддерживают управление данными, совместно используемыми различными потоками, путем управления порядком выполнения ключевых инструкций с помощью семафоров , управления доступом к общим данным через монитор или включения передачи сообщений между потоками. [80]

Обработка исключений [ править ]

Многие языки программирования включают обработчики исключений — раздел кода, вызываемый ошибками во время выполнения , который может обрабатывать их двумя основными способами: [81]

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

Некоторые языки программирования поддерживают выделение блока кода для выполнения независимо от того, возникает ли исключение до достижения кода; это называется финализацией. [82]

Существует компромисс между увеличением возможностей обработки исключений и снижением производительности. [83] Например, несмотря на то, что ошибки индекса массива являются обычным явлением [84] C не проверяет их по соображениям производительности. [83] Хотя программисты могут писать код для перехвата пользовательских исключений, это может загромождать программу. Стандартные библиотеки некоторых языков, например C, используют возвращаемые значения для обозначения исключения. [85] Некоторые языки и их компиляторы имеют возможность включать и отключать возможность обработки ошибок временно или постоянно. [86]

Проектирование и реализация [ править ]

Языки программирования имеют общие свойства с естественными языками, связанные с их назначением в качестве средств общения, имеют синтаксическую форму, отдельную от ее семантики, и показывают языковые семьи родственных языков, ответвляющихся друг от друга. [87] [88] Но будучи искусственными конструкциями, они также фундаментально отличаются от языков, которые развились в процессе использования. Существенная разница состоит в том, что язык программирования можно полностью описать и изучить целиком, поскольку он имеет точное и конечное определение. [89] Напротив, естественные языки имеют меняющиеся значения, придаваемые их пользователями в разных сообществах. Хотя сконструированные языки также являются искусственными языками, разработанными с нуля с определенной целью, им не хватает точного и полного семантического определения, которое имеет язык программирования.

Многие языки программирования были разработаны с нуля, изменены для удовлетворения новых потребностей и объединены с другими языками. Многие из них со временем вышли из употребления. Хотя предпринимались попытки разработать один «универсальный» язык программирования, который служил бы всем целям, все они не были признаны выполняющими эту роль. [90] Потребность в разнообразных языках программирования возникает из-за разнообразия контекстов, в которых используются языки:

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

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

Программирование на естественном языке было предложено как способ устранить необходимость в специализированном языке программирования. Однако эта цель остается далекой, а ее преимущества открыты для дискуссий. Эдсгер В. Дейкстра занял позицию, согласно которой использование формального языка необходимо для предотвращения введения бессмысленных конструкций, и назвал программирование на естественном языке «глупым». [92] Алан Перлис также пренебрежительно отнесся к этой идее. [93] Гибридные подходы были использованы в структурированном английском языке и SQL .

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

Спецификация [ править ]

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

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

Реализация [ править ]

Реализация языка программирования — это преобразование программы в машинный код , который может выполняться аппаратным обеспечением. Машинный код затем может быть выполнен с помощью операционной системы . [97] Наиболее распространенной формой интерпретации рабочего кода является компилятор , который переводит исходный код через язык промежуточного уровня в машинный код, известный как исполняемый файл . После компиляции программа будет работать быстрее, чем при использовании других методов реализации. [98] Некоторые компиляторы могут обеспечить дополнительную оптимизацию для уменьшения использования памяти или вычислений при запуске исполняемого файла, но увеличения времени компиляции. [99]

Другой метод реализации — запуск программы с помощью интерпретатора , который переводит каждую строку программного обеспечения в машинный код непосредственно перед ее выполнением. Хотя это может облегчить отладку, недостатком интерпретации является то, что она работает в 10–100 раз медленнее, чем скомпилированный исполняемый файл. [100] Гибридные методы интерпретации предоставляют некоторые преимущества компиляции и некоторые преимущества интерпретации посредством частичной компиляции. Одна из форм, которую это принимает, — это компиляция «точно в срок» , при которой программное обеспечение заранее компилируется в промежуточный язык, а затем в машинный код непосредственно перед выполнением. [101]

Собственные языки [ править ]

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

Некоторые языки программирования существуют на границе между проприетарными и открытыми; например, корпорация Oracle заявляет права собственности на некоторые аспекты языка программирования Java , [102] а Microsoft от язык программирования C# , который имеет открытые реализации большинства частей системы, также имеет среду Common Language Runtime (CLR) в качестве закрытой среды. [103]

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

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

Используйте [ править ]

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

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

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

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

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

Определить, какой язык программирования является наиболее широко используемым, сложно, поскольку определение использования зависит от контекста. Один язык может занимать большее количество часов программиста, другой — больше строк кода, а третий — больше всего процессорного времени. Некоторые языки очень популярны для определенных типов приложений. Например, COBOL по-прежнему популярен в корпоративных центрах обработки данных, часто на больших мэйнфреймах ; [110] [111] Фортран в научных и инженерных приложениях; Ada в аэрокосмической, транспортной, военной сфере, приложениях реального времени и встроенных приложениях; и C во встроенных приложениях и операционных системах. Другие языки регулярно используются для написания множества различных приложений.

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

  • подсчет количества объявлений о вакансиях, в которых упоминается этот язык [112]
  • количество проданных книг, обучающих или описывающих язык [113]
  • оценки количества существующих строк кода, написанных на этом языке, что может занижать оценку языков, которые не часто встречаются в общедоступных поисках. [114]
  • количество ссылок на язык (т. е. на название языка), найденных с помощью поисковой системы в Интернете.

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

По состоянию на февраль 2024 года в пятерку лучших языков программирования по индексу TIOBE входят Python , C , C++ , Java и C# . TIOBE предоставляет список 100 лучших языков программирования по популярности и обновляет этот список каждый месяц. [116]

Диалекты, разновидности и реализации [ править ]

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

Классификации [ править ]

Языки программирования часто делятся на четыре основные категории: императивные , функциональные , логические и объектно-ориентированные . [117]

Хотя языки разметки не являются языками программирования, некоторые из них имеют расширения, поддерживающие ограниченное программирование. Кроме того, существуют языки специального назначения, которые нелегко сравнить с другими языками программирования. [121]

См. также [ править ]

Ссылки [ править ]

  1. ^ Перейти обратно: а б с Ааби, Энтони (2004). Введение в языки программирования . Архивировано из оригинала 8 ноября 2012 года . Проверено 29 сентября 2012 г.
  2. ^ Роберт А. Эдмундс, Стандартный глоссарий компьютерной терминологии Прентис-Холл, Прентис-Холл, 1985, стр. 91
  3. ^ Паскаль Ландо, Анн Лапужад, Жиль Кассель и Фредерик Фюрст, К общей онтологии компьютерных программ. Архивировано 7 июля 2015 г. в Wayback Machine , ICSOFT 2007. Архивировано 27 апреля 2010 г. в Wayback Machine , стр. 163–170.
  4. ^ С. К. Баджпай, Введение в компьютеры и программирование на C , New Age International, 2007, ISBN   81-224-1379-X , стр. 346
  5. ^ «Тьюринговая полнота» . www.cs.odu.edu . Архивировано из оригинала 16 августа 2022 года . Проверено 5 октября 2022 г.
  6. ^ Корпорация цифрового оборудования. «Информационные технологии – язык баз данных SQL (предлагаемый пересмотренный текст DIS 9075)» . ISO/IEC 9075:1992, Язык баз данных SQL . Архивировано из оригинала 21 июня 2006 года . Проверено 29 июня 2006 г.
  7. ^ Группа развития благотворительности (декабрь 1996 г.). «Главная страница БЛАГОТВОРИТЕЛЬНОСТИ» . Архивировано из оригинала 18 июля 2006 г. , «Благотворительность — это категориальный язык программирования…», «Все вычисления благотворительности прекращаются».
  8. ^ С математической точки зрения это означает, что язык программирования является полным по Тьюрингу. МакЛеннан, Брюс Дж. (1987). Принципы языков программирования . Издательство Оксфордского университета. п. 1. ISBN  978-0-19-511306-8 .
  9. ^ Р. Нарасимхан, Языки программирования и компьютеры: унифицированная метатеория, стр. 189–247 в книге Франца Альта, Морриса Рубиноффа (ред.) «Достижения в области компьютеров», том 8, Academic Press, 1994, ISBN   0-12-012108-5 , стр. 215: «[...] модель [...] для компьютерных языков отличается от модели [...] для языков программирования только в двух отношениях. В компьютерном языке существует только конечное число имен – или регистров – которые могут принимать только конечное число значений – или состояний – и эти состояния далее не различаются с точки зрения каких-либо других атрибутов [сноска автора:] Это может звучать как трюизм, но его последствия таковы. Например, это будет означать, что любая модель языков программирования, фиксируя определенные ее параметры или особенности, должна быть естественным образом сведена к модели компьютерных языков».
  10. ^ Джон К. Рейнольдс, «Некоторые мысли об обучении программированию и языкам программирования», SIGPLAN Уведомления , том 43, выпуск 11, ноябрь 2008 г., стр.109
  11. ^ Бен Ари, Мордехай (1996). Понимание языков программирования . Джон Уайли и сыновья. Программы и языки можно определить как чисто формальные математические объекты. Однако больше людей интересуются программами, чем другими математическими объектами, такими как группы, именно потому, что можно использовать программу — последовательность символов — для управления работой компьютера. Хотя мы настоятельно рекомендуем изучать теорию программирования, этот текст обычно ограничивается изучением программ в том виде, в каком они выполняются на компьютере.
  12. ^ XML в 10 пунктах. Архивировано 6 сентября 2009 г. на Wayback Machine W3C , 1999 г.: «XML не является языком программирования».
  13. ^ Пауэлл, Томас (2003). HTML и XHTML: полный справочник . МакГроу-Хилл. п. 25. ISBN  978-0-07-222942-4 . HTML не является языком программирования.
  14. ^ Дайкс, Люсинда; Титтель, Эд (2005). XML для чайников (4-е изд.). Уайли. п. 20 . ISBN  978-0-7645-8845-7 . ... это язык разметки, а не язык программирования.
  15. ^ «Что это за язык XSLT?» . IBM.com. 20 апреля 2005 г. Архивировано из оригинала 11 мая 2011 г.
  16. ^ «XSLT — это язык программирования» . Msdn.microsoft.com. Архивировано из оригинала 3 февраля 2011 года . Проверено 3 декабря 2010 г.
  17. ^ Скотт, Майкл (2006). Прагматика языков программирования . Морган Кауфманн . п. 802 . ISBN  978-0-12-633951-2 . XSLT, хотя и узкоспециализирован для преобразования XML, является полным по Тьюрингу языком программирования.
  18. ^ Этикер, Тобиас; Партл, Хьюберт; Хина, Ирен; Шлегль, Элизабет (20 июня 2016 г.). «Не такое уж краткое введение в LATEX 2ε» (Версия 5.06) . tobi.oetiker.ch . стр. 1–157. Архивировано (PDF) из оригинала 14 марта 2017 г.
  19. ^ Сиропулос, Апостол; Антонис Цсоломитис; Ник Софрониу (2003). Цифровая типографика с использованием LaTeX . Спрингер-Верлаг. п. 213 . ISBN  978-0-387-95217-8 . TeX — это не только превосходный механизм верстки, но и настоящий язык программирования.
  20. ^ Дэвид А. Шмидт, Структура типизированных языков программирования , MIT Press, 1994, ISBN   0-262-19349-3 , с. 32
  21. ^ Пирс, Бенджамин (2002). Типы и языки программирования . МТИ Пресс. п. 339 . ISBN  978-0-262-16209-8 .
  22. ^ Габбриелли и Мартини 2023 , с. 519.
  23. ^ Габбриелли и Мартини 2023 , стр. 520–521.
  24. ^ Перейти обратно: а б с Габбриелли и Мартини 2023 , с. 521.
  25. ^ Габбриелли и Мартини 2023 , с. 522.
  26. ^ Себеста 2012 , с. 42.
  27. ^ Перейти обратно: а б с Габбриелли и Мартини 2023 , с. 524.
  28. ^ Sebesta 2012 , pp. 42–44.
  29. ^ Габбриелли и Мартини 2023 , стр. 523–524.
  30. ^ Габбриелли и Мартини 2023 , с. 527.
  31. ^ Перейти обратно: а б с Габбриелли и Мартини 2023 , с. 528.
  32. ^ «Как Лисп стал языком программирования Бога» . сайт twobithistory.org . Архивировано из оригинала 10 апреля 2024 года . Проверено 10 апреля 2024 г.
  33. ^ Sebesta 2012 , pp. 47–48.
  34. ^ Габбриелли и Мартини 2023 , с. 526.
  35. ^ Себеста 2012 , с. 50.
  36. ^ Sebesta 2012 , pp. 701–703.
  37. ^ Габбриелли и Мартини 2023 , стр. 524–525.
  38. ^ Sebesta 2012 , pp. 56–57.
  39. ^ Габбриелли и Мартини 2023 , с. 525.
  40. ^ Габбриелли и Мартини 2023 , стр. 526–527.
  41. ^ Габбриелли и Мартини 2023 , с. 531.
  42. ^ Перейти обратно: а б Себеста 2012 , с. 79.
  43. ^ Габбриелли и Мартини 2023 , с. 530.
  44. ^ Габбриелли и Мартини 2023 , стр. 532–533.
  45. ^ Габбриелли и Мартини 2023 , с. 534.
  46. ^ Габбриелли и Мартини 2023 , стр. 534–535.
  47. ^ Габбриелли и Мартини 2023 , с. 535.
  48. ^ Себеста 2012 , с. 736.
  49. ^ Габбриелли и Мартини 2023 , с. 536.
  50. ^ Габбриелли и Мартини 2023 , стр. 536–537.
  51. ^ Sebesta 2012 , pp. 91–92.
  52. ^ Габбриелли и Мартини 2023 , стр. 538–539.
  53. ^ Sebesta 2012 , pp. 97–99.
  54. ^ Габбриелли и Мартини 2023 , с. 542.
  55. ^ Габбриелли и Мартини 2023 , стр. 474–475, 477, 542.
  56. ^ Габбриелли и Мартини 2023 , стр. 542–543.
  57. ^ Габбриелли и Мартини 2023 , с. 544.
  58. ^ Безансон Дж., Карпински С., Шах В.Б. и Эдельман А., 2012. Джулия: Быстрый динамический язык для технических вычислений. Препринт arXiv arXiv:1209.5145.
  59. ^ Аюни М. и Аюни М., 2020. Типы данных в кольце. Начало кольцевого программирования: от новичка до профессионала, стр. 51–98.
  60. ^ Саес-Лопес, Х.М., Роман-Гонсалес, М. и Васкес-Кано, Э., 2016. Языки визуального программирования, интегрированные в учебную программу начальной школы: двухлетнее тематическое исследование с использованием «Scratch» в пяти школах. Компьютеры и образование, 97, стр. 129–141.
  61. ^ Файед, М.С., Аль-Куриши, М., Аламри, А. и Аль-Дарайсе, А.А., 2017, март. PWCT: визуальный язык для приложений и систем Интернета вещей и облачных вычислений. В материалах Второй международной конференции по Интернету вещей, данным и облачным вычислениям (стр. 1-5).
  62. ^ Кодоски, Дж., 2020. LabVIEW. Труды ACM по языкам программирования, 4 (HOPL), стр. 1-54.
  63. ^ Фернандо А. и Варусавитана Л., 2020. Начало программирования балерин: от новичка до профессионала. Апресс.
  64. ^ Балупритвирадж, К.Н., Бхарати, К.Р., Чендхуран, С. и Локешваран, П., 2021, март. Умная дверь на основе искусственного интеллекта с обнаружением маски для лица. В 2021 году пройдет Международная конференция по искусственному интеллекту и интеллектуальным системам (ICAIS) (стр. 543-548). IEEE.
  65. ^ Сьюэлл, Б., 2015. Чертежи визуальных сценариев для Unreal Engine. ООО «Пакт Паблишинг»
  66. ^ Бертолини, Л., 2018. Практическая разработка игр без программирования: создавайте 2D- и 3D-игры с помощью визуальных сценариев в Unity. ООО «Пакт Паблишинг»
  67. ^ Майкл Сипсер (1996). Введение в теорию вычислений . Издательство ПВС. ISBN  978-0-534-94728-6 . Раздел 2.2: Автоматы с опусканием вниз, стр. 101–114.
  68. ^ Джеффри Кеглер, « Perl и неразрешимость. Архивировано 17 августа 2009 г. в Wayback Machine », The Perl Review . Статьи 2 и 3 доказывают, используя соответственно теорему Райса и прямое сведение к проблеме остановки , что синтаксический анализ Perl-программ в общем случае неразрешим.
  69. ^ Марти Холл, 1995, Конспекты лекций: Макросы. Архивировано 6 августа 2013 г. в Wayback Machine . PostScript. Версия Архивировано 17 августа 2000 г. в Wayback Machine.
  70. ^ Майкл Ли Скотт, Прагматика языков программирования , издание 2, Морган Кауфманн, 2006 г., ISBN   0-12-633951-1 , с. 18–19
  71. ^ Перейти обратно: а б с д Это ж г Эндрю Кук. «Введение в компьютерные языки» . Архивировано из оригинала 15 августа 2012 года . Проверено 13 июля 2012 г.
  72. ^ Лейвант, Дэниел (1983). Вывод полиморфного типа . Симпозиум ACM SIGACT-SIGPLAN по принципам языков программирования. Остин, Техас: ACM Press. стр. 88–98. дои : 10.1145/567067.567077 . ISBN  978-0-89791-090-3 .
  73. ^ В частности, экземпляры универсальных для определенных форм выражений выводятся типов. Вывод типа в Generic Java — исследовательском языке, который послужил основой для расширений ограниченного параметрического полиморфизма в Java 1.5 — обсуждается в двух неофициальных рукописях из списка рассылки Types: Вывод типа Generic Java необоснован. Архивировано 29 января 2007 г. на Wayback Machine ( Алан Джеффри , 17 декабря 2001 г.) и вывод типа Sound Generic Java. Архивировано 29 января 2007 г. в Wayback Machine ( Мартин Одерски , 15 января 2002 г.). Система типов C# аналогична системе типов Java и использует аналогичную схему вывода частичного типа.
  74. ^ «Пересмотренный отчет об алгоритмической языковой схеме» . 20 февраля 1998 года. Архивировано из оригинала 14 июля 2006 года.
  75. ^ Лука Карделли и Питер Вегнер . «О понимании типов, абстракции данных и полиморфизме» . Рукопись (1985 г.) . Архивировано из оригинала 19 июня 2006 года.
  76. ^ Аюни, М., 2020. Начало кольцевого программирования (том 978, № 1, стр. 4842-5832). Апресс.
  77. ^ Себеста 2012 , с. 576.
  78. ^ Себеста 2012 , с. 579.
  79. ^ Себеста 2012 , с. 585.
  80. ^ Sebesta 2012 , pp. 585–586.
  81. ^ Sebesta 2012 , pp. 630, 634.
  82. ^ Себеста 2012 , с. 635.
  83. ^ Перейти обратно: а б Себеста 2012 , с. 631.
  84. ^ Себеста 2012 , с. 261.
  85. ^ Себеста 2012 , с. 632.
  86. ^ Sebesta 2012 , pp. 631, 635–636.
  87. ^ Стивен Р. Фишер, История языка , Reaktion Books, 2003, ISBN   1-86189-080-X , с. 205
  88. ^ Эрик Левенес (2011). «История компьютерных языков» . Архивировано из оригинала 7 января 2006 года.
  89. ^ Цзин Хуан. «Искусственный язык против естественного языка» . Архивировано из оригинала 3 сентября 2009 года.
  90. ^ IBM, впервые опубликовав PL/I, например, довольно амбициозно назвала свое руководство «Универсальный язык программирования PL/I» (Библиотека IBM; 1966). Название отражало цели IBM в отношении неограниченных возможностей создания подмножеств: «PL/I спроектирован таким образом, что из него можно изолировать подмножества, удовлетворяющие требованиям конкретных приложений». ( «ПЛ/И» . Энциклопедия математики . Архивировано из оригинала 26 апреля 2012 года . Проверено 29 июня 2006 г. ). У Ada и UNCOL были схожие первоначальные цели.
  91. ^ Фредерик П. Брукс-младший: Мифический человеко-месяц , Аддисон-Уэсли, 1982, стр. 93–94.
  92. ^ Дейкстра, Эдсгер В. О глупости «программирования на естественном языке». Архивировано 20 января 2008 года на Wayback Machine EWD667.
  93. ^ Перлис, Алан (сентябрь 1982 г.). «Эпиграммы о программировании» . Уведомления SIGPLAN Vol. 17, № 9 . стр. 7–13. Архивировано из оригинала 17 января 1999 года.
  94. ^ Милнер, Р .; М. Тофте ; Р. Харпер ; Д. МакКуин (1997). Определение стандарта ОД (пересмотренного) . МТИ Пресс. ISBN  978-0-262-63181-5 .
  95. ^ Келси, Ричард; Уильям Клингер; Джонатан Рис (февраль 1998 г.). «Раздел 7.2 Формальная семантика» . Пересмотренный 5 Отчет об алгоритмической языковой схеме . Архивировано из оригинала 6 июля 2006 года.
  96. ^ ANSI - Язык программирования Rexx, X3-274.1996
  97. ^ Sebesta 2012 , pp. 23–24.
  98. ^ Sebesta 2012 , pp. 25–27.
  99. ^ Себеста 2012 , с. 27.
  100. ^ Себеста 2012 , с. 28.
  101. ^ Sebesta 2012 , pp. 29–30.
  102. ^ См.: Oracle America, Inc. против Google, Inc. [ источник, созданный пользователем ]
  103. ^ «Руководство по языкам программирования | ComputerScience.org» . ComputerScience.org . Архивировано из оригинала 13 мая 2018 года . Проверено 13 мая 2018 г.
  104. ^ "Основы" . IBM.com . 10 мая 2011 г. Архивировано из оригинала 14 мая 2018 г. . Проверено 13 мая 2018 г.
  105. ^ Абдельазиз, Абдулла И.; Хэнсон, Кент А.; Габер, Чарльз Э.; Ли, Тодд А. (2023). «Оптимизация анализа больших реальных данных с помощью файлов паркета в R: пошаговое руководство» . Фармакоэпидемиология и безопасность лекарственных средств . 33 (3): e5728. дои : 10.1002/pds.5728 . ПМИД   37984998 .
  106. ^ «HOPL: интерактивный список языков программирования» . Австралия: Университет Мердока . Архивировано из оригинала 20 февраля 2011 года . Проверено 1 июня 2009 г. На этом сайте перечислено 8512 языков.
  107. ^ Майер, Филип; Бауэр, Александр (2015). «Эмпирический анализ использования нескольких языков программирования в проектах с открытым исходным кодом». Материалы 19-й Международной конференции по оценке и оцениванию в программной инженерии . Материалы 19-й Международной конференции по оценке и оценке в программной инженерии – EASE '15. Нью-Йорк, штат Нью-Йорк, США: ACM. стр. 4:1–4:10. дои : 10.1145/2745802.2745805 . ISBN  978-1-4503-3350-4 . Результаты: мы обнаружили (а) среднее количество 5 языков на проект с явно доминирующим основным языком общего назначения и 5 часто используемыми типами DSL, (б) значительное влияние размера, количества коммитов и основного языка. от количества языков, а также от отсутствия существенного влияния возраста и количества участников, и (c) трех языковых экосистем, сгруппированных вокруг XML, Shell/Make и HTML/CSS. Выводы: Многоязычное программирование, по-видимому, является обычным явлением в проектах с открытым исходным кодом и является фактором, который необходимо учитывать при разработке инструментов и при оценке разработки и сопровождения таких программных систем.
  108. ^ Абельсон, Сассман и Сассман. «Структура и интерпретация компьютерных программ» . Архивировано из оригинала 26 февраля 2009 года . Проверено 3 марта 2009 г. {{cite web}}: CS1 maint: несколько имен: список авторов ( ссылка )
  109. ^ Вики, Браун; Морен, Рич (1999). «Скриптовые языки» . МакТех . Архивировано из оригинала 2 декабря 2017 года.
  110. ^ Джорджина Свон (21 сентября 2009 г.). «КОБОЛУ» исполняется 50 лет . Компьютерный мир. Архивировано из оригинала 19 октября 2013 года . Проверено 19 октября 2013 г.
  111. ^ Эд Эйри (3 мая 2012 г.). «Разоблачение 7 мифов о COBOL» . разработчик.com. Архивировано из оригинала 19 октября 2013 года . Проверено 19 октября 2013 г.
  112. ^ Николас Энтикнап. «Еженедельный обзор зарплат в сфере SSL/Computer в сфере ИТ: финансовый бум стимулирует рост рабочих мест в сфере ИТ» . Компьютерный еженедельник . Архивировано из оригинала 26 октября 2011 года . Проверено 14 июня 2013 г.
  113. ^ «Подсчет языков программирования по продажам книг» . Радар.oreilly.com. 2 августа 2006 г. Архивировано из оригинала 17 мая 2008 г.
  114. ^ Биман, Дж. М.; Мердок, В., Поиск кода во Всемирной паутине: предварительное расследование, Материалы первого международного семинара IEEE по анализу и манипулированию исходным кодом, 2001 г.
  115. ^ «Самые популярные и влиятельные языки программирования 2018 года» . stackify.com. 18 декабря 2017 года. Архивировано из оригинала 30 августа 2018 года . Проверено 29 августа 2018 г. .
  116. ^ «Индекс ТИОБЕ» . Архивировано из оригинала 15 октября 2023 года . Проверено 24 февраля 2024 г.
  117. ^ Себеста 2012 , с. 21.
  118. ^ Перейти обратно: а б Sebesta 2012 , pp. 21–22.
  119. ^ Себеста 2012 , с. 12.
  120. ^ Себеста 2012 , с. 22.
  121. ^ Sebesta 2012 , pp. 22–23.

Дальнейшее чтение [ править ]