Статьи Утилиты Telegram YouTube VK Видео RuTube Отзывы

Эволюция языков программирования

7 марта 2026

Тэги: Java, Kotlin, ООП.

Содержание

  1. Первые языки программирования
  2. Процедурное программирование
  3. Объектно-ориентированное программирование
  4. Эпоха графических интерфейсов
  5. Появление Java
  6. Семейство JVM-языков
  7. Выводы

На первый взгляд может быть непонятно, зачем рассматривать историю развития языков программирования? Ну, были когда-то старые языки и пропали, кому какая разница? Если взглянуть на рейтинг их популярности, (например, TIOBE), окажется, что среди активно развивающихся языков вроде Python, Java и C# довольно много «старых». Например, C++ появился в 1980-ом. C в 1972-ом, COBOL в 1959-ом, Fortran в 1957-ом. Но, несмотря на «возраст», они прочно удерживают свои ниши до сих пор. Пережив языки, которые проектировались для продвижения более «правильного» дизайна, но в итоге оказались забытыми.

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

Как множатся языки программирования

Первые языки программирования

В 1950 году появился первый компьютер, способный выполнять команды. Правда понимать он мог только единицы и нули. Программисту ничего не оставалось кроме как писать команды в двоичном виде. Причём эти команды у каждого компьютера были свои.

Например, вот так выглядел машинный код для сложения двух чисел:

00010100 00000000 00010000   ; загрузить значение из адреса 10 в аккумулятор
00011000 00000000 00010001   ; прибавить значение из адреса 11
00010101 00000000 00010010   ; сохранить результат в адрес 12
00000000 00000000 00000000   ; останов программы

Перфокарты

Ассемблер

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

Так появился ассемблер – первый язык программирования низкого уровня. А вместе с ним компилятор, чтобы из текстовых команд, понятных человеку, переводить обратно в двоичное представление понятное компьютеру.

Вот пример сравнения двух чисел на ассемблере, аналог конструкции if-else:

cmp eax, ebx   ; Сравниваем значения в регистрах EAX и EBX
jg greater     ; Если EAX > EBX, переходим по метке greater

mov ecx, 0     ; Блок else (EAX <= EBX), тут логика для false
jmp end_if     ; Переходим в конец if-else

greater:
mov ecx, 1     ; Тут логика для true

end_if:

Согласитесь, программа стала более читаемой?

Лично я сталкивался с ассемблером только во время учёбы в универе. Тогда меня поразило, что, несмотря на его близость к «железу», базовые принципы понять довольно легко и уже на первом лабораторном занятии написать свой «Hello, World!».

Basic

В 1964 году преподавателями Дартмутского Колледжа был придуман высокоуровневый язык для начинающих программистов под названием Basic. Этот язык является родоначальником целого семейства, однако на начальном этапе не поддерживал даже процедуры. Вот так выглядела минимальная программа на Basic:

10 INPUT A, B
20 IF A > B THEN PRINT "A > B" ELSE PRINT "A <= B"
30 END

Тут с читаемостью уже всё хорошо, а if-else вообще можно написать в одну строку.

Интересный факт. Каждую строку исходного кода нужно было нумеровать вручную. Для редактирования строки её нужно было набрать заново в терминале с указанием номера. Строки было принято нумеровать не подряд, а с шагом 10, чтобы при необходимости можно было вставить новую строку между ними.

Процедурное программирование

Всё, что было до этого, предполагало написание программ единым потоком мыслей без какой-либо структуры. Идея о том, что программу можно разделить на относительно независимые участки кода и затем их переиспользовать, получила название процедурного программирования.

Fortran

В 1957 году появился первый язык высокого уровня Fortran. В то время основными пользователями компьютеров были учёные, поэтому язык создавался под их потребности, т.е. научные расчёты. Fortran – это сокращение от Formula Translator. Основной структурной единицей в нём являются процедуры, поэтому язык называется процедурным.

PROGRAM ADDNUM
INTEGER A, B, C

A = 5
B = 3
C = A + B

PRINT *, 'RESULT =', C
STOP
END

Fortran был революцией для своего времени — впервые программисты могли писать почти как на английском, не думая о машинном коде. При этом он жёстко стандартизован, благодаря чему легко переносится на различные платформы. Язык до сих пор используется в научных расчётах благодаря оптимизации и большому коду наследия. Последний стандарт языка вышел в ноябре 2023 года, т.е. совсем недавно.

COBOL

В 1959 году был разработан COBOL (common business-oriented language) на основе более раннего языка FLOW-MATIC, созданного под руководством Грейс Хоппер. Кстати, за это она впоследствии получила звание контр-адмирала флота США и почётный титул «бабушки Кобола».

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

