Язык программирования
Язык программирования — это система обозначений для написания компьютерных программ . [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-е годы
[ редактировать ]Примерно в 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]
Элементы
[ редактировать ]Каждый язык программирования включает фундаментальные элементы для описания данных и операций или преобразований, применяемых к ним, таких как сложение двух чисел или выбор элемента из коллекции. Эти элементы регулируются синтаксическими и семантическими правилами, которые определяют их структуру и значение соответственно.
Синтаксис
[ редактировать ]Поверхностная форма языка программирования известна как его синтаксис . Большинство языков программирования являются чисто текстовыми; они используют последовательности текста, включая слова, цифры и знаки препинания, подобно письменным естественным языкам. С другой стороны, некоторые языки программирования являются графическими и используют визуальные связи между символами для описания программы.
Синтаксис языка описывает возможные комбинации символов, образующие синтаксически правильную программу. Значение, придаваемое комбинации символов, обрабатывается семантикой (либо формальной , либо жестко запрограммированной в эталонной реализации ). Поскольку большинство языков являются текстовыми, в этой статье обсуждается текстовый синтаксис.
Синтаксис языка программирования обычно определяется с использованием комбинации регулярных выражений (для лексической структуры) и формы Бэкуса – Наура (для грамматической структуры). Ниже приведена простая грамматика, основанная на Lisp :
expression ::= atom | listatom ::= number | symbolnumber ::= [+-]?['0'-'9']+symbol ::= ['A'-'Z''a'-'z'].*list ::= '(' expression* ')'
Эта грамматика определяет следующее:
- выражением является либо атом , либо список ;
- атом — это либо число , либо символ ;
- число представляет собой непрерывную последовательность из одной или нескольких десятичных цифр, которой может предшествовать знак плюс или минус;
- символ — это буква, за которой следует ноль или более любых символов (за исключением пробелов); и
- список представляет собой совпадающую пару круглых скобок с нулем или более выражениями внутри него.
Ниже приведены примеры правильно сформированных последовательностей токенов в этой грамматике: 12345
, ()
и (a b c232 (1))
.
Не все синтаксически правильные программы являются семантически правильными. Тем не менее, согласно правилам языка, многие синтаксически правильные программы имеют неверный формат; и может (в зависимости от спецификации языка и правильности реализации) привести к ошибке при трансляции или выполнении. В некоторых случаях такие программы могут демонстрировать неопределенное поведение . Даже если программа четко определена в языке, она все равно может иметь значение, которое не было задумано человеком, который ее написал.
На примере естественного языка может оказаться невозможным придать значение грамматически правильному предложению или предложение может быть ложным:
- « Бесцветные зеленые идеи яростно спят ». грамматически правильно сформировано, но не имеет общепринятого значения.
- «Джон — женатый холостяк». грамматически правильно сформировано, но выражает значение, которое не может быть истинным.
Следующий фрагмент языка C синтаксически корректен, но выполняет операции, которые не определены семантически (операция *p >> 4
не имеет значения для значения, имеющего сложный тип и p->im
не определено, поскольку значение p
это нулевой указатель ):
complex *p = NULL;complex abs_p = sqrt(*p >> 4 + p->im);
Если бы объявление типа в первой строке было опущено, программа выдала бы ошибку в неопределенной переменной. p
во время компиляции. Однако программа по-прежнему будет синтаксически корректной, поскольку объявления типов предоставляют только семантическую информацию.
Грамматику, необходимую для определения языка программирования, можно классифицировать по ее положению в иерархии Хомского . Синтаксис большинства языков программирования может быть определен с использованием грамматики типа 2, т. е. они являются контекстно-свободными грамматиками . [67] Некоторые языки, включая Perl и Lisp, содержат конструкции, позволяющие выполнение на этапе синтаксического анализа. Языки, в которых есть конструкции, позволяющие программисту изменять поведение синтаксического анализатора, делают синтаксический анализ неразрешимой проблемой и обычно стирают различие между синтаксическим анализом и выполнением. [68] В отличие от макросистемы Lisp и Perl BEGIN
блоки, которые могут содержать общие вычисления, макросы C представляют собой просто замену строк и не требуют выполнения кода. [69]
Семантика
[ редактировать ]Логические связки | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||
Связанные понятия | ||||||||||||||||||||||
Приложения | ||||||||||||||||||||||
Категория | ||||||||||||||||||||||
Термин семантика относится к значению языков, а не к их форме ( синтаксису ).
Статическая семантика
[ редактировать ]Статическая семантика определяет ограничения на структуру действительных текстов, которые трудно или невозможно выразить с помощью стандартных синтаксических формализмов. [1] [ не удалось пройти проверку ] Для компилируемых языков статическая семантика по существу включает те семантические правила, которые можно проверить во время компиляции. Примеры включают проверку того, что каждый идентификатор объявлен перед его использованием (в языках, которые требуют таких объявлений) или что метки на ветвях оператора case различны. [70] Многие важные ограничения этого типа, такие как проверка того, что идентификаторы используются в соответствующем контексте (например, не добавлять целое число к имени функции) или что вызовы подпрограмм имеют соответствующее количество и тип аргументов, могут быть реализованы путем определения их как правил. в логике, называемой системой типов . Другие формы статического анализа , такие как анализ потока данных, также могут быть частью статической семантики. Языки программирования, такие как Java и C#, имеют определенный анализ присваивания , форму анализа потока данных, как часть их соответствующей статической семантики.
Динамическая семантика
[ редактировать ]После указания данных машине необходимо дать команду выполнить операции с данными. Например, семантика может определять стратегию, с помощью которой выражения оцениваются по значениям, или способ, которым структуры управления условно выполняют инструкции . Динамическая семантика (также известная как семантика выполнения ) языка определяет, как и когда различные конструкции языка должны обеспечивать поведение программы. Существует много способов определения семантики выполнения. Естественный язык часто используется для определения семантики выполнения языков, обычно используемых на практике. Значительный объем академических исследований посвящен формальной семантике языков программирования , что позволяет формальным образом определять семантику выполнения. Результаты этой области исследований нашли ограниченное применение при разработке и реализации языков программирования за пределами академических кругов.
Типовая система
[ редактировать ]Тип данных — это набор допустимых значений и операций, которые можно выполнять с этими значениями. [71] каждого языка программирования Система типов определяет, какие типы данных существуют, тип выражения и как эквивалентность и совместимость типов . в языке функционируют [72]
Согласно теории типов , язык является полностью типизированным, если спецификация каждой операции определяет типы данных, к которым эта операция применима. [73] Напротив, нетипизированный язык, такой как большинство языков ассемблера , позволяет выполнять любую операцию с любыми данными, обычно с последовательностями бит различной длины. [73] На практике, хотя немногие языки являются полностью типизированными, большинство из них предлагают определенную степень типизации. [73]
Поскольку разные типы (например, целые числа и числа с плавающей запятой ) представляют значения по-разному, могут возникнуть неожиданные результаты, если один тип используется, когда ожидается другой. Проверка типов выявляет эту ошибку, обычно во время компиляции (проверка типов во время выполнения обходится дороже). [74] При строгой типизации всегда ошибки типов можно обнаружить , если только переменные явно не приведены к другому типу. Слабая типизация возникает, когда языки допускают неявное приведение типов — например, чтобы обеспечить возможность выполнения операций между переменными разных типов без выполнения программистом явного преобразования типов. Чем больше случаев, в которых такое приведение типов , тем меньше ошибок типов можно обнаружить. разрешено [75]
Часто поддерживаемые типы
[ редактировать ]Ранние языки программирования часто поддерживали только встроенные числовые типы, такие как целое число (со знаком и без знака) и с плавающей запятой (для поддержки операций с действительными числами , которые не являются целыми числами). Большинство языков программирования поддерживают несколько размеров чисел с плавающей запятой (часто называемых float и double ) и целых чисел в зависимости от размера и точности, требуемых программистом. Сохранение целого числа в типе, который слишком мал для его представления, приводит к переполнению целого числа . Наиболее распространенным способом представления отрицательных чисел знаковыми типами является дополнение до двух , хотя дополнение до единиц . также используется [76] Другие распространенные типы включают логические значения (которые могут быть либо истинными, либо ложными) и символьные (традиционно один байт , достаточный для представления всех символов ASCII) . [77]
Массивы — это тип данных, элементы которого во многих языках должны состоять из одного типа фиксированной длины. Другие языки определяют массивы как ссылки на данные, хранящиеся в другом месте, и поддерживают элементы разных типов. [78] В зависимости от языка программирования последовательности из нескольких символов, называемые строками , могут поддерживаться как массивы символов или собственный примитивный тип . [79] Строки могут иметь фиксированную или переменную длину, что обеспечивает большую гибкость за счет увеличения места для хранения и большей сложности. [80] Другие типы данных, которые могут поддерживаться, включают списки , [81] ассоциативные (неупорядоченные) массивы, доступ к которым осуществляется через ключи, [82] записи, в которых данные сопоставлены с именами в упорядоченной структуре, [83] и кортежи — аналогично записям, но без имен полей данных. [84] Указатели хранят адреса памяти, обычно ссылаясь на места в куче , где хранятся другие данные. [85]
Самый простой определяемый пользователем тип — это порядковый тип , значения которого можно сопоставить с набором положительных целых чисел. [86] С середины 1980-х годов большинство языков программирования также поддерживают абстрактные типы данных , в которых представление данных и операций скрыто от пользователя , который может получить доступ только к интерфейсу . [87] Преимущества абстракции данных могут включать повышенную надежность, снижение сложности, меньшую вероятность конфликта имен и возможность базовой структуры данных без необходимости изменения клиентом своего кода. изменения [88]
Статическая и динамическая типизация
[ редактировать ]При статической типизации типы всех выражений определяются до выполнения программы, обычно во время компиляции. [73] Наиболее широко используемые статически типизированные языки программирования требуют явного указания типов переменных. В некоторых языках типы неявны; одна из форм этого — когда компилятор может выводить типы на основе контекста. Недостатком неявной типизации является вероятность того, что ошибки останутся незамеченными. [89] Полный вывод типов традиционно ассоциировался с функциональными языками, такими как Haskell и ML . [90]
При динамической типизации к переменной привязывается не тип, а только закодированное в ней значение. Одну переменную можно повторно использовать для значения другого типа. Хотя это обеспечивает большую гибкость для программиста, за это приходится платить меньшей надежностью и меньшей способностью языка программирования проверять наличие ошибок. [91] Некоторые языки допускают переменные типа объединения , которым можно присвоить любой тип значения, в качестве исключения из их обычных правил статической типизации. [92]
Параллелизм
[ редактировать ]При вычислениях несколько инструкций могут выполняться одновременно. Многие языки программирования поддерживают параллелизм на уровне инструкций и подпрограмм. [93] К XXI веку дополнительная вычислительная мощность компьютеров все чаще обеспечивалась за счет использования дополнительных процессоров, что требует от программистов разработки программного обеспечения, которое использует несколько процессоров одновременно для достижения улучшенной производительности. [94] Интерпретируемые языки, такие как Python и Ruby, не поддерживают одновременное использование нескольких процессоров. [95] Другие языки программирования поддерживают управление данными, совместно используемыми различными потоками, путем управления порядком выполнения ключевых инструкций с помощью семафоров , управления доступом к общим данным через монитор или включения передачи сообщений между потоками. [96]
Обработка исключений
[ редактировать ]Многие языки программирования включают обработчики исключений — раздел кода, вызываемый ошибками во время выполнения , который может обрабатывать их двумя основными способами: [97]
- Прекращение: завершение работы и передача управления операционной системе . Этот вариант считается самым простым.
- Возобновление: возобновление работы программы рядом с местом возникновения исключения. Это может вызвать повторение исключения, если только обработчик исключений не сможет изменить значения, чтобы предотвратить повторное возникновение исключения.
Некоторые языки программирования поддерживают выделение блока кода для выполнения независимо от того, возникает ли исключение до достижения кода; это называется финализацией. [98]
Существует компромисс между увеличением возможностей обработки исключений и снижением производительности. [99] Например, несмотря на то, что ошибки индекса массива являются обычным явлением [100] C не проверяет их по соображениям производительности. [99] Хотя программисты могут писать код для перехвата пользовательских исключений, это может загромождать программу. Стандартные библиотеки некоторых языков, например C, используют возвращаемые значения для обозначения исключения. [101] Некоторые языки и их компиляторы имеют возможность включать и отключать возможность обработки ошибок временно или постоянно. [102]
Проектирование и реализация
[ редактировать ]Одним из наиболее важных факторов, повлиявших на разработку языков программирования, оказалась компьютерная архитектура . Императивные языки , наиболее часто используемый тип, были разработаны для хорошей работы на архитектуре фон Неймана , наиболее распространенной компьютерной архитектуре. [103] В архитектуре фон Неймана память хранит как данные, так и инструкции, тогда как ЦП , выполняющий инструкции над данными, является отдельным, и данные должны передаваться туда и обратно в ЦП. Центральными элементами в этих языках являются переменные, присваивание и итерация более эффективно, чем рекурсия . , что на этих машинах [104]
Многие языки программирования были разработаны с нуля, изменены для удовлетворения новых потребностей и объединены с другими языками. Многие из них со временем вышли из употребления. [ нужна ссылка ] Рождение языков программирования в 1950-х годах было стимулировано желанием создать универсальный язык программирования, подходящий для всех машин и применений, избегая необходимости писать код для разных компьютеров. [105] К началу 1960-х годов идея универсального языка была отвергнута из-за различий в требованиях различных целей, для которых писался код. [106]
Компромиссы
[ редактировать ]Желательные качества языков программирования включают читабельность, возможность записи и надежность. [107] Эти функции могут снизить стоимость обучения программистов языку, количество времени, необходимое для написания и поддержки программ на этом языке, стоимость компиляции кода и повысить производительность во время выполнения. [108]
- Хотя в ранних языках программирования эффективность часто отдавалась приоритету над читабельностью, с 1970-х годов важность последней возросла. Наличие нескольких операций для достижения одного и того же результата может отрицательно сказаться на читаемости, равно как и перегрузка операторов , из-за которой один и тот же оператор может иметь несколько значений. [109] Еще одна особенность, важная для читаемости, — это ортогональность , ограничивающая количество конструкций, которые программисту приходится изучать. [110] Легко понятная синтаксическая структура и специальные слова также способствуют удобочитаемости. сразу бросающиеся в глаза [111]
- Возможность записи — это простота использования кода для решения желаемой проблемы. Наряду с теми же функциями, необходимыми для удобства чтения, [112] абстракция — интерфейсы, позволяющие скрывать детали от клиента, — и выразительность , позволяющая сделать программы более краткими, — дополнительно помогают программисту писать код. [113] Самые ранние языки программирования были очень тесно связаны с базовым аппаратным обеспечением компьютера, но со временем поддержка абстракции возросла, что позволило программистам выражать идеи, которые более далеки от простого перевода в базовые аппаратные инструкции. Поскольку программисты меньше привязаны к сложности компьютера, их программы могут выполнять больше вычислений с меньшими усилиями со стороны программиста. [114] Большинство языков программирования имеют стандартную библиотеку часто используемых функций. [115]
- Надежность означает, что программа работает так, как указано в широком диапазоне обстоятельств. [116] Проверка типов , обработка исключений и ограниченное использование псевдонимов (множественные имена переменных, обращающиеся к одной и той же области памяти) — все это может повысить надежность программы. [117]
Проектирование языка программирования часто предполагает компромиссы. [118] Например, функции повышения надежности обычно достигаются за счет производительности. [119] Повышенная выразительность благодаря большому количеству операторов упрощает написание кода, но достигается за счет удобочитаемости. [119]
Программирование на естественном языке было предложено как способ устранить необходимость в специализированном языке программирования. Однако эта цель остается далекой, а ее преимущества открыты для дискуссий. Эдсгер В. Дейкстра придерживался позиции, согласно которой использование формального языка необходимо для предотвращения введения бессмысленных конструкций. [120] Алан Перлис также пренебрежительно отнесся к этой идее. [121]
Спецификация
[ редактировать ]Спецификация языка программирования — это артефакт, который пользователи языка и разработчики могут использовать, чтобы договориться о том, является ли часть исходного кода допустимой программой на этом языке, и если да, то каким должно быть ее поведение.
Спецификация языка программирования может принимать несколько форм, включая следующие:
- Явное определение синтаксиса, статической семантики и семантики выполнения языка. Хотя синтаксис обычно задается с использованием формальной грамматики, семантические определения могут быть написаны на естественном языке (например, как в языке C ) или формальной семантике (например, как в стандартном ML). [122] и схема [123] спецификации).
- Описание поведения транслятора языка (например, спецификации C++ и Fortran ). Синтаксис и семантика языка должны быть выведены из этого описания, которое может быть написано на естественном или формальном языке.
- Эталонная . или модельная реализация , иногда написанная на указанном языке (например, Пролог или ANSI REXX) [124] ). Синтаксис и семантика языка явны в поведении эталонной реализации.
Выполнение
[ редактировать ]Реализация языка программирования — это преобразование программы в машинный код , который может выполняться аппаратным обеспечением. Машинный код затем может быть выполнен с помощью операционной системы . [125] Наиболее распространенной формой интерпретации рабочего кода является компилятор , который переводит исходный код через язык промежуточного уровня в машинный код, известный как исполняемый файл . После компиляции программа будет работать быстрее, чем при использовании других методов реализации. [126] Некоторые компиляторы могут обеспечить дополнительную оптимизацию для уменьшения использования памяти или вычислений при запуске исполняемого файла, но увеличения времени компиляции. [127]
Другой метод реализации — запуск программы с помощью интерпретатора , который переводит каждую строку программного обеспечения в машинный код непосредственно перед ее выполнением. Хотя это может облегчить отладку, недостатком интерпретации является то, что она работает в 10–100 раз медленнее, чем скомпилированный исполняемый файл. [128] Гибридные методы интерпретации предоставляют некоторые преимущества компиляции и некоторые преимущества интерпретации посредством частичной компиляции. Одной из форм, которую это принимает, является компиляция «точно в срок» , при которой программное обеспечение заранее компилируется в промежуточный язык, а затем в машинный код непосредственно перед выполнением. [129]
Собственные языки
[ редактировать ]Хотя большинство наиболее часто используемых языков программирования имеют полностью открытые спецификации и реализации, многие языки программирования существуют только как проприетарные языки программирования, причем реализация доступна только от одного поставщика, который может заявлять, что такой проприетарный язык является их интеллектуальной собственностью. Собственные языки программирования обычно представляют собой языки, специфичные для предметной области , или внутренние языки сценариев для одного продукта; некоторые проприетарные языки используются только внутри поставщика, тогда как другие доступны внешним пользователям. [ нужна ссылка ]
Некоторые языки программирования существуют на границе между проприетарными и открытыми; например, корпорация Oracle заявляет права собственности на некоторые аспекты языка программирования Java , [130] а Microsoft язык программирования C# , который имеет открытые реализации большинства частей системы, также имеет среду Common Language Runtime (CLR) в качестве закрытой среды. [131]
Многие проприетарные языки широко используются, несмотря на их проприетарный характер; примеры включают MATLAB , VBScript и Wolfram Language . Некоторые языки могут перейти от закрытого к открытому; например, Erlang изначально был внутренним языком программирования Ericsson. [132]
Языки программирования с открытым исходным кодом особенно полезны для приложений открытой науки , расширяя возможности репликации и совместного использования кода. [133]
Использовать
[ редактировать ]Были созданы тысячи различных языков программирования, в основном в области вычислений. [134] В отдельных проектах программного обеспечения обычно используются пять и более языков программирования. [135]
Языки программирования отличаются от большинства других форм человеческого самовыражения тем, что требуют большей степени точности и полноты. Используя естественный язык для общения с другими людьми, авторы и носители языка могут быть двусмысленными и делать небольшие ошибки, но при этом ожидать, что их намерения будут поняты. Однако, образно говоря, компьютеры «делают именно то, что им велят» и не могут «понять», какой код намеревался написать программист. Сочетание определения языка, программы и входных данных программы должно полностью определять внешнее поведение, которое происходит при выполнении программы в пределах области управления этой программой. С другой стороны, идеи об алгоритме могут передаваться людям без точности, необходимой для выполнения, с использованием псевдокода , который чередует естественный язык с кодом, написанным на языке программирования.
Язык программирования предоставляет структурированный механизм для определения фрагментов данных, а также операций или преобразований, которые могут автоматически выполняться над этими данными. Программист присутствующие использует абстракции, в языке, для представления концепций, участвующих в вычислениях. Эти концепции представлены как набор простейших доступных элементов (называемых примитивами ). [136] Программирование — это процесс, посредством которого программисты комбинируют эти примитивы для создания новых программ или адаптируют существующие к новому использованию или изменяющейся среде.
Программы для компьютера могут выполняться в пакетном режиме участия человека, или пользователь может вводить команды в интерактивном сеансе интерпретатора без . В этом случае «команды» — это просто программы, выполнение которых связано в цепочку. Когда язык может запускать свои команды через интерпретатор (например, оболочку Unix или другой интерфейс командной строки ) без компиляции, он называется языком сценариев . [137]
Измерение использования языка
[ редактировать ]Определить, какой язык программирования является наиболее широко используемым, сложно, поскольку определение использования зависит от контекста. Один язык может занимать большее количество часов программиста, другой — больше строк кода, а третий — больше всего процессорного времени. Некоторые языки очень популярны для определенных типов приложений. Например, COBOL по-прежнему популярен в корпоративных центрах обработки данных, часто на больших мэйнфреймах ; [138] [139] Фортран в научных и инженерных приложениях; Ada в аэрокосмической, транспортной, военной сфере, приложениях реального времени и встроенных приложениях; и C во встроенных приложениях и операционных системах. Другие языки регулярно используются для написания множества различных приложений.
Были предложены различные методы измерения популярности языка, каждый из которых имеет разную предвзятость в отношении того, что измеряется:
- подсчет количества объявлений о вакансиях, в которых упоминается этот язык [140]
- количество проданных книг, обучающих или описывающих язык [141]
- оценки количества существующих строк кода, написанных на этом языке, что может занижать оценку языков, которые не часто встречаются в общедоступных поисках. [142]
- количество ссылок на язык (т. е. на название языка), найденных с помощью поисковой системы в Интернете.
Объединив и усреднив информацию с различных интернет-сайтов, stackify.com сообщил о десяти самых популярных языках программирования (в порядке убывания общей популярности): Java , C , C++ , Python , C# , JavaScript , VB.NET , R , PHP и MATLAB. . [143]
По состоянию на июнь 2024 года в пятерку лучших языков программирования по индексу TIOBE входят Python , C++ , C , Java и C# . TIOBE предоставляет список 100 лучших языков программирования по популярности и обновляет этот список каждый месяц. [144]
Диалекты, разновидности и реализации
[ редактировать ]Диалект — это (относительно небольшая) вариация или языка программирования или языка обмена данными расширение языка, не меняющее его внутреннюю природу. В таких языках, как Scheme и Forth , разработчики могут считать стандарты недостаточными, неадекватными или незаконными, поэтому часто они отклоняются от стандарта, создавая новый диалект . В других случаях диалект создается для использования в предметно-ориентированном языке , часто являющемся его подмножеством. В мире Lisp большинство языков, использующих базовый синтаксис S-выражений и подобную Lisp семантику, считаются диалектами Lisp, хотя они сильно различаются, как, скажем, Racket и Clojure . Поскольку один язык обычно имеет несколько диалектов, неопытному программисту может быть довольно сложно найти нужную документацию. Язык BASIC имеет множество диалектов .
Классификации
[ редактировать ]Языки программирования часто делятся на четыре основные категории: императивные , функциональные , логические и объектно-ориентированные . [145]
- Императивные языки предназначены для реализации алгоритма в определенном порядке; они включают языки визуального программирования , такие как .NET, для создания графических пользовательских интерфейсов . Языки сценариев , которые частично или полностью интерпретируются , а не компилируются , иногда считаются отдельной категорией, но соответствуют определению императивных языков. [146]
- Функциональные языки программирования работают путем последовательного применения функций к заданным параметрам. Хотя многие исследователи ценят их за простоту и элегантность, проблемы с эффективностью не позволяют им получить широкое распространение. [147]
- Логические языки устроены таким образом, что программное обеспечение, а не программист, решает, в каком порядке выполнять инструкции. [148]
- Объектно-ориентированное программирование, характерными чертами которого являются абстракция данных , наследование и динамическая диспетчеризация , поддерживается большинством популярных императивных языков и некоторыми функциональными языками. [146]
Хотя языки разметки не являются языками программирования, некоторые из них имеют расширения, поддерживающие ограниченное программирование. Кроме того, существуют языки специального назначения, которые нелегко сравнить с другими языками программирования. [149]
См. также
[ редактировать ]- Сравнение языков программирования (базовые инструкции)
- Сравнение языков программирования
- Компьютерное программирование
- Информатика и Очерк информатики
- Язык, специфичный для предметной области
- Специализированное моделирование
- Образовательный язык программирования
- Эзотерический язык программирования
- Расширяемое программирование
- Категория:Языки программирования с расширяемым синтаксисом
- Инвариантное программирование
- Список БАЗОВЫХ диалектов
- Списки языков программирования
- Список исследователей языков программирования
- Языки программирования, используемые на большинстве популярных веб-сайтов
- Языко-ориентированное программирование
- Логическое программирование
- Грамотное программирование
- Metaprogramming
- Язык моделирования
- Теория языка программирования
- Псевдокод
- Ребол § Диалекты
- Рефлексивное программирование
- Научный язык программирования
- Язык сценариев
- Разработка программного обеспечения и список тем по разработке программного обеспечения
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с Ааби, Энтони (2004). Введение в языки программирования . Архивировано из оригинала 8 ноября 2012 года . Проверено 29 сентября 2012 г.
- ^ Роберт А. Эдмундс, Стандартный глоссарий компьютерной терминологии Прентис-Холл, Прентис-Холл, 1985, стр. 91
- ^ Паскаль Ландо, Анн Лапужад, Жиль Кассель и Фредерик Фюрст, К общей онтологии компьютерных программ. Архивировано 7 июля 2015 г. в Wayback Machine , ICSOFT 2007. Архивировано 27 апреля 2010 г. в Wayback Machine , стр. 163–170.
- ^ С. К. Баджпай, Введение в компьютеры и программирование на C , New Age International, 2007, ISBN 81-224-1379-X , стр. 346
- ^ «Тьюринговая полнота» . www.cs.odu.edu . Архивировано из оригинала 16 августа 2022 года . Проверено 5 октября 2022 г.
- ^ Корпорация цифрового оборудования. «Информационные технологии – язык баз данных SQL (предлагаемый пересмотренный текст DIS 9075)» . ISO/IEC 9075:1992, Язык баз данных SQL . Архивировано из оригинала 21 июня 2006 года . Проверено 29 июня 2006 г.
- ^ Группа развития благотворительности (декабрь 1996 г.). «Главная страница БЛАГОТВОРИТЕЛЬНОСТИ» . Архивировано из оригинала 18 июля 2006 г. , «Благотворительность — это категориальный язык программирования…», «Все вычисления благотворительности прекращаются».
- ^ С математической точки зрения это означает, что язык программирования является полным по Тьюрингу. МакЛеннан, Брюс Дж. (1987). Принципы языков программирования . Издательство Оксфордского университета. п. 1. ISBN 978-0-19-511306-8 .
- ^ Р. Нарасимхан, Языки программирования и компьютеры: унифицированная метатеория, стр. 189–247 в книге Франца Альта, Морриса Рубиноффа (ред.) «Достижения в области компьютеров», том 8, Academic Press, 1994, ISBN 0-12-012108-5 , стр. 215: «[...] модель [...] для компьютерных языков отличается от модели [...] для языков программирования только в двух отношениях. В компьютерном языке существует лишь конечное число имен (или регистров), которые могут принимать лишь конечное число значений (или состояний), и эти состояния далее не различаются с точки зрения каких-либо других атрибутов [сноска автора:] Это может звучать как трюизм, но его последствия таковы. Например, это будет означать, что любая модель языков программирования, фиксируя определенные ее параметры или особенности, должна быть естественным образом сведена к модели компьютерных языков».
- ^ Джон К. Рейнольдс, «Некоторые мысли об обучении программированию и языкам программирования», SIGPLAN Уведомления , том 43, выпуск 11, ноябрь 2008 г., стр.109
- ^ Бен Ари, Мордехай (1996). Понимание языков программирования . Джон Уайли и сыновья.
Программы и языки можно определить как чисто формальные математические объекты. Однако больше людей интересуются программами, чем другими математическими объектами, такими как группы, именно потому, что можно использовать программу — последовательность символов — для управления работой компьютера. Хотя мы настоятельно рекомендуем изучать теорию программирования, этот текст обычно ограничивается изучением программ в том виде, в каком они выполняются на компьютере.
- ^ XML в 10 пунктах. Архивировано 6 сентября 2009 г. на Wayback Machine W3C , 1999 г.: «XML не является языком программирования».
- ^ Пауэлл, Томас (2003). HTML и XHTML: полный справочник . МакГроу-Хилл. п. 25. ISBN 978-0-07-222942-4 .
HTML не является языком программирования.
- ^ Дайкс, Люсинда; Титтель, Эд (2005). XML для чайников (4-е изд.). Уайли. п. 20 . ISBN 978-0-7645-8845-7 .
... это язык разметки, а не язык программирования.
- ^ «Что это за язык XSLT?» . IBM.com. 20 апреля 2005 г. Архивировано из оригинала 11 мая 2011 г.
- ^ «XSLT — это язык программирования» . Msdn.microsoft.com. Архивировано из оригинала 3 февраля 2011 года . Проверено 3 декабря 2010 г.
- ^ Скотт, Майкл (2006). Прагматика языков программирования . Морган Кауфманн . п. 802 . ISBN 978-0-12-633951-2 .
XSLT, хотя и узкоспециализирован для преобразования XML, является полным по Тьюрингу языком программирования.
- ^ Этикер, Тобиас; Партл, Хьюберт; Хина, Ирен; Шлегль, Элизабет (20 июня 2016 г.). «Не такое уж краткое введение в LATEX 2ε» (Версия 5.06) . tobi.oetiker.ch . стр. 1–157. Архивировано (PDF) из оригинала 14 марта 2017 г.
- ^ Сиропулос, Апостол; Антонис Цсоломитис; Ник Софрониу (2003). Цифровая типографика с использованием LaTeX . Спрингер-Верлаг. п. 213 . ISBN 978-0-387-95217-8 .
TeX — это не только превосходный механизм верстки, но и настоящий язык программирования.
- ^ Дэвид А. Шмидт, Структура типизированных языков программирования , MIT Press, 1994, ISBN 0-262-19349-3 , с. 32
- ^ Пирс, Бенджамин (2002). Типы и языки программирования . МТИ Пресс. п. 339 . ISBN 978-0-262-16209-8 .
- ^ Габбриелли и Мартини 2023 , с. 519.
- ^ Габбриелли и Мартини 2023 , стр. 520–521.
- ^ Перейти обратно: а б с Габбриелли и Мартини 2023 , с. 521.
- ^ Габбриелли и Мартини 2023 , с. 522.
- ^ Sebesta 2012 , p. 42.
- ^ Перейти обратно: а б с Габбриелли и Мартини 2023 , с. 524.
- ^ Sebesta 2012 , pp. 42–44.
- ^ Габбриелли и Мартини 2023 , стр. 523–524.
- ^ Габбриелли и Мартини 2023 , с. 527.
- ^ Перейти обратно: а б с Габбриелли и Мартини 2023 , с. 528.
- ^ «Как Лисп стал собственным языком программирования Бога» . сайт twobithistory.org . Архивировано из оригинала 10 апреля 2024 года . Проверено 10 апреля 2024 г.
- ^ Sebesta 2012 , pp. 47–48.
- ^ Габбриелли и Мартини 2023 , с. 526.
- ^ Sebesta 2012 , p. 50.
- ^ Sebesta 2012 , pp. 701–703.
- ^ Габбриелли и Мартини 2023 , стр. 524–525.
- ^ Sebesta 2012 , pp. 56–57.
- ^ Габбриелли и Мартини 2023 , с. 525.
- ^ Габбриелли и Мартини 2023 , стр. 526–527.
- ^ Габбриелли и Мартини 2023 , с. 531.
- ^ Перейти обратно: а б Sebesta 2012 , p. 79.
- ^ Габбриелли и Мартини 2023 , с. 530.
- ^ Габбриелли и Мартини 2023 , стр. 532–533.
- ^ Габбриелли и Мартини 2023 , с. 534.
- ^ Габбриелли и Мартини 2023 , стр. 534–535.
- ^ Габбриелли и Мартини 2023 , с. 535.
- ^ Sebesta 2012 , p. 736.
- ^ Габбриелли и Мартини 2023 , с. 536.
- ^ Габбриелли и Мартини 2023 , стр. 536–537.
- ^ Sebesta 2012 , pp. 91–92.
- ^ Габбриелли и Мартини 2023 , стр. 538–539.
- ^ Sebesta 2012 , pp. 97–99.
- ^ Габбриелли и Мартини 2023 , с. 542.
- ^ Габбриелли и Мартини 2023 , стр. 474–475, 477, 542.
- ^ Габбриелли и Мартини 2023 , стр. 542–543.
- ^ Габбриелли и Мартини 2023 , с. 544.
- ^ Безансон Дж., Карпински С., Шах В.Б. и Эдельман А., 2012. Джулия: Быстрый динамический язык для технических вычислений. Препринт arXiv arXiv:1209.5145.
- ^ Аюни М. и Аюни М., 2020. Типы данных в кольце. Начало кольцевого программирования: от новичка до профессионала, стр. 51–98.
- ^ Саес-Лопес, Х.М., Роман-Гонсалес, М. и Васкес-Кано, Э., 2016. Языки визуального программирования, интегрированные в учебную программу в начальной школе: двухлетнее тематическое исследование с использованием «Scratch» в пяти школах. Компьютеры и образование, 97, стр. 129–141.
- ^ Файед, М.С., Аль-Куриши, М., Аламри, А. и Аль-Дарайсе, А.А., 2017, март. PWCT: визуальный язык для приложений и систем Интернета вещей и облачных вычислений. В материалах Второй международной конференции по Интернету вещей, данным и облачным вычислениям (стр. 1–5).
- ^ Кодоски, Дж., 2020. LabVIEW. Труды ACM по языкам программирования, 4 (HOPL), стр. 1–54.
- ^ Фернандо А. и Варусавитана Л., 2020. Начало программирования балерин: от новичка до профессионала. Апресс.
- ^ Балупритвирадж, К.Н., Бхарати, К.Р., Чендхуран, С. и Локешваран, П., 2021, март. Умная дверь на основе искусственного интеллекта с обнаружением маски для лица. В 2021 году пройдет Международная конференция по искусственному интеллекту и интеллектуальным системам (ICAIS) (стр. 543-548). IEEE.
- ^ Сьюэлл, Б., 2015. Чертежи визуальных сценариев для Unreal Engine. ООО «Пакт Паблишинг»
- ^ Бертолини, Л., 2018. Практическая разработка игр без программирования: создавайте 2D- и 3D-игры с помощью визуальных сценариев в Unity. ООО «Пакт Паблишинг»
- ^ Майкл Сипсер (1996). Введение в теорию вычислений . Издательство ПВС. ISBN 978-0-534-94728-6 . Раздел 2.2: Автоматы с опусканием вниз, стр. 101–114.
- ^ Джеффри Кеглер, « Perl и неразрешимость. Архивировано 17 августа 2009 г. в Wayback Machine », The Perl Review . Статьи 2 и 3 доказывают, используя соответственно теорему Райса и прямое сведение к проблеме остановки , что синтаксический анализ Perl-программ в общем случае неразрешим.
- ^ Марти Холл, 1995, Конспекты лекций: Макросы. Архивировано 6 августа 2013 г. в Wayback Machine . PostScript. Версия Архивировано 17 августа 2000 г. в Wayback Machine.
- ^ Майкл Ли Скотт, Прагматика языка программирования , издание 2, Морган Кауфманн, 2006 г., ISBN 0-12-633951-1 , с. 18–19
- ^ Sebesta 2012 , p. 244.
- ^ Sebesta 2012 , p. 245.
- ^ Перейти обратно: а б с д Эндрю Кук. «Введение в компьютерные языки» . Архивировано из оригинала 15 августа 2012 года . Проверено 13 июля 2012 г.
- ^ Sebesta 2012 , pp. 15, 408–409.
- ^ Sebesta 2012 , pp. 303–304.
- ^ Sebesta 2012 , pp. 246–247.
- ^ Sebesta 2012 , p. 249.
- ^ Sebesta 2012 , p. 260.
- ^ Sebesta 2012 , p. 250.
- ^ Sebesta 2012 , p. 254.
- ^ Sebesta 2012 , pp. 281–282.
- ^ Sebesta 2012 , pp. 272–273.
- ^ Sebesta 2012 , pp. 276–277.
- ^ Sebesta 2012 , p. 280.
- ^ Sebesta 2012 , pp. 289–290.
- ^ Sebesta 2012 , p. 255.
- ^ Sebesta 2012 , pp. 244–245.
- ^ Sebesta 2012 , p. 477.
- ^ Sebesta 2012 , p. 211.
- ^ Лейвант, Дэниел (1983). Вывод полиморфного типа . Симпозиум ACM SIGACT-SIGPLAN по принципам языков программирования. Остин, Техас: ACM Press. стр. 88–98. дои : 10.1145/567067.567077 . ISBN 978-0-89791-090-3 .
- ^ Sebesta 2012 , pp. 212–213.
- ^ Sebesta 2012 , pp. 284–285.
- ^ Sebesta 2012 , p. 576.
- ^ Sebesta 2012 , p. 579.
- ^ Sebesta 2012 , p. 585.
- ^ Sebesta 2012 , pp. 585–586.
- ^ Sebesta 2012 , pp. 630, 634.
- ^ Sebesta 2012 , p. 635.
- ^ Перейти обратно: а б Sebesta 2012 , p. 631.
- ^ Sebesta 2012 , p. 261.
- ^ Sebesta 2012 , p. 632.
- ^ Sebesta 2012 , pp. 631, 635–636.
- ^ Sebesta 2012 , p. 18.
- ^ Sebesta 2012 , p. 19.
- ^ Нофре, Пристли и Альбертс 2014 , с. 55.
- ^ Нофре, Пристли и Альбертс 2014 , с. 60.
- ^ Sebesta 2012 , p. 8.
- ^ Sebesta 2012 , pp. 16–17.
- ^ Sebesta 2012 , pp. 8–9.
- ^ Sebesta 2012 , pp. 9–10.
- ^ Sebesta 2012 , pp. 12–13.
- ^ Sebesta 2012 , p. 13.
- ^ Sebesta 2012 , pp. 14–15.
- ^ Фредерик П. Брукс-младший: Мифический человеко-месяц , Аддисон-Уэсли, 1982, стр. 93–94.
- ^ Басби, Кеннет Лерой; Брауншвейг, Дэйв (15 декабря 2018 г.). «Стандартные библиотеки» . Основы программирования — модульный структурированный подход . Проверено 27 января 2024 г.
- ^ Sebesta 2012 , p. 15.
- ^ Sebesta 2012 , pp. 8, 16.
- ^ Sebesta 2012 , pp. 18, 23.
- ^ Перейти обратно: а б Sebesta 2012 , p. 23.
- ^ Дейкстра, Эдсгер В. О глупости «программирования на естественном языке». Архивировано 20 января 2008 года на Wayback Machine EWD667.
- ^ Перлис, Алан (сентябрь 1982 г.). «Эпиграммы о программировании» . Уведомления SIGPLAN Vol. 17, № 9 . стр. 7–13. Архивировано из оригинала 17 января 1999 года.
- ^ Милнер, Р .; М. Тофте ; Р. Харпер ; Д. МакКуин (1997). Определение стандарта ОД (пересмотренного) . МТИ Пресс. ISBN 978-0-262-63181-5 .
- ^ Келси, Ричард; Уильям Клингер; Джонатан Рис (февраль 1998 г.). «Раздел 7.2 Формальная семантика» . Пересмотренный 5 Отчет об алгоритмической языковой схеме . Архивировано из оригинала 6 июля 2006 года.
- ^ ANSI - Язык программирования Rexx, X3-274.1996
- ^ Sebesta 2012 , pp. 23–24.
- ^ Sebesta 2012 , pp. 25–27.
- ^ Sebesta 2012 , p. 27.
- ^ Sebesta 2012 , p. 28.
- ^ Sebesta 2012 , pp. 29–30.
- ^ См.: Oracle America, Inc. против Google, Inc. [ источник, созданный пользователем ]
- ^ «Руководство по языкам программирования | ComputerScience.org» . ComputerScience.org . Архивировано из оригинала 13 мая 2018 года . Проверено 13 мая 2018 г.
- ^ «Основы» . IBM.com . 10 мая 2011 г. Архивировано из оригинала 14 мая 2018 г. . Проверено 13 мая 2018 г.
- ^ Абдельазиз, Абдулла И.; Хэнсон, Кент А.; Габер, Чарльз Э.; Ли, Тодд А. (2023). «Оптимизация анализа больших реальных данных с помощью файлов паркета в R: пошаговое руководство» . Фармакоэпидемиология и безопасность лекарственных средств . 33 (3): e5728. дои : 10.1002/pds.5728 . ПМИД 37984998 .
- ^ «HOPL: интерактивный список языков программирования» . Австралия: Университет Мердока . Архивировано из оригинала 20 февраля 2011 года . Проверено 1 июня 2009 г.
На этом сайте перечислено 8512 языков.
- ^ Майер, Филип; Бауэр, Александр (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. Выводы: Многоязычное программирование, по-видимому, является обычным явлением в проектах с открытым исходным кодом и является фактором, который необходимо учитывать при разработке инструментов и при оценке разработки и сопровождения таких программных систем.
- ^ Абельсон, Сассман и Сассман. «Структура и интерпретация компьютерных программ» . Архивировано из оригинала 26 февраля 2009 года . Проверено 3 марта 2009 г.
{{cite web}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ Вики, Браун; Морен, Рич (1999). «Скриптовые языки» . МакТех . Архивировано из оригинала 2 декабря 2017 года.
- ^ Джорджина Свон (21 сентября 2009 г.). «КОБОЛУ» исполняется 50 лет . Компьютерный мир. Архивировано из оригинала 19 октября 2013 года . Проверено 19 октября 2013 г.
- ^ Эд Эйри (3 мая 2012 г.). «Разоблачение 7 мифов о COBOL» . разработчик.com. Архивировано из оригинала 19 октября 2013 года . Проверено 19 октября 2013 г.
- ^ Николас Энтикнап. «Еженедельный обзор зарплат в сфере SSL/Computer в сфере ИТ: финансовый бум стимулирует рост рабочих мест в сфере ИТ» . Компьютерный еженедельник . Архивировано из оригинала 26 октября 2011 года . Проверено 14 июня 2013 г.
- ^ «Подсчет языков программирования по продажам книг» . Радар.oreilly.com. 2 августа 2006 г. Архивировано из оригинала 17 мая 2008 г.
- ^ Биман, Дж. М.; Мердок, В., Поиск кода во Всемирной паутине: предварительное расследование, Материалы первого международного семинара IEEE по анализу и манипулированию исходным кодом, 2001 г.
- ^ «Самые популярные и влиятельные языки программирования 2018 года» . stackify.com. 18 декабря 2017 года. Архивировано из оригинала 30 августа 2018 года . Проверено 29 августа 2018 г. .
- ^ «Индекс ТИОБЕ» . Проверено 24 июня 2024 г.
- ^ Sebesta 2012 , p. 21.
- ^ Перейти обратно: а б Sebesta 2012 , pp. 21–22.
- ^ Sebesta 2012 , p. 12.
- ^ Sebesta 2012 , p. 22.
- ^ Sebesta 2012 , pp. 22–23.
Дальнейшее чтение
[ редактировать ]- Абельсон, Гарольд ; Сассман, Джеральд Джей (1996). Структура и интерпретация компьютерных программ (2-е изд.). МТИ Пресс. Архивировано из оригинала 9 марта 2018 года.
- Рафаэль Финкель : Проектирование продвинутого языка программирования , Аддисон Уэсли, 1995.
- Дэниел П. Фридман , Митчелл Ванд , Кристофер Т. Хейнс : Основы языков программирования , MIT Press, 2001.
- Дэвид Гелернтер , Суреш Джаганнатан : Лингвистика программирования , MIT Press 1990.
- Эллис Горовиц (редактор): Языки программирования, большой тур (3-е изд.), 1987.
- Эллис Горовиц: Основы языков программирования , 1989.
- Шрирам Кришнамурти : Языки программирования: применение и интерпретация , онлайн-публикация. Архивировано 30 апреля 2021 года в Wayback Machine .
- Габбриелли, Маурицио; Мартини, Симона (2023). Языки программирования: принципы и парадигмы (2-е изд.). Спрингер. ISBN 978-3-031-34144-1 .
- Брюс Дж. МакЛеннан : Принципы языков программирования: проектирование, оценка и реализация , Oxford University Press , 1999.
- Джон К. Митчелл : Концепции языков программирования , Cambridge University Press, 2002.
- Нофре, Дэвид; Пристли, Марк; Альбертс, Джерард (2014). «Когда технология стала языком: истоки лингвистической концепции компьютерного программирования, 1950–1960» . Технологии и культура . 55 (1): 40–75. ISSN 0040-165X .
- Бенджамин К. Пирс : Типы и языки программирования , MIT Press, 2002.
- Терренс В. Пратт и Марвин Виктор Зелковиц : Языки программирования: проектирование и реализация (4-е изд.), Prentice Hall 2000.
- Питер Х. Салус . Справочник по языкам программирования (4 тома). Макмиллан 1998.
- Рави Сетхи : Языки программирования: концепции и конструкции , 2-е изд., Аддисон-Уэсли, 1996.
- Майкл Л. Скотт : Прагматика языков программирования , Morgan Kaufmann Publishers, 2005.
- Себеста, Роберт В. (2012). Концепции языков программирования (10-е изд.). Аддисон-Уэсли. ISBN 978-0-13-139531-2 .
- Франклин Турбак и Дэвид Гиффорд с Марком Шелдоном: концепции дизайна в языках программирования , MIT Press, 2009.
- Питер Ван Рой и Сейф Хариди . Концепции, методы и модели компьютерного программирования , MIT Press, 2004.
- Дэвид А. Ватт . Концепции и парадигмы языка программирования . Прентис Холл 1990.
- Дэвид А. Ватт и Маффи Томас . Синтаксис и семантика языка программирования . Прентис Холл 1991.
- Дэвид А. Ватт. Языковые процессоры программирования . Прентис Холл 1993.
- Дэвид А. Ватт. Концепции проектирования языков программирования . Джон Уайли и сыновья 2004.
- Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. ISBN 0-201-71012-9 .