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


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

Содержание:
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:

  • записывает в регистр ah значение 9,
  • потом записывает в регистр dx значение offset hello_message,
  • вызывает прерывание 21h (с помощью команды int), что означает: выведи на экран то, что записано выше.

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

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

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

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

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

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

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

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

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

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

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

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

Кобол

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

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

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

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

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

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

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

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

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

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

Фортран

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

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

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

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

Золотой век

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

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

  • процедурное (структурное) программирование – языки Algol, C, Pascal. Появление этих языков закончило эпоху спагетти-кода, когда программа представляла собой огромную «портянку» кода без какой-либо структуры;
  • объектно-ориентированное программирование – Simula, Smalltalk;
  • функциональное программирование – LISP, ML.

Алгол

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

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

  • C
  • Pascal.

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

Паскаль

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

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

Simula и Smalltalk

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

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

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

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

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

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

  • Perl – 1987 год,
  • Pynton – 1991,
  • Ruby – 1993.

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

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

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

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

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

  • PHP,
  • JavaScript.

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

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

  • Ruby,
  • Pynton,
  • Java.

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

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

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

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

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

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

Язык – это

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

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

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

Одним из самых простых языков программирования, которые имеют формальную грамматику, считается язык списков 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.

Пример простой программы на 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 (абсолютно свободная)
  • и т.п.
Пример простой программы на JAVA

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

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

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

Lisp

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

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

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

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

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

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

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

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

Python (Питон)

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

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

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

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

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

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

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

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

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

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

Экосистема

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

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

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

Сложно найти в команду людей, которые пишут код на редко используемом языке, к примеру на 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. Русский язык программирования, а почему бы и нет?



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


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

  • Ананий:

    Начните с простейшего учебного языка по программированию — Microsoft Small Basic. Начинать нужно с простого, а не с популярного.
    Сайт small-basic.ru вам в помощь, там много учебных материалов на русском языке.

    • Тарас:

      Смол бейсик как раз сложен. Начинать надо с азов бейсика, но более продвинутого. Юзать почти что общее подмножество со смол бейсиком, но именовать переменные более свободно. Начав понимать машину, переходить на паскаль, с него – на c++, с него можно перейти на голые си, а можно и остаться на плюсах и учить их уже серьёзно. А на голых сях ограничиться азами просто не получится.

  • Vlad:

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

    • Тарас:

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

  • Denis:

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

    • Тарас:

      И как же на BitC не запутаться в преобразованиях самого BitC? А без этого искомый контроль невозможен.