Смысл каждой команды и других конструкций языка программирования образует его

2007 Школа Википедия Выбор. Смежные дисциплины: Компьютерное программирование

Язык программирования-это искусственный язык. Который может использоваться для управления поведением машины. В частности компьютера. Языки программирования. Как и человеческие языки. Определяются с помощью синтаксических и семантических правил. Определяющих структуру и значение соответственно.

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

компьютерный язык

Были созданы тысячи различных языков программирования. И каждый год создаются новые.

Определения

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

  • Функция: Язык программирования-это язык. Используемый для написания компьютерных программ. Которые инструктируют компьютер выполнять какие-либо вычисления и/или организовывать поток управления между внешними устройствами (такими как принтер. Робот или любое периферийное устройство).
  • Цель: Языки программирования отличаются от

    естественных языков тем. Что естественные языки используются только для взаимодействия между людьми. В то время как языки программирования также позволяют людям передавать инструкции машинам. В некоторых случаях языки программирования используются одной программой или машиной для программирования другой; например. Исходный код PostScript часто генерируется программно для управления компьютерным принтером или дисплеем.

  • Конструкции: Языки программирования могут содержать конструкции для определения и управления структурами данных или для управления потоком выполнения.
  • Выразительная сила: Теория вычислений классифицирует языки по вычислениям. Которые они могут выражать (см.

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

Не Вычислительные языки. Такие как языки разметки, такие как HTML. Или формальные грамматики. Такие как BNF. Обычно не считаются языками программирования. Это обычный подход к встраиванию языка программирования в не вычислительный (хост) язык. Чтобы выразить

шаблоны для хост-языка.

Цель

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

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

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

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

Одной из общих тенденций в развитии языков программирования было добавление большего количества возможностей для решения задач с использованием более высокого уровня

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

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

Элементы

Синтаксис

Дерево синтаксического анализа кода Python с токенизацией inset

Увеличивать

Дерево синтаксического анализа кода Python с токенизацией inset

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

Увеличивать

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

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

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

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

expression ::= atom | list
atom  ::= number | symbol
number  ::= [+-]?['0'-'9']+
symbol  ::= ['A'-'Z''a'-'z'].*
list  ::= '(' expression* ')'

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

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

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

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

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

  • Бесцветные зеленые идеи неистово спят

Следующий фрагмент языка Си синтаксически корректен. Но выполняет операцию. Которая не определена семантически (поскольку p является нулевым указателем. Операции и не имеют никакого значения):

комплекс *p = NULL; 

Типовая система

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

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

Языки можно классифицировать по их типам систем.

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

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

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

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

Статическая и динамическая типизация

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

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

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

Слабый и сильный

Слабая типизация позволяет обрабатывать значение одного типа как другое, например. Обрабатывать строку как число. Иногда это может быть полезно. Но также может вызвать ошибки; такие языки часто называют небезопасными. C, C++и большинство языков ассемблера часто описываются как слабо типизированные.

Сильная типизация предотвращает вышесказанное. Попытка смешать типы вызывает ошибку. Строго типизированные языки часто называют типобезопасными или безопасными, но они не делают ошибки невозможными. Ada, Python и ML строго типизированы.

Альтернативное определение Perl, Javascript и C++, которые допускают большое количество неявных преобразований типов; Perl, в частности. Можно охарактеризовать как динамически типизированный язык программирования. В котором проверка типов может выполняться во время выполнения. См.Раздел Система типов. Эта возможность часто полезна. Но иногда опасна. Поскольку она позволяет выполнять операции. Объекты которых могут изменять тип по требованию.

Сильное и статическое обычно считаются ортогональными понятиями. Но использование в литературе различается. Некоторые используют термин строго. Статически типизированногоили, что еще более запутанно. Для обозначения просто статически типизированного. Таким образом, C был назван как сильно типизированным. Так и слабо. Статически типизированным..

Семантика выполнения

После того, как данные были заданы. Машина должна быть проинструктирована выполнять операции с данными. Семантика выполнения языка определяет. Как и когда различные конструкции языка должны производить поведение программы.

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

Основная библиотека

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

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

Практика

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

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

Спецификация языка программирования предназначена для предоставления определения. Которое пользователи языка и исполнители могут использовать для интерпретации поведения программ при чтении их исходного кода.

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

  • Явное определение синтаксиса и семантики языка. В то время как синтаксис обычно определяется с помощью формальной грамматики. Семантические определения могут быть написаны на естественном языке (например, язык Си) или на формальной семантике (например, стандартные спецификации ML и схемы).
  • Описание поведения переводчика для языка (например, C++ и Fortran). Синтаксис и семантика языка должны быть выведены из этого описания. Которое может быть написано на естественном или формальном языке.
  • Реализация модели, иногда написанная на указанном языке (например, Пролог). Синтаксис и семантика языка эксплицитны в поведении реализации модели.

Реализация

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

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

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

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

История

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

Увеличивать

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

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

Первые языки программирования появились еще до появления современного компьютера. В 19 веке существовали ткацкие станки и свитки пианино-плееров. Которые реализовывали то. Что сегодня признается примерами предметно-ориентированных языков программирования. К началу XX века перфокарты кодировали данные и направляли их механическую обработку. В 1930-х и 1940-х годах формализмы лямбда-исчисления Алонсо Черча и машин Тьюринга Алана Тьюринга обеспечивали математические абстракции для выражения алгоритмов; лямбда-исчисление остается влиятельным в языковом дизайне.

В 1940-х годах были созданы первые цифровые компьютеры с электрическим питанием. Компьютеры начала 1950-х годов, в частности UNIVAC I и IBM 701, использовали программы машинного языка. Программирование на машинном языке первого поколения было быстро вытеснено вторым поколением языков программирования. Известных как ассемблеры. Позже, в 1950-х годах. Программирование на ассемблере. Которое эволюционировало. Чтобы включить использование макроинструкций. Сопровождалось развитием трех современных языков программирования: FORTRAN, LISP и КОБОЛ. Обновленные версии всех этих языков до сих пор широко используются. И, что важно. Каждый из них сильно повлиял на развитие более поздних языков. В конце 1950-х годов был введен язык, формализованный как Algol 60, и большинство современных языков программирования во многих отношениях являются потомками Algol. Формат и использование ранних языков программирования сильно зависели от ограничений интерфейса.

Улучшение

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

  • APL ввел программирование массивови оказал влияние на функциональное программирование.
  • В 1960-х годах Simula был первым языком. Предназначенным для поддержки объектно-ориентированного программирования; в середине 1970-х годов Smalltalk последовал за первым
  • Си был разработан между 1969 и 1973 годами как язык системного программирования и остается популярным.
  • Пролог, разработанный в 1972 году. Был первым языком логического программирования.
  • В 1978 году ML построила полиморфную систему типов поверх Lisp. Став пионером статически типизированных функциональных языков программирования.

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

В 1960-е и 1970-е годы также велись значительные дебаты о достоинствах структурированного программированияи о том . Следует ли разрабатывать языки программирования для его поддержки. Эдсгер Дейкстра в знаменитом письме 1968 года. Опубликованном в журнале Communications of the ACM, утверждал. Что операторы GOTO должны быть исключены из всех языков программирования

В 1960-х и 1970-х годах также наблюдалось расширение методов. Которые уменьшали объем программы. А также повышали производительность программиста и пользователя. Колода карт для раннего 4GL была намного меньше для той же функциональности. Выраженной в колоде 3GL.

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

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

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

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

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

4GLs являются примерами языков. Специфичных для конкретной области. Таких как SQL. Который манипулирует и возвращает наборы данных. А не скалярные значения. Которые являются каноническими для большинства языков программирования. Perl, например. С его here document

Таксономия

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

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

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

Язык программирования можно классифицировать по его положению в иерархии Хомского. Например, язык программирования Thue может распознавать или определять языки типа 0 в иерархии Хомского. Большинство языков программирования являются языками типа 2 и подчиняются контекстно-свободным грамматикам.