Сайт о телевидении

Сайт о телевидении

» » На каком языке программировать новичку. Список языков программирования

На каком языке программировать новичку. Список языков программирования

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

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

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

  • простыми,
  • сложными и
  • непонятными (например, графическими).

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

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

Нулевое поколение

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

Жаккардовый станок

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

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

Рис. 1. Перфокарты для ткацкого станка Жаккарда

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

Машина Беббиджа

Интернет и Веб

Появились специализированные языки:

  • JavaScript.

Многие сайты написаны с помощью PHP и JavaScript.

Некоторые ранее существовавшие языки с появлением Интернета и Веба нашли новые ниши и стали веб-ориентированными:

  • Ruby,
  • Pynton,
  • Java.

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

Любой язык программирования – это искусственный язык, который имеет свой цикл жизни. Аналогично, операционные системы семейства Windows тоже имеют свои жизненные циклы: .

Жизненный цикл языка программирования:

  • создание,
  • early adoption (первоначальное использование языка),
  • (промышленный) успех,
  • угасание, смена другими языками.

В современном мире основная часть программного обеспечения (софта) пишется на 10-15 языках, хотя за все время, которое нам известно, было создано больше сотен языков программирования. Официально как-то зарегистрировано 300 или 400 языков.

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

Язык – это

  • синтаксис (правила написания программ),
  • семантика (поведение элементов, которые входят в правила написания и встроены в язык),
  • runtime (среда выполнения).

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

Синтаксис на примере Lisp

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

Рис. 10. Программа на LISP

LISP является очень старым языком, который вырабатывает списки. Грамматика такого языка – это грамматика списков, читается сверху вниз.

  • В Лиспе есть выражения: может быть один атом, либо список;
  • atom – это число или символ,
  • number – число, то есть, с плюсом или минусом цифры, не менее одной,
  • symbol – это буквы, сколько угодно раз, можно даже много раз,
  • list – список, выражения в скобочках более одного раза.

Программа на Лиспе – это список списков. Знаков препинания в Лиспе нет, но есть скобочки. Могут быть такие длинные программы на Лиспе, где в конце идет 2-3 листа, состоящих из одних закрывающих скобочек.

Простейший интерпретатор Лиспа занимает всего 19 строк! Ни один другой язык не может себе позволить себе такой роскоши.

Семантика

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

Варианты представления семантики довольно ограничены.

Семантика может быть:

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

Семантика разделяется на две части:

  • статическую,
  • динамическую.

Статическая семантика

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

Динамическая или фронтальная семантика этапа выполнения

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

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

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

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

Если же система типов присутствует, то можно провести деление языков программирования на два независимых друг от друга класса, которые приведены ниже.

Система типов данных:

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

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

Если типизация динамическая, то, наоборот, тип объектов контекстного языка неизвестен до момента выполнения, то есть тип функции или чего угодно будет неизвестен до самого конца.

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

При слабой типизации тип объекта может быть разным в зависимости от контекста и от того, что Вы с ним делаете.

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

Следующая важная характеристика языка –

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

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

Главные парадигмы

  • императивная: программа – набор последовательных инструкций, изменяющих внутренне состояние компьютера, данных и т.д. То есть, программа – это инструкция;
  • функциональная: программа – набор математических функций. Работа программы – вычисление значения функций;
  • объектно-ориентированная: предметная область описывается при помощи объектов со свойствами и методами. Программа – процесс взаимодействия объектов;
  • логическая: программа – набор утверждений о предметной области. Работа программы – установление истинности высказываний об этой предметной области.

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

Еще одной важной частью языка, которую нужно учитывать при использовании языка, является Runtime – то, как язык выполняется.

Runtime – выполнение программы

Программа может выполняться по-разному:

  1. самым простым и наивным способом выполнения программы является интерпретация – чтение исходного кода в момент запуска. Так работают легкие, скриптовые языки. Также работает сам программист: когда он написал программу, то смотрит своими глазами на собственную программу и прикидывает, как его программа будет работать и что делать;
  2. распространенным способом запуска программ является компиляция в машинный код – отдельный шаг до запуска. Есть отдельный инструмент – компилятор, где читаются исходники программы, что-то с ними делают, преобразуя в машинные коды, которые понятны текущей системе. Потом этот код выполняется непосредственно «железки»;
  3. гибридный способ – это байт-компиляция и выполнение в виртуальной машине. Компилятор читает исходный код, после чего производится байт-код, который выполняется в виртуальной машине.

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

