История языков программирования
Программирование — это сама основа цифровой эпохи, в которой мы живем сегодня. Каждый раз, когда вам нравится публикация в социальных сетях, вы отправляете электронное письмо или устанавливаете будильник на своем телефоне, язык программирования работает за кулисами, дергая за ниточки.
Но с чего все началось? И что стимулировало его рост в ведущую отрасль, существующую сегодня? Прежде всего, почему знание истории языков программирования важно для подбора ит специалистов и разработчиков ?
Эта ретроспектива продемонстрирует, насколько компьютерное программирование развилось за эти годы. Он вернет вас от ранних языков и сложного машинного кода к сложному, удобочитаемому языку, на котором сегодня работают наши любимые технологии.
Первый язык программирования
Знаете ли вы, что первый в мире язык компьютерного программирования был изобретен еще в 1843 году? Ада Лавлейс изобрела первый в истории машинный алгоритм для одной из первых вычислительных машин, который она записала на листе бумаги, потому что в то время компьютеров не существовало! С тех пор языки программирования, очевидно, прошли долгий путь, но для того, чтобы понять историю языков, нужно сначала понять их происхождение.
История языков программирования: хронология
Ниже приведен график истории языков программирования. Первые известные языки были сложными машинными кодами, которые вручную вводились в первые вычислительные машины. Как вы понимаете, компьютерное программирование быстро превратилось из машинных кодов в полностью автоматизированный, читаемый человеком код.
1843: Машинный алгоритм Ады Лавлейс
Ада Лавлейс изобретает первый в истории машинный алгоритм для разностной машины Чарльза Бэббиджа, который закладывает основу для всех языков программирования.
1944-45: Планкалкюль
Где-то между 1944-45 годами Конрад Цузе разработал первый «настоящий» язык программирования под названием Plankalkül (Расчет плана). Язык Zeus (помимо прочего) позволял создавать процедуры, в которых хранятся фрагменты кода, которые можно было вызывать снова и снова для выполнения рутинных операций.
1949: Язык Ассемблера
Ассемблер использовался в автоматическом калькуляторе с электронным запоминанием задержки (EDSAC). Ассемблер был разновидностью низкоуровневого языка программирования, который упростил язык машинного кода. Другими словами, конкретные инструкции, необходимые для работы с компьютером.
1949: Shortcode
Шорткод (или сокращенный код) был первым языком высокого уровня (HLL), предложенным Джоном Макколи в 1949 году. Однако именно Уильям Шмитт реализовал его для компьютера BINAC в том же году и для UNIVAC в 1950 году.
1952: Автокодирование
Автокод был общим термином, используемым для семейства языков программирования. Autocode, впервые разработанный Аликом Гленни для компьютера Mark 1 в Университете Манчестера, был первым в истории скомпилированным языком, который был реализован, что означает, что он может быть переведен непосредственно в машинный код с помощью программы, называемой компилятором. Автокод использовался на первых вычислительных машинах Ferranti Pegasus и Sirius в дополнение к Mark 1.
1957: Fortran
FORmula TRANslation или FORTRAN был создан Джоном Бэкусом и считается старейшим языком программирования, используемым сегодня. Язык программирования был создан для научных, математических и статистических вычислений высокого уровня. FORTRAN до сих пор используется в некоторых из самых передовых суперкомпьютеров в мире.
1958: ALGOL (Алгоритмический язык)
Алгоритмический язык или АЛГОЛ был создан совместным комитетом американских и европейских компьютерных ученых. Алгол послужил отправной точкой для разработки некоторых из наиболее важных языков программирования, включая Pascal, C, C ++ и Java.
1958: LISP (обработчик списков)
Процессор списков или LISP был изобретен Джоном Маккарти в Массачусетском технологическом институте (MIT). Первоначально предназначенный для искусственного интеллекта, LISP является одним из старейших языков программирования, которые все еще используются сегодня, и его можно использовать вместо Ruby или Python. Такие компании, как Acceleration, Boeing и Genworks, по-прежнему используют LISP в своих технических стеках.
1959: КОБОЛ (Общий бизнес-ориентированный язык)
Общий бизнес-ориентированный язык (COBOL) — это язык программирования, лежащий в основе многих процессоров кредитных карт, банкоматов, телефонных и сотовых вызовов, сигналов больниц и систем сигналов светофора (и это лишь некоторые из них). Разработкой языка руководила доктор Грейс Мюррей Хоппер, и он был разработан таким образом, чтобы его можно было использовать на компьютерах всех марок и типов. COBOL до сих пор используется в первую очередь для банковских систем.
1964: BASIC (универсальный символьный код инструкций для начинающих)
Универсальный код символических инструкций для начинающих или BASIC был разработан группой студентов Дартмутского колледжа. Этот язык был написан для студентов, которые плохо разбирались в математике или компьютерах. Этот язык был разработан основателями Microsoft Биллом Гейтсом и Полом Алленом и стал первым товарным продуктом компании.
1970: ПАСКАЛЬ
Названный в честь французского математика Блеза Паскаля, Никлаус Вирт разработал язык программирования в его честь. Он был разработан как средство обучения компьютерному программированию, что означало, что его легко освоить. Apple предпочитала его на заре своей деятельности из-за простоты использования и мощности.
1972: Smalltalk
Smalltalk, разработанный в исследовательском центре Xerox в Пало-Альто Аланом Кей, Адель Голдберг и Дэном Ингаллсом, позволял программистам изменять код на лету. Он представил множество аспектов языка программирования, которые сегодня являются видимыми языками, такими как Python, Java и Ruby. Такие компании, как Leafly, Logitech и CrowdStrike, заявляют, что используют Smalltalk в своих технических стеках.
1972: C (Си)
Разработан Деннисом Ричи из Bell Telephone Laboratories для использования с операционной системой Unix. Он был назван C, потому что был основан на более раннем языке под названием «B». Многие из ведущих в настоящее время языков являются производными от C, включая; C #, Java, JavaScript, Perl, PHP и Python. Он также использовался / до сих пор используется такими крупными компаниями, как Google, Facebook и Apple.
1972: SQL (в то время SEQUEL)
SQL был впервые разработан исследователями IBM Рэймондом Бойсом и Дональдом Чемберленом. SEQUEL (как его тогда называли) используется для просмотра и изменения информации, хранящейся в базах данных. В настоящее время язык является аббревиатурой — SQL, что означает язык структурированных запросов. Существует множество компаний, использующих SQL, и некоторые из них включают Microsoft и Accenture.
1980/81: Ада
Изначально Ada была разработана командой во главе с Джин Ичбиа из CUU Honeywell Bull по контракту с Министерством обороны США. Названный в честь математика середины 19-го века Ады Лавлейс, Ada представляет собой структурированный, статически типизированный, императивный, объектно-ориентированный язык программирования высокого уровня с широким спектром возможностей. Ада была расширена из других популярных в то время языков программирования, таких как Паскаль. Ada используется в системах управления воздушным движением в таких странах, как Австралия, Бельгия и Германия, а также во многих других транспортных и космических проектах.
1983: C ++
Бьярн Страуструп модифицировал язык C в Bell Labs, C ++ — это расширение C с такими улучшениями, как классы, виртуальные функции и шаблоны. Он был включен в 10 лучших языков программирования с 1986 года и получил статус Зала славы в 2003 году. C ++ используется в MS Office, Adobe Photoshop, игровых движках и другом высокопроизводительном программном обеспечении.
1983: Objective-C
Objective-C, разработанный Брэдом Коксом и Томом Лавом, является основным языком программирования, используемым для написания программного обеспечения для операционных систем Apple macOS и iOS.
1987: Perl
Perl был создан Ларри Уоллом и представляет собой универсальный язык программирования высокого уровня. Первоначально он был разработан как язык сценариев, предназначенный для редактирования текста, но в настоящее время он широко используется для многих целей, таких как CGI, приложения баз данных , системное администрирование, сетевое программирование и графическое программирование.
1990: Haskell
Haskell — это язык программирования общего назначения, названный в честь американского логика и математика Хаскелла Брукса Карри. Это чисто функциональный язык программирования, то есть в первую очередь математический. Он используется во многих отраслях, особенно в тех, которые имеют дело со сложными вычислениями, записями и обработкой чисел. Как и многие другие языки программирования той эпохи, не так уж часто можно увидеть, что Haskell используется для хорошо известных приложений. С учетом сказанного, язык программирования был использован для написания ряда игр, одна из которых — Nikki and the Robots.
1991: Python
Названный в честь британской комедийной труппы «Монти Пайтон», Python был разработан Гвидо Ван Россумом. Это универсальный язык программирования высокого уровня, созданный для поддержки различных стилей программирования и приятный в использовании (ряд руководств, примеров и инструкций часто содержат ссылки на Monty Python). Python по сей день является одним из самых популярных языков программирования в мире, который используют такие компании, как Google, Yahoo и Spotify.
1991: Visual Basic
Visual Basic, разработанный Microsoft, позволяет программистам использовать стиль перетаскивания для выбора и изменения предварительно выбранных фрагментов кода через графический интерфейс пользователя (GUI). В наши дни этот язык не используется слишком часто, однако Microsoft частично использовала Visual Basic для ряда своих приложений, таких как Word, Excel и Access.
1993: Ruby
Ruby, созданный Юкихиро Мацумото, представляет собой интерпретируемый язык программирования высокого уровня. Язык обучения, на который повлияли Perl, Ada, Lisp и Smalltalk — среди прочих. В основном Ruby используется для разработки веб-приложений и Ruby on Rails. Twitter, Hulu и Groupon — известные примеры компаний, использующих Ruby.
1995: Java
Java — это универсальный язык высокого уровня, созданный Джеймсом Гослингом для проекта интерактивного телевидения. Он обладает кросс-платформенной функциональностью и неизменно входит в число самых популярных языков программирования в мире. Java можно найти везде, от компьютеров до смартфонов и парковочных счетчиков.
1995: PHP
Ранее известный как «Персональная домашняя страница», что теперь означает «Препроцессор гипертекста», PHP был разработан Расмусом Лердорфом. Его основное применение включает создание и поддержку динамических веб-страниц, а также разработку на стороне сервера . Некоторые из крупнейших компаний по всему миру используют PHP, включая Facebook, Wikipedia, Digg, WordPress и Joomla.
1995: JavaScript
JavaScript был создан Бренданом Эйхом, этот язык в основном используется для динамической веб-разработки, документов PDF, веб-браузеров и виджетов рабочего стола. Почти каждый крупный веб-сайт использует JavaScript. Gmail, Adobe Photoshop и Mozilla Firefox включают несколько хорошо известных примеров.
2000: C #
Разработанный в Microsoft с надеждой на объединение вычислительных возможностей C ++ с простотой Visual Basic, C # основан на C ++ и имеет много общего с Java. Этот язык используется почти во всех продуктах Microsoft и используется в основном при разработке настольных приложений.
2003: Scala
Scala, разработанная Мартином Одерски, объединяет математическое функциональное программирование и организованное объектно-ориентированное программирование. Совместимость Scala с Java делает его полезным при разработке под Android. Linkedin, Twitter, Foursquare и Netflix — это всего лишь несколько примеров многих компаний, которые используют Scala в своих технических стеках.
2003: Groovy
Унаследованный от Java, Groovy был разработан Джеймсом Страчаном и Бобом МакВиртером. Язык повышает продуктивность, поскольку он лаконичен и прост в изучении. Некоторые известные компании, которые используют Groovy в своих технических стеках, — это Starbucks, Transferwise и Craftbase.
2009: Golang (Go)
Go был разработан Google для решения проблем, возникающих из-за больших программных систем. Благодаря своей простой и современной структуре Go завоевал популярность среди некоторых крупнейших технологических компаний по всему миру, таких как Google, Uber, Twitch и Dropbox.
2014: Swift
Разработанный Apple в качестве замены C, C ++ и Objective-C, Swift был разработан с целью быть проще, чем вышеупомянутые языки, и оставлять меньше места для ошибок. Универсальность Swift означает, что его можно использовать для настольных, мобильных и облачных приложений. Ведущее языковое приложение Duolingo запустило новое приложение, написанное на Swift.
Какие старые языки программирования все еще используются?
Не все языки программирования существуют вечно. Будь то результат развития технологий или просто замена более сложным языком. С учетом сказанного, ИТ специалисты по-прежнему используют некоторые старые языки программирования:
FORTRAN
Первоначальная версия FORTRAN была предложена в IBM Джоном Бэкусом еще в 1953 году. Это был первый компилятор-оптимизатор, который широко использовался в научной работе, поскольку его оптимизированный код выгодно конкурировал с написанным вручную кодом ассемблера. Этот язык до сих пор используется на некоторых из самых быстрых суперкомпьютеров в мире. С 1953 года была выпущена серия обновлений, последняя версия которых была выпущена в 2018 году.
COBOL
COBOL был разработан еще в 1959 году и был одним из первых языков программирования высокого уровня. Несмотря на то, что COBOL был изобретен так давно, он по-прежнему широко распространен. В одних только США 43% банковских систем построены на COBOL, что составляет 95% операций с банкоматами и 80% транзакций, совершаемых лично.
Ранние языки программирования Microsoft и Apple
Microsoft и Apple — две из самых фундаментальных компаний в истории языков программирования. BASIC (впервые выпущенный в 1964 году) был модифицирован основателями Microsoft Биллом Гейтсом и Полом Алленом в 1975 году. Их модифицированная версия стала Altair BASIC , который был первым продаваемым и распространяемым продуктом Microsoft, который привел к созданию компании.
Паскаль был предпочтительным языком программирования в первые дни Apple. Паскаль, изобретенный в начале 1970-х годов, понравился разработчикам Apple из-за его мощности и простоты использования. Однако, когда Apple приобрела библиотеку кода NeXTSTEP в 1996 году, Objective-C (который был лицензирован под NeXTSTEP) стал популярным языком, выбранным техническим гигантом.
Вывод
История языков программирования увлекательна. Кто бы мог подумать, что алгоритм середины 19 века проложит путь для технологического общества, в котором мы живем сегодня. От ранних машинных кодов до сложного, удобночитаемого кода, на котором сегодня работают наши любимые технологии, языки программирования прошли долгий путь. Несомненно, компьютерное программирование продолжит развиваться, как это происходило в течение последних 150 лет, и интересно смотреть, что принесет будущее.
Компьютерная грамотность с Надеждой
Заполняем пробелы — расширяем горизонты!
Языки программирования: почему появились, яркие представители, как выбрать язык
Язык программирования – это искусственный язык, который был создан для общения человека с компьютером, в частности, для того чтобы сказать компьютеру, что и как, когда и за чем сделать, то есть, для того, чтобы передать компьютеру инструкции на выполнение какой-то полезной работы.
Зачем нужны языки программирования
Компьютеры до сих пор плохо понимают естественные языки, которые используются для общения между людьми, по крайней мере, еще не научились понимать.
В свою очередь, люди плохо понимают машинные языки. Поэтому были созданы языки программирования, которые покрывают эту дыру в понимании, в модели мышления между человеком и компьютером.
Языки программирования могут быть:
- простыми,
- сложными и
- непонятными (например, графическими).
История возникновения языков программирования
Сейчас используется несколько сотен языков программирования, но еще больше таких языков уже не используется. Под новые задачи со временем разрабатывались новые языки программирования.
Нулевое поколение
- (электро) механические машины,
- программируются структурой их собственного устройства
- узкоспециальные,
- возможности программирования ограничены.
Жаккардовый станок
Примером таких машин служит жаккардовый ткацкий станок с программируемым устройством. Он был сделан в 1804 году французом Жозефом Мари Жаккаром. Кстати, в его честь узорчатая, декоративная ткань названа жаккардовой или жаккард.
С помощью станка можно было легко и массово производить вышивки на ткани при помощи перфокарт, представленных ниже на рисунке:

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

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

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

