Уровни языков программирования: какие бывают и чем они отличаются
В мире насчитывают около 9000 языков программирования. Среди них есть низкоуровневые и высокоуровневые. В чем их отличие, и почему низкий уровень не хуже высокого — рассказываем в статье.
Освойте профессию «Веб-разработчик»
Веб-разработчик с нуля
Веб-разработчик — мастер на все руки. Он создает программы и приложения для любых сфер и компаний: от небольшой кофейни до международных банков. Станьте специалистом, который создает востребованный продукт
Профессия / 12 месяцев
Веб-разработчик с нуля
Создавайте нужные любому бизнесу сервисы
3 990 ₽/мес 6 650 ₽/мес
Что такое язык программирования
- алфавит — символы, которые используются для передачи команд;
- синтаксис — правила написания запросов;
- семантику — смысловое значение команд.
С помощью языка программирования можно изменять данные на компьютере, производить вычисления, создавать новые приложения. При этом все языки взаимодействуют с компьютером на разных уровнях — низких или высоких.
Низкоуровневые языки
«Мозг» компьютера — это процессор. Именно он отдает указания и контролирует работу устройства. Процессор распознает команды только в двоичном коде — написанные при помощи нулей и единиц (100110). Цифры помогают машине понять, что именно нужно сделать — вывести на экран изображение, положить свитшот в корзину или запустить любимую игру.
У низкоуровневых языков нет встроенных функций. Они общаются с конкретным процессором, поэтому код одного компьютера не может быть использован на другом. У каждого производителя процессоров свой собственный набор инструкций.
Самые распространенные низкоуровневые языки — это машинный код и язык ассемблера.
Машинный код
Тот самый двоичный код — язык нулей и единиц, который компьютер понимает без дополнительной обработки. Для человека он кажется слишком сложным, и в нем легко запутаться. Поэтому в чистом виде его практически не используют.
Код передается в загрузчик программ напрямую, минуя «посредников», поэтому требует меньше памяти и отличается высокой производительностью.
Язык ассемблера
Чтобы немного упростить управление «железом», популярные команды преобразуют в более понятные директивы. Они похожи на сокращенные английские слова. Например, можно написать MOV вместо команды 1011, чтобы переместить данные в соседний регистр.
Язык ассемблера — это первая надстройка, которая упрощает машинный код. Но при этом все еще позволяет писать высокопроизводительные программы и приложения.
Сегодня язык ассемблера используют для создания программного обеспечения или драйверов. Чтобы компьютер понял этот язык, все команды пропускаются через компилятор или интерпретатор и переводят обратно в двоичный код.
Какие языки программирования учить и зачем
Языки высокого уровня не хуже и не лучше языков низкого уровня. Как правило, они используются для разных задач. Выбирать язык программирования следует исходя из поставленной цели. Например, для мобильной разработки используют C++, Java, JavaScript. Для создания веб-сайтов подойдет Python, JavaScript, Ruby, PHP. Для драйверов можно использовать низкоуровневый язык ассемблера.
Языки низкого уровня и некоторые языки высокого уровня, например, С++, будут сложными для новичков. Поэтому тем, кто только начинает кодить, рекомендуют выбирать высокоуровневые языки с упрощенным синтаксисом — Python, JavaScript. Даже не имея глубоких познаний в информатике, с их помощью можно создать интересный проект и внедрить много небанальных решений.
Классификация языков программирования
Существует множество классификаций языков программирования по различным критериям. Самое простое деление – на языки высокого и низкого уровня.
Язык низкого уровня – это язык программирования, предназначенный для определенного типа компьютера и отражающий его внутренний машинный код; языки низкого уровня часто называют машинно-ориентированными языками. Их сложно конвертировать для использования на компьютерах с разными центральными процессорами, а также довольно сложно изучать, поскольку для этого требуется хорошо знать внутренние принципы работы компьютера.
Язык высокого уровня – это язык программирования, предназначенный для удовлетворения требований программиста; он не зависит от внутренних машинных кодов компьютера любого типа. Языки высокого уровня используют для решения проблем, и поэтому их часто называют проблемно-ориентированными языками. Каждая команда языка высокого уровня эквивалентна нескольким командам в машинных кодах, поэтому программы, написанные на языках высокого уровня, более компактны, чем аналогичные программы в машинных кодах.
Другая классификация делит языки на вычислительные и языки символьной обработки. К первому типу относят ФОРТРАН, ПАСКАЛЬ, АЛГОЛ, БЕЙСИК, С, ко второму – ЛИСП, ПРОЛОГ, СНОБОЛ и др.
Классификация языков программирования по типам задач приведена в табл. 22.2.
Таблица 22.2. Классификация языков программирования по типам задач
Задачи искусственного интеллекта
ЛИСП, ПРОЛОГ, Common Lisp, РЕФАЛ, Planner, QLisp
Fun, Apl, ML, SML, Occam, Actus, параллельный КОБОЛ, ОВС-АЛГОЛ, ОВС-ФОРТРАН
Задачи вычислительной математики и физики
Occam, Actus, параллельный КОБОЛ, ОВС-АЛГОЛ, ОВС-ФОРТРАН
Разработка интерфейса, программ-оболочек, систем
Forth, С, C++, АССЕМБЛЕР, МАКРОАССЕМБЛЕР, СИМУЛА-67,0 А К, Smalltalk, Java, РПГ
Задачи вычислительного характера
АЛГОЛ, ФОРТРАН, КОБОЛ, Ada, PL/1, БЕЙСИК, ПАСКАЛЬ
Оформление документов, обработка больших текстовых файлов, организация виртуальных трехмерных интерфейсов в Интернете, разработка БД
HTML, Perl, SQL, Informix 4GL, Natural, DDL, DSDL, SEQUEL
Еще одна распространенная классификация языков программирования основана на принципе их организации, илипарадигме [1] . По этой классификации языки делят на процедурные (употребляются также термины императивные и структурные, хотя это не совсем одно и то же), объектно-ориентированные, функциональные и логические.
В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий. В эту большую группу входят, например, ПАСКАЛЬ, С, АДА, ПЛ/1, ФОРТРАН и БЕЙСИК.
В объектно-ориентированных языках не описывают подробной последовательности действий для решения задачи, хотя они содержат элементы процедурного программирования. Программа пишется в терминах объектов, которые обладают свойствами и поведением. Объекты обмениваются сообщениями.
В функциональных языках программа описывает вычисление некоторой функции. Обычно эта функция задается как композиция других, более простых, те в свою очередь разлагаются на еще более простые и т.д. Один из основных элементов в функциональных языках – рекурсия, т.е. вычисление значения функции через значение этой же функции от других элементов. Присваивания и циклов в классических функциональных языках нет. Представителями этой группы являются ЛИСП, ML и Haskell.
В логических языках программа вообще не описывает действий. Она задает данные и соотношения между ними. После этого системе можно задавать вопросы. Машина перебирает известные и заданные в программе данные и находит ответ на вопрос. Порядок перебора не описывается в программе, а неявно задается самим языком. Классическим языком логического программирования считается ПРОЛОГ. Построение логической программы вообще не требует алгоритмического мышления, программа описывает статические отношения объектов, а динамика находится в механизме перебора и скрыта от программиста.
Функциональные и логические языки называют декларативными, или непроцедурными, поскольку программа представляет собой не набор команд, а описание действий, которые необходимо осуществить. Этот подход существенно проще и прозрачнее формализуется математическими средствами. Следовательно, программы проще проверять на наличие ошибок (тестировать), а также на соответствие заданной технической спецификации (верифицировать). Высокая степень абстракции также является преимуществом данного подхода. Фактически программист оперирует не набором инструкций, а абстрактными понятиями, которые могут быть достаточно обобщенными.
На начальном этапе развития декларативным языкам программирования было сложно конкурировать с императивными в силу объективных трудностей эффективной реализации трансляторов. Программы работали медленнее, однако они могли решать более абстрактные задачи с меньшими трудозатратами.
- [1] Более подробно о парадигмах рассказывается в гл. 26.
Среднее Заочное отделение / 8 семестр / Эксплуатация программного обеспечения сетей телекоммуникаций / 1. Классификация языков программирования
Только сегодня: скидка до 20% в подарок на первый заказ.
Какую работу нужно написать?
Другую работу
Помощник Анна
Классификация языков программирования. Краткое описание языков программирования Язык программирования — это формализованный язык, который представляет собой совокупность алфавита, правил написания конструкций (синтаксис) и правил толкования конструкций (семантика). Алфавит — фиксированный для данного языка набор основных символов, допускаемых для составления текста программы на этом языке. Синтаксис — система правил, определяющих допустимые конструкции языка программирования из букв алфавита. Семантика — система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных. Языки программирования, если в качестве признака классификации взять синтаксис образования его конструкций, можно условно разделить на классы: · машинные языки – языки программирования, воспринимаемые аппаратной частью компьютера (машинные коды); · машинно-ориентированные языки – языки программирования, которые отражают структуру конкретного типа компьютера (ассемблеры); · алгоритмические языки – не зависящие от архитектуры компьютера языки программирования для отражения структуры алгоритма (Паскаль, Фортран, Бейсик и др.); · процедурно-ориентированные языки – языки программирования, где имеется возможность описания программы как совокупности процедур (подпрограмм); · проблемно-ориентированные языки – языки программирования, предназначенные для решения задач определенного класса (Лисп, Симула и др.); · интегрированные системы программирования. Программирование ЭВМ можно осуществлять на языке машинных команд (машинных кодов), на языке, использующем символическое обозначение машинных команд, языке ассемблера и языке высокого уровня. Понятие уровня языка определяется аппаратно–программными средствами, с помощью которых инструкции, записанные на некотором языке, переводятся в язык, понятный для ЭВМ. Современные ЭВМ имеют несколько уровней, каждому из которых соответствует определенный язык (язык данного уровня). Самый нижний уровень — микропрограммный, который обеспечивает выполнение инструкций системы команд ЭВМ. Микропрограммный уровень определяется реализацией АЛУ(арифметико-логическое устройство), составом и назначением регистров в процессоре и т. д., т. е. ориентирован на конкретную ЭВМ (машинно-ориентирован). Следующим уровнем является машинный уровень, которому соответствует язык машинных команд. Взаимодействие между рассмотренными уровнями производится следующим образом: Каждая машинная команда, поступающая из памяти в процессор, анализируется и вызывает исполнение определенной микропрограммы, реализующей заданную командой операцию. Ассемблерный уровень является символической формой представления языка машинных команд. Язык ассемблера более удобен для программирования, но требует использования специальной программы для перевода на язык машинных, команд. Перечисленные низкие языковые уровни относятся к разряду машинно-ориентированных. Следующий уровень представлен языками высокого уровня (ЯВУ), которые часто называют проблемно-ориентированными, поскольку каждый из них разработан для решения определенного круга задач: научных (Алгол, Фортран, Бейсик), экономических (Кобол), управления в реальном масштабе времени (Ада, Модула). Другой классификацией языков программирования является их деление на языки, ориентированные на реализацию основ структурного программирования, и объектно-ориентированные языки, поддерживающие понятие объектов и их свойств и методов обработки. В настоящее время насчитывается несколько сотен языков высокого уровня, а если считать и их диалекты, то это число возрастет до нескольких тысяч. Языки программирования высокого уровня существенно отличаются от машинно-ориентированных (низкого уровня) языков. Во-первых, машинная программа в конечном счете записывается с помощью лишь двух символов 0 и 1. Во-вторых, каждая ЭВМ имеет ограниченный набор машинных операций, ориентированных на структуру процессора. Как правило, этот набор состоит из сравнительно небольшого числа простейших операций, типа: переслать число в ячейку; считать число их ячейки; увеличить содержимое ячейки на +1 и т.п. Команда на машинном языке содержит очень ограниченный объем информации, поэтому она обычно определяет простейший обмен содержимого ячеек памяти, элементарные арифметические и логические операции. Команда содержит код и адреса ячеек, с содержимым которых выполняется закодированное действие. Языки программирования высокого уровня имеют следующие достоинства: · алфавит языка значительно шире машинного, что делает его гораздо более выразительным и существенно повышает наглядность и понятность текста; · набор операций, допустимых для использования, не зависит от набора машинных операций, а выбирается из соображений удобства формулирования алгоритмов решения задач определенного класса; · конструкции команд (операторов) отражают содержательные виды обработки данных и задаются в удобном для человека виде; · используется аппарат переменных и действий с ними; · поддерживается широкий набор типов данных. Таким образом, языки программирования высокого уровня являются машинно-независимыми и требуют использования соответствующих программ-переводчиков (трансляторов) для представления программы на языке машины, на которой она будет исполняться. Примеры языков высокого уровня: · Fortran: это первый компилируемый язык созданный Джимом Бэкусом в 50-е годы. Основным критерием при разработке компиляторов Фортрана являлась эффективность исполняемого хода. Поэтому хотя в Фортране был впервые реализован ряд важнейших понятий программирования, удобство создания программ было принесено в жертву возможности получения эффективного машинного кода; · Pascal: язык Паскаль, созданный в конце 70-х годов основоположником множества идей современного программирования Никлаусом Виртом, во многом напоминает Алгол, но в нем ужесточен ряд требований к структуре программы и имеются возможности, позволяющие успешно применять его при создании крупных проектов; · C: данный язык был создан в лаборатории Bell и первоначально не рассматривался как массовый. Он планировался для замены ассемблера, чтобы иметь возможность создавать столь же эффективные и компактные программы, и в то же время не зависеть от конкретного вида процессора; · С++ — это объектно-ориентированное расширения языка Си, созданное Бьярном Страуструпом в 1980 году. Множество новых мощных возможностей, позволивших резко увеличить производительность программ, наложилось на унаследованную от языка Си определенную низкоуровневость, в результате чего создание сложных и надежных программ потребовало от разработчиков высокого уровня профессиональной подготовки; · Java: этот язык был создан компанией Sun в начале 60-х годов на основе Си++. Он призван упростить разработку приложений на основе Си++ путем исключения из него всех низкоуровневых возможностей. Но главная особенность этого языка — компиляция не в машинный код, а в платформо-независимый байт-код. Этот байт-код может выполнятся с помощью интерпретатора — виртуальной машины JVM (Java Virtual Machine), версии которой созданы сегодня для любых платформ. Транслятор — это программа, которая переводит входную программу на исходном (входном) языке в эквивалентную ей выходную программу на результирующем (выходном) языке. Компилятор — это транслятор, который осуществляет перевод исходной программы в эквивалентную ей объектную программу на языке машинных команд или на языке ассемблера. Таким образом, компилятор отличается от транслятора лишь тем, что его результирующая программа всегда должна быть написана на языке машинных кодов или на языке ассемблера. Результирующая программа транслятора, в общем случае, может быть написана на любом языке — возможен, например, транслятор программ с языка Pascal на язык С. Соответственно, всякий компилятор является транслятором, но не наоборот — не всякий транслятор будет компилятором. Например, упомянутый выше транслятор с языка Pascal на С компилятором являться не будет. Интерпретатор — это программа, которая воспринимает входную программу на исходном языке и выполняет ее. В отличие от трансляторов интерпретаторы не порождают результирующую программу (и вообще какого-либо результирующего кода) — и в этом принципиальная разница между ними. Интерпретатор, так же как и транслятор, анализирует текст исходной программы. Однако он не порождает результирующей программы, а сразу же выполняет исходную в соответствии с ее смыслом, заданным семантикой входного языка. Таким образом, результатом работы интерпретатора будет результат, заданный смыслом исходной программы, в том случае, если эта программа правильная, или сообщение об ошибке, если исходная программа неверна. К числу основных достоинств компилируемых языков по сравнению с интерпретируемыми относятся: · в компилируемых языках процесс построения (создания) исполняемого модуля выполняется один раз, а не при каждом запуске, что экономит время; · в компилируемых языках обнаружение синтаксических ошибок происходит до запуска программы на выполнение, а не в его процессе. Несмотря на очевидные недостатки интерпретируемых языков, они применяются в разных специфических задачах, а также в тех случаях, где простота программы важнее ее производительности.
Уровни языков программирования
Какие бывают языки программирования? Что за концепции в них заложены? Как они развивались? В данной статье рассмотрим виды языков программирования основываясь на так называемых уровнях — от машинных кодов (низкий уровень, приближённый к компьютерному «железу») до таких языков, как Java или С# (высокий уровень). Чем меньше преобразований пройдёт текстовый листинг программы по пути превращения в набор нулей и единичек – тем ниже уровень.
- Языки низкого уровня (машинные коды и ассемблер)
- Средний уровень ( C, Фортран …. )
- Высокий уровень (C++, Java, Python, Ruby, JavaScript . )
Машинные языки (Самый низкий уровень)
Нам придётся совершить краткий визит из Software области в Hardware. Рассмотрим в упрощенном виде. Процессор – основной «мозг» компьютера. Материнская плата, на которой он установлен, содержит контроллеры, служащие для взаимодействия с прочими устройствами через шины (каналы данных для связи).
Некоторые работают с большой скоростью (красные стрелки): процессор черпает из памяти команды и манипулирует данными, видеокарта – особенно в 3D играх, потребляет огромные объёмы текстур, фигур, координат пикселей и прочих объектов для построения изображения на экране монитора. Другим (в силу ограничения скорости обмена информацией) столь высокие показатели и не нужны. Разнообразные внутренние и внешние устройства подключены на схеме зелёными стрелками.
Внутренний мир процессора
Все команды процессора поступают из памяти на выполнение в двоичном виде. Формат, количество, подмножество инструкций зависят от его архитектуры. Большинство из них несовместимо друг с другом и следуют разным идеологиям. А также вид команды сильно зависит от режима (8/16/32… разрядность) и источника данных (память, регистр, стек…), с которыми работает процессор. Одно и то же действие может быть представлено различными инструкциями. Процессор имеет команды сложения двух операндов (ADD X,Y) и прибавления единицы к указанному (INC X). Добавление тройки к операнду можно выполнить как ADD X,3 или троекратно вызвав INC X. И, в отношении разных процессоров, нельзя предсказать какой из этих способов будет оптимальным по скорости или объёму занимаемой памяти. Для удобства двоичную информацию записывают в 16-ричном виде. Рассмотрим часть привычной программы (язык C, синтаксис которого сходный с Java)
int func()
- Мы полностью хозяева положения, имеем самые широкие возможности использования процессора и аппаратуры компьютера.
- Для нас доступны все варианты организации и оптимизации кода.
- Необходимо обладать обширными знаниями по функционированию процессоров и учитывать большое количество аппаратных факторов при выполнении кода.
- Создание программ чуть более сложных чем приведенный пример приводит к резким увеличениям затрат времени по написанию кода и его отладку.
- Платформозависимость: программа, созданная для одного процессора, как правило, не будет функционировать на других. Возможно, и для данного процессора, в остальных режимах его работы, потребуется редактирование кода.
Язык ассемблера (низкий уровень)
- Сопоставим группам цифровых инструкций процессора, выполняющих соответствующие действия, одну символьную команду.
- Выделим аргументы инструкций процессора отдельно.
- Введем возможность именовать области памяти, переменные, местоположение отдельных команд.
2004b0 48 83 ec 08 sub $0x8,%rsp 2004b4 bf bc 05 20 00 mov $0x2005bc,%edi 2004b9 31 c0 xor %eax,%eax 2004bb e8 e8 fe ff ff callq getData 2004c0 48 83 c4 08 add $0x8,%rsp 2004c4 83 c0 01 add $0x1,%eax
- Процесс написания и модификации кода упростился.
- Сохранился контроль ко всем ресурсам аппаратуры.
- Относительно легче переносить программу на другие платформы, но требуется их модификация в зависимости от аппаратной совместимости.
- Ассемблер относится к низкоуровневым языкам программирования. Создание даже небольших участков кода затруднено. К тому же также необходимо учитывать специфику работы аппаратуры.
- Платформозависимость.
public static void main(String[] args)
будет выглядеть (NASM синтаксис, с использованием Windows API и kernel32.lib) следующим образом:
global _main extern _GetStdHandle@4 extern _WriteFile@20 extern _ExitProcess@4 section .text _main: ; DWORD bytes; mov ebp, esp sub esp, 4 ; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE) push -11 call _GetStdHandle@4 mov ebx, eax ; WriteFile( hstdOut, message, length(message), &bytes, 0); push 0 lea eax, [ebp-4] push eax push (message_end - message) push message push ebx call _WriteFile@20 ; ExitProcess(0) push 0 call _ExitProcess@4 ; never here hlt message: db 'Hello, World', 10 message_end:
Как и машинные коды, ассемблер чаще используется инженерами и системными программистами. На нём пишут аппаратно-зависимые части ядра операционных систем, критические по времени или особенностям реализации драйвера различных периферийных устройств. Но в последнее время к нему прибегают всё реже и реже, так как его применение сильно сужает переносимость программ на другие платформы. Иногда используют процесс дизассемблирования – создают ассемблерный листинг программы из цифровых кодов для разбора логики выполнения небольших фрагментов. В редких случаях, если первоначальный высокоуровневый код недоступен: анализ вирусов для борьбы с ними или потере исходного текста. Язык ассемблера причисляют к первому/второму поколению (мы не будем рассматривать отдельно псевдокоды до возникновения ассемблера и их отличие от символьных команд). Хотелось бы выделить использование ассемблера в Demo Scene (демо-сцена): сплав искусства, математики и низкоуровневого кодирования, воплощающие художественные замыслы своих создателей в виде программ, генерирующих видеоклипы при ограничениях в ресурсах. Часто общий размер файла программы и данных не должен превышать 256 байт (также популярен и формат в 4/64 килобайта). Вот пример 4 Кб программы:
Языки группы C/Фортран (средний/высокий уровень)
- Упрощение процесса создания кода: введение типов, разбивка на модули, сокращение листинга программ.
- Прозрачная логика заложенного алгоритма вследствие ухода от машинных кодов к более понятным для человека командам в семантически описательном стиле.
- Переносимость. Стало достаточно перекомпилировать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
- Скорость откомпилированных программ.
- Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
- Отсутствие реализации концепций объектно-ориентированного и функционального программирования.
Развитие языков высокого уровня
Высокоуровневые языки программирования, в плане создания ПО, стали всё по большей части удаляться от машинных кодов и реализовывать различные, помимо процедурного, парадигм программирования. К ним относят также и реализацию объектно-ориентированных принципов. C++, Java, Python, JavaScript, Ruby… – спектр языков данного типа наиболее популярен и востребован сегодня. Они предоставляют больше возможностей для реализации разнообразного ПО и нельзя однозначно определить «специализацию» каждого из них. Но популярность применения в соответствующих областях обусловлена библиотеками/фреймворками для работы с ними, например: JavaScript – Frontend. Язык был разработан для взаимодействия клиентского веб-браузера с пользователем и удалённым сервером. Наиболее популярные библиотеки: Angular, React и VUE. В данное время относительно активно употребляется и на web и т. п. серверах (backend), особенно популярен Node.js. Ruby – Backend. Применяется для создания скриптов (служебных сервисных файлов) и на web серверах. Основной фреймворк — Ruby On Rails. Python – научная и инженерная сфера (помимо веб-области). Является альтернативой стандартным вычислительным и математическим пакетам (Mathematica, Octave, MatLab…), но имеет привычную семантику языка и большое число библиотек. Имеет много поклонников в области систем машинного обучения, статистики и искусственного интеллекта. Из часто используемых библиотек необходимо упомянуть django, numpy, pandas, tensorflow. С++ – Универсал, эволюционное развитие языка C. Предоставляет возможности функционального и объектно-ориентированного программирования и не потеряв при этом способность низкоуровневого взаимодействия с аппаратным обеспечением. За счёт чего реализуется производительность и гибкость при создании ПО, но и цена соответствует: высокий порог вхождения за счёт сложной спецификации языка, необходимости самостоятельного контроля за ресурсами при выполнении программы. Многие однопользовательское и системное ПО написано с его применением: модули операционных систем (Windows, Symbian…), игры, редакторы (Adobe Photoshop, Autodesk Maya…), базы данных (MSSQL, Oracle…), проигрыватели (WinAmp…) и т. д. Следует отметить, что современное ПО является сложным продуктом, в разработке которого используется сразу несколько языков программирования и расставлять степень участия каждого из них в общий результат бывает весьма затруднительно.
Дальнейший прогресс
- Для тестирования нам необходимы только аргументы функций (результат работы не зависит от внешних переменных и т. п.).
- Программа в функциональном стиле чудесным образом готова к параллельной работе: последовательные вызовы функций можно пускать в соседних потоках (так как на них не действуют внешние факторы) и им не нужны блокировки (то есть, проблемы синхронизации отсутствуют). Хороший стимул уделить время этой теме, учитывая повальное распространение многоядерных процессоров.
Заключение
В настоящее время самые распространённые – языки ООП. Java, с момента возникновения, всегда находится в топе, обычно в тройке, востребованных языков. Помимо ООП, содержит элементы функционального программирования, и вы можете комбинировать разные стили составления ваших программ. Спектр применения Java весьма широк – это бизнес задачи, реализация веб-серверов (backend), основной язык создания Android-приложений, кроссплатформенные среды программирования и рабочих мест (IDE/АРМ) и моделирования и многое другое. Особенно сильны позиции Java в Enterprise секторе – области корпоративного программного обеспечения, которая требует качественный и долгоживущий код, реализацию самых сложных бизнес-логик.