Универсальные языки это языки программирования
Языки программирования: что это такое, зачем нужны и какой выбрать новичку
Разбираемся, как устроены языки программирования, почему их так много и чем они отличаются от алгоритмов.
Что такое язык программирования
Язык программирования — это набор формальных правил, по которым пишут программы. Обычный язык нужен для общения людей, а язык программирования — для общения с компьютером. Как и в любом естественном языке, тут есть лексика — слова, функции и операторы, из которых по правилам синтаксиса составляются выражения. Они имеют чёткий, вполне определённый смысл, понятный компьютеру, — семантику.
Вот, например, программа на языке JavaScript:
Здесь слово alert — лексика, один из принятых в языке методов обработки текста. Текст в одинарных кавычках, скобки, точка с запятой — правила синтаксиса. А то, что нужно сделать в итоге, — семантика. Получив эти инструкции, компьютер выведет на экран всплывающее окно с кнопкой и сообщением: «Это программа на JavaScript».
Фанат Free Software Foundation, использую Linux и недолюбливаю Windows. Пишу истории про кодинг и программы на Python. Влюблен в LISP, но пока что не умею на нем программировать.
Чем языки программирования отличаются от алгоритмов
Программы нужны для того, чтобы машина сделала что-то полезное. Это невозможно, если нет чёткого порядка действий и правил их выполнения — алгоритма.
Алгоритм работает как маршрут в навигаторе: «Из пункта А едем в пункт Б, поворот через 150 метров». Англичанин понимает его по-английски, китаец —
по-китайски, а мы с вами — по-русски. Языки разные, а порядок действий один и все должны добраться до нужного места.
Любая программа начинается с алгоритма, но на разных языках это может выглядеть по-разному. Например, вот эта — на языке С — проверяет, чтобы делитель не был нулём, а затем делит одно число на другое. Или пишет, что так делать нельзя.
То же самое, но на Python.
В программе на Python нет фигурных скобок и точек с запятой, но алгоритм и результат работы такой же, как у программы на C, да и слова похожи.
Перейти с одного языка программирования на другой легко: если знаешь Java — быстро начнёшь кодить, например, на Python или C#.
Как компьютер понимает разные языки программирования
На самом деле язык программирования — это не язык компьютера. Машина понимает последовательности нулей и единичек: есть напряжение в цепи — единица, нет — ноль. Поэтому любую программу сначала надо перевести в набор таких машинных команд.
Для этого есть два инструмента — компилятор и интерпретатор. Компилятор работает как бюро переводов: вы отдаёте ему весь текст программы, а он превращает его в исполняемый код, набор команд для процессора. Интерпретатор больше похож на переводчика-синхрониста: сказали фразу — синхронист тут же её перевёл, а компьютер выполнил.
Внутри компиляторов и интерпретаторов — сложные наборы правил по превращению языка программирования в машинный код, понятный компьютеру. Это тоже программы. Их пишут создатели нового языка — на каком-то другом, уже существующем. Например, интерпретатор Python написан на C, а сам C — на ассемблере, практически машинном коде.
Что такое библиотеки
Библиотеки — наборы функций, готовых шаблонов, написанных на каком-то из языков программирования. Это удобно и похоже на книги в обычной библиотеке: на них можно ссылаться внутри программ и сразу получать результат без необходимости каждый раз писать много кода.
Например, в Python есть модуль — библиотека yandex_translate, которая переводит тексты на разные языки. Программистам не надо создавать программу-переводчик с нуля, достаточно подключить этот модуль и обратиться к нему из любой точки кода.
Универсальные языки программирования
В главе 5 мы изучили множество возможностей языков программирования высокого уровня. В этом разделе мы применим наши знания о вычислимости для определения, какие же из этих возможностей действительно нужны. Мы увидим, что большинство функций современных высокоуровневых языков просто делают программирование более удобным для людей, а не увеличивают мощь и возможности этого языка.
Мы попытаемся описать простой императивный язык программирования, достаточно мощный, чтобы на нем можно было написать программы для вычисления всех вычислимых функций. Следовательно, если когда-либо программист обнаружит, что задачу невозможно решить при помощи нашего языка, то причиной будут не недочеты языка. Это будет означать, что для решения задачи просто не существует алгоритма. Язык программирования, обладающий таким свойством, называется универсальным языком программирования.
Возможно, вас удивит тот факт, что универсальный язык программирования вовсе не должен быть сложным. Язык, с которым мы собираемся познакомиться, достаточно прост. Мы назовем его скелетным языком, потому что в нем будет собран минимальный набор требований универсального языка программирования.
Скелетный язык
Начнем представление нашего скелетного языка (bare-bones language) с рассмотрения операторов описания в других языках. Такие операторы обеспечивают программистам возможность мыслить в терминах структур и типов данных (таких, как массивы числовых значений и строки алфавитных символов), хотя сама машина просто манипулирует битовыми комбинациями, не подозревая о том, что эти конфигурации обозначают. Перед тем как отправить машине для выполнения инструкции высокого уровня в терминах сложных типов данных и структур, их необходимо перевести в команды машинного уровня, которые при помощи битовых шаблонов имитируют необходимые действия. Следовательно, модель языка программирования можно упростить, в первую очередь, заставив программиста выражать все операции в терминах битовых комбинаций. В таком языке будет только один тип данных и одна структура данных, поэтому операторы для описания данных не понадобятся.
Скелетный язык следует этому подходу в целях упрощения. Все переменные в нем принадлежат типу «битовая последовательность произвольной длины». В программе на скелетном языке операторы описания, с помощью которых можно описать имена переменных и их свойства, не потребуются; программист при необходимости может просто начать использовать новое имя переменной, понимая, что оно относится к шаблону битов произвольной длины.
Конечно же, транслятор нашего скелетного языка должен уметь отличать имена переменных от других элементов. Это делается за счет разработки синтаксиса скелетного языка таким образом, чтобы роль любого терма определялась исключительно синтаксисом. Для этой цели мы принимаем, что имена переменных должны начинаться с буквы английского алфавита, за которой может следовать любая комбинация букв и цифр (от 0 до 9). Следовательно, в качестве имен переменных можно использовать строки XYZ, B747, abcdefghi и X5Y, тогда как имена 2G5,1о и х.у недопустимы.
Что же до императивных операторов, в скелетном языке есть три оператора присваивания и одна циклическая структура. Это язык со свободным форматом, поэтому каждый оператор должен завершаться точкой с запятой, чтобы транслятору было легко отделять операторы друг от друга, если они записаны на одной строке. Мы, тем не менее, будем записывать только один оператор на строке, чтобы программа была легко читаемой.
11.3.2 Существуют ли инопланетяне?
Студенты редко удивляются, когда им говорят о существовании задач, которые невозможно решить алгоритмически. Когда же их просят привести пример, они задают вопросы, подобные «Выживет ли человеческая раса через тысячу лет?» или «Существуют ли инопланетяне?». Но что действительно может удивить — так это то, что на такие вопросы можно ответить алгоритмически, и, что еще более удивительно, при помощи очень простых алгоритмов. На каждый из предыдущих вопросов может ответить алгоритм, состоящий из одного шага — «Выдать ответ да» или «Выдать ответ нет». Мы просто не знаем, какой из алгоритмов правильный.
Чтобы разъяснить ситуацию, представим себе все возможные программы на скелетном языке, организованные в длинный список, в начале которого стоят короткие программы, за которым находятся все более длинные. Вопрос, можно ли решить определенную задачу алгоритмически, превращается в вопрос, существует ли в списке программа для решения этой задачи. Это не то же самое, что действительный поиск в списке программы, решающей требуемую задачу. Существует множество проблем, которые решаются программами, место для которых в списке еще не определено. То есть для большого количества алгоритмически решаемых задач алгоритмические решения еще не найдены. Например, для задачи о том, существуют ли инопланетяне.
Каждый из трех операторов присваивания требует изменения содержимого переменной, используемой в операторе. Первый из них позволяет помещать в переменную строку нулей. Его синтаксис:
где name — любое имя переменной.
Оставшиеся операторы присваивания являются антиподами:
Здесь name также является любым именем переменной. Первый из этих операторов увеличивает значение указанной переменной на единицу. Термин i ncr (increment) обозначает интерпретацию битовой последовательности как целого двоичного числа и изменение последовательности, чтобы она представляла целое значение на единицу больше. Например, если с переменной Y до выполнения оператора incr Y:
была связана последовательность 101, то после выполнения оператора значение переменной Y представляет последовательность 110. То есть к значению переменной Y была добавлена единица.
В свою очередь, оператор deer (decrement) используется для уменьшения значения указанной переменной на единицу. Исключением является лишь случай, когда значение переменной равно нулю, тогда оператор не изменяет значения. Таким образом, если до выполнения оператора deer Y:
с переменной Y было связано значение 101, то после его выполнения это значение равно 100. Если же значение переменной Y было равно нулю перед выполнением оператора, оно не изменится и останется равным нулю.
В скелетном языке есть только одна управляющая структура, представленная парой операторов while-end. Последовательность операторов while name not 0 do:
(где name — это любое имя переменной) обозначает, что любой оператор или набор операторов между словами while и end выполняется до тех пор, пока значение переменной name не станет равным нулю. Более точно, когда структура while-end появляется во время выполнения программы, значение указанной переменной сначала сравнивается с нулем. Если оно равно нулю, структура пропускается и выполнение продолжается с оператора, следующего за end. Если же значение переменной не равно нулю, выполняется последовательность операторов внутри структуры while-end, и управление возвращается оператору while, после чего снова выполняется сравнение. Обратите внимание, что часть ответственности за управлению еиклом лежит на программисте, который должен явно изменять значение переменной в теле цикла, чтобы избежать бесконечного выполнения цикла. Например, последовательность
приведет к бесконечному процессу, так как после достижения оператора while значение переменной X никогда не станет нулем. Однако последовательность
в итоге прекратит выполняться, а переменная Z получит значение, ранее принадлежавшее переменной X.
Обратите внимание, что операторы while и end должны всегда использоваться в паре, причем первым должен идти оператор whi I e. Однако пара операторов while-end может появиться среди инструкций, которые повторяются внутри другой пары while-end. В таком случае разбиение на пары операторов while и end выполняется путем просмотра написанной программы от начала до конца и соотнесения каждого оператора end с ближайшим предшествующим оператором while, для которого пара еще не найдена. Хотя этого не требует синтаксис, мы часто используем отступы для улучшения читаемости подобных структур.
Приведем последний пример. Последовательность инструкций (листинг 11.1) приводит к тому, что произведение значений переменных X и Y присваивается переменной Z, а побочным эффектом программы является изменение значения X, если оно не равно нулю. (Структура while-end, которой управляет переменная W, восстанавливает исходное значение переменной Y.)
Листинг 11.1. Программа на скелетном языке для умножения X на Y
while X not 0 do: clear W:
while Y not 0 do; incr Z; incr W; deer Y: end;
while W not 0 do; incr Y; deer W: end; deer X; end;
Программирование на скелетном языке
Помните, цель нашего знакомства со скелетным языком — исследовать его возможности, а не практическое его применение. Скелетный язык, вероятнее всего, было бы крайне неудобно использовать в реальной ситуации. С другой стороны, скоро мы увидим, что этот простой язык справляется с ролью скромного, без излишеств, универсального языка программирования. Сейчас же мы просто продемонстрируем использование скелетного языка для записи некоторых элементарных операций.
Для начала заметим, что при помощи комбинации операторов присваивания данной переменной можно назначить любое значение (любую битовую комбинацию). Например, следующая последовательность присваивает комбинацию битов 11 (бинарное представление 3) переменной X, для чего сначала удаляет ее предыдущее значение и затем увеличивает значение на единицу три раза:
clear X; incr X: incr X;
Другое действие, которое часто выполняется в программах, — копирование данных из одного местоположения в другое. В терминах скелетного языка это означает, что нам необходимо уметь присваивать одной переменной битовую комбинацию, которая ранее была присвоена другой переменной. Это можно выполнить, сначала очистив целевую переменную, а затем увеличивая ее на единицу подходящее количество раз. Действительно, мы уже видели, что последовательность
передает значение, связанное с X, в переменную Z. Однако у этой программы есть побочный эффект — она разрушает исходное значение X. Чтобы исправить эту ошибку, мы можем ввести вспомогательную переменную, которой присвоим в начале программы рассматриваемое значение. Затем эта вспомогательная переменная будет использоваться как источник данных, из которого мы восстановим исходную переменную, одновременно помещая нужное значение в целевую переменную. Таким образом, присваивание переменной Tomorrow значения переменной Today можно выполнить при помощи последовательности команд, приведенных в листинге 11.2.
Листинг 11.2. Реализация команды «скопироватьToday в Tomorrow» на скелетном языке
clear Aux; clear Tomorrow; while Today not 0 do;
deer Today: end; while Aux not 0 do;
Мы будем использовать синтаксис copy namel to name2;
(где namel и name2 — имена переменных) для краткого обозначения структуры операторов, приведенной в листинге 11.2. Поэтому, хотя в скелетном языке не существует явной команды копирования, мы будем писать программы так, как если бы она существовала, понимая, что для преобразования таких неформальных программ в настоящие программы на скелетном языке нам понадобится заменить операторы сору на эквивалентные структуры while-end с использованием вспомогательной переменной, имя которой не встречается где-либо еще в программах.
Почему не существует универсального языка программирования?
Почему не существует универсального языка программирования? На этот вопрос ответили пользователи сайта Quora.
Дин Хью, бывший электротехник
Компьютер в данном случае – это чистый холст памяти, ждущий нанесения красок в виде скрипта, приложения или утилита. В зависимости от того, что вы хотите получить в итоге, и от того, с чего начинаете, вы выбираете язык программирования, каждый из которых имеет свою специфику. Некоторые языки просты и приятны в обращении, как пила или разводной ключ. К таким языкам относятся Basic и JavaScript. Для достижения высокой скорости и точности программирования существуют языки С и С++. Это утверждение может вызвать массу споров, но высокая скорость и точность в этом контексте связаны с операционными системами, алгоритмами и другими критическими для скорости задачами программирования. Мистер Тьюринг научил нас тому, что и операционную систему можно написать на Perl или Javascript, но можно и из дуба наждачной бумагой стол вышлифовать, если конечно хватит наждачной бумаги, времени и терпения. О практичности речь не идет.
Эндрю МакГрегор, инженер
Заметили у них что-то общее? У них всех репутация тяжелых в изучении, тяжелых в использовании или доступных лишь посвященным языков. Или все сразу.
Причина, по которой я выбрал именно эти языки заключается в том, что все они могут быть использованы для программирования голографического ядра ОС, программ на уровне системы и приложений, ориентированных на пользователей, и я точно знаю, что они были использованы для написания ядер, начальных загрузчиков или приложений на голом железе. Я работал со всеми шестью языками.
Такое количество других языков появилось из-за того, что появляется потребность в написании все большего количества программ и со временем это делать все сложнее.
Причина, по которой C и C ++ настолько популярны, состоит в том, что они были существуют дольше, чем Haskell и Rust. К тому же С и С++ близки к золотой середине между широтой применения и дополнительной сложностью использования по сравнению с другими возрастными языками из моего списка. Вероятно, они даже лучше, чем Haskell.
Rust же слишком молод для того, чтобы повсеместным, но дайте ему 20 лет. Возможно, этот язык близок к тому, чтобы стать универсальным языком, но самым практичным на сегодняшний день является С++.
Эльфеус Мэдсен, математик, притворяющийся программистом
Многие отвечали на этот вопрос, приводя в пример языки, подходящие для любых целей; C, Assembly и Machine Language являются самыми масштабными примерами. Конечно, с точки зрения Тьюринга эти языки являются завершенными, но они не настолько хороши для исследовательского программирования или прототипирования, так что они не проходят проверку на универсальность. Мне также нравится Python и Ruby, но в этих языках «близость к железу» означает «просмотрите свою программу, найдите самые активные ее части и перепишите эти части на С». Едва ли эти языки являются универсальными.
Универсальный язык должен достигать как высокого, так и низкого уровня: он должен максимально использовать абстракции, но когда вам нужна производительность, вы должны быть в состоянии достичь необходимой глубины в аппаратном обеспечении и манипулировать битами, если это необходимо. Такие языки существуют, и я называю их «трансцендентными».
Некоторые из этих языков, такие как Common Lisp, Scheme и Smalltalk начинают как высокоуровневые, но при этом имеют механизмы (начиная от опционального ввода и заканчивая представлением для аппаратных команд низкого уровня с использованием встроенного ассемблера), позволяющие с легкостью достичь низкого уровня. Другие же, например, Forth, начинают как низкоуровневые, но могут с легкостью переходить на высокий уровень. Такие языки в прямом смысле позволяют создавать мини-языки, идеально вписывающиеся в оригинальный синтаксис исходного языка, что заметно упрощает решение сложных задач.
Для создания операционных систем с нуля использовались некоторые языки более высокого уровня. C – вездесущий язык, созданный в то время, когда ресурсов было не так много, но он занял золотую середину между простотой, низкоуровневостью и высокоуровневостью и стал очень популярен, несмотря на то, ему не хватает гибкости. Мне показалось интересным, что лишь несколько известных мне языков в свое время использовались для написания операционных систем – Lisp, Forth и Smalltalk – они также трансцендентны.
И хотя как большинство поначалу находят это странным, самое забавное заключается в том, что на самом деле все не так запутанно. Это всего лишь дело привычки. Сравните эти языки с любым языком на основе Algol (C, Pascal, PHP, Python и т. д.), который в котором присутствует иерархия выполнения математических действий, которая, как это ни парадоксально, имеет тонкие отличия от одного языка к другому. Все эти правила слишком многочисленны и труднозапоминаемы. Легче просто заключить все в круглые скобки, чтобы не пришлось беспокоиться о причудливых правилах приоритетности.
Уильям Шайн, кандидат наук по информатике и математике, университет Хьюстона (1995)
Как и было отмечено другими пользователями, С и семейство С являются универсальными языками. К ним относятся C, C++, Objective C, Objective C++ и Swift. Можно было бы добавить сюда Rust. Современные компиляторы С и С++ позволяют писать встраиваемый ассемблерный код. Не то, чтобы это было прекрасной идеей. И они почти все могут взаимодействовать между собой. С++ может использовать библиотеки С, Swift – библиотеки С и Objective C.
Какие бывают языки программирования?
Студенты периодически спрашивали меня какой язык программирования учить чтобы получить хорошую работу и зарплату. Конечно, я не мог сказать учите этот язык, а этот не учите и будет вам счастье. Но зато мог дать информацию о языках программирования чтобы этот выбор был легче. Проклассифицируем языки программирования с семи сторон: Модные и не модные • Компилируемые и интерпретируемые • Универсальные и специализированные • Алгоритмические и языки описания данных • Низкоуровневые и высокоуровневые • Объектно-ориентированные и языки структурного программирования • Сопутствующие Фреймворки, Библиотеки и Технологии.
Первый способ классификации, в котором есть доля шутки: Модные или популярные языки программирования, и вышедшие из моды или активного применения
Почему некоторые языки становятся модными, а о других почему-то забывают? Во-первых, смена технологий. Например, во времена операционной системы MS DOS, которая работала на 16-битных процессорах Intel, огромной популярностью пользовались языки Турбо C и Турбо Паскаль. А владеющие Ассемблером программисты считались элитой. Но, по понятным причинам, мы теперь не пользуемся ни этими устаревшими процессорами, ни системой MS DOS, так что языки отпали сами собой. Хотя мне, например, они до сих пор очень нравятся.
Другая ситуация с языком Delphi, который был продолжением Турбо Паскаля, и который был очень популярен во времена первых 32-х битных версий Windows, однако не выдержал конкуренции с другими языками программирования, в том числе от компании Microsoft, которые развивались более активно.
Это может быть и победа в конкуренции двух аналогичных языков, например, таких как JScript от Microsoft для веб-браузеров и JavaScript, первоначально представленный компанией Netscape. Популярным JavaScript стал за счет большей открытости и поддержки большим числом компаний разработчиков.
Языки С и С++ долгое время остаются популярными благодаря мнению о высокой эффективности программ, которые написаны на них. В общем, так оно и есть. Однако, постепенно другие языки программирования стали приобретать популярность не только за эффективность выполнения, но и за легкость в изучении, написании и поддержке программ, чего нельзя с уверенностью сказать о C++.
За большие возможности и гибкость С++ требует от программиста дисциплины и культуры программирования, иначе, как шутят программисты, он может превратиться из языка написания программ в язык для написания ошибок.
Несмотря на провозглашаемый стандарт языков C и C++, программы, написанные для компиляторов разных фирм редко когда бывают полностью совместимы по исходным кодам. Эту особенность тоже надо учитывать при его изучении.
А язык TypeScript получил популярность в качестве ответа на проблему сложности поддержки программ написанных на JavaScript, языке, который сам по себе достаточно популярен.
Из современных популярных языков стоит отметить Python из-за сравнительной простоты изучения, открытости, и возможности применения в различных предметных областях, таких как веб, искусственный интеллект, компьютерные игры.
Практически у каждого языка программирования есть своя группа фанатов, хотя популярность сегодня совсем не означает популярность в ближайшем будущем или что популярный язык обязательно станет полезен именно вам. В общем, выбор всегда за вами.
2. Компилируемые и Интерпретируемые
Любая программа на языке программирования это прежде всего текст. Текст понятен человеку, и сравнительно легко может быть обработан компьютером, потому что буквы и другие текстовые символы в компьютере представлены некими целыми числами, их еще называют кодами символов. Программа, которая обрабатывает текст на языке программирования и создает по нему последовательность команд микропроцессора называется компилятор. То есть компилятор переводит числа, которые человек воспринимает как текст в другие числа, которые компьютер воспринимает как команды микропроцессора.
Такая схема, конечно, не всех устраивала и программисты придумали языки, которым не требуется компилятор. Для таких языков перевод текста в команды микропроцессора происходит незаметно сразу после запуска текстовой программы. Правда, для этого текстовая программа должна запускаться под управлением другой уже готовой программы, которая называется Интерпретатор. Интерпретатор и делает эту незаметную компиляцию. Языки для которых требуется интерпретатор назвали Интерпретируемыми.
Главное отличие компилируемых языков от интерпретируемых в скорости выполнения программ. Считается, что программы написанные на компилируемых языках выполняются быстрее чем на интерпретируемых. Но сам процесс написания и тестирования интерпретируемой программы проходит проще, так как нет необходимости в промежуточном шаге компиляции.
Похожим образом, программа на TypeScript сначала компилируется в текстовую программу, или, как говорят, в код на JavaScript, который затем уже может быть выполнен интерпретатором JavaScript. Такое усложнение позволяет воспользоваться преимуществами строгой типизации данных и отловом ошибок на этапе компиляции, которые доступны в TypeScript.
3. Универсальные и специализированные
Классификация говорит сама за себя. Есть языки, на которых можно в принципе написать любую программу, но не всегда это можно сделать, например, быстро. Или такая программа не обязательно будет оптимально быстро работать. Типичный универсальный язык всех времен и народов: С++. И в этом его большой плюс. А, может, даже два плюса )).
Специализация в языках программирования касается, как правило, либо предметной области, например, математические вычисления (Fortran, F#), искусственный интеллект (LISP), веб-разработка (PERL, PHP), компьютерные игры (Unity, Lua), бухгалтерия (1С) и т.д., либо какой-то технологии программирования, например, многопоточность как в языке Cи-Омега (Cw) или способ записи операторов как в F#.
Для разных областей приложений создаются свои языки или скрипты. Особенно это относится к компьютерным играм, в которых переплетаются сразу несколько видов искусства, науки и технологии. Но системы разработки игр также используют и уже известные языки, например, Python в системе нарративных игр Ren’Py или язык Swift для устройств Apple.
Универсальные: семейство Pascal/Delphi, C/C++, C#, Java
Специализированные:
Математические вычисления: Fortran, F#
Математическое моделирование: MatLab, Wolfram (Mathematica)
Искусственный интеллект: LISP,
На основе передачи сообщений: Small Talk,
Многопоточные приложения Cw,
Веб-разработка: Perl, PHP, JavaScript
Базы данных: SQL
Компьютерные игры: Lua, Unity, Godot, Twine
Компьютерная графика: MEL (Maya), MAX Script (3ds Max)
Бухгалтерия: 1С
4. Алгоритмические и Языки описания данных
Алгоритмические: Pascal, C++, Java, C#
Языки описания данных: XML, XAML, JSON, HTML, DDL SQL
Алгоритмические языки, конечно, тоже умеют описывать данные, но в основном предназначены для создания больших и сложных программ, которые описывают действия, то есть алгоритмы.
Языки же описания данных предназначены только для описания данных для разных типов приложений. Эти языки можно считать необходимой нагрузкой к обычным алгоритмическим языкам. Например, если вы учите JavaScript для разработки веб-приложений, то скорее всего вам придется также изучить и синтаксис каскадных таблиц стилей CSS и язык описания данных JSON, в формате которого удобно передавать данные между веб-сервером и клиентом.
Или, например, язык работы с базами данных SQL, по сути является языком для обработки и получения данных, но также включает в себя раздел Data Definition Language или Язык Описания Данных.
Вообще, на способы описания и управления данными сейчас разработчикам приходится обращать внимания, пожалуй, не меньше чем на описание алгоритмов.
5. Низкоуровневые и Высокоуровневые
Низкоуровневые: Assembler, CIL,
Высокоуровневые: любой объектно-ориентированный или поддерживающий сложные типы данных язык.
Этот тип классификации, хоть и немного теряет актуальность, поскольку подавляющее большинство языков теперь можно отнести к высокоуровневым, но все еще имеет место, поскольку низкоуровневые языки существуют.
Эта классификация была актуальна на заре развития компьютеров, когда число доступных компиляторов можно было пересчитать по пальцам, а написать, например, драйвер клавиатуры на Ассемблере можно было в качестве развлечения в свободное время.
Напомню, что Ассемблер, это язык, команды которого максимально соответствуют командам самого микропроцессора, которые позволяют обрабатывать данные размером один, два или четыре байта, за счет чего представить на нем сложные типы данных очень и очень проблематично. Но зато по скорости выполнения программ языку Ассемблера просто нет равных.
6. Объектно-Ориентированные и Структурные языки программирования
Появление объектно-ориентированного программирования, сокращенно ООП, примерно со второй половины 80-х годов 20-го века стало настоящей технологической революцией. Это был буквально переворот, сейчас объясню почему. До ООП были популярны языки структурного программирования. И программисты были вполне счастливы писать программы на структурных языках высокого уровня, потому что в свое время это тоже было колоссальным шагом вперед.
Дело в том, что компьютер удалось создать только после титанических усилий таких гениев как Алан Тьюринг, который разработал свою теорию — машину Тьюринга, на основе которой и работают все числовые компьютеры в наши дни. Принцип машины Тьюринга, вкратце, состоит в том, что в оперативной памяти записана последовательность команд микропроцессора, в том числе команд условных или безусловных переходов на другие команды. Эти переходы на ассемблере называются JMP (англ.: jump — прыжок, переход), а в языках высокого уровня обозначаются командой GOTO (англ.: go to — перейти к чему-л.).
Для программирования компьютера первоначально существовал язык Ассемблер, команды которого почти один в один соответствуют командам микропроцессора. Теоретически, на Ассемблере можно написать любую программу, но практически перенос абстракций прикладных задач на него совсем не простое дело.
Для программирования прикладных задач, примерно с начала 70-х годов 20-го века и появилось структурное программирование, для создания которого потребовались усилия других гениев, таких как Никлаус Вирт, создатель языка Паскаль и Эдсгер Дейкстра, который первым написал о необходимости избавляться от оператора GOTO в языках высокого уровня и предложил решение как это сделать с помощью трех типов операторов и функций.
На практике это вылилось в появление языков программирования, таких как Basic, С, Паскаль, Algol, Cobol, Fortran, PL1. Разработка программ методом «сверху вниз» в структурном программировании превратилась в сплошное удовольствие. Суть ее состояла в написании набора функций, содержащих подфункции, которые можно вызывать, подставляя на вход нужные данные и получая соответствующий результат.
Таким образом, в языках структурного программирования алгоритмы на основе функций стоят как бы на первом месте, а данные для них можно брать откуда угодно. Не последнюю роль в этом сыграла идея автора кибернетики Норберта Винера о функции как о черном ящике, на вход которому можно подавать любые данные и наблюдать получаемый выход.
Для небольших задач типа сортировки данных или нахождения кратчайшего пути структурное программирование подходило идеально. Были найдены решения для большинства сложных алгоритмических задач. Появились фундаментальные труды, такие как многотомник “Искусство программирования” Дональда Кнута, который до сих пор считается настольной книгой для программистов.
Однако, увеличение сложности программ в результате привело к появлению и бо́льших шансов на внесение ошибок в программы, так как возможность подставлять любые данные на вход процедурам и функциям влекло за собой побочные эффекты. Так, например, в 1999 году космический аппарат NASA «Mars Climate Orbiter» потерпел крушение в из-за ошибки в программе — подстановки неправильных данных.
В результате появилась новая концепция объектно-ориентированного программирования, в котором во главу угла ставится, как я его называю, принцип актуальности данных, а функции становятся как бы приложением к данным, которые они должны обрабатывать. Объект это, в первую очередь, набор данных со своими функциями. В ООП вводятся ограничения на доступ функций к «чужим» данным, что уменьшает возможность непреднамеренного изменения данных и резко повышает надежность программ.
После появления объектно-ориентированных языков программирования, таких как С++, Object Pascal, Java, С#, а также новых аппаратных возможностей компьютеров, объемы программ и данных для них увеличились многократно, если не на порядки, что легко оценить хотя бы по объемам дистрибутивов программ, которые перестали помещаться сначала на дискеты, а потом и на компакт диски. А программирование снова как бы встало с головы на ноги.
Update 24.02.2021
См. также видео-версию этой главы.
7. Сопутствующие Фреймворки (Frameworks), Библиотеки и Технологии
С определенным языком программирования может быть связана технологическая цепочка или целая система программирования, которые также называют термином фреймворк.
Для использования языка С++ от Microsoft для первых 32-х битных версий Windows программистам для создания оконных приложений также приходилось изучать библиотеку MFC.
Для разработки веб-приложений с помощью технологии MVC от Microsoft программистам также потребуется язык разметки веб-страниц Razor.
Для создания современных приложений на универсальной платформе Microsoft может потребоваться язык разметки XAML.
Другие примеры:
Ruby on Rails — серверная платформа разработки веб-приложений.
Для компьютерных игр, такие как Unity, Cocos, Unreal Engine.
Для 3D графики: OpenGL, DirectX.
Наверно, возможны и другие способы классификации языков программирования, например, со строгой типизацией и без. Но они интересны тем, кто уже разбирается в программировании, этот же обзор скорее для начинающих.
Выводы
В принципе, чем больше языков знает программист, тем увереннее себя чувствует как профессионал. Но в наше скоростное время возможно и такое, что версия языка может потерять свою актуальность буквально за полтора-два года. Например, у языка TypeScript c 2015 по 2019 год, то есть примерно за 5 лет, было выпущено, внимание, более 20-ти обновлений.
Если же с компанией еще не определились, то можно начать с одного из универсальных языков программирования. Из-за повсеместного проникновения интернета, для программиста желательно хотя бы в общих чертах представлять себе что такое язык HTML, а также сопутствующие языки описания данных типа XML и JSON. Желательно также иметь представление о языке управления базами данных SQL.
Прошло то время, когда работать с одной и той же версией языка программирования можно было десятилетиями. В наше время особенность работы программиста состоит в постоянном изучении новых языков и технологий. Курсы по программированию могут быть хорошим трамплином, но основной опыт программисты получают в процессе работы, как бы учась и работая одновременно.
Глядя на эти системы может сложиться впечатление, что программисты скоро окажутся не нужны. Но отгадайте, кто создает все эти системы программирования без программистов? Те же программисты с помощью все тех же обычных языков программирования.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.