Рис. 4. Программа для табулятора
Как видите, программа для табулятора совсем не похожа на современное программирование.
Машина Тьюринга
– простая абстракция, теоретическое построение, несуществующая в реальности машина, но которая описывает, как должен быть построен любой вычислитель:
- программа – набор состояний и переходов машины,
- входные и выходные данные записаны на некоторой бесконечной ленте, по которой машина перемещается и выполняет различные операции.
Машина Тьюринга не имела воплощения в «железе», но получила важное теоретическое применение в теории вычислений.
Архитектура фон Неймана
– абстрактная архитектура для абстрактного вычислителя, которая позволяет добиться некоторых хороших результатов в гибкости использования машины.
Схематично эту архитектуру можно представить в виде 3-х основных блоков:
- память,
- арифметико-логическое устройство (АЛУ),
- блок управления,
- два вспомогательных устройства ввода и вывода.

Рис. 5. Архитектура фон Неймана
Фон Нейман предложил программу действий машины и исходные данные, с которыми она работает, хранить в одном общем пространстве памяти, что несколько противоречит машине Тьюринга. У Тьюринга программа состоит из набора переходов в разные состояния машины, а данные хранятся отдельно, на ленте.
В дальнейшем по архитектуре фон Неймана были построены почти все существующие сейчас устройства.
Цифровые компьютеры
Идеи машины Тьюринга и архитектуры фон Неймана определили дальнейшее развитие программирования и цифровых компьютеров по следующим характеристикам:
- однородность памяти,
- адресация памяти (схема обращения к отдельным сегментам памяти),
- программное управление,
- универсальное двоичное кодирование данных и программ.
Первые программы для цифровых компьютеров писали в машинных двоичных кодах. Со временем стало неудобно писать в программах длинный код, руководствуясь следующей схемой: из какой ячейки памяти брать каждое число, что с ним потом сделать и в какую ячейку памяти поместить результат. Программы для военных, для космических аппаратов и т.д. были очень сложными, большими.
Тогда появились первые языки программирования, отличавшиеся от ранее существовавших языков, которые были родными для машины и фактически содержали двоичный код. Языки программирования стали чуть ближе к человеку, а не к машине.
Ассемблер

Рис. 6. Программа на Ассемблере для MS DOS
Программа на рис. 6:
- записывает в регистр ah значение 9,
- потом записывает в регистр dx значение offset hello_message,
- вызывает прерывание 21h (с помощью команды int), что означает: выведи на экран то, что записано выше.
Ассемблер – язык, очень близкий к системе команд, которая была родной для вычислительной машины. При этом в ассемблере давали командам понятные мнемонические имена (названия команд).
Раньше программисты писали цифры, двоичные коды, а в Ассемблере наконец появились человеко-понятные имена для операций.
Программа на ассемблере писалась для конкретной машины, ее нельзя было использовать на другом устройстве.
Языки семейства ассемблер до сих пор широко используются, ибо для любой новой архитектуры или чего-то нового первые программы всегда пишутся на ассемблере по той причине, что до какого-то момента просто может НЕ найтись иных подходящих языков программирования, кроме как ассемблер.
Ассемблеры – это языки, которые написаны для конкретной архитектуры железа и близки к машинным кодам.

Рис. 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.