Представители языков

Язык C

– один из самых популярных, один из самых важных по физически написанному по нему коду, практически это «наше всё».

Он создан в 1972 году, создатели – Деннис Ритчи (Dennis Ritchie) и коллеги. Д.Ритчи создал также систему Linux и многие другие полезные вещи.

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

Кстати, С актуален до сих пор, используется для:

  • системного программирования (например, ядро Linux написано на C),
  • number-crunching (так называемые числа-дробилки, то есть, для больших вычислений, где важно быстродействие),
  • программирования микроконтроллеров и встраиваемых систем.

С – низкоуровневый язык, можно сказать, что это Ассемблер с человеческим лицом, ибо почти любую конструкцию C человек может вручную преобразовать в Ассемблер и получатся довольно понятные операции.

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

Поэтому C сейчас используется для таких задач, где требуется быстродействие, очень важно управление памятью и большое значение имеет компактный объем самой программы. Если у Вас маленький микроконтроллер, который встраивается в какое-то устройство, то программа для него, скорее всего, будет написана либо на Ассемблере, либо на C.

Рис. 11. Пример простой программы на C.

Java

  • Создан в 1995 году,
  • создатели – Джеймс Гослинг (James Gosling) и Sun Microsystems (в этой компании работал Гослинг).
  • Объектно-ориентированный, императивный (C императивный, но НЕ объектно-ориентированный),
  • строго- и статически-типизированный,
  • байт-компилируемый с виртуальной машиной,
  • нет доступа к памяти, автоматическая сборка мусора (последняя работает хорошо, если имеется треть или четверть свободной памяти).

В 90-ых годах JAVA получила большую популярность как мультиплатформенный язык. Один раз написав виртуальную машину для какой-то платформы, допустим для Windows или для Linux или для Mac, можно любые программы на JAVA запускать на ней без перекомпиляции. Поэтому язык был популярен в эпоху веба, когда было разных платформ (разные версии Windows, разные Маки). Программы на JAVA работали быстро и довольно хорошо на разных платформах.

Используется для:

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

Следует отличать спецификации языка Java и различные реализации JVM:

  • Sun JDK (от компании Sun, ныне это Oracle),
  • IBM JDK (продается за деньги),
  • OpenJDK (абсолютно свободная)
  • и т.п.

Рис. 12. Пример простой программы на JAVA.

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

Тем не менее JAVA очень популярна, в частности, на ней написана клиентская часть операционной системы .

Lisp

  • Он действительно завершает Lis t P rocessor (LisP);
  • создан в 1958 году;
  • создатели – Джон Маккарти;
  • чистый функциональный язык, несмотря на довольно странный синтаксис;
  • строго- и динамически- типизированный;
  • как правило, интерпретируемый;
  • нет доступа к памяти, автоматическая сборка мусора, которая ложится на интерпретатор, а не на виртуальную машину.

Используется для:

  • научного программирования и исследований;
  • искусственный интеллект – Lisp был создан в самом начале по поиску с интеллектом. В конце 1950-ых – начале 1960-ых в научных кругах было сильное ощущение, что вот-вот будет создан искусственный интеллект. Тогда считалось, что ключевыми особенностями искусственного интеллекта будет возможность оперировать естественным языком, текстом, читать, говорить и делать какие-то разумные вещи. Для обработки смысловых данных из текста был создан Lisp, он позволяет такие вещи делать хорошо;
  • всего, чего угодно, но, как правило, используется не очень эффективно.

Язык Lisp, разработанный в 1958 году, претерпел массу изменений.

У него есть множество реализаций и диалектов:

  • CommonLisp (создан в 1970-ых) – классическая реализация, которая считается основной;
  • Scheme (схема) – упрощенный диалект, который некоторые вещи из CommonLisp выбрасывает и позволяет делать проще;
  • Clojure – диалект Lisp в плане языка, но работает поверх JAVA-машины, то есть компилируется в байт-код и исполняется также, как будто это JAVA-программа.

