Рис. 1. Перфокарты для ткацкого станка Жаккарда
Язык программирования – это искусственный язык, который был создан для общения человека с компьютером, в частности, для того чтобы сказать компьютеру, что и как, когда и за чем сделать, то есть, для того, чтобы передать компьютеру инструкции на выполнение какой-то полезной работы.
Содержание:
1. Почему понадобились языки программирования
История возникновения:
2. Нулевое поколение
. . . Жаккардовый станок
. . . Машина Беббиджа
. . . Программируемый табулятор
3. Машина Тьюринга
4. Архитектура фон Неймана
5. Цифровые компьютеры
. . . Ассемблер
6. Первые языки высокого уровня
. . . Кобол
. . . История о преданности языку программирования
. . . Фортран
7. Золотой век
. . . Алгол
. . . Паскаль
. . . Simula и Smalltalk
8. Скриптовые языки
9. Интернет и Веб
10. Жизненный цикл языка программирования
11. Что есть язык программирования
. . . Синтаксис на примере Lisp
. . . Семантика
. . . Система типов данных
. . . Парадигма языка программирования
. . . Runtime – выполнение программы
12. Представители языков
. . . Язык C
. . . Java
. . . Lisp
. . . Python (Питон)
13. Выбор языка под задачу: важный совет
. . . Экосистема
. . . Популярность
. . . Скорость обучения
. . . Нишевость языков
14. Видео
Компьютеры до сих пор плохо понимают естественные языки, которые используются для общения между людьми, по крайней мере, еще не научились понимать.
В свою очередь, люди плохо понимают машинные языки. Поэтому были созданы языки программирования, которые покрывают эту дыру в понимании, в модели мышления между человеком и компьютером.
Языки программирования могут быть:
История возникновения языков программирования
Сейчас используется несколько сотен языков программирования, но еще больше таких языков уже не используется. Под новые задачи со временем разрабатывались новые языки программирования.
Примером таких машин служит жаккардовый ткацкий станок с программируемым устройством. Он был сделан в 1804 году французом Жозефом Мари Жаккаром. Кстати, в его честь узорчатая, декоративная ткань названа жаккардовой или жаккард.
С помощью станка можно было легко и массово производить вышивки на ткани при помощи перфокарт, представленных ниже на рисунке:
На перфокартах была запрограммирована последовательность действий для станков, чтобы воспроизвести какой-либо рисунок на ткани.
– еще более узкоспециальная машина, чем жаккардовый станок. Она была разработана Чарльзом Бэббиджем в Англии в 19 веке, но так и не была построена из-за нехватки средств.
Рис. 2. Машина Бэббиджа
Машина Бэббиджа была предназначена, чтобы вычислять суммы рядов и через них – разные функции. У этого устройства был собственный язык, который говорил, что нужно вычислять.
По проекту предполагалось вычислять логарифмы, степени, тригонометрические функции и т.д. с высокой степенью точности, более 5 знаков, что в то время было фантастикой.
– полностью электронное устройство. Это машины, которые были разработаны в начале 20 века и использовались, в основном, для операций с перфокартами.
Рис.3. Программируемый табулятор
На таком табуляторе писали программы для расчета зарплаты и т.п. Программа для такой машины выглядит как доска с массой отверстий и проводов. Табулятор «жевал» (читал) стопку перфокарт и выдавал что-то интересное.
Рис. 4. Программа для табулятора
Как видите, программа для табулятора совсем не похожа на современное программирование.
– простая абстракция, теоретическое построение, несуществующая в реальности машина, но которая описывает, как должен быть построен любой вычислитель:
Машина Тьюринга не имела воплощения в «железе», но получила важное теоретическое применение в теории вычислений.
– абстрактная архитектура для абстрактного вычислителя, которая позволяет добиться некоторых хороших результатов в гибкости использования машины.
Схематично эту архитектуру можно представить в виде 3-х основных блоков:
Рис. 5. Архитектура фон Неймана
Фон Нейман предложил программу действий машины и исходные данные, с которыми она работает, хранить в одном общем пространстве памяти, что несколько противоречит машине Тьюринга. У Тьюринга программа состоит из набора переходов в разные состояния машины, а данные хранятся отдельно, на ленте.
В дальнейшем по архитектуре фон Неймана были построены почти все существующие сейчас устройства.
Идеи машины Тьюринга и архитектуры фон Неймана определили дальнейшее развитие программирования и цифровых компьютеров по следующим характеристикам:
Первые программы для цифровых компьютеров писали в машинных двоичных кодах. Со временем стало неудобно писать в программах длинный код, руководствуясь следующей схемой: из какой ячейки памяти брать каждое число, что с ним потом сделать и в какую ячейку памяти поместить результат. Программы для военных, для космических аппаратов и т.д. были очень сложными, большими.
Тогда появились первые языки программирования, отличавшиеся от ранее существовавших языков, которые были родными для машины и фактически содержали двоичный код. Языки программирования стали чуть ближе к человеку, а не к машине.
Рис. 6. Программа на Ассемблере для MS DOS
Программа на рис. 6:
Ассемблер – язык, очень близкий к системе команд, которая была родной для вычислительной машины. При этом в ассемблере давали командам понятные мнемонические имена (названия команд).
Раньше программисты писали цифры, двоичные коды, а в Ассемблере наконец появились человеко-понятные имена для операций.
Программа на ассемблере писалась для конкретной машины, ее нельзя было использовать на другом устройстве.
Языки семейства ассемблер до сих пор широко используются, ибо для любой новой архитектуры или чего-то нового первые программы всегда пишутся на ассемблере по той причине, что до какого-то момента просто может НЕ найтись иных подходящих языков программирования, кроме как ассемблер.
Ассемблеры – это языки, которые написаны для конкретной архитектуры железа и близки к машинным кодам.
Рис. 7. Перфокарта от IBM 360
В ассемблере (и не только в нем) для передачи в компьютер используются перфокарты. На перфокарту можно записать 80 символов, одна перфокарта хранит 8 байт. Кстати, до сих пор по умолчанию ширина терминала в Linux ограничена 80-ю символами.
Люди поняли, что давать машине прямые команды с помощью ассемблера классно, но хочется делать вещи более высокого уровня. В конце 50-60-х годов появились первые языки высокого уровня:
Рис. 8. Программа на Коболе
Программа на Кобол, приведенная на рис. 8, делает то же самое, что и программа на рис. 6, а именно, выводит сообщение HELLO.
Кобол прочно укрепился в бизнесе, использовался в управлении атомными реакторами и энергосистемами, в банковских системах. Поэтому в США до сих пор есть спрос на программистов на Коболе.
Была интересная история про «жадную компанию» в США, которая купила в 1960-х годах большой компьютер, наняла программистов. Они для компании написали программное обеспечение на Коболе.
Компьютер работал-работал, но со временем устарел и перестал работать. Попытки найти замену старому компьютеру не увенчались успехом – такие машины уже никто не выпускал.
Приобрели другую машину, но спустя 20 лет переписывать для нее старые программы на Коболе – очень дорогое удовольствие. Поэтому был заказан у программистов и в течение года написан транслятор для старого программного обеспечения на Коболе, который позволял старую программу запускать на новой системе.
Такая история повторялась в компании 2 раза. Они брали старую бизнес-систему на Коболе, аккуратно ее поднимали и переносили на новое место, чтобы она там жила и здравствовала.
Технические специалисты понимали, что так продолжаться бесконечно не может, но родственники боялись что-то менять в бизнесе и так он продолжал работать.
Многие научные разработки велись с использованием Фортрана. Считается, что ученый из любой области легко мог освоить этот язык и применять его в своей научной деятельности.
Ниже приведен пример программы на Фортране:
Рис. 9. Программа на Фортране
Это конец 60-х – начало 70-х, когда программирование получает признание. Люди понимают, что можно написать программу, которая пошлет аппарат на Луну, можно моделировать, строить и т.д.
В это время формируется несколько языков, которые положили начало важным направлениям в программировании:
Язык Algol был предназначен для написания алгоритмов, а не для вычислений. Благодаря Алголу появилось само понятие «структурного программирования». В настоящее время язык немножко «умер» и не используется.
Наследники Алгола – языки
На языке C до сих пор очень-очень много пишут программ, а это одна пятая часть всего кода, который сейчас есть. На нем разрабатывают программы для маленьких устройств и низкоуровневый код для персональных систем.
Язык Паскаль был разработан в 1970 г. Никлаусом Виртом в качестве учебного языка для того, чтобы учить студентов программированию. Он воплотил в себе все идеологические аспекты структурного программирования, не смешанные с техническими вещами.
Объектно-ориентированное программирование подразумевает описание предметной области при помощи объектов, а не так, как было до этого – в виде линейной или ветвящейся структуры.
Simula – объектно-ориентированный язык, появился в 1967 году в Европе, вначале описывал военные маневры. Объектами были танк, самолет, человек, которые делают то-то и то-то.
Smalltalk использовался в научных разработках, но он был очень медленный, в результате чего появился язык C++.
В функциональном программировании программа в целом представляет собой функцию, значение которой вычисляется. Функция записывается или определяется через другие функции.
В 1980-х – 1990-х годах с появлением персональных компьютеров (PC) в программирование приходят «простые люди». Появляется потребность в таких языках, которые может легко использовать простой человек в своих целях.
Появляются новые языки:
Их основные особенности:
Следующая важная веха в программировании – появление Интернета и Веба.
Появились специализированные языки:
Многие сайты написаны с помощью PHP и JavaScript.
Некоторые ранее существовавшие языки с появлением Интернета и Веба нашли новые ниши и стали веб-ориентированными:
К 2000-м годам старые языки программирования постепенно «умирают», появляются новые, но нет общепризнанной концепции, что же происходит с этими вещами.
Любой язык программирования – это искусственный язык, который имеет свой цикл жизни. Аналогично, операционные системы семейства Windows тоже имеют свои жизненные циклы: подробнее.
В современном мире основная часть программного обеспечения (софта) пишется на 10-15 языках, хотя за все время, которое нам известно, было создано больше сотен языков программирования. Официально как-то зарегистрировано 300 или 400 языков.
Язык – это
Синтаксис определяет форму текстового представления программ, то есть, как их нужно написать, какие слова в язык входят, как ставить запятые, пробелы и т.д.
Одним из самых простых языков программирования, которые имеют формальную грамматику, считается язык списков LISP.
Рис. 10. Программа на LISP
LISP является очень старым языком, который вырабатывает списки. Грамматика такого языка – это грамматика списков, читается сверху вниз.
Программа на Лиспе – это список списков. Знаков препинания в Лиспе нет, но есть скобочки. Могут быть такие длинные программы на Лиспе, где в конце идет 2-3 листа, состоящих из одних закрывающих скобочек.
Простейший интерпретатор Лиспа занимает всего 19 строк! Ни один другой язык не может себе позволить себе такой роскоши.
Если грамматика описывает формы представления: буквы, цифры, скобочки, то семантика описывает то, как программа работает, что эти буквы, цифры, скобочки означают, как они работают, взаимодействуют друг с другом и т.п.
Варианты представления семантики довольно ограничены.
Семантика может быть:
Семантика разделяется на две части:
Статическая семантика
Динамическая или фронтальная семантика этапа выполнения
Важной частью семантики является система типов – это набор правил и выражений для методов, которые написаны в идеологии языка и того, как они между собой взаимодействуют.
Обычно в языке программирования имеется система типов данных – это строки, числа, списки и т.д. Есть, например, язык Форс, где все данные – просто байты, другими словами, существуют языки, где вообще не встроены типы данных.
Если же система типов присутствует, то можно провести деление языков программирования на два независимых друг от друга класса, которые приведены ниже.
Система типов данных:
Если типизация статическая, то типы всех переменных и выражений, которые написаны в программе, известны до момента ее выполнения, то есть, когда описываются функции, классы, переменные, то сразу задаются или явно обеспечиваются условия для того, чтобы тип такой конструкции был известен с самого начала.
Если типизация динамическая, то, наоборот, тип объектов контекстного языка неизвестен до момента выполнения, то есть тип функции или чего угодно будет неизвестен до самого конца.
Строгая типизация означает, что если у сущности есть какой-то тип и он известен, то этот тип может заменяться, но у самого объекта тип фиксированный, и он не меняется.
При слабой типизации тип объекта может быть разным в зависимости от контекста и от того, что Вы с ним делаете.
За системой типов языка приходится следить. Из-за неверно заданного типа только одного, не очень заметного символа в начале программы меняется тип всего выражения и поэтому в итоге могут получаться очень странные ошибки.
Следующая важная характеристика языка —
Главные парадигмы
Часто одну и ту же практическую задачу можно реализовать с помощью любой из парадигм, перечисленных выше.
Еще одной важной частью языка, которую нужно учитывать при использовании языка, является Runtime – то, как язык выполняется.
Программа может выполняться по-разному:
Перечисленные три способы разные и используются для разных целей. Эти техники могут комбинироваться – интерпретатор может компилировать на лету какие-то куски программы, чтобы работало быстрее. Динамически-сгенерированный код может интерпретироваться без компиляции.
Представители языков
– один из самых популярных, один из самых важных по физически написанному по нему коду, практически это «наше всё».
Он создан в 1972 году, создатели – Деннис Ритчи (Dennis Ritchie) и коллеги. Д.Ритчи создал также систему Linux и многие другие полезные вещи.
Язык С:
Кстати, С актуален до сих пор, используется для:
С – низкоуровневый язык, можно сказать, что это Ассемблер с человеческим лицом, ибо почти любую конструкцию C человек может вручную преобразовать в Ассемблер и получатся довольно понятные операции.
Программы на C получаются очень компактные. Они не намного больше, чем если бы аналогичные программы были написаны на Ассемблере. При этом разработка на C проходит намного быстрее, чем на Ассемблере.
Поэтому C сейчас используется для таких задач, где требуется быстродействие, очень важно управление памятью и большое значение имеет компактный объем самой программы. Если у Вас маленький микроконтроллер, который встраивается в какое-то устройство, то программа для него, скорее всего, будет написана либо на Ассемблере, либо на C.
Рис. 11. Пример простой программы на C.
В 90-ых годах JAVA получила большую популярность как мультиплатформенный язык. Один раз написав виртуальную машину для какой-то платформы, допустим для Windows разных версий или для Linux или для Mac, можно любые программы на JAVA запускать на ней без перекомпиляции. Поэтому язык был популярен в эпоху веба, когда было разных платформ (разные версии Windows, разные Маки). Программы на JAVA работали быстро и довольно хорошо на разных платформах.
Используется для:
Следует отличать спецификации языка Java и различные реализации JVM:
Рис. 12. Пример простой программы на JAVA.
Как видно на рис. 12, приходится писать много букв, чтобы выполнить простые действия. Java часто называют новым Коболом, так как она содержит те же негативные свойства, которые когда-то сделали Кобол плохим языком.
Тем не менее JAVA очень популярна, в частности, на ней написана клиентская часть операционной системы Андроид.
Используется для:
Язык Lisp, разработанный в 1958 году, претерпел массу изменений.
У него есть множество реализаций и диалектов:
Рис. 13. Программа на LISP: сортировка пузырьком
Без правильных отступов читать такую программу довольно сложно.
Используется для:
Python – спецификация языка. Существует несколько основных реализаций:
Рис. 14. Программа на Python: сортировка пузырьком
У Python есть важная особенность – вместо скобочек (круглых, фигурных) для выделения блоков кода и структурных элементов используются отступы с помощью пробелов, что довольно необычно для всех языков. Кроме Python такой особенностью почти никто не обладает.
Как выбрать язык под задачу, когда Вы знаете, что Вам нужно сделать, но не знаете на чем?
Важный совет: используйте то, на чем Вы умеете программировать. Это гораздо лучше, чем использовать то, на чем Вы НЕ умеете программировать.
Язык, который Вы хотите взять, не должен быть «голым» языком, у него должна быть экосистема, которая включает:
Сложно найти в команду людей, которые пишут код на редко используемом языке, к примеру на Eiffel. С другой стороны, на вакансию по мега-популярному языку JAVА, в котором порог входа низкий, набежит много народа, но будет непросто подобрать людей, которые пишут на нем действительно хорошо.
Чем популярнее язык, тем больше у него библиотек, коммьюнити, фреймворков и других вещей, которые нарастают сами по себе сверху.
Почти никто не знает язык до конца. По мере работы Вам потребуется учиться языку все дальше и дальше. Некоторые языки учатся легко, а какие-то очень плохо.
JAVA — язык простой в изучении и простой по возможностям, а дальше все строится не за счет языка, а за счет инструментов.
С++ выучить до конца невозможно, потому что там есть очень сложные вещи с кодогенерацией.
Конкретные языки лучше подходят для решения определенных нишевых задач.
Пример 1: веб приложение, которое
Для такой задачи, скорее всего, подойдет Python или Ruby. Не надо это делать на JAVA
Пример 2: биллинговая система сотового оператора
В этом случае наш выбор – Java, С++, Erlang – богатые языки с богатым инструментарием.
Пример 3: код бортовой ЭВМ для спутника
Наш выбор – С и С-подобные языки (и даже ассемблер), потому что очень мало ресурсов и эти требования надо соблюсти.
Статья основана на видео:
Смотреть видео лучше на скорости 0.75.
Видео снято в декабре 2014 года, тем не менее, вся информация актуальна и не имеет срока давности. Многие материалы с позиции сегодняшних реалий представляют несомненный интерес, например, о том, что ученые еще в конце 1950-ых — начале 1960-ых годов считали, что искусственный интеллект уже на пороге и с его помощью можно будет вот-вот работать на компьютере с естественным, обычным, человеческим языком.
Чтобы записаться на онлайн-курс, нужно пройти регистрацию, указав свою электронную почту. Для этого перейдите по указанной ниже ссылке, после чего в правом верхнем углу кликните по зеленой кнопке «Поступить на курс»:
Дополнительные материалы:
В Google почте можно задать секретный, конфиденциальный режим для письма. Этот режим НЕ позволяет получателю…
На сайте Госуслуг можно узнать, есть ли у вас какие-либо ограничения на выезд из России.…
Рассмотрим два способа, как можно найти и потом сохранить картинку на компьютере. Первый способ –…
Жизнь идет своим чередом и вносит свои коррективы в наши планы, поэтому для ранее купленных…
У РЖД (Российские Железные Дороги) есть официальный сайт rzd.ru. У программы РЖД Бонус тоже есть…
В Госуслугах появились три новых возможности для пассажира поезда: сведения о билете, архив и возврат…
View Comments
Начните с простейшего учебного языка по программированию - Microsoft Small Basic. Начинать нужно с простого, а не с популярного.
Сайт small-basic.ru вам в помощь, там много учебных материалов на русском языке.
Смол бейсик как раз сложен. Начинать надо с азов бейсика, но более продвинутого. Юзать почти что общее подмножество со смол бейсиком, но именовать переменные более свободно. Начав понимать машину, переходить на паскаль, с него – на c++, с него можно перейти на голые си, а можно и остаться на плюсах и учить их уже серьёзно. А на голых сях ограничиться азами просто не получится.
Некоторые языки очень популярны для конкретных задач. Например, Кобол до сих пор доминирует в корпоративных дата-центрах, Фортран — в научных и инженерных приложениях, вариации языка Си — в системном программировании.
И как же я по-Вашему умудрился написать приложение, использованное для мною в рамках диссертационного исследования, не зная даже операторов фортрана и не имея его трансляторов вообще? И ладно бы один, независимый разработчик может юзать что угодно, лишь бы результату хватало ресурсов. Но аспиранты независимо не работают. А профессор не молод.
В наши дни языки низкого уровня используются только в задачах системного программирования. Считается, что в задачах, где необходим точный контроль за ресурсами, язык сам должен требовать как можно меньше преобразований, иначе все усилия программиста окажутся напрасными. В действительности есть примеры, опровергающие это, например, язык BitC.
И как же на BitC не запутаться в преобразованиях самого BitC? А без этого искомый контроль невозможен.