Рис. 10. Программа на LISP
LISP является очень старым языком, который вырабатывает списки. Грамматика такого языка – это грамматика списков, читается сверху вниз.
- В Лиспе есть выражения: может быть один атом, либо список;
- atom – это число или символ,
- number – число, то есть, с плюсом или минусом цифры, не менее одной,
- symbol – это буквы, сколько угодно раз, можно даже много раз,
- list – список, выражения в скобочках более одного раза.
Программа на Лиспе – это список списков. Знаков препинания в Лиспе нет, но есть скобочки. Могут быть такие длинные программы на Лиспе, где в конце идет 2-3 листа, состоящих из одних закрывающих скобочек.
Простейший интерпретатор Лиспа занимает всего 19 строк! Ни один другой язык не может себе позволить себе такой роскоши.
Семантика
Если грамматика описывает формы представления: буквы, цифры, скобочки, то семантика описывает то, как программа работает, что эти буквы, цифры, скобочки означают, как они работают, взаимодействуют друг с другом и т.п.
Варианты представления семантики довольно ограничены.
Семантика может быть:
- описана на естественном, человеческом языке. Многие языки можно описать только так. На самом деле, это основной случай, когда просто есть документ, где описано по-русски или по-английски, что такая-то штука работает таким-то образом, одна команда делает одно, другая делает такие-то вещи и т.п.;
- задана формально (в специализированных языках, например, для каких-то расчетов поведение элементов можно описать формально);
- определена исходной реализацией (редко используют, но это «последняя надежда» на описание, когда слишком сложная семантика или не очень важная);
- описана набором тестов (кейсов), а именно, что это должно так работать, а это вот таким образом.
Семантика разделяется на две части:
- статическую,
- динамическую.
- придает смысл лексическим конструкциям;
- определяет допустимые значения переменных и параметров;
- описывает синтаксические ограничения, например, с помощью синтаксиса не получится описать, что нельзя складывать строки с числами.
Динамическая или фронтальная семантика этапа выполнения
- определяет общий характер выполнения программы;
- описывает, как работают встроенные операции и встроенные библиотеки. Это основная часть семантики, которая нужна, чтобы понять, как программа будет жить и работать после ее написания;
- задает требования для интерпретатора.
Система типов данных в языках программирования
Важной частью семантики является система типов – это набор правил и выражений для методов, которые написаны в идеологии языка и того, как они между собой взаимодействуют.
Обычно в языке программирования имеется система типов данных – это строки, числа, списки и т.д. Есть, например, язык Форс, где все данные – просто байты, другими словами, существуют языки, где вообще не встроены типы данных.
Если же система типов присутствует, то можно провести деление языков программирования на два независимых друг от друга класса, которые приведены ниже.
Система типов данных:
- типизированный или нетипизированный язык
- статическая или динамическая типизация
- строгая или слабая типизация
Если типизация статическая, то типы всех переменных и выражений, которые написаны в программе, известны до момента ее выполнения, то есть, когда описываются функции, классы, переменные, то сразу задаются или явно обеспечиваются условия для того, чтобы тип такой конструкции был известен с самого начала.
Если типизация динамическая, то, наоборот, тип объектов контекстного языка неизвестен до момента выполнения, то есть тип функции или чего угодно будет неизвестен до самого конца.
Строгая типизация означает, что если у сущности есть какой-то тип и он известен, то этот тип может заменяться, но у самого объекта тип фиксированный, и он не меняется.
При слабой типизации тип объекта может быть разным в зависимости от контекста и от того, что Вы с ним делаете.
За системой типов языка приходится следить. Из-за неверно заданного типа только одного, не очень заметного символа в начале программы меняется тип всего выражения и поэтому в итоге могут получаться очень странные ошибки.
Следующая важная характеристика языка —
Парадигма языка программирования
- с греческого – шаблон, пример, образец;
- это система идей и понятий, определяющих стиль написания программ на этом языке – то, как язык предполагает написание программ на нем (wiki);
- язык «благоволит» одной или нескольким парадигмам (мультипарадигменность).
- императивная: программа – набор последовательных инструкций, изменяющих внутренне состояние компьютера, данных и т.д. То есть, программа – это инструкция;
- функциональная: программа – набор математических функций. Работа программы – вычисление значения функций;
- объектно-ориентированная: предметная область описывается при помощи объектов со свойствами и методами. Программа – процесс взаимодействия объектов;
- логическая: программа – набор утверждений о предметной области. Работа программы – установление истинности высказываний об этой предметной области.
Часто одну и ту же практическую задачу можно реализовать с помощью любой из парадигм, перечисленных выше.
Еще одной важной частью языка, которую нужно учитывать при использовании языка, является Runtime – то, как язык выполняется.
Runtime – выполнение программы
Программа может выполняться по-разному:
- самым простым и наивным способом выполнения программы является интерпретация – чтение исходного кода в момент запуска. Так работают легкие, скриптовые языки. Также работает сам программист: когда он написал программу, то смотрит своими глазами на собственную программу и прикидывает, как его программа будет работать и что делать;
- распространенным способом запуска программ является компиляция в машинный код – отдельный шаг до запуска. Есть отдельный инструмент – компилятор, где читаются исходники программы, что-то с ними делают, преобразуя в машинные коды, которые понятны текущей системе. Потом этот код выполняется непосредственно процессором «железки»;
- гибридный способ – это байт-компиляция и выполнение в виртуальной машине. Компилятор читает исходный код, после чего производится байт-код, который выполняется в виртуальной машине.
Перечисленные три способы разные и используются для разных целей. Эти техники могут комбинироваться – интерпретатор может компилировать на лету какие-то куски программы, чтобы работало быстрее. Динамически-сгенерированный код может интерпретироваться без компиляции.
Язык C
– один из самых популярных, один из самых важных по физически написанному по нему коду, практически это «наше всё».
Он создан в 1972 году, создатели – Деннис Ритчи (Dennis Ritchie) и коллеги. Д.Ритчи создал также систему Linux и многие другие полезные вещи.
- императивный,
- компилируемый,
- строго- и статически-типизированный,
- ручное управление памятью (при помощи некоторых операций, встроенных в язык, вам нужно выделить элементы памяти под переменные и затем вы освобождаете их, когда они больше не нужны).
Кстати, С актуален до сих пор, используется для:
- системного программирования (например, ядро Linux написано на C),
- number-crunching (так называемые числа-дробилки, то есть, для больших вычислений, где важно быстродействие),
- программирования микроконтроллеров и встраиваемых систем.
С – низкоуровневый язык, можно сказать, что это Ассемблер с человеческим лицом, ибо почти любую конструкцию C человек может вручную преобразовать в Ассемблер и получатся довольно понятные операции.
Программы на C получаются очень компактные. Они не намного больше, чем если бы аналогичные программы были написаны на Ассемблере. При этом разработка на C проходит намного быстрее, чем на Ассемблере.
Поэтому C сейчас используется для таких задач, где требуется быстродействие, очень важно управление памятью и большое значение имеет компактный объем самой программы. Если у Вас маленький микроконтроллер, который встраивается в какое-то устройство, то программа для него, скорее всего, будет написана либо на Ассемблере, либо на C.

Рис. 11. Пример простой программы на C.
- Создан в 1995 году,
- создатели – Джеймс Гослинг (James Gosling) и Sun Microsystems (в этой компании работал Гослинг).
- Объектно-ориентированный, императивный (C императивный, но НЕ объектно-ориентированный),
- строго- и статически-типизированный,
- байт-компилируемый с виртуальной машиной,
- нет доступа к памяти, автоматическая сборка мусора (последняя работает хорошо, если имеется треть или четверть свободной памяти).
В 90-ых годах JAVA получила большую популярность как мультиплатформенный язык. Один раз написав виртуальную машину для какой-то платформы, допустим для Windows разных версий или для Linux или для Mac, можно любые программы на JAVA запускать на ней без перекомпиляции. Поэтому язык был популярен в эпоху веба, когда было разных платформ (разные версии Windows, разные Маки). Программы на JAVA работали быстро и довольно хорошо на разных платформах.
- прикладного программирования, в том числе для веб-программирования,
- встраиваемых систем (если С используется для микроконтроллеров, то JAVA – для мобильных телефонов, терминалов и т.п.),
- высоконагруженных систем с большим количеством пользователей (банковские программы, системы управления воздушным движением и т.п.).
Следует отличать спецификации языка Java и различные реализации JVM:
- Sun JDK (от компании Sun, ныне это Oracle),
- IBM JDK (продается за деньги),
- OpenJDK (абсолютно свободная)
- и т.п.

Рис. 12. Пример простой программы на JAVA.
Как видно на рис. 12, приходится писать много букв, чтобы выполнить простые действия. Java часто называют новым Коболом, так как она содержит те же негативные свойства, которые когда-то сделали Кобол плохим языком.
Тем не менее JAVA очень популярна, в частности, на ней написана клиентская часть операционной системы Андроид.
- Он действительно завершает List Processor (LisP);
- создан в 1958 году;
- создатели – Джон Маккарти;
- чистый функциональный язык, несмотря на довольно странный синтаксис;
- строго- и динамически- типизированный;
- как правило, интерпретируемый;
- нет доступа к памяти, автоматическая сборка мусора, которая ложится на интерпретатор, а не на виртуальную машину.
- научного программирования и исследований;
- искусственный интеллект — Lisp был создан в самом начале по поиску с интеллектом. В конце 1950-ых — начале 1960-ых в научных кругах было сильное ощущение, что вот-вот будет создан искусственный интеллект. Тогда считалось, что ключевыми особенностями искусственного интеллекта будет возможность оперировать естественным языком, текстом, читать, говорить и делать какие-то разумные вещи. Для обработки смысловых данных из текста был создан Lisp, он позволяет такие вещи делать хорошо;
- всего, чего угодно, но, как правило, используется не очень эффективно.
Язык Lisp, разработанный в 1958 году, претерпел массу изменений.
У него есть множество реализаций и диалектов:
- CommonLisp (создан в 1970-ых) – классическая реализация, которая считается основной;
- Scheme (схема) – упрощенный диалект, который некоторые вещи из CommonLisp выбрасывает и позволяет делать проще;
- Clojure – диалект Lisp в плане языка, но работает поверх JAVA-машины, то есть компилируется в байт-код и исполняется также, как будто это JAVA-программа.

Рис. 13. Программа на LISP: сортировка пузырьком
Без правильных отступов читать такую программу довольно сложно.
Python (Питон)
- Назван в честь британского шоу 1970-ых годов Monty Pynton’s Flying Circus (там старые шутки, но смешные)
- создан в 1991 году
- создатель – голландец Guido van Rossum
- мультипарадигменный язык, объектно-ориентированный, императивный, функциональный
- строго- и динамически-типизированный
- интерпретируемый, байт-компилируемый с виртуальной машиной (в зависимости от реализации)
- скриптового программирования
- веб-программирования
- научного программирования (имеются большие, сильные пакеты для работы с моделированием, с вероятностью, со статистикой и в других областях, которые объединяют в себе опыт, накопленный в других областях)
Python – спецификация языка. Существует несколько основных реализаций:
- CPython – основная (reference)
- Jython – поверх JVM
- PyPy – Python in Python («Питон на Питоне» работает быстрее и лучше, чем CPython и Jython)