Рис. 13. Программа на LISP: сортировка пузырьком

Python (Питон)

  • Назван в честь британского шоу 1970-ых годов Monty Pynton’s Flying Circus (там старые шутки, но смешные)
  • создан в 1991 году
  • создатель – голландец Guido van Rossum
  • мультипарадигменный язык, объектно-ориентированный, императивный, функциональный
  • строго- и динамически-типизированный
  • интерпретируемый, байт-компилируемый с виртуальной машиной (в зависимости от реализации)

Используется для:

  • скриптового программирования
  • веб-программирования
  • научного программирования (имеются большие, сильные пакеты для работы с моделированием, с вероятностью, со статистикой и в других областях, которые объединяют в себе опыт, накопленный в других областях)

Python – спецификация языка. Существует несколько основных реализаций:

  • CPython – основная (reference)
  • Jython – поверх JVM
  • PyPy – Python in Python («Питон на Питоне» работает быстрее и лучше, чем CPython и Jython)

Рис. 14. Программа на Python: сортировка пузырьком

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

Выбор языка под задачу

Как выбрать язык под задачу, когда Вы знаете, что Вам нужно сделать, но не знаете на чем?

Важный совет: используйте то, на чем Вы умеете программировать. Это гораздо лучше, чем использовать то, на чем Вы НЕ умеете программировать.

Экосистема

Язык, который Вы хотите взять, не должен быть «голым» языком, у него должна быть экосистема, которая включает:

  • средства разработки (удобное IDE)
  • готовые библиотеки и фреймворки
  • инструменты тестирования для запуска тест-кейсов: тестовые фреймворки и инструменты
  • системы пакетирования и развертывания для того, чтобы написанный код можно было упаковать, куда-то выложить, чтобы другие могли легко воспользоваться. У языка Си нет такой возможности, а у языков Руби и Питон есть.
  • коммьюнити. Не надо пользоваться мертвыми языками, какими бы классными они не были. Если не у кого спросить, Вы останетесь в полном тупике. Считается, что одни коммьюнити более дружелюбные, другие – менее. Например, коммьюнити Руби классное, а коммьюнити Java ужасное – там даже спрашивать ничего не надо.

Популярность

Сложно найти в команду людей, которые пишут код на редко используемом языке, к примеру на Eiffel. С другой стороны, на вакансию по мега-популярному языку JAVА, в котором порог входа низкий, набежит много народа, но будет непросто подобрать людей, которые пишут на нем действительно хорошо.

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

Скорость обучения

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

JAVA – язык простой в изучении и простой по возможностям, а дальше все строится не за счет языка, а за счет инструментов.

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

Нишевость языков

Конкретные языки лучше подходят для решения определенных нишевых задач.

Пример 1: веб приложение, которое

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

Для такой задачи, скорее всего, подойдет Python или Ruby. Не надо это делать на JAVA

Пример 2: биллинговая система сотового оператора

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

В этом случае наш выбор – Java, С++, Erlang – богатые языки с богатым инструментарием.

Пример 3: код бортовой ЭВМ для спутника

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

Наш выбор – С и С-подобные языки (и даже ассемблер), потому что очень мало ресурсов и эти требования надо соблюсти.

Статья основана на видео:

Как правильно выбрать язык программирования – Иван Калинин

Видео снято в декабре 2014 года, тем не менее, вся информация актуальна и не имеет срока давности. Многие материалы с позиции сегодняшних реалий представляют несомненный интерес, например, о том, что ученые еще в конце 1950-ых – начале 1960-ых годов считали, что искусственный интеллект уже на пороге и с его помощью можно будет вот-вот работать на компьютере с естественным, обычным, человеческим языком.

Когда вы пытаетесь выяснить, какой язык программирования начать изучать, вы, вероятно, столкнетесь с терминами «высокий уровень» и «низкий уровень». Люди постоянно говорят о языках программирования высокого и низкого уровня. Но что именно это означает? И что значит научиться писать код? Начнем с определений каждого.


Языки программирования «Высокого» и «Низкого уровня»

