Найти в Дзене
twokenul

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

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

В предыдущих статьях мы поднимали тему языков программирования. Пришло время разобрать её поподробнее.

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

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

пример множества языков программирования
пример множества языков программирования

Понятие как «язык программирования»

Создатели языков по разному описываю понятие «язык программирования». Наиболее распространённым утверждениям относятся следующие:

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

Типы данных

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

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

Динамическая типизация — это приём, используемый в языках программирования и языках спецификации, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов. Примеры языков с динамической типизацией — Smalltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript.

Статическая типизация — приём, широко используемый в языках программирования, при котором переменная, параметр подпрограммы, возвращаемое значение функции связывается с типом в момент объявления и тип не может быть изменён позже (переменная или параметр будут принимать, а функция — возвращать значения только этого типа). Примеры статически типизированных языков — C, С++, D, Java, ML, Паскаль, Solidity, Go, Fortran, Matlab. Статически типизированные языки могут быть в дальнейшем подразделены на языки с обязательной декларацией, где каждая переменная и объявление функции имеет обязательное объявление типа, и языки с выводимыми типами.
пример типов данных в ЯП
пример типов данных в ЯП

Семантика языков программирования

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

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

Наиболее широко распространены следующие три вида: операционный, денотационный и деривационный.

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

Деривационная семантика описывает последствия выполнения конструкций языка с помощью языка логики и задания пред- и постусловий.

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

Парадигма программирования

Язык программирования строится в соответствии с той или иной базовой вычислений и парадигмой программирования.

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

Большинство языков ориентировано на императивную модель вычислений, задаваемую фон-неймановской архитектурой ЭВМ. И не смотря на это существуют и другие подходы. Можно вспомнить про логическое программирование и языке «Рефал», который основан на модели вычисления , введений советским математиком Андреем Андреевичем Марковым (младшим). Ещё стоит упомянуть про стековую вычислительную модель (PostScript, Forth, Factor и т.д.), и функциональное (Halkell, ML, Лисп и др.). Также в настоящее время активно развиваются проблемно-ориентированные, декларативные и визуальные языки программирования.

Способы реализации языков

Языки программирования могут быть реализованы как компилируемые и интерпретируемые.

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

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

Но все же разделение на компилируемые и интерпретируемые условное. Это потому что для компилируемого языка, как, к примеру, Java, можно написать интерпретатор. К тому же, многие современные «чистых» интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в высокоуровневое промежуточное представление. Для любого интерпретируемого языка можно создать компилятор.

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

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

Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми. А именно, компилятор не компилирует все классы в одну программу из машинных кодов. Вместо этого он компилирует каждый класс по отдельности, и не в машинные коды, а в специальный промежуточный код (байт-код). Компиляция в машинный код выполняется при запуске программы. Обычно для выполнения байт-кода используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции Just-in-time compilation (JIT), её по другому ещё называют «на лету» . Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для С— Common Language Runtime.

Стандартизация языков программирования

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

Используемые символы

Современные языки программирования рассчитаны на использование ASCII (American standard code for information interchange), то есть доступность всех графических символов ASCII является необходимым и достаточным условием для записи любых конструкций языка. ASCII — это название таблицы, в которой некоторым распространённым печатным и непечатным символам сопоставлены числовые коды.

Ранние языки, возникшие в эпоху 6-битных символов, использовали более ограниченный набор. Например, алфавит Фортрана включает 49 символов: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / () . , $ ' (включая пробел):

Заметным исключением является язык APL, в котором используется очень много специальных символов.

Использование символов за пределами ASCII (например, символов KOI8-R или символов Юникода) зависит от реализации: иногда они разрешаются только в комментариях и символьных/строковых константах, а иногда и в идентификаторах. В СССР существовали языки, где все ключевые слова писались русскими буквами, но большу́ю популярность подобные языки не завоевали (исключение составляет Встроенный язык программирования 1С: Предприятие).

Расширение набора используемых символов сдерживается тем, что многие проекты по разработке программного обеспечения являются международными. Очень сложно было бы работать с кодом, где имена одних переменных записаны русскими буквами, других — арабскими, а третьих — китайскими иероглифами. Вместе с тем, для работы с текстовыми данными языки программирования нового поколения (Delphi 2006, Java) поддерживают unicode.