Рис. 14. Программа на Python: сортировка пузырьком
У Python есть важная особенность – вместо скобочек (круглых, фигурных) для выделения блоков кода и структурных элементов используются отступы с помощью пробелов, что довольно необычно для всех языков. Кроме Python такой особенностью почти никто не обладает.
Выбор языка под задачу
Как выбрать язык под задачу, когда Вы знаете, что Вам нужно сделать, но не знаете на чем?
Важный совет: используйте то, на чем Вы умеете программировать. Это гораздо лучше, чем использовать то, на чем Вы НЕ умеете программировать.
Экосистема
Язык, который Вы хотите взять, не должен быть «голым» языком, у него должна быть экосистема, которая включает:
- средства разработки (удобное IDE)
- готовые библиотеки и фреймворки
- инструменты тестирования для запуска тест-кейсов: тестовые фреймворки и инструменты
- системы пакетирования и развертывания для того, чтобы написанный код можно было упаковать, куда-то выложить, чтобы другие могли легко воспользоваться. У языка Си нет такой возможности, а у языков Руби и Питон есть.
- коммьюнити. Не надо пользоваться мертвыми языками, какими бы классными они не были. Если не у кого спросить, Вы останетесь в полном тупике. Считается, что одни коммьюнити более дружелюбные, другие — менее. Например, коммьюнити Руби классное, а коммьюнити Java ужасное — там даже спрашивать ничего не надо.
Популярность
Сложно найти в команду людей, которые пишут код на редко используемом языке, к примеру на Eiffel. С другой стороны, на вакансию по мега-популярному языку JAVА, в котором порог входа низкий, набежит много народа, но будет непросто подобрать людей, которые пишут на нем действительно хорошо.
Чем популярнее язык, тем больше у него библиотек, коммьюнити, фреймворков и других вещей, которые нарастают сами по себе сверху.
Скорость обучения
Почти никто не знает язык до конца. По мере работы Вам потребуется учиться языку все дальше и дальше. Некоторые языки учатся легко, а какие-то очень плохо.
JAVA — язык простой в изучении и простой по возможностям, а дальше все строится не за счет языка, а за счет инструментов.
С++ выучить до конца невозможно, потому что там есть очень сложные вещи с кодогенерацией.
Нишевость языков
Конкретные языки лучше подходят для решения определенных нишевых задач.
Пример 1: веб приложение, которое
- взаимодействует с базой данных
- внутренний сервис в компании
- низкая нагрузка
- нужна быстрая разработка, потому что шеф очень просит.
Для такой задачи, скорее всего, подойдет Python или Ruby. Не надо это делать на JAVA
Пример 2: биллинговая система сотового оператора
- тысячи операций в секунду, масса различных платежей и переводов
- высокая надежность и отказоустойчивость
- гибкость в конфигурации, диагностика проблем
В этом случае наш выбор – Java, С++, Erlang – богатые языки с богатым инструментарием.
Пример 3: код бортовой ЭВМ для спутника
- ограниченные ресурсы (всего мегабайт памяти и очень низкая тактовая частота)
- жесткое реальное время, чтобы спутник не потерял ориентацию, не сломался и не взорвался
- строго известные задачи, нет никакой гибкости и нет настроек
- большое количество вычислений
Наш выбор – С и С-подобные языки (и даже ассемблер), потому что очень мало ресурсов и эти требования надо соблюсти.
Статья основана на видео:
Как правильно выбрать язык программирования — Иван Калинин
Смотреть видео лучше на скорости 0.75.
Видео снято в декабре 2014 года, тем не менее, вся информация актуальна и не имеет срока давности. Многие материалы с позиции сегодняшних реалий представляют несомненный интерес, например, о том, что ученые еще в конце 1950-ых — начале 1960-ых годов считали, что искусственный интеллект уже на пороге и с его помощью можно будет вот-вот работать на компьютере с естественным, обычным, человеческим языком.
Онлайн-курс «Введение в программирование (C++)»
Чтобы записаться на онлайн-курс, нужно пройти регистрацию, указав свою электронную почту. Для этого перейдите по указанной ниже ссылке, после чего в правом верхнем углу кликните по зеленой кнопке «Поступить на курс»:
Язык программирования Java: особенности, популярность, ситуация на рынке труда

Рассказываем, как Java уже много лет остается одним из самых популярных языков программирования, легко ли на нем писать, сколько получают программисты (спойлер — в среднем больше, чем разработчики на других популярных языках) и как стать разработчиком на Java.
Краткая теория: особенности и сферы применения Java
Java разработала компания Sun Microsystems в начале 90-х годов XX века. Ведущую роль в создании языка сыграл канадский инженер Джеймс Гослинг, а на ранних этапах разработки язык назывался Oak. Затем его переименовали в честь сорта кофе Java и в честь этого оставили чашку в логотипе.
Джеймс Гослинг и его единомышленники хотели создать язык с C-подобным синтаксисом. В то же время он должен быть более простым по сравнению с C/C++. Создатели планировали использовать Java для программирования бытовой электроники, однако практически сразу после выпуска версии 1.0 в 1995 году язык стали использовать разработчики серверного и клиентского ПО.
В 2010 году компанию Sun Microsystems купила Oracle. После этого Джеймс Гослинг перешёл в Google, откуда тоже вскоре уволился.
Особенности языка Java
Java — язык программирования общего назначения. Относится к объектно-ориентированным языкам программирования, к языкам с сильной типизацией.
Создатели реализовали принцип WORA: write once, run anywhere или «пиши один раз, запускай везде». Это значит, что написанное на Java приложение можно запустить на любой платформе, если на ней установлена среда исполнения Java (JRE, Java Runtime Environment).
Эта задача решается благодаря компиляции написанного на Java кода в байт-код. Этот формат исполняет JVM или виртуальная машина Java. JVM — часть среды исполнения Java (JRE). Виртуальная машина не зависит от платформы.
В Java реализован механизм управления памятью, который называется сборщиком мусора или garbage collector. Разработчик создаёт объекты, а JRE с помощью сборщика мусора очищает память, когда объекты перестают использоваться. Объясняет эксперт Никита Липский: «Есть такое понятие — циклический мусор. Внутри цикла на все объекты есть ссылки, однако garbage collector в Java удалит его, если объекты не могут использоваться из программы».
Как отмечалось выше, синтаксис языка Java похож на синтаксис других си-подобных языков. Вот его некоторые особенности:
- чувствительность к регистру — идентификаторы User и user в Java представляют собой разные сущности;
- для именования методов используется lowerCamelCase. Если название метода состоит из одного слова, оно должно начинаться со строчной буквы. Пример: firstMethodName() ;
- для именования классов используется UpperCamelCase. Если название состоит из одного слова, оно должно начинаться с прописной буквы. Пример: FirstClassName .
- название файлов программы должно точно совпадать с названием класса с учётом чувствительности к регистру. Например, если класс называется FirstClassName , файл должен называться FirstClassName.java ;
- идентификаторы всегда начинаются с буквы ( A-Z , a-z ), знака $ или нижнего подчёркивания _ ;
Ближе познакомиться с синтаксисом Java можно на нашем бесплатном ресурсе Code Basics, где есть вводный курс.
Что пишут на языке Java: сферы применения
По данным компании Oracle, программы на Java запускаются на 3 млрд девайсов. Например, подавляющее большинство крупных компаний так или иначе используют Java, и очень много серверных приложений для корпораций написаны на этом языке. Например, речь идёт о программах для финансовых организаций, которые обеспечивают проведение транзакций, фиксацию торговых операций.
На Java также написано много веб-приложений. Популярные фреймворки, в том числе Spring, Stuts, JSP, используются для создания разных приложений в вебе: от ecommerce-проектов до крупных порталов, от образовательных платформ до правительственных ресурсов.
Популярная компьютерная игра Minecraft написана на Java.
Мобильная разработка — ещё одна область использования Java. На этом языке пишут приложения для устройств, работающих под управлением ОС Android. На Java также создают клиентские приложения.
Кроме того, Java применяется для работы с Big Data, разработки программ для научных целей, например, обработки естественных языков, программирования приборов — от бытовых девайсов до промышленных установок.
То есть на Java можно писать разные типы приложений: веб, мобильный и десктопный софт, игры и так далее. Традиционно у этого языка сильные позиции в промышленном программировании, в сегменте крупных компаний.
Изучайте Java на Хекслете Вступайте в профессию и изучайте один из самых востребованных в энтерпрайзе языков программирования.
Популярность Java
Вы уже знаете, что по результатам рейтинга State of Octoverse 2021 Java входит в тройку самых популярых языков программирования. Java опережает по популярности PHP, C#, C++, TypeScript и другие востребованные языки, а уступает только JavaScript и Python.
Справка: рейтинг State of Octoverse рассчитывается по количеству репозиториев на соответствующем языке, которые хранятся на GitHub.
В индексе TIOBE на июнь 2022 года Java занимает третьем место. Индекс TIOBE — индикатор популярности языков программирования, который рассчитывается по сложной методике с учётом количества поисковых запросов, относящихся к тому или иному языку. При этом первое место в этом индексе занимает язык программирования Python, а на втором месте — C.
Зарплата Java-программистов
По данным Хабр Карьера на второе полугодие 2021 года, медианная зарплата программиста на Java составляет 165 тыс. рублей в месяц — это на 25 тыс. рублей больше, чем в 2020 году. Джависты зарабатывают больше программистов на Python, JavaScript и PHP.
В Исследовании Хабр-карьеры говорится, что на конец 2021 года медианная зарплата стажеров на Java составляла 40 тыс. рублей — это больше на 11%, чем в конце 2020 года. Джунов — 65 тыс. рублей, без изменений год к году. Мидлов — 150 тыс. рублей — это на 14% больше, а сеньоров — 230 тыс. рублей, +10%. Больше всех, конечно же, получают лиды — от 269 тыс. рублей в месяц. Это на 8% больше, чем в конце 2020 года.
Легко ли выучить Java
Язык Java считается дружественным для начинающих. Он не такой лаконичный, как Python, однако создатели Java стремились сделать язык простым и лёгким для изучения, как и создатели Python.
Читайте и другие истории успеха: Как нефтяник и водитель трака стал Java-разработчиком в Майами
Мы попросили известных в отрасли специалистов поделиться взглядами на целесообразность изучение Java и перспективах начинающих джавистов на рынке труда.
Вячеслав Ковалевский: человечество не сможет отказаться от Java