В этой статье я расскажу о языках «высокого» и «низкого уровня». Но особых критериев для определения этого нет. Просто имейте в виду, что это во многом зависит от вашей перспективы. Если вы программист C, Java может показаться довольно высокоуровневым. Если вы привыкли к Ruby, Java может показаться языком низкого уровня.

Машинный код и языки низкого уровня

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

Вот пример машинного кода:

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

Писать непосредственно в машинный код возможно, но очень сложно.

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

В машинный код вы можете написать что-то вроде «10110000 01100001», но язык ассемблера может упростить это как «MOV AL, 61h». Между тем, что написано на языке ассемблера, и инструкциями, переданными машине, по-прежнему существует почти одно-однозначное соответствие.

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

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

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

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

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

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

Важно отметить, что «языки программирования высокого уровня» могут включать в себя все, что более абстрактно, чем язык ассемблера.

Какой язык изучать: низкого или высокого уровня?

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

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

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

Помня об этом, вот список популярных языков по шкале от низкого до высокого:

  • JavaScript
  • Python

Конечно, это отчасти субъективно. И включает только крошечную часть доступных языков.

Но это должно дать вам некоторое представление о том, на каком уровне находятся интересующие вас языки.

Что Вы хотите делать?

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

Если вы хотите программировать операционные системы, ядра или что-то, что необходимо для работы на максимальной скорости, язык более низкого уровня может быть хорошим выбором. Большая часть Windows, OS X и Linux написана на языках C и C-производных языках, таких как C ++ и Objective-C.

Многие современные приложения пишутся на языках более высокого уровня или даже на предметно-ориентированных языках. Python и Ruby особенно популярны для веб-приложений, хотя HTML5 становится все более мощным. Языки, такие как Swift, C #, JavaScript и SQL, имеют свои сильные и слабые стороны.

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

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

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

Вы скоро увидите параллели, и вы получите гораздо более глубокое понимание того, как работает программирование.

Сосредоточьтесь на цели, а не на средстве

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

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

У вас есть опыт работы с языками высокого и низкого уровня? Вы предпочитаете одни другим? Поделитесь своими мыслями в комментариях ниже!

ЯЗЫК ПРОГРАММИРОВАНИЯ И ЕГО ВИДЫ

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

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

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

ЯЗЫКИ ПРОГРАММИРОВАНИЯ НИЗКОГО УРОВНЯ

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

Рис.1. Пример машинного кода и представления его на ассемблере

Трансляторы делятся на:

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

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

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

Преимущества

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

Недостатки

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

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

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

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

Ассемблер - язык низкого уровня, что широко применяется до сих пор.

ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ

Первым языком программирования высокого уровня считается компьютерный язык Plankalkül, разработанный немецким инженером Конрадом Цузе ещё в период 1942-1946 годах. Однако транслятора для него не существовало до 2000 г. Первым в мире транслятором языка высокого уровня является ПП (Программирующая Программа), он же ПП-1, успешно испытанный в 1954 г. Транслятор ПП-2 (1955 г., 4-й в мире транслятор) уже был оптимизирующим и содержал собственный загрузчик и отладчик, библиотеку стандартных процедур, а транслятор ПП для ЭВМ Стрела-4 уже содержал и компоновщик (linker) из модулей. Однако, широкое применение высокоуровневых языков началось с возникновением Фортрана и созданием компилятора для этого языка (1957).

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

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

Примеры: C, C++,C#, Java, Python, PHP, Ruby, Perl, Паскаль, Delphi, Lisp . Языкам высокого уровня свойственно умение работать с комплексными структурами данных. В большинстве из них интегрирована поддержка строковых типов, объектов, операций файлового ввода-вывода и т. п.Недостатком языков высокого уровня является больший размер программ по сравнению с программами на языке низкого уровня. Поэтому в основном языки высокого уровня используются для разработок программного обеспечения компьютеров и устройств, которые имеют большой объем памяти. А разные подвиды ассемблера применяются для программирования других устройств, где критичным является размер программы.

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

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

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

