- Компьютерная грамотность с Надеждой - https://sosenki-sok.ru -

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

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

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

Содержание:
1. Почему понадобились языки программирования
История возникновения:
2. Нулевое поколение
. . . Жаккардовый станок
. . . Машина Беббиджа
. . . Программируемый табулятор
3. Машина Тьюринга
4. Архитектура фон Неймана
5. Цифровые компьютеры
. . . Ассемблер
6. Первые языки высокого уровня
. . . Кобол
. . . История о преданности языку программирования
. . . Фортран
7. Золотой век
. . . Алгол
. . . Паскаль
. . . Simula и Smalltalk
8. Скриптовые языки
9. Интернет и Веб
10. Жизненный цикл языка программирования
11. Что есть язык программирования
. . . Синтаксис на примере Lisp
. . . Семантика
. . . Система типов данных
. . . Парадигма языка программирования
. . . Runtime – выполнение программы
12. Представители языков
. . . Язык C
. . . Java
. . . Lisp
. . . Python (Питон)
13. Выбор языка под задачу: важный совет
. . . Экосистема
. . . Популярность
. . . Скорость обучения
. . . Нишевость языков
14. Видео

Зачем нужны языки программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рис. 2. Машина Бэббиджа

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

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

Программируемый табулятор

– полностью электронное устройство. Это машины, которые были разработаны в начале 20 века и использовались, в основном, для операций с перфокартами.

Программируемый табулятор

Рис.3. Программируемый табулятор

На таком табуляторе писали программы для расчета зарплаты и т.п. Программа для такой машины выглядит как доска с массой отверстий и проводов.  Табулятор «жевал» (читал) стопку перфокарт и выдавал что-то интересное.

Программа для табулятора

Рис. 4. Программа для табулятора

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

Машина Тьюринга

– простая абстракция, теоретическое построение, несуществующая в реальности машина, но которая описывает, как должен быть построен любой вычислитель:

Машина Тьюринга не имела воплощения в «железе», но получила важное теоретическое применение в теории вычислений.

Архитектура фон Неймана

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

Схематично эту архитектуру можно представить в виде 3-х основных блоков:

Архитектура фон Неймана

Рис. 5. Архитектура фон Неймана

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

В дальнейшем по архитектуре фон Неймана были построены почти все существующие сейчас устройства.

Цифровые компьютеры

Идеи машины Тьюринга и архитектуры фон Неймана определили дальнейшее развитие программирования и цифровых компьютеров по следующим характеристикам:

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

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

Ассемблер

Программа на Ассемблере для MS DOS

Рис. 6. Программа на Ассемблере для MS DOS

Программа на рис. 6:

Ассемблер – язык, очень близкий к системе команд, которая была родной для вычислительной машины. При этом в ассемблере давали командам понятные мнемонические имена (названия команд).

Раньше программисты писали цифры, двоичные коды, а в Ассемблере наконец появились человеко-понятные имена для операций.

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

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

Ассемблеры – это языки, которые написаны для конкретной архитектуры железа и близки к машинным кодам.

Перфокарта от IBM 360

Рис. 7. Перфокарта от IBM 360

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

Первые языки высокого уровня

Люди поняли, что давать машине прямые команды с помощью ассемблера классно, но хочется делать вещи более высокого уровня. В конце 50-60-х годов появились первые языки высокого уровня:

Кобол

Программа на Коболе

Рис. 8. Программа на Коболе

Программа на Кобол, приведенная на рис. 8, делает то же самое, что и программа на рис. 6, а именно, выводит сообщение HELLO.

Кобол прочно укрепился в бизнесе, использовался в управлении атомными реакторами и энергосистемами, в банковских системах. Поэтому в США до сих пор есть спрос на программистов на Коболе.

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

Была интересная история про «жадную компанию» в США, которая купила в 1960-х годах большой компьютер, наняла программистов. Они для компании написали программное обеспечение на Коболе.

Компьютер работал-работал, но со временем устарел и перестал работать. Попытки найти замену старому компьютеру не увенчались успехом – такие машины уже никто не выпускал.

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

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

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

Фортран

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

Ниже приведен пример программы на Фортране:

Программа на Фортране

Рис. 9. Программа на Фортране

Золотой век

Это конец 60-х – начало 70-х, когда программирование получает признание. Люди понимают, что можно написать программу, которая пошлет аппарат на Луну, можно моделировать, строить и т.д.

В это время формируется несколько языков, которые положили начало важным направлениям в программировании:

Алгол

Язык Algol был предназначен для написания алгоритмов, а не для вычислений. Благодаря Алголу появилось само понятие «структурного программирования». В настоящее время язык немножко «умер» и не используется.

Наследники Алгола – языки

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

Паскаль

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

Объектно-ориентированное программирование подразумевает описание предметной области при помощи объектов, а не так, как было до этого – в виде линейной или ветвящейся структуры.

Simula и Smalltalk

Simula – объектно-ориентированный язык, появился в 1967 году в Европе, вначале описывал военные маневры. Объектами были танк, самолет, человек, которые делают то-то и то-то.

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

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

Скриптовые языки

В 1980-х – 1990-х годах с появлением персональных компьютеров (PC) в программирование приходят «простые люди». Появляется потребность в таких языках, которые может легко использовать простой человек в своих целях.

Появляются новые языки:

Их основные особенности:

Следующая важная веха в программировании – появление Интернета и Веба.

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

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

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

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

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

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

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

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

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

Язык – это

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

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

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

Программа на LISP

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

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

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

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

Семантика

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Язык C

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

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

Язык С:

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

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

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

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

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

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

Java

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

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

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

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

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

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

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

Lisp

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

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

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

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

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

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

Python (Питон)

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

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

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

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

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

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

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

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

Экосистема

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Смотреть видео лучше на скорости 0.75.

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

Онлайн-курс «Введение в программирование (C++)»

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

https://stepik.org/course/363/syllabus

Дополнительные материалы:

1. Что такое переменная с индексами, массив, комментарий, цикл и счетчик в программировании на конкретном примере

2. Кодирование цветовой информации

3. Русский язык программирования, а почему бы и нет?