IDENTIFICATION DIVISION.
PROGRAM-ID. ADDNUM.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM1        PIC 9(3) VALUE 005.
01 NUM2        PIC 9(3) VALUE 003.
01 RESULT      PIC 9(4) VALUE 0000.

PROCEDURE DIVISION.
ADD NUM1 TO NUM2 GIVING RESULT.
DISPLAY "RESULT = " RESULT.
STOP RUN.

Кстати, на момент написания статьи (март 2025), COBOL в рейтинге популярности занимает 20-е место. Он до сих пор используется в финансовых системах (особенно на мэйнфреймах IBM) и обрабатывает значительную часть банковских транзакций в мире. Всего на нём написано порядка 220 миллиардов строк кода! Последний стандарт также вышел в 2023 году.

ALGOL

Параллельно с COBOL в 1958-1960 годах появился ALGOL (ALGOrithmic Language) для описания алгоритмов в научных и инженерных задачах. Стал первым языком с блочной структурой, вложенными операторами, формализованной грамматикой. Первым стандартом является ALGOL 60. Язык был популярен в Европе, в том числе в СССР, в качестве языка как практического программирования, так и языка публикации алгоритмов в научных работах. Однако в США и Канаде не смог превзойти распространённый там Fortran.

Вот так выглядит сложение двух чисел:

begin
   integer a, b, sum;
   read(a, b);
   sum := a + b;
   write(sum)
end

Синтаксис с характерным обрамлением блоков с помощью begin и end впоследствии оказал заметное влияние на целое семейство Pascal-подобных языков.

Крайне важным свойством Алгола стала возможность организации рекурсивных процедур. До этого момента у промышленных языков, в том числе у Фортрана и Кобола, возможность рекурсивного вызова отсутствовала. Однако были и недостатки: язык не предусматривал какой-либо стандартный ввод-вывод, из-за чего разные реализации языка были несовместимы между собой.

Pascal

На основе Algol 60 швейцарский учёный Никлаус Вирт создал Pascal. Это процедурный язык со статической типизацией, созданный специально для обучения, воспитал не одно поколение программистов.

Вот так выглядит программа для сложения двух чисел на Pascal.

program SumTwoNumbers;
var
  a, b, sum: integer;
begin
  writeln('Enter two numbers:');
  readln(a, b);
  sum := a + b;
  writeln('Sum = ', sum);
end.

Обратите внимание на структурированность и отделение объявления переменных от логики самого метода.

В настоящий момент Pascal практически не используется для обучения программистов - его нишу занял Python.

Язык C

В 1972 году Деннис Ритчи разработал язык Си. Это процедурный язык со статической типизацией. Конструкции языка Си изначально разрабатывались таким образом, чтобы они легко компилировались в машинные инструкции, благодаря чему нашёл применение в тех нишах, где раньше использовался только ассемблер.

int main() {
    int num1 = 5;
    int num2 = 3;
    int result = num1 + num2;

    printf("Result = %d\n", result);
    return 0;
}

Синтаксис языка Си оказал значительное влияние на дальнейшее развитие языков программирования, такие как C++, Java, C# и т.д. Согласитесь, это уже довольно близко к тому, с чем большинство из нас имеет дело каждый день. Язык C в 2026 году занимает 2-ю строчку в рейтинге TIOBE, хотя языку уже более 50 лет!

Объектно-ориентированное программирование

Попытка объединять не просто отдельные инструкции, а целые процедуры, привела к дальнейшему развитию процедурного программирования, которое со временем эволюционировало в объектно-ориентированное. Этот подход дал нам три базовых принципа:

  • наследование (расширение свойств дочернего класса относительно родительского)
  • инкапсуляцию (отделение публичного контракта от внутренней реализации)
  • полиморфизм (любые производные типы могут обрабатываться так же как и базовый)

Simula

В 1967 году норвежские программисты Кристен Нюгор и Оле-Йохан Даль создали язык Simula, который на тот момент не считался ООП-языком (да и концепция эта ещё не была до конца сформирована). Однако он имел при этом основные синтаксические конструкции, присущие современным объектно-ориентированным языкам. Simula можно считать объектным расширением Algol 60.

Вот так на Simula можно описать класс, представляющий информацию о человеке.

begin
  class Person;
    begin
      text name;
      integer age;

      procedure init(nam); text nam;
        begin
          name := nam;
        end;

      procedure setAge(a); integer a;
        begin
          age := a;
        end;

      procedure printInfo;
        begin
          outtext("Name: "); outtext(name); outimage;
          outtext("Age: "); outint(age, 3); outimage;
        end;
    end;

  Person p;
  p :- new Person;
  p.init("Alice");
  p.setAge(30);
  p.printInfo;