Набоp действий, котоpые могут выполняться внутpи функции очень огpаничен. Он состоит из вычисления фоpмульных выpажений, вызовов дpугих функций (что не является отдельным действием - вызов функции часто входит в выpажение), присваиваний, ветвлений (гpуппа действий, котоpая выполняется лишь при истинности некоторого условия) и циклов (гpуппа действий, выполняемых многокpатно, число повтоpений зависит от некотоpого условия). Действия могут быть вложены дpуг в дpуга. Может показаться, что набоp из ветвлений и циклов слишком мал, но это не так. Доказано, что любой алгоpитм, составленный из функциональных блоков (на низком уpовне - арифметических команд и команд пеpесылки данных), условных и безусловных пеpеходов может быть пpеобpазован в эквивалентный алгоpитм, составленный только из стpуктуpных блоков - функциональных блоков, ветвлений и циклов с пpовеpкой условия в конце. Это утвеpжение было сфоpмулиpовано в статье Бома и Джакопини (Corrado Bohm and Giuseppe Jacopini) "Flow diagrams, turing mashines and languages with only two formation rules" (Communications of ACM, Volume 9 / Number 5 / May, 1965).

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

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

Обычно языки пpогpаммиpования пpедоставляют достаточно огpаниченный набоp пpедопpеделенных типов пеpеменных и сpедства создания новых типов. Пpедопpеделены некотоpые из следующих типов:

    натуpальные и целые числа pазличной pазpядности;

    вещественные числа;

    символы - буквы, цифpы, знаки аpифметических действий и пp.;

    стpоки символов;

    логические значения;

    указатели

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

В языке C, напpимеp, не опpеделены символы, строки и логические значения. Его тип char на самом деле является коpотким целым и допускает аpифметические действия.

Новые типы обpазуются путем объединения в единое целое нескольких элементов одного типа (массив, каждый его элемент имеет поpядковый номеp) или элементов pазных типов (стpуктуpа, каждый ее элемент имеет собственное имя). Напpимеp, в большинстве языков комплексные числа не опpеделены, но их можно опpеделить:

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

Есть и другие способы создания новых типов. Например, в языке Pascal возможно создание:

    типов-диапазонов (посредством задания диапазона значений);

    типов-перечислений (посредством перечисления возможных значений);

    типов-множеств

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

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

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

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

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

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

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

Типы данных

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

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

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

Структуры данных

Системы типов в языках высокого уровня позволяют определять сложные, составные типы, так называемые структуры данных . Как правило, структурные типы данных образуются как декартово произведение базовых (атомарных) типов и ранее определённых составных типов.

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

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

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

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

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

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

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

Несмотря на то, что большинство языков ориентировано на императивную модель вычислений , задаваемую фон-неймановской архитектурой ЭВМ, существуют и другие подходы. Можно упомянуть языки со стековой вычислительной моделью (Форт , Factor , PostScript и др.), а также функциональное (Лисп , Haskell , , и др.) и логическое программирование (Пролог) и язык РЕФАЛ , основанный на модели вычислений, введённой советским математиком А. А. Марковым-младшим.

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

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

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

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

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

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

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

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

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

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

Подобный подход в некотором смысле позволяет использовать плюсы как интерпретаторов, так и компиляторов. Следует упомянуть, что есть языки, имеющие и интерпретатор, и компилятор (Форт).

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

Современные языки программирования рассчитаны на использование ASCII , то есть доступность всех графических символов ASCII является необходимым и достаточным условием для записи любых конструкций языка. Управляющие символы ASCII используются ограниченно: допускаются только возврат каретки CR, перевод строки LF и горизонтальная табуляция HT (иногда также вертикальная табуляция VT и переход к следующей странице FF).

Ранние языки, возникшие в эпоху 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 .

Классы языков программирования

См. также

Примечания

Литература

  • Hal Abelson, Gerald Jay Sussman. Structure and Interpretation of Computer Programs
  • Роберт У. Себеста. Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. - 5-е изд. - М .: Вильямс, 2001. - 672 с. - 5000 экз. - ISBN 5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.)
  • Вольфенгаген В. Э. Конструкции языков программирования. Приёмы описания. - М .: Центр ЮрИнфоР, 2001. - 276 с. - ISBN 5-89158-079-9
  • Паронджанов В. Д. Как улучшить работу ума. Алгоритмы без программистов - это очень просто! - М .: Дело, 2001. - 360 с. - ISBN 5-7749-0211-0
  • Ф. Бьянкуцци, Ш. Уорден. Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования . - СПб. : Символ-Плюс, 2010. - 608 с. - ISBN 978-5-93286-170-7

