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

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

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

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

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

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

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

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

Функция и цель
Язык программирования является язык , используемый для записи компьютерных программ , которая включает в себя компьютер выполняя какие - то вычисления [4] или алгоритма и , возможно , управлять внешними устройствами , такими как принтеры , дисковые накопители , роботов , [5] и так далее. Например, PostScriptпрограммы часто создаются другой программой для управления компьютерным принтером или дисплеем. В более общем плане язык программирования может описывать вычисления на некоторой, возможно, абстрактной машине. Принято считать, что полная спецификация языка программирования включает описание, возможно, идеализированное, машины или процессора для этого языка. [6] В большинстве практических случаев язык программирования включает компьютер; следовательно, языки программирования обычно определяются и изучаются таким образом. [7] Языки программирования отличаются от естественных языков тем, что естественные языки используются только для взаимодействия между людьми, в то время как языки программирования также позволяют людям передавать инструкции машинам.
Абстракции
Языки программирования обычно содержат абстракции для определения структур данных и управления ими или управления потоком выполнения . Практическая необходимость, чтобы язык программирования поддерживал адекватные абстракции, выражается принципом абстракции . [8] Этот принцип иногда формулируется как рекомендация программисту правильно использовать такие абстракции. [9]
Выразительная сила
Теория вычисления классифицирует языки по вычислениям они способны выразить. Все полные языки Тьюринга могут реализовывать один и тот же набор алгоритмов . ANSI / ISO SQL-92 и Charity - это примеры языков, которые не являются полными по Тьюрингу, но их часто называют языками программирования. [10] [11]

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

Термин « компьютерный язык» иногда используется как синоним языка программирования. [20] Однако использование обоих терминов варьируется среди авторов, включая точную область применения каждого из них. Одно использование описывает языки программирования как подмножество компьютерных языков. [21] Точно так же языки, используемые в вычислениях, которые имеют другую цель, чем выражение компьютерных программ, обычно называются компьютерными языками. Например, языки разметки иногда называют компьютерными языками, чтобы подчеркнуть, что они не предназначены для использования в программировании. [22]

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

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

Ранние разработки [ править ]

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

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

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

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

Джон Мочли «s Сокращенный код , предложенный в 1949 году, был одним из первых языков высокого уровня , когда - либо для электронной вычислительной машины . [26] В отличие от машинного кода , операторы Short Code представляют математические выражения в понятной форме. Однако программу приходилось переводить в машинный код каждый раз при запуске, что делало процесс намного медленнее, чем выполнение эквивалентного машинного кода.

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

Второй автокод был разработан Р.А. Брукером для Mark 1 в 1954 году и назывался «Автокод Mark 1». Брукер также разработал автокод для Ferranti Mercury в 1950-х годах совместно с Манчестерским университетом. Версия для EDSAC 2 был разработан DF Хартли из Кембриджского университета математической лаборатории в 1961 г. Известный как EDSAC 2 AutoCode, это была прямая разработка от Mercury AutoCode адаптирована для местных условий и было отмечено , для ее оптимизации объектного кода и исходного языка- диагностика, передовая для того времени. Атлас Autocode, современный, но отдельный поток разработки, был разработан для Манчестерского университета.Машина Атлас 1 .

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

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

Уточнение [ править ]

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

В период с 1960-х до конца 1970-х годов были разработаны основные языковые парадигмы, используемые сейчас:

  • APL представил программирование массивов и повлиял на функциональное программирование . [36]
  • Алгол усовершенствовал как структурированное процедурное программирование, так и дисциплину спецификации языка ; «Пересмотренный отчет по алгоритмическому языку ALGOL 60 » стал образцом того, как были написаны более поздние языковые спецификации.
  • Lisp , реализованный в 1958 году, был первым функциональным языком программирования с динамической типизацией .
  • В 1960-х Simula был первым языком, разработанным для поддержки объектно-ориентированного программирования ; в середине 1970-х за ним последовал Smalltalk , выпустивший первый «чисто» объектно-ориентированный язык.
  • C был разработан между 1969 и 1973 годами как язык системного программирования для операционной системы Unix и остается популярным. [37]
  • Prolog , разработанный в 1972 году, был первым языком логического программирования .
  • В 1978 году ML построил систему полиморфных типов на основе Lisp , став пионером в языках функционального программирования со статической типизацией .

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