Об эксперте: Вячеслав Ковалевский, инженер-исследователь c опытом в мировых ИТ гигантах. Занимается разработками в сфере искусственного интеллекта и обучением программированию
1. По вашему мнению, почему новичкам стоит изучать Java?
Новички выбирают язык для быстрого входа в профессию, и Java соответствует этому критерию. К тому же этот язык не привязывает человека к конкретному узкому направлению, например, фронтенд- или бэкенд-разработке. На Java пишут и фронтенд, и бэкенд, и другие вещи. Например, можно писать приложения для Android.
Java — язык энтерпрайза или больших компаний, это надо учитывать при выборе языка и финансовых перспектив разработчика. Нет компаний, которые не используют Java. Человечество не сможет отказаться от этого языка, так как на нём написано очень много.
Да, Java труднее изучать, чем Python. Порог входа в профессию выше. Но Python не подходит для энтерпрайза, этот язык скорее для более простых вещей, для прототипов.
Надо понимать, что Java — объектно-ориентированный язык. Это может сужать понимание других парадигм. Но Java меняется в сторону поддержки разных парадигм программирования.
2. Будет ли этот язык востребован в будущем?
Попытки вытеснить Java есть. Oracle монетизирует Java, поэтому энтерпрайз будет уходить от этого языка в новых проектах. Например, в мобильной разработке набирает популярность Kotlin, это несложный язык.
Стоит помнить, что Java — язык и виртуальная машина. Виртуальная машина никогда не умрёт. Тот же Kotlin компилируется в байт-код, который исполняет JVM. Да, можно пересесть на Scala, Kotlin, Go. Но в целом непонятно, куда податься с Java и надо ли куда-то подаваться. То есть язык будет востребованным, как минимум будет нужна поддержка того, что уже написано на Java.
3. Каковы перспективы Java-разработчика на рынке труда?
Как я уже говорил, Java — это большие компании или Android-разработка. Бэкенд-разработка на Java — это тоже зрелые большие компании. Большие деньги в легаси, в старом софте, который генерирует выручку.
Язык адаптирован банками, крупными финансовыми компаниями. Банковский софт традиционно пишут на Java. Соответственно, перспективы трудоустройства для Java-программиста в крупных компаниях или в компаниях, которые обслуживают крупные компании.
4. Что новичку нужно знать об особенностях Java и направлениях развития этого языка?
Новичок должен понять, какая Java его интересует. Хочет писать мобильные приложения для Android? Это другая виртуальная машина, нужно её изучать. Хочет писать бэкенд? Нужно изучать высокоуровневые фреймворки: Spring, Java EE.
То есть новичку надо выбрать направление, которым он хочет заниматься. Это может быть мобайл или бэкенд. Но базовая Java одинакова для всех.
Ещё надо понимать, что Android отстаёт на несколько версий Java.
5. Если отбросить маркетинговые обещания, сколько времени придётся учиться с нуля до уровня джуниора?
Надо понимать, что интервью джуниора — это в общем случайность. Нет стандартов таких интервью. Обычно собеседование проводит мидл или даже такой же джун. Он задаёт каверзные вопросы и просит решить задачи. Если человек вчера посмотрел урок, связанный с вопросом или с задачей, он всё решит.
Итак, считаю собеседования необъективными, а их результат случайным. Потенциальный кандидат может увеличить вероятность успеха. Для этого надо учиться, учиться и ещё раз учиться.
Некоторым людям для обучения нужны годы, некоторые справляются за 2 месяца. Чётко определённого времени нет. В среднем на обучение уходит полгода. Или 2-3 месяца обучения фултайм.
Ключ к успеху — практика, свои проекты, опенсорс. Также надо знать английский язык.
Если нужен быстрый вход в разработку, надо изучать Java и делать Android-приложения. Такую возможность сложно найти в других направлениях.
Николай Алименков: перспективы Java-разработчиков на рынке труда очень радужные

Об эксперте: Николай Алименков — практикующий Java TechLead и Delivery Manager, независимый консультант. Разрабатывает на Java больше 15 лет, специализируется на сложных распределенных системах. Эксперт в Java, Agile, архитектуре, инженерных практиках, продуктовой разработке и обеспечении качества. Докладчик многих международных конференций. Основатель XP Injection и международных конференций JEEConf, XP Days Ukraine, Selenium Camp. Канал в Telegram
1. По вашему мнению, почему новичкам стоит изучать Java?
Java является многопрофильным языком программирования в том плане, что на нем пишут как серверную логику распределенных систем, так и десктопные, мобильные и веб-приложения. Поэтому ставка на Java дает широкие возможности по выбору направления в мире разработки. Скучно точно не будет, можно легко начать заниматься другого типа разработкой, не меняя языка программирования.
В то же время, Java является очень комфортной платформой с точки зрения имеющихся в наличии готовых решений и компонентов. Наличие огромного сообщества делает процесс обучения и входа в профессию более простым и быстрым. Ну и в финансовом плане, спрос на Java разработчиков растет с каждым днем. Поэтому это достаточно стабильная среда, где можно быть уверенным в завтрашнем дне.
2. Будет ли этот язык востребован в будущем?
Я думаю, в ближайшем будущем (5-7 лет) Java в плане востребованности ничего не угрожает. И тут дело даже не в языке, а в той экосистеме, которая выросла вокруг Java и JVM. Это бесконечное количество фреймворков, инструментов и библиотек практически под любую задачу, которая может прийти в голову.
За счет кроссплатформенности Java остается стандартом де-факто для серверной разработки и распределенных систем. А в этой области не так важен язык с его синтаксисом и правилами, как возможность быстро разрабатывать за счет существующих решений и компонентов.
Да и Java не стоит на месте. Сейчас действует стабильная система релизов новых версий языка каждые полгода и разработчики начали получать возможности, которые давно есть в других языках программирования (var, pattern matching, текстовые блоки, легковесные потоки и так далее). То есть язык все больше подстраивается под современные реалии и требования.
3. Каковы перспективы Java-разработчика на рынке труда?
Перспективы Java разработчиков на рынке труда очень радужные. Спрос на них всегда превышает предложение, как на локальном так и на глобальном международном рынке. Поэтому зарплаты постоянно растут и условия улучшаются.
Из особенностей я бы отметил разве что нарастающее количество legacy продуктов в энтерпрайз-мире, которые заказчики хотят переписывать и обновлять под новые архитектурные веяния. За это неплохо платят, но работа не всегда сильно интересная. Ведь приходится разбираться и копаться в весьма старых технологиях, а процесс перехода зачастую болезненный и очень неторопливый.
4. Что новичку нужно знать об особенностях Java и направлениях развития этого языка?
Новичку пожалуй нужно понимать, что сам язык — это лишь верхушка айсберга. Java очень простой язык с точки зрения синтаксиса, потому что очень медленно эволюционировал в прошлом. И есть огромное количество учебных материалов, чтобы быстро его освоить.
Но вот потом начинается самое интересное, ведь направлений разработки в Java экосистеме большое множество:
- энтерпрайз мир с Java EE (теперь Jakarta EE);
- Spring и все что построено за долгие годы вокруг него;
- мобильная разработка под Android;
- веб-разработка с множеством готовых платформ;
- реактивное направление и т.д.
И каждое из направлений весьма глубокое, охватить все сразу не хватит ни времени, ни возможностей.
Ну и еще новичку стоит знать о том, что на базе JVM есть альтернативные языки как Kotlin или Groovy. Они выглядят куда более адаптированными под реалии современного мира разработки за счет отсутствия legacy «задолженностей» обратной совместимости.
5. Если отбросить маркетинговые обещания, сколько времени придётся учиться с нуля до уровня джуниора?
Как я уже говорил, выучить сам язык можно достаточно быстро. А вот для полноценного погружения в выбранное направление и изучение фреймворков, инструментов и практик в нем понадобится от полугода до года. Это если человек не имеет опыта работы с другим языком программирования и пришел учиться с нуля. Процесс может ускорить наличие хорошего ментора, который будет помогать развиваться быстрее и на практических задачах, не оторванных от реального мира разработки. Тогда можно уверенно вложиться в 3-6 месяцев интенсивного обучения.
Никита Липский: Java на рынке труда надолго

Об эксперте: Никита Липский работает в исследовательском центре Хуавей над JVM, компиляторами и новыми языками программирования. Также известен как ключевая фигура в проекте Excelsior JET — виртуальная машина Java со статическим (AOT) компилятором
1. По вашему мнению, почему новичкам стоит изучать Java?
Новичкам нужно начинать с основ — с алгоритмов и структур данных. Язык вторичен, но если основа есть, не составит труда выучить любой. Для кругозора стоит пожалуй разбираться в нескольких языках. Новичкам рекомендую ознакомиться с C/LISP/Java/Python. А далее уже понять к чему больше душа лежит.
2. Будет ли этот язык востребован в будущем?
Java, конечно, еще долго будет востребована. Пока ничего, что бы ее могло заменить, нет.
3. Каковы перспективы Java-разработчика на рынке труда?
Перспективы Java на рынке труда? Почитайте вакансии — всё станет понятно. Java на рынке труда надолго.
4. Что новичку нужно знать об особенностях Java и направлениях развития этого языка?
Нужно понимать, что Java — это в первую очередь не язык, а платформа. То есть Java — это гораздо больше чем язык, и на платформе Java есть много других языков. Поэтому рекомендую кроме языка попытаться понять, что лежит под самим языком, что заставляет программы, написанные на Java, работать.
5. Если отбросить маркетинговые обещания, сколько времени придётся учиться с нуля до уровня джуниора?
Если есть основы, мотивация, хорошая и интересная задача для начала, которую хочется решить, то освоить язык вполне можно за полгода.
Татьяна Федорина: для новичков язык программирования имеет второстепенное значение. Гораздо важнее вначале научиться строить алгоритмы и понимать, как компьютер их выполняет