Ссылки

  • The Language List (англ.) - более 2500 языков с кратким описанием
  • Computer Languages History (англ.) - история языков программирования (с 1954 по май 2004) (содержит регулярно обновляемую диаграмму)
  • Examples (англ.) - примеры программирования на 162 языках
  • Programming Language Popularity (англ.) - исследование популярности языков программирования за 2004 год
  • 10 языков программирования, которые стоит изучать (2006 г.)
  • Programming Community Index (англ.) - регулярно обновляемый рейтинг популярности языков программирования
  • Computer Language Shootout Benchmarks (англ.) - сравнение языков программирования по эффективности
  • Programming Languages that are Loved (англ.) - сравнение языков программирования по «любви» и «ненависти» к ним

Wikimedia Foundation . 2010 .

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

Язык программирования – формальная знаковая система, предназначенная для описания алгоритмов в форме, которая удобна для исполнителя (например, ЭВМ, т.е. компьютера).

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

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

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

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

Эти спецификации обычно включают в себя описание:

    типов и структур данных;

    операционную семантику (алгоритм вычисления конструкций языка);

    семантические конструкции языка;

    библиотеки примитивов (например, команды ввода-вывода);

    философии, назначения и возможностей языка.

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

Языки программирования принято делить на низкоуровневые и высокоуровневые . Такое разделение происходит взависимости от степени детализации команд – чем меньше детализация, тем выше уровень языка.

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

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

Низкоуровневым языком является язык ассемблера (от английского assembler - сборщик) - названия транслятора (компилятора) c языка ассемблера. Язык ассемблера, часто для краткости неверно называют "ассемблером".

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

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

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

Высокоуровневый язык программирования – язык программирования, разработанный для быстроты и удобства использования программистом. Термин «высокоуровневый» здесь означает, что язык предназначен для решения абстрактных высокоуровневых задач и оперирует не инструкциями к оборудованию, а логическими понятиями и абстракцией данный. Это позволяет быстрее программировать сложные задачи и обеспечивает относительную независимость от оборудования. Использование разнообразных трансляторов и интерпретаторов обеспечивает связь программ, написанных при помощи языков высокого уровня, с различными операционными системами и различным аппаратным оборудованием, в то время как их исходный текст остаётся, в большей части, неизменным.

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

Первым языком программирования высокого уровня считается компьютерный язык Plankalkül , разработанный немецким инженером Конрадом Цузе ещё в период 1942–1946 гг. Однако, широкое применение высокоуровневых языков началось с возникновением Фортрана и созданием компилятора для этого языка (1957).

Наиболее распространёнными языками высокого уровня в настоящее время являются С++, Visual Basic, Delphi, Java, Python, Ruby, Perl, PHP.

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

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

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

Среда визуального программирования Delphi

Бурное развитие вычислительной техники, потребность в эффективных средствах разработки программного обеспечения и языках программирования привели к появлению систем программирования, ориентированных на так называемую "быструю разработку" - RAD-систем (Rapid Application Development).

Среди таких систем быстрой разработки приложений можно выделить Borland Delphi , Borland C Builder и Microsoft Visual Basic. В их основе лежит технология визуального проектирования и событийного программирования, суть которой заключается в том, что среда разработки берет на себя большую часть рутинной работы, оставляя программисту работу по конструированию диалоговых окон и функций обработки событий.

Delphi – это среда быстрой разработки, в которой в качестве языка программирования используется язык объектно-ориентированный язык Object Pascal .

Object Pascal - результат развития языка Turbo Pascal, который, в свою очередь, развился из языка Pascal. Pascal, впервые предложенный швейцарским ученым Н. Виртом еще в 1970г., является полностью процедурным языком, Turbo Pascal начиная с версии 5.5 добавил в Pascal объектно-ориентированные свойства, а Object Pascal - объектно-ориентированный язык программирования с уникальным свойством доступа к метаданным классов (то есть к описанию классов и их членов) в компилируемом коде, также называемом интроспекцией.