В 1960-х и 1970-х годах также велись серьезные споры о достоинствах структурного программирования и о том, следует ли разрабатывать языки программирования для его поддержки. [38] Эдсгер Дейкстра в известном письме 1968 года, опубликованном в « Коммуникациях ACM» , утверждал, что операторы Goto должны быть исключены из всех языков программирования «более высокого уровня». [39]

Консолидация и рост [ править ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В этой грамматике указывается следующее:

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

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

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

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

  • « Бесцветные зеленые идеи яростно спят ». грамматически правильно сформирован, но не имеет общепринятого значения.
  • «Джон женатый холостяк». грамматически правильно сформирован, но выражает значение, которое не может быть истинным.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Дизайн и реализация [ править ]

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

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

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

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

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

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

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

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

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

  • Явное определение синтаксиса, статической семантики и семантики исполнения языка. Хотя синтаксис обычно определяется с использованием формальной грамматики, семантические определения могут быть написаны на естественном языке (например, как в языке C ) или формальной семантике (например, как в спецификациях Standard ML [57] и Scheme [58] ).
  • Описание поведения переводчика языка (например, спецификации C ++ и Fortran ). Синтаксис и семантика языка должны быть выведены из этого описания, которое может быть написано на естественном или формальном языке.
  • Справочник или модель реализации , иногда написанный на языке уточняются (например, Пролог или ANSI REXX [59] ). Синтаксис и семантика языка явно указаны в поведении эталонной реализации.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Бурный рост диалектов Форта привел к появлению поговорки: «Если вы видели один Форт ... вы видели один Форт».

Таксономии [ править ]

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

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

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

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

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

  • Сравнение языков программирования (основные инструкции)
  • Сравнение языков программирования
  • Компьютерное программирование
  • Информатика и Основы информатики
  • Доменный язык
  • Доменно-ориентированное моделирование
  • Образовательный язык программирования
  • Эзотерический язык программирования
  • Расширяемое программирование
  • Категория: Языки программирования с расширяемым синтаксисом
  • Инвариантное программирование
  • Список ОСНОВНЫХ диалектов
  • Списки языков программирования
  • Список исследователей языков программирования
  • Языки программирования, используемые на самых популярных веб-сайтах
  • Языко-ориентированное программирование
  • Логическое программирование
  • Грамотное программирование
  • Метапрограммирование
    • Ruby (язык программирования) § Метапрограммирование
  • Язык моделирования
  • Теория языка программирования
  • Псевдокод
  • Rebol § Диалекты
  • Отражение
  • Язык научного программирования
  • Язык сценариев
  • Программная инженерия и Список тем программной инженерии

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

  1. ^ Эттингер, Джеймс (2004) Сеть Жаккарда , Oxford University Press
  2. ^ a b c Aaby, Энтони (2004). Введение в языки программирования . Архивировано из оригинала 8 ноября 2012 года . Проверено 29 сентября 2012 года .
  3. ^ С математической точки зрения это означает, что языком программирования является полный по Тьюрингу MacLennan, Bruce J. (1987). Принципы языков программирования . Издательство Оксфордского университета. п. 1. ISBN 978-0-19-511306-8.
  4. ^ ACM SIGPLAN (2003). «Постановление Специальной группы по языкам программирования Ассоциации вычислительной техники» . Архивировано 22 июня 2006 года., "Сфера применения SIGPLAN - это теория, дизайн, реализация, описание и применение языков компьютерного программирования - языков, которые позволяют специфицировать множество различных вычислений, тем самым предоставляя пользователю значительный контроль (немедленный или отложенный) над компьютером операция ".
  5. ^ Дин, Том (2002). «Программирование роботов» . Создание интеллектуальных роботов . Кафедра компьютерных наук Университета Брауна. Архивировано 29 октября 2006 года.
  6. ^ Р. Нарасимахан, Языки программирования и компьютеры: унифицированная метатеория, стр. 189–247 у Франца Альт, Морриса Рубиноффа (ред.) «Достижения компьютеров», Том 8, Academic Press, 1994, ISBN 0-12-012108-5 , стр.193: «Полная спецификация языка программирования должна по определению включать спецификацию процессора - если хотите, идеализированного - для этого языка». [источник цитирует множество ссылок в поддержку этого утверждения] 
  7. Бен Ари, Мордехай (1996). Понимание языков программирования . Джон Уайли и сыновья. Программы и языки можно определить как чисто формальные математические объекты. Однако больше людей интересуются программами, чем другими математическими объектами, такими как группы, именно потому, что можно использовать программу - последовательность символов - для управления работой компьютера. Хотя мы настоятельно рекомендуем изучать теорию программирования, этот текст, как правило, ограничивается изучением программ, выполняемых на компьютере.
  8. ^ Дэвид А. Шмидт, Структура типизированных языков программирования , MIT Press, 1994, ISBN 0-262-19349-3 , стр. 32 
  9. ^ Пирс, Бенджамин (2002). Типы и языки программирования . MIT Press. п. 339 . ISBN 978-0-262-16209-8.
  10. ^ Digital Equipment Corporation. «Информационные технологии - язык баз данных SQL (предлагаемый пересмотренный текст DIS 9075)» . ИСО / МЭК 9075: 1992, Язык баз данных SQL . Архивировано 21 июня 2006 года . Источник +29 Июня 2006 .
  11. ^ The Charity Development Group (декабрь 1996 г.). "Домашняя страница БЛАГОТВОРИТЕЛЬНОСТИ" . Архивировано 18 июля 2006 года., «Charity - это категориальный язык программирования ...», «Все вычисления Charity прекращаются».
  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. ^ Oetiker, Тобиас; Партль, Юбер; Хайна, Ирэн; Шлегль, Элизабет (20 июня 2016 г.). «Не такое уж краткое введение в LATEX 2ε» (версия 5.06) . tobi.oetiker.ch . С. 1–157. Архивировано 14 марта 2017 года (PDF) .
  19. ^ Сиропулос, Апостолос; Антонис Цоломитис; Ник Софрониу (2003). Цифровая типографика с использованием LaTeX . Springer-Verlag. п. 213 . ISBN 978-0-387-95217-8. TeX - это не только отличный инструмент для набора текста, но и настоящий язык программирования.
  20. Роберт А. Эдмундс, Стандартный глоссарий компьютерной терминологии Прентис-Холла, Прентис-Холл, 1985, стр. 91
  21. ^ Паскаль Ландо, Энн Lapujade, Жиль Кассель, и Фредерик Fürst, на пути к общей онтологии компьютерных программ архивной 7 июля 2015 в Wayback Machine , ICSOFT 2007 архивации 27 апреля 2010 в Wayback Machine , стр. 163-170
  22. ^ С. К. Баджпай, Введение в компьютеры и программирование на языке C , New Age International, 2007, ISBN 81-224-1379-X , стр. 346 
  23. ^ Р. Нарасимахан, Языки программирования и компьютеры: унифицированная метатеория, стр. 189–247 у Франца Альт, Морриса Рубиноффа (ред.) Достижения в компьютерах, Том 8, Academic Press, 1994, ISBN 0-12-012108-5 , стр.215: «[...] модель [...] компьютерных языков отличается от модели [...] языков программирования только в двух отношениях. В компьютерном языке существует лишь конечное число имен - или регистры, которые могут принимать только конечное число значений или состояний, и эти состояния не различаются в дальнейшем с точки зрения каких-либо других атрибутов. [сноска автора:] Это может звучать как трюизм, но его последствия имеют далеко идущие последствия. Например, это будет подразумевают, что любая модель для языков программирования, фиксируя определенные ее параметры или особенности, должна быть естественным образом сведена к модели для компьютерных языков ".
  24. ^ Джон С. Рейнольдс, «Некоторые мысли об обучении программированию и языкам программирования», Уведомления SIGPLAN , том 43, выпуск 11, ноябрь 2008 г., стр.109
  25. ^ Рохас, Рауль и др. (2000). «Планкалкюль: первый язык программирования высокого уровня и его реализация». Institut für Informatik, Freie Universität Berlin, Технический отчет B-3/2000. (полный текст) Архивировано 18 октября 2014 года в Wayback Machine.
  26. ^ Себеста, WS Концепции языков программирования. 2006; M6 14:18 с.44. ISBN 0-321-33025-0 
  27. ^ Кнут, Дональд Э .; Пардо, Луис Трабб. «Раннее развитие языков программирования». Энциклопедия компьютерных наук и технологий . 7 : 419–493.
  28. ^ Питер Дж. Бентли (2012). Оцифровано: Наука о компьютерах и как она формирует наш мир . Издательство Оксфордского университета. п. 87. ISBN 9780199693795. Архивировано 29 августа 2016 года.
  29. ^ «Создатель Fortran Джон Бэкус умирает - Технология и гаджеты» . NBC News. 20 марта 2007 . Проверено 25 апреля 2010 года .
  30. ^ "CSC-302 99S: Класс 02: Краткая история языков программирования" . Math.grin.edu. Архивировано 15 июля 2010 года . Проверено 25 апреля 2010 года .
  31. Юджин Ло (18 июня 2010 г.). «Идеальный язык программирования HPC» . Очередь . 8 (6). Архивировано 4 марта 2016 года.
  32. ^ «HPL - портативная реализация высокопроизводительного теста Linpack для компьютеров с распределенной памятью» . Архивировано 15 февраля 2015 года . Проверено 21 февраля 2015 года .
  33. ^ Хоппер (1978) стр. 16.
  34. ^ Саммет (1969) стр. 316
  35. ^ Саммет (1978) стр. 204.
  36. ^ Ричард Л. Вексельблат: История языков программирования , Academic Press, 1981, глава XIV.
  37. ^ Франсуа Лабель. «График использования языка программирования» . SourceForge . Архивировано 17 июня 2006 года . Проверен 21 Июнь 2006 .. В этом сравнении анализируются тенденции в количестве проектов, размещенных в популярном репозитории программного обеспечения сообщества. В течение большинства лет сравнения C со значительным отрывом лидирует; в 2006 году Java обгоняет C, но комбинация C / C ++ по-прежнему значительно лидирует.
  38. ^ Хейс, Брайан (2006). «Войны с запятой». Американский ученый . 94 (4): 299–303. DOI : 10.1511 / 2006.60.299 .
  39. ^ Дейкстра, Эдсгер W. (март 1968). «Перейти к заявлению, которое считается вредным» (PDF) . Коммуникации ACM . 11 (3): 147–148. DOI : 10.1145 / 362929.362947 . S2CID 17469809 . Архивировано 13 мая 2014 года (PDF) .  
  40. ^ Тетсеро Fujise, Takashi Chikayama, Кадзуаки Rokusawa, Акихико Nakase (декабрь 1994). "KLIC: переносимая реализация KL1" Proc. of FGCS '94, ICOT Tokyo, December 1994. « Архивная копия» . Архивировано из оригинального 25 сентября 2006 года . Проверено 9 октября 2006 года .CS1 maint: заархивированная копия как заголовок ( ссылка )KLIC - это переносимая реализация языка параллельного логического программирования KL1 .
  41. Джим Бендер (15 марта 2004 г.). «Мини-библиография по модулям для языков функционального программирования» . ReadScheme.org . Архивировано 24 сентября 2006 года.
  42. ^ Майкл Сипсер (1996). Введение в теорию вычислений . PWS Publishing. ISBN 978-0-534-94728-6. Раздел 2.2: Автоматические выталкиватели, стр.101–114.
  43. ^ Джеффри Кеглер, " Perl и неразрешимости архивации 17 августа 2009 в Wayback Machine ", The Perl Review . В статьях 2 и 3 доказывается, используя соответственно теорему Райса и прямую редукцию к проблеме остановки , что синтаксический анализ программ Perl в общем случае неразрешим.
  44. ^ Marty Hall, 1995, Lecture Notes: Макросы Archived 6 августа 2013 года на Wayback Machine , PostScript версии архивированных 17 августа 2000 года на Wayback Machine
  45. ^ Майкл Ли Скотт, Прагматика языков программирования , издание 2, Морган Кауфманн, 2006, ISBN 0-12-633951-1 , стр. 18–19 
  46. ^ Б с д е е г Эндрю Кук. «Введение в компьютерные языки» . Архивировано 15 августа 2012 года . Проверено 13 июля 2012 года .
  47. ^ В частности,для определенных форм выражения выводятсяэкземпляры универсальных типов. Вывод типа в Generic Java - исследовательском языке, который обеспечил основу длярасширенийограниченного параметрического полиморфизма Java 1.5- обсуждается в двух неофициальных рукописях из списка рассылки Types: Выведение типов в Generic Java не обосновано. Архивировано 29 января 2007 г. в Wayback Machine ( Алан Джеффри , 17 декабря 2001 г.) и логический вывод типа Java. Архивировано 29 января 2007 г. на Wayback Machine ( Мартин Одерски., 15 января 2002 г.). Система типов C # похожа на систему Java и использует аналогичную схему частичного вывода типов.
  48. ^ «Пересмотренный отчет по алгоритмической языковой схеме» . 20 февраля 1998 года. Архивировано 14 июля 2006 года.
  49. ^ Лука Карделли и Питер Вегнер . «О понимании типов, абстракции данных и полиморфизма» . Рукопись (1985) . Архивировано 19 июня 2006 года.
  50. ^ Стивен Р. Фишер, История языка , Reaktion Books, 2003, ISBN 1-86189-080-X , стр. 205 
  51. ^ Эрик Левенес (2011). «История компьютерных языков» . Архивировано 7 января 2006 года.
  52. ^ Цзин Хуан. «Искусственный язык против естественного языка» . Архивировано 3 сентября 2009 года.
  53. ^ IBM, впервые опубликовав PL / I, например, довольно амбициозно назвала свое руководство Универсальным языком программирования PL / I (IBM Library; 1966). Название отражает цели IBM в отношении неограниченных возможностей создания подмножеств: «PL / I разработан таким образом, чтобы можно было изолировать от него подмножества, удовлетворяя требованиям конкретных приложений». ( "PL / I" . Encyclopedia of Mathematics . Архивировано 26 апреля 2012 года . Проверено 29 июня 2006 года .). У Ады и UNCOL были похожие первоначальные цели.
  54. Фредерик П. Брукс, младший: Мифический человеко-месяц , Эддисон-Уэсли, 1982, стр. 93–94.
  55. ^ Дейкстра, Эдсгер В. О глупости «программирования на естественном языке». Архивировано 20 января 2008 года на Wayback Machine EWD667.
  56. Перлис, Алан (сентябрь 1982 г.). «Эпиграммы по программированию» . Уведомления SIGPLAN Vol. 17, № 9 . С. 7–13. Архивировано 17 января 1999 года.
  57. ^ Милнер, Р .; М. Тофте ; Р. Харпер ; Д. Маккуин (1997). Определение Standard ML (пересмотренное) . MIT Press. ISBN 978-0-262-63181-5.
  58. ^ Келси, Ричард; Уильям Клингер; Джонатан Рис (февраль 1998 г.). «Раздел 7.2 Формальная семантика» . Пересмотренный отчет 5 по алгоритмической языковой схеме . Архивировано 6 июля 2006 года.
  59. ^ ANSI - язык программирования Rexx, X3-274.1996
  60. ^ Стив, МакКоннелл (2004). Код завершен (Второе изд.). Редмонд, Вашингтон. С.  590, 600 . ISBN 0735619670. OCLC  54974573 .
  61. ^ См .: Oracle America, Inc. против Google, Inc.
  62. ^ "Руководство по языкам программирования | ComputerScience.org" . ComputerScience.org . Проверено 13 мая 2018 .
  63. ^ «Основы» . ibm.com . 10 мая 2011г . Проверено 13 мая 2018 .
  64. ^ «HOPL: интерактивный список языков программирования» . Австралия: Университет Мердока . Архивировано из оригинального 20 февраля 2011 года . Проверено 1 июня 2009 года . На этом сайте перечислены 8512 языков.
  65. ^ Майер, Филип; Бауэр, Александр (2015). Эмпирический анализ использования нескольких языков программирования в проектах с открытым исходным кодом . Труды 19-й Международной конференции по оценке и оценке в программной инженерии - EASE '15. Нью-Йорк, Нью-Йорк, США: ACM. С. 4: 1–4: 10. DOI : 10.1145 / 2745802.2745805 . ISBN 978-1-4503-3350-4. Результаты: мы обнаружили (а) в среднем 5 языков на проект с явно доминирующим основным языком общего назначения и 5 часто используемых типов DSL, (б) значительное влияние на размер, количество коммитов и основной язык. на количество языков, а также на отсутствие значительного влияния возраста и количества участников, и (c) три языковые экосистемы, сгруппированные вокруг XML, Shell / Make и HTML / CSS. Выводы: многоязычное программирование, по-видимому, является обычным явлением в проектах с открытым исходным кодом и является фактором, который необходимо учитывать при разработке инструментов и при оценке разработки и сопровождения таких программных систем.
  66. ^ Абельсон, Сассмен и Сассмен. «Структура и интерпретация компьютерных программ» . Архивировано из оригинального 26 февраля 2009 года . Проверено 3 марта 2009 года .CS1 maint: несколько имен: список авторов ( ссылка )
  67. Перейти ↑ Brown Vicki (1999). «Языки сценариев» . mactech.com . Архивировано 2 декабря 2017 года.
  68. Джорджина Свон (21 сентября 2009 г.). «COBOL исполняется 50 лет» . computerworld.com.au. Архивировано 19 октября 2013 года . Проверено 19 октября 2013 года .
  69. Эд Эйри (3 мая 2012 г.). «7 мифов о COBOL развенчаны» . developer.com. Архивировано 19 октября 2013 года . Проверено 19 октября 2013 года .
  70. ^ Николас Энтикнап. «Еженедельный опрос ИТ-зарплат по протоколу SSL / Computer: финансовый бум способствует росту рабочих мест в ИТ» . Computer Weekly . Архивировано 26 октября 2011 года . Проверено 14 июня 2013 года .
  71. ^ "Подсчет языков программирования по продажам книг" . Radar.oreilly.com. 2 августа 2006 Архивировано из оригинального 17 мая 2008.
  72. ^ Биман, JM; Мердок В., Поиск кода во всемирной паутине: предварительное расследование, Первый международный семинар IEEE по анализу исходного кода и манипуляции с ним, 2001 г.
  73. ^ «Самые популярные и влиятельные языки программирования 2018 года» . stackify.com. 18 декабря 2017 . Проверено 29 августа 2018 .
  74. ^ Карл А. Гюнтер, Семантика языков программирования: структуры и методы , MIT Press, 1992, ISBN 0-262-57095-5 , стр. 1 
  75. ^ "НАСТРОЙКИ: Языки программирования" . Архивировано 20 октября 2007 года.
  76. ^ Вирт, Никлаус (1993). «Воспоминания о развитии Паскаля». Вторая конференция ACM SIGPLAN по истории языков программирования - HOPL-II . Proc. 2-я конференция ACM SIGPLAN по истории языков программирования . 28 . С. 333–342. CiteSeerX 10.1.1.475.6989 . DOI : 10.1145 / 154766.155378 . ISBN  978-0-89791-570-0. S2CID  9783524 .

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

  • Абельсон, Гарольд ; Суссман, Джеральд Джей (1996). Структура и интерпретация компьютерных программ (2-е изд.). MIT Press. Архивировано из оригинала 9 марта 2018 года.
  • Рафаэль Финкель : Advanced Programming Language Design , Addison Wesley, 1995.
  • Дэниел П. Фридман , Митчелл Уэнд , Кристофер Т. Хейнс : Основы языков программирования , MIT Press 2001.
  • Маурицио Габбриелли и Симоне Мартини: «Языки программирования: принципы и парадигмы», Springer, 2010.
  • Дэвид Гелернтер , Суреш Джаганнатан : лингвистика программирования , MIT Press, 1990.
  • Эллис Горовиц (редактор): языки программирования, большой тур (3-е изд.), 1987.
  • Эллис Хоровиц: Основы языков программирования , 1989.
  • Шрирам Кришнамурти : Языки программирования: применение и интерпретация , онлайн-публикация .
  • Брюс Дж. Макленнан : Принципы языков программирования: дизайн, оценка и реализация , Oxford University Press, 1999.
  • Джон С. Митчелл : Концепции языков программирования , Cambridge University Press, 2002.
  • Бенджамин С. Пирс : типы и языки программирования , MIT Press, 2002.
  • Терренс В. Пратт и Марвин В. Зельковиц : Языки программирования: проектирование и реализация (4-е изд.), Prentice Hall 2000.
  • Питер Х. Салус . Справочник по языкам программирования (4 тт.). Макмиллан 1998.
  • Рави Сетхи : Языки программирования: концепции и конструкции , 2-е изд., Addison-Wesley 1996.
  • Майкл Л. Скотт : Прагматика языка программирования , издательство Morgan Kaufmann, 2005.
  • Роберт В. Себеста : концепции языков программирования , 9-е изд., Addison Wesley 2009.
  • Франклин Турбак и Дэвид Гиффорд с Марком Шелдоном : Концепции дизайна на языках программирования , MIT Press 2009.
  • Питер Ван Рой и Сейф Хариди . Концепции, методы и модели компьютерного программирования , MIT Press 2004.
  • Дэвид А. Ватт . Концепции и парадигмы языков программирования . Прентис Холл 1990.
  • Дэвид А. Ватт и Маффи Томас . Синтаксис и семантика языков программирования . Прентис Холл 1991.
  • Дэвид А. Ватт. Процессоры языков программирования . Прентис Холл 1993.
  • Дэвид А. Ватт. Концепции дизайна языка программирования . Джон Вили и сыновья 2004.

Внешние ссылки [ править ]