Об эксперте: Татьяна Федорина преподаёт Java в Хекслете.
1. По вашему мнению, почему новичкам стоит изучать Java?
Java — многогранный язык программирования. Java-программисты реализуют себя в разных направлениях: приложения для компьютера и мобильных гаджетов, сфера финансовых услуг, бэкенд, обработка данных, программное обеспечение для «умных» устройств. Изучив основы Java, программист может выбрать наиболее интересную область применения и легко расширить свои знания и навыки. Порог вхождения в Java не высокий, и у начинающего программиста есть возможность выбрать тот формат обучения, который подходит именно ему.
2. Будет ли этот язык востребован в будущем?
Уверена, Java еще долго будет востребован.
Некоторые разработчики считают, что язык Java не так актуален, как раньше. И действительно, некоторые языки программирования подвинули его с позиций лидера. Например, Android-разработчики чаще используют Kotlin для создания мобильных приложений.
Но Java развивается, и каждые полгода мы видим новый релиз языка.
К тому же, этот язык легко интегрируется с другими JVM-языками, такими как Groovy, Scala, Kotlin.
Благодаря высокой популярности, у Java есть огромное количество библиотек, фреймворков и инструментов, которые делают разработку приложений максимально удобным и эффективным.
3. Каковы перспективы Java-разработчика на рынке труда?
Считаю, что отличные!
Язык Java прекрасно подходит для коммерческих проектов, он очень востребован в корпорациях. Поддержка и рефакторинг существующих проектов всегда будет актуален в крупных финансовых компаниях.
Несмотря на популярность Kotlin, Java все еще активно используется для разработки Android-приложений.
Разработка с использованием Spring Framework открывает большие перспективы в бэкенд-разработке и разработке корпоративных программ.
Применение Java настолько широко, что каждый найдет вакансию по душе.
4. Что новичку нужно знать об особенностях Java и направлениях развития этого языка?
Путь в Java-программировании местами тернистый. Некоторых начинающих программистов приводит в ступор использование классов в простой программе. Не стоит опускать руки! Нужно подобрать для себя ту платформу, ресурс, учебник, канал на YouTube, который будет понятен именно вам, тогда все детали и нюансы разложатся по полочкам.
Изучив основы программирования на Java, нужно выбрать дальнейшее направление, изучать фреймворки и библиотеки для конкретной цели.
Какое направление предпочесть? Выбор огромный: от веб-сервисов до космических разработок. Каждый решает сам, исходя из своих интересов.
5. Если отбросить маркетинговые обещания, сколько времени придется учиться с нуля до уровня джуниора?
Это зависит от имеющихся навыков, мотивации и наличия базовых знаний в программировании. На изучение синтаксиса Java, принципов ООП и стандартных инструментов разработки может уйти от 3 до 6 месяцев, иногда больше.
Хочу отметить, что для новичков язык программирования имеет второстепенное значение. Гораздо важнее вначале научиться строить алгоритмы и понимать, как компьютер их выполняет.
Быстрее и эффективнее изучать Java поможет выполнение практических задач или работа над конкретным проектом. А если работать над совместным проектом с другими программистами, можно получить бесценный опыт работы в команде.
Заключение
Java входит в тройку самых популярных языков программирования. У Java-разработчиков отличные перспективы на рынке труда. Кроме того, труд джавистов оплачивается выше, чем труд разработчиков на JavaScript, PHP и Python. Если у вас есть вопросы по особенностям изучения Java, задавайте их в комментариях.
Никогда не останавливайтесь: В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях
Языки программирования c cobol java применяются в такой области человеческой деятельности как
Предмет: Технология разработки программных продуктов.
Тема :Основы проектирования программных систем.
Ознакомление с проектированием программных систем .
Развивать умение слушать других, делать выводы и обобщать полученные знания
Воспитывать чувство значимости предмета в профессиональной деятельности, аккуратности в работе
— Основы алгоритмизации и программирования
Оборудование: доска, мел, письменные принадлежности, проектор, ПК
Тип урока: комбинированный
Метод обучения: Объяснительно иллюстративный
— Проверка готовности кабинета
2. Постановка цели урока
3.Повторение пройденного материала
Основные характеристики программного модуля
Модульная структура программных продуктов
4.Сообщение новых знаний
Методы разработки при модульном программировании
Метод восходящей разработки
Метод нисходящей разработки
Целенаправленная конструктивная реализация
5. Восприятие и осознание учащимися нового материала
6. Осмысление обобщение и систематизация знаний
7. Подведение итогов урока и постановка домашнего задания
Выучить содержимое темы
Гагарина Л.Г. стр. С.101-107
Ответить на вопросы:
Методы разработки при модульном программировании
Спецификация программного модуля состоит из функциональной спецификации модуля, описывающей семантику функций, выполняемых этим модулем по каждому из его входов, и
синтаксической спецификации его входов, позволяющей построить на используемом языке программирования синтаксически правильное обращение к нему. Функциональная
спецификация модуля определяется теми же принципами, что и функциональная спецификация программной системы.
Существуют разные методы разработки модульной структуры Программы, в зависимости от которых определяется порядок программирования и отладки модулей, указанных в этой структуре. Обычно в литературе обсуждаются два метода [42, 46]: метод восходящей разработки и метод нисходящей разработки.
Метод восходящей разработки
Сначала строится древовидная модульная структура программы. Затем поочередно проектируются и разрабатываются модули программы, начиная с модулей самого нижнего уровня, затем
предыдущего уровня и т. д. То есть модули реализуются в таком порядке, чтобы для каждого программируемого модуля были уже запрограммированы все модули, к которым он может
обращаться. После того как все модули программы запрограммированы, производится их поочередное тестирование и отладка в таком же восходящем порядке. Достоинство метода заключается в том, что каждый модуль при программировании выражается через уже запрограммированные непосредственно подчиненные модули, а при тестировании использует уже отлаженные модули.
Недостатки метода восходящей разработки заключаются в следующем:
• на нижних уровнях модульной структуры спецификации могут быть еще определены не полностью, что может привести к полной переработке этих модулей после уточнения
спецификаций на верхнем уровне;
• для восходящего тестирования всех модулей, кроме головного, который является модулем самого верхнего уровня, приходится создавать вызывающие программы, что приводит к созданию большого количества отладочного материала, но не гарантирует, что результаты тестирования верны;
• головной модуль проектируется и реализуется в последнюю очередь, что не дает продемонстрировать его заказчику для уточнения спецификаций.
Метод нисходящей разработки
Как и в предыдущем методе, сначала строится модульная структура программы в виде дерева. Затем проектируются и реализуются модули программы, начиная с модуля самого верхнего уровня — головного, далее разрабатываются модули уровнем ниже и т. д. При этом переход к программированию какого-либо модуля осуществляется только в том случае, если уже
запрограммирован модуль, который к нему обращается. Затем производится их поочередное тестирование и отладка в таком ^е нисходящем порядке. При таком порядке разработки
программы вся необходимая глобальная информация формируется своевременно, т. е. ликвидируется весьма неприятный источник просчетов при программировании модулей. Существенно облегчается и тестирование модулей, производимое при нисходящем
тестировании программы. Первым тестируется головной модуль программы, который представляет всю тестируемую программу, при этом все модули, к которым может обращаться головной,
заменяются их имитаторами (так называемыми «заглушками» [45]). Каждый имитатор модуля является простым программным фрагментом, реализующим сам факт обращения к данному модулю с необходимой для правильной работы программы обработкой значений его входных параметров и с выдачей, если это необходимо, подходящего результата. Далее производится
тестирование следующих по уровню модулей. Для этого имитатор выбранного для тестирования модуля заменяется самим модулем, и добавляются имитаторы модулей, к которым может
обращаться тестируемый модуль. При таком подходе каждый модуль будет тестироваться в «естественных» состояниях информационной среды, возникающих к моменту обращения к
этому модулю при выполнении тестируемой программы. Таким образом, большой объем «отладочного» программирования заменяется программированием достаточно простых имитаторов
используемых в программе модулей.
Недостатком нисходящего подхода к программированию является необходимость абстрагироваться от реальных возможностей выбранного языка программирования и придумывать абстрактные операции, которые позже будут реализованы с помощью модулей. Однако способность к таким абстракциям является необходимым условием разработки больших программных средств.
Рассмотренные выше методы (нисходящей и восходящей разработок), являющиеся классическими, требуют, чтобы модульная древовидная структура была готова до начала программирования модулей. Как правило, точно и содержательно разработать структуру программы до начала программирования невозможно. При конструктивном и архитектурном подходах к разработке модульная структура формируется в процессе реализации модулей.
Конструктивный подход
Конструктивный подход к разработке программы представляет собой модификацию нисходящей разработки, при которой модульная древовидная структура программы формируется в процессе программирования модуля. Сначала программируется головной модуль, исходя из спецификации программы в целом (спецификация программы является одновременно спецификацией головного модуля). В процессе программирования головного модуля в случае, если эта программа достаточно большая, выделяются подзадачи (некоторые функции) и для них создаются спецификации реализующих эти подзадачи фрагментов программы. В дальнейшем каждый из этих фрагментов будет представлен поддеревом модулей (спецификация выделенной функции является одновременно спецификацией головного модуля этого поддерева).
Таким образом, на первом шаге разработки программы (при программировании ее головного модуля) формируется верхняя часть дерева, например, как на рис. 3.12.

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

Архитектурный подход
Архитектурный подход к разработке программы представляет собой модификацию восходящей разработки, при которой модульная структура программы формируется в процессе программирования модуля. Целью разработки в данном методе является повышение уровня языка программирования, а не разработка конкретной программы. Это означает, что для заданной
предметной области выделяются типичные функции, специфицируются, а затем и программируются отдельные программные модули, выполняющие эти функции. Сначала в виде модулей
реализуются более простые функции, а затем создаются модули, использующие уже имеющиеся функции, и т. д. Это позволяет существенно сократить трудозатраты на разработку конкретной
программы путем подключения к ней уже имеющихся и проверенных на практике модульных структур нижнего уровня, что также позволяет бороться с дублированием в программировании.
В связи с этим программные модули, создаваемые в рамках архитектурного подхода, обычно параметризуются для того, чтобы облегчить их применение настройкой параметров.
Нисходящая реализация
В классическом методе нисходящей разработки сначала все модули разрабатываемой программы программируются, а затем тестируются в нисходящем порядке. При этом тестирование и
отладка модулей могут привести к изменению спецификации подчиненных модулей и даже к изменению самой модульной структуры программы. В результате может оказаться, что часть
модулей вообще не нужна в данной структуре, а часть модулей придется переписывать. Более рационально каждый запрограммированный модуль тестировать сразу же до перехода к
программированию другого модуля. Такой метод в литературе получил название метода нисходящей реализации.
Целенаправленная конструктивная реализация
В зависимости от того, в какой последовательности в процессе разработки программы обходятся узлы дерева, существуют разновидности описанных выше методов. Например, метод целенаправленной конструктивной реализации, при котором в рамках конструктивного подхода реализуются сначала модули, необходимые для самого простого рабочего варианта программы,
остальные модули заменяются их имитаторами. Затем к имеющемуся варианту добавляются другие модули, обеспечивающие работу программы для других наборов данных, и так далее до полной
реализации программы. Достоинством этого метода является то, что уже на достаточно ранней стадии создается работающий вариант разрабатываемой программы. Психологически это играет
роль допинга, резко повышающего эффективность разработчика. Подводя итог сказанному, на рис. 3.14 представлена общая схема классификации рассмотренных методов разработки структуры программы.


7.1 Инструментальные средства разработки программ
Инструментальное программное обеспечение (Software tools) — программное обеспечение, используемое в ходе разработки, корректировки или развития других программ:
редакторы, компиляторы, отладчики, вспомогательные системные программы, графические пакеты и др.
Сюда входят языки программирования, интегрированные среды разработки программ, CASE-системы и др.
7.1.2 Выбор языка программирования
Существующие на сегодняшний день языки программирования можно выделить в следующие группы [1, 56]:
• универсальные языки высокого уровня;
• специализированные языки разработчика программного обеспечения;
• специализированные языки пользователя;
• языки низкого уровня.
В группе универсальных языков высокого уровня безусловным лидером на сегодня является язык C++. Действительно, он имеет ряд достоинств:
• масштабируемость. На языке C++ разрабатывают программы для самых различных платформ и систем;
• возможность работы на низком уровне с памятью, адресами, портами, что при неосторожном использовании может легко превратиться в недостаток;
• C++ имеет мощный препроцессор, унаследованный от С, но, как и любой другой мощный инструмент, требует осторожного использования;
• возможность создания обобщенных алгоритмов для разных типов данных, их специализация и вычисления на этапе компиляции, используя шаблоны.
При этом язык C++ обладает рядом существенных недостатков:
• подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла (#include) серьезно замедляет компиляцию при подключении большого количества модулей;
• недостаток информации о типах данных во время компиляции;
• сложность для изучения и компиляции;
• некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдает беззнаковый результат.
Для C++ существует большое количество библиотек классов, поддерживающих создание пользовательского интерфейса, клиент-серверных приложений, работу с базами данных и т. д.,
поэтому пока альтернативы C++ нет [40]. Для второстепенных проектов иногда используется Visual Basic. Язык Java рассматривался как альтернатива Basic, но из-за отсутствия визуального средства разработки форм он пока остается малопригодным. Современный Object Pascal, как и Pascal, предложенный Н. Виртом в середине 70-х годов XX в., остается наиболее привлекательным
для обучения основам программирования в силу своей простоты, структурированности и обнаружения компилятором большого количества не только синтаксических, но и семантических
В нынешнее время в отличие от 60-х годов XX в. языки программирования создаются крайне редко. За последние 15 лет можно отметить лишь две новинки, получившие широкое распространение — это Java (Sun Microsystems, 1995 г .), ставший популярным во многом благодаря технологии его использования в Интернете и появления такого понятия, как виртуальная Java-машина, и С# (Microsoft, 2000 г .), созданный на основе C++.
Создателем языка является сотрудник Microsoft Андреас Хейлсберг. Он стал известным в мире программистов задолго до того, как пришел в Microsoft. Хейлсберг входил в число ведущих
разработчиков одной из самых популярных сред разработки — Delphi. В Microsoft он участвовал в создании версии Java — J++, так что опыта в написании языков и сред программирования ему
не занимать. Как отмечал сам Андреас Хейлсберг, С# создавался как язык компонентного программирования, и в этом одно из главных достоинств языка, направленное на возможность
повторного использования созданных компонентов.
Другие достоинства языка С#:
• сохраняет лучшие черты популярных языков программирования C/C++, на основе которых он создан. В связи с этим облегчается переход программистов от C++ к С#;
• является проще и надежнее C++. Простота и надежность главным образом связаны с тем, что на С# хотя и допускаются, но не поощряются такие опасные свойства C++, как указатели, адресация, разыменование, адресная арифметика;
• является полностью объектно-ориентированным языком, где даже типы, встроенные в язык, представлены классами;
• реализует возможности наследования и универсализации;
• учитывает все возможности Framework .Net, так как С# создавался параллельно с данной средой;
• благодаря каркасу Framework .Net, ставшему надстройкой над операционной системой, программисты С# получают те же преимущества работы с виртуальной машиной, что и
программисты Java. Эффективность кода даже повышается, поскольку исполнительная среда CLR представляет собой компилятор промежуточного языка, в то время как виртуальная Java-машина является интерпретатором байт-кода;
• мощная библиотека каркаса поддерживает удобство построения различных типов приложений на С#, позволяя легко строить Web-службы, другие виды компонентов, достаточно просто сохранять и получать информацию из базы данных и других хранилищ данных;
• является источником надежного и эффективного кода.
Кроме вышеописанных языков к группе универсальных принадлежат также Modula, Ada, COBOL, FORTRAN и некоторые другие. Каждый из вышеописанных языков имеет свои особенности и, соответственно, свою область применения. В настоящее время универсальные языки программирования применяются в самых различных областях человеческой деятельности, таких как:
• научные вычисления (языки C++, FORTRAN, Java);
• системное программирование (языки C++, Java);
• обработка информации (языки C++, COBOL, Java);
• искусственный интеллект (LISP, Prolog);
• издательская деятельность (Postscript, TeX);
• удаленная обработка информации (Perl, PHP, Java, C++);
• описание документов (HTML, XML).
С течением времени одни языки развивались, приобретали новые черты и остались востребованными, другие утратили свою актуальность и сегодня представляют в лучшем случае чисто теоретический интерес (Focal, PL/1 и др.). В значительной степени это связано с такими факторами:
• наличие среды программирования, поддерживающей разработку приложений на конкретном языке
• удобство сопровождения и тестирования программ;
• стоимость разработки с применением конкретного языка программирования;
• четкость и ортогональность конструкций языка;
• применение объектно-ориентированного подхода.
Специализированные языки разработчика используют для создания конкретных типов программного обеспечения. К ним относят:
• языки баз данных;
• языки создания сетевых приложений;
• языки создания систем искусственного интеллекта и т. д.
Специализированные языки пользователя обычно являются частью профессиональных сред пользователя, характеризуются узкой направленностью и разработчиками программного
обеспечения не используются.
Языки низкого уровня позволяют осуществлять программирование практически на уровне машинных команд. При этом получают самые оптимальные как с точки зрения времени
выполнения, так и с точки зрения объема необходимой памяти программы. Недостатком их является то, что они не поддерживают принципов структурного программирования [1].
В настоящее время языки типа ассемблера обычно используют:
• при написании сравнительно простых программ, для обращения к техническим средствам, например драйверов;
• в виде вставок в программы на языках высокого уровня, например, для ускорения преобразования данных в циклах с большим количеством повторений.
В большей степени выбор языка программирования определяется опытом разработчика, требованиями ведущей разработку организации или просто устоявшимся мнением.
7.7.3. Выбор среды программирования
Интегрированной средой разработки программного обеспечения называют систему программных средств, используемую программистами для разработки программного обеспечения [1, 56].
Обычно среда разработки включает в себя текстовый редактор, компилятор и/или интерпретатор, компоновщик, отладчик и справочную систему. Иногда также содержит систему управления версиями и разнообразные инструменты для упрощения конструирования графического интерфейса пользователя. Многие современные среды разработки также включают инспектор объектов, браузер классов и диаграмму иерархии классов, которые используются для объектно-ориентированной разработки ПО. Обычно среда разработки предназначается для одного определенного языка программирования, как, например, Visual Basic или Deiphi, но существуют среды разработки, предназначенные для нескольких языков, такие как Eclipse или Microsoft Visual Studio.
Примеры сред разработки — Turbo Pascal, Borland C++, GNU toolchain, DrPython.
В последнее время, с развитием объектно-ориентированного программирования, широкое распространение получили упоминавшиеся ранее среды визуального программирования, в
которых наиболее распространенные блоки программного кода представлены в виде графических объектов.
Наиболее часто используемыми являются визуальные среды Delphi , C ++ Builder фирмы Borland ( Inprise Corporation ), Visual C ++, Visual Basic фирмы Microsoft , Visual Ada фирмы IBM и др.
244 Глава 7. Разработка программного обеспечения Большую популярность в наши дни получила технология .NET Framework, предложенная фирмой Microsoft в качестве платформы для создания как обычных программ, так и веб-приложений. Основным преимуществом .NET является
совместимость различных служб, написанных на разных языках. Например, служба, написанная на C++ для .NET, может обратиться к методу класса из библиотеки, написанной на Delphi; на С#
можно написать класс, наследующий от класса, написанного на Visual Basic .NET, а исключение, выброшенное методом, написанным на С#, может быть поймано и обработано в Delphi.
Так же как и в случае с выбором языка программирования, выбор среды программирования определяется характером проекта, привычками и навыками разработчика, веяниями времени, требованиями заказчика и просто общественным мнением: «Все подобные разработки должны выполняться в среде.
7.2. Технологии программирования
7.2.1. Объектно-ориентированное программирование
Рассмотрим сначала, как появилось объектно-ориентированное программирование. Ключевое понятие, помогающее при программировании, — это абстракция. Она позволяет лучше понять
сущность программированного объекта или среду. Пусть нужно совершить поездку в Мурманск. Возникают вопросы: «Каким образом это сделать? какой транспорт использовать? сколько это
будет стоить?» и т. д. Нужно выделить главное и отбросить лишнее. Тут главным будет вид транспорта. Эту абстракцию и проще всего назвать классом при программировании. У транспорта есть данные (скорость, количество двигателей и др.) и методы (взлет, посадка для самолета). Класс группирует данные и методы в единую сущность. Данные обычно закрыты, и их изменение, как
правило, производится посредством методов, т. е. они защищены корректной работой методов.
Первое использование классов как объектов произошло в 1967 г .: Бьерн Страуструп применил язык Simula в своей диссертации для программы, моделирующей компьютерные системы.
Этот язык очень выразителен и позволяет работать с высоким уровнем абстракций. Однако при запуске программы оказалось, что у нее очень низкая производительность и выполнить работу
в срок не удастся, поэтому пришлось переписать программу на языке Си. В Си классов нет. Страуструп их добавил, и появился язык C++ [40]
Несколько лет назад в журнале Byte появилась статья «Объектно-ориентированное программирование умерло?». В ней говорилось о том, что объекты не оправдали возложенные на них надежды. Достичь главной цели — повторного использования кода — с помощью объектов сложно, хотя сам процесс программирования они упростили.
В этот же период Microsoft создает Visual Basic. Главным нововведением в нем является возможность вставки управляющих элементов (кнопок, полей ввода) на форму. К каждому элементу
можно добавить кусок кода для описания его деятельности.
Оказалось очень удобно, и вскоре были созданы тысячи новых элементов — появилось расширение VBX (Visual Basic Extention).
Статья Byte описала управляющие элементы VBX как наиболее успешную реализацию мечты о повторном использовании кода.
У многих поклонников ООП статья вызвала недовольство.
Элементы VBX не являются объектно-ориентированными. В них нет даже концепции метода, нет наследования и полиморфизма.
Тем не менее VBX может рассматриваться как пример программного компонента. Это часть бинарного кода, который может быть легко вставлен в различные приложения. VBX — это
любопытная, но тупиковая ветвь эволюции технологии программирования. Однако она сыграла свою роль.
Как же развивалась эволюция программирования?
Первоначально существовали статические библиотеки. Такие библиотеки компоновались в выполняемый файл, т. е. каждая программа содержала код библиотеки. Их легко представить в виде
перфокарт, которые вставляли программисты в свои программы в «далекие времена».
Для того чтобы снизить затраты памяти, были созданы динамически компонуемые библиотеки DLL. При их применении несколькими приложениями в память загружалась только одна копия библиотеки, и все приложения использовали эту копию.
Другое полезное свойство DLL — компоновка в процессе выполнения, т. е. новая версия DLL может быть использована без перестройки приложения. Если новая версия библиотеки
совместима со старой, то код может оказаться эффективнее (если улучшены алгоритмы в библиотеки или исправлены ошибки), если нет, приложение может оказаться неработоспособным.
Второй случай называется DLL HELL. Распределение памяти при использовании статических
библиотек показано на рис. 7.1.

7.2.2. Платформа JAVA и .NET
На данный момент наиболее активно развиваются две конкурирующие линии технологий создания ПО на основе компонентов — технологии Java и .NET. Рассмотрим несколько элементов
этих технологий, являющихся ключевыми в создании широко востребованного в настоящее время и достаточно сложного вида приложений. Это Web-приложения, т. е. распределенное программное обеспечение, использующее базовую инфраструктуру Интернета для связи между различными своими компонентами, а стандартные инструменты для навигации по Web-браузеры —
как основу для своего пользовательского интерфейса.
Технологии Java представляют собой набор стандартов, инструментов и библиотек, предназначенных для разработки приложений разных типов и связанных друг с другом использованием языка программирования Java. Торговая марка Java принадлежит
компании Sun Microsystems, и эта компания во многом определяет развитие технологий Java, но в нем активно участвуют и другие игроки — IBM , Intel , Oracle , Hewlett — Packard , SAP , Bea и пр.
В этот набор входят следующие основные элементы:
• платформа Java Platform Standard Edition (J2SE) [1].
Предназначена для разработки обычных, в основном однопользовательских приложений;
• платформа Java Platform Enterprise Edition (J2EE) [2].
Предназначена для разработки распределенных веб-приложений уровня предприятия;
• платформа Java Platform Micro Edition (J2ME) [3].
Предназначена для разработки встроенных приложений, работающих на ограниченных ресурсах, в основном в мобильных телефонах и компьютеризированных бытовых устройствах;
• платформа Java Card [5]. Предназначена для разработки ПО, управляющего функционированием цифровых карт.
Ресурсы, имеющиеся в распоряжении такого ПО, ограничены в наибольшей степени.
С некоторыми оговорками можно считать, что J2ME является подмножеством J2SE, а та, в свою очередь, — подмножеством J2EE. Java Card представляет собой, по существу, особый набор
средств разработки, связанный с остальными платформами только поддержкой (в сильно урезанном виде) языка Java.
Язык Java — это объектно-ориентированный язык программирования, который транслируется не непосредственно в машинно-зависимый код, а в так называемый байт-код,
исполняемый специальным интерпретатором, виртуальной Java-машиной (Java Virtual Machine — JVM). Такая организация работы Java-программ позволяет им быть переносимыми без изменений и
одинаково работать на разных платформах, если на этих платформах есть реализация JVM, соответствующая опубликованным спецификациям виртуальной машины.
Кроме того, интерпретация кода позволяет реализовывать различные политики безопасности для одних и тех же приложений, выполняемых в разных средах, — к каким ресурсам
(файлам, устройствам и пр.) приложение может иметь доступ, а к каким нет, можно определять при запуске виртуальной машины.
Таким способом можно обеспечить запускаемое пользователем вручную приложение (за вред, причиненный которым, будет отвечать этот пользователь) большими правами, чем аплет,
загруженный автоматически с какого-то сайта в Интернете.
Режим интерпретации приводит обычно к более низкой производительности программ по сравнению с программами, оттранслированными в машинно-специфический код. Для преодоления этой проблемы JVM может работать в режиме
динамической компиляции (just-in-time-compilation — JIT), в котором байт-код на лету компилируется в машинно-зависимый, а часто исполняемые участки кода подвергаются дополнительной оптимизации.
.NET представляет собой похожий набор стандартов, инструментов и библиотек, но разработка приложений в рамках .NET возможна с использованием различных языков
программирования. Основой .NET являются виртуальная машина для промежуточного языка ( Intermediate Language — IL , иногда встречается сокращение Microsoft IL — MSIL), в который
транслируются все .NET-программы, также называемая общей средой выполнения ( Common Language Runtime — CLR ), и общая библиотека классов (.NET Framework class library), доступная из всех .NET-приложений.
Промежуточный язык является полноценным языком программирования, но он не предназначен для использования людьми. Разработка в рамках .NET ведется на одном из языков, для которых имеется транслятор, в промежуточный язык —Visual Basic.NET, C++, С#, Java (транслятор Java в .NET называется J#, и он не обеспечивает одинаковой работы программ на Java, оттранслированных в .NET и выполняемых на JVM) и пр. Однако разные языки достаточно сильно отличаются друг от друга, и чтобы гарантировать возможность из одного языка работать с компонентами, написанными на другом языке, необходимо при разработке этих компонентов придерживаться общих правил
( Common Language Specifications — CLS ), определяющих, какими конструкциями можно пользоваться во всех .NET-языках без потери возможности взаимодействия между результатами.
Наиболее близок к промежуточному языку С# — этот язык был специально разработан вместе с платформой .NET.
Некоторым отличием от Java является то, что код на промежуточном языке в .NET не интерпретируется, а всегда выполняется в режиме динамической компиляции (ЛТ).
Компания Microsoft инициировала разработку платформы .NET и принятие стандартов, описывающих ее отдельные элементы (к сожалению, пока не все), и она же является основным
поставщиком реализаций этой платформы и инструментов разработки. Благодаря наличию стандартов возможна независимая реализация .NET (например, такая реализация разработана в
рамках проекта Mono), но, в силу молодости платформы и опасений по поводу монопольного влияния Microsoft на ее дальнейшее развитие, реализации .NET не от Microsoft используются
Для Java-технологий базовым языком является Java, а для изучения правил построения компонентов для .NET используется язык С#. Он наиболее удобен при работе в этой среде и наиболее похож на Java.
Оба языка имеют мощные выразительные возможности объектно-ориентированных языков последнего поколения, поддерживающих автоматическое управление памятью и работу в
многопоточном режиме. Они весьма похожи, но имеют большое число мелких отличий в деталях. Наиболее существенны для построения программ различия, касающиеся наличия в С#
невиртуальных методов, возможности объявления и использования пользовательских типов значений и делегатных типов в С# и возможности передачи значений параметров в С# по ссылке.