end;

Он содержит поля с именем и возрастом, а также метод инициализации (конструктор), set-метод и метод для вывода на экран.

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

Smalltalk

В 1980 году появился Smalltalk – первый объектно-ориентированный язык. Его парадигмой является принцип «всё есть объект». Взаимодействие между объектами происходило пересылкой сообщений. Также в Smalltalk использовалась сборка мусора – автоматическое удаление ненужных объектов. Smalltalk дал миру ООП в чистом виде: классы, объекты, сообщения, наследование.

В Smalltalk все действия производятся путём посылки сообщений объектам.

Transcript show: 'Hello, world!'

В данном случае сообщение - это show: 'Hello, world!', и оно посылается объекту Transcript. Обратите внимание на отсутствие привычных нам скобочек и точки перед show.

C++

1983 год – датский программист Бьёрн Страуструп, которому не хватало выразительности языка Си, создал язык С++. При этом он вдохновлялся концепциями Simula. И, подобно тому, как Simula считается «Algol c классами», своё расширение Бьёрн назвал назвал «Си с классами». Этот язык был совместим с Си, сохранял все его преимущества, а также позволял использовать объекто-ориентированное программирование.

Вот так выглядит класс Person на C++, аналогичный примеру для Simula:

class Person {
private:
    std::string name;
    int age;

public:
    // Конструктор
    Person(std::string n, int a) {
        name = n;
        age = a;
    }

    // Метод вывода информации
    void printInfo() {
        std::cout << "Name: " << name << "\nAge: " << age << std::endl;
    }
};

int main() {
    Person p("Alice", 30);
    p.printInfo();
    return 0;
}

Несмотря на необходимость ручного управления памятью, большого количества legacy-конструкций и неочевидного поведения, C++ в 2026 году занимает третью строчку в рейтинге TIOBE. Его ниша - это разработка низкоуровневых программ и драйверов, а также высоконагруженных и производительных приложений (игровые и поисковые движки, операционные системы, высокочастотная торговля на бирже, автопилоты).

Эпоха графических интерфейсов

С появлением Windows возникла необходимость в быстрой разработке типовых программ с графическим интерфейсом (GUI). Здесь как никогда оказались востребованы объектно-ориентированное программирование и технология drag & drop.

Visual Basic

Первым языком для создания формочек, который был разработан в недрах Microsoft в 1991 году, был Visual Basic. По сравнению с классическим Basic из 60-х, в него добавили поддержку процедур. Обработчик нажатия кнопки на Visual Basic выглядел так:

Private Sub Button1_Click()
    Dim userName As String
    userName = TextBox1.Text
    Label1.Caption = "Hello, " & userName
End Sub

Этот язык имел низкий порог входа, при этом позволял создавать полноценные приложения под Windows из готовых компонентов и имел хорошую интеграцию с ней.

Delphi

Дальнейшее развитие Pascal-семейства привело к тому, что в 1995 году датский инженер-программист Андерс Хейлсберг разработал объектно-ориентированный вариант Pascal под названием Delphi. Его нишей также была разработка графических приложений под Windows. Во многом этому способствовала среда разработка, позволяющая за 5 минут методом drag & drop накидать типовое «оконное» приложение.

Вот так выглядит обработчик события при нажатии на кнопку:

procedure TForm1.Button1Click(Sender: TObject);
var
  userName: string;
begin
  userName := Edit1.Text;
  Label1.Caption := 'Hello, ' + userName + '!';
end;

В начале нулевых Delphi безраздельно царствовал в нише бухгалтерии, документооборота и CRM-систем.

C#

Глядя на успех Delphi и Java, под руководством всё того же Хейлсберга в Microsoft создают платформу .NET и C#. Новый язык учитывает все проблемы своих предшественников и берёт всё лучшее, что было в индустрии на тот момент (лямбды, свойства, именованные параметры, делегаты и т.п.)

var names = new[] { "Tom", "Alice", "Bob", "Alexander", "Sam" };

var result = names
    .Where(name => name.Length > 3)
    .Select(name => name.ToUpper())
    .OrderBy(name => name);

foreach (var name in result)
{
    Console.WriteLine(name);
}

В начале 2010-х мне пришлось пересесть с C# на Java 6, где не было лямбд, и это выглядело как шаг назад...

C# более универсален, чем Visual Basic, поэтому к настоящему моменту практически полностью его вытеснил в нише разработки приложений под Windows. Сейчас C# занимает пятую строку в рейтинге TIOBE.

Однако vendor lock в виде Microsoft ограничивает области применения C#, особенно в России.

Python

1991 год – голландский программист Гвидо ван Россум создаёт язык Python с динамической типизацией, ориентированный на повышение скорости написания программы и её читаемости. Язык не компилируется в машинный код, а интерпретируется, т.е. выполняются непосредственно текстовые команды языка.

Особенностью языка является то, что блоки кода не обрамляются фигурными скобками или ключевым словами. Для этого используются отступы. Что позволяет не перегружать синтаксис и повышает читаемость кода.

names = ["Tom", "Alice", "Bob", "Alexander", "Sam"]

result = sorted(
    name.upper()
    for name in names
    if len(name) > 3
)

for name in result:
    print(name)

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

Появление Java

В 1995 году для программирования бытовых электронных устройств, таких как стиральная машина или микроволновка, появился объектно-ориентированный си-подобный язык Java. Изначально он разрабатывался Джеймсом Гослингом и назван в честь марки кофе, которая, в свою очередь, названа в честь острова Ява. Его девизом становится «write once, run anywhere» – «напиши один раз – запускай где угодно».

Это достигается за счёт использования виртуальной машины Java (сокращённо JVM). Компиляция исходного кода на Java заключается в том, что код компилируется в промежуточный байт-код, понятный виртуальной машине. Это аналог ассемблера для неё. Затем, непосредственно во время выполнения, байт-код комплируется в машинный код, учитывая специфику конкретного окружения (just in-time, JIT - компиляция). Таким образом, Java обладает преимуществами одновременно и компилируемых, и интерпретируемых языков.

Другой особенностью языка является автоматический сборщик мусора (garbage collector), который сам удаляет созданные объекты из памяти, если они больше не требуются. В отличие от C++, где для каждого объекта требовалось очищать память вручную.

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

void main() {
    var names = List.of("Tom", "Alice", "Bob", "Alexander", "Sam");
    names.stream()
        .filter(name -> name.length() > 3)
        .map(String::toUpperCase)
        .sorted()
        .forEach(System.out::println);
}

В 2026 году Java занимает четвёртое место в рейтинге TIOBE.

Javascript

Одновременно с Java в 1995 году появился Javascript, который не имеет ничего общего с Java кроме названия. Их часто путают, однако Javascript – интерпретируемый язык с динамической типизацией. Его средой исполнения является браузер пользователя, в отличие от Java, которая работает на сервере.

Семейство JVM-языков

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

2003 год - язык Groovy, который совместим с Java, но позволяет использовать динамическую типизацию. Благодаря дополнительным синтаксическим конструкциям код получается компактнее. Его ниша - написание небольших скриптов, подобно Python.

def names = ["Tom", "Alice", "Bob", "Alexander", "Sam"]
names
    .findAll { it.length() > 3 }
    .collect { it.toUpperCase() }
    .sort()
    .each { println it }

2004 год - язык Scala, в котором сделан упор на функциональное программирование. Код, который пишется на Scala, является довольно гибким и выразительным, однако, может быть сложен для понимания и дальнейшей поддержки.

object Example extends App {
    val names = List("Tom", "Alice", "Bob", "Alexander", "Sam")

    names
        .filter(_.length > 3)
        .map(_.toUpperCase)
        .sorted
        .foreach(println)
}

В 2011 году компания JetBrains выпустила Kotlin, который учитывает весь накопленный опыт семейства JVM-языков. При этом код на Kotlin в целом выглядит компактнее, чем код на Java и проще, чем код на Scala. Интересно, что Google выбрала его в качестве основного языка для разработки под Android. В настоящее время можно констатировать, что Kotlin вытесняет как Groovy в нише написания скриптов, так и Scala в части функционального программирования.

fun main() {
    val names = listOf("Tom", "Alice", "Bob", "Alexander", "Sam")
    names
        .filter { it.length > 3 }
        .map { it.uppercase() }
        .sorted()
        .forEach { println(it) }
}

Выводы

Мы рассмотрели краткую историю развития языков программирования от ассемблера до Java и Kotlin. Её можно описать как стремление решать задачи быстрее и писать меньше кода. И это правильный подход, ведь чем меньше кода - тем меньше вероятность допустить в нём ошибку.

Однако за последний год AI-инструменты прочно вошли в повседневную практику и теперь мы всё меньше кода пишем вручную и всё больше ревьюим то, что пишет AI. И тут два варианта. Либо развитие языков значительно замедлится, т.к. AI быстрее осваивает любые существующие языки и не ленится писать однотипные конструкции. Либо же, наоборот, появится тот самый универсальный язык, оптимизированный под написание кода с помощью LLM (например, с минимально возможным расходом токенов) и при этом сохраняющий читаемость.


См. также


Комментарии

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

×

devmark.ru