Найти в Дзене
Цифровая Переплавка

🧩 От языков программирования к «наборам языков»: новый взгляд на разработку

Среди программистов давно существуют дискуссии о том, какой язык программирования лучше. Python или Rust, TypeScript или Go? Но что, если мы всё это время задавали неправильный вопрос? Возможно, вместо того, чтобы выбирать один язык, нам стоит использовать целые «наборы языков», плавно перетекая от одного уровня сложности к другому. Идею такой градации недавно предложил разработчик и автор под псевдонимом xixixao в своей статье «From Languages to Language Sets». 🎚️ Четыре уровня программирования Автор предлагает разделить языки программирования на четыре уровня по степени производительности и удобства использования: Конечно, есть ещё и нулевой уровень — ассемблер, но его мы пока оставим для узких специалистов и хакеров. 🛠️ Почему одного языка недостаточно? Практически каждая крупная компания вынуждена использовать сразу несколько языков программирования одновременно: Однако использование нескольких языков приводит к сложностям с поддержкой инструментов, наймом специалистов и переключ

Среди программистов давно существуют дискуссии о том, какой язык программирования лучше. Python или Rust, TypeScript или Go? Но что, если мы всё это время задавали неправильный вопрос? Возможно, вместо того, чтобы выбирать один язык, нам стоит использовать целые «наборы языков», плавно перетекая от одного уровня сложности к другому.

Идею такой градации недавно предложил разработчик и автор под псевдонимом xixixao в своей статье «From Languages to Language Sets».

🎚️ Четыре уровня программирования

Автор предлагает разделить языки программирования на четыре уровня по степени производительности и удобства использования:

  • 🟢 Уровень 4: интерпретируемые, динамически типизированные языки (JavaScript, Python, PHP). Очень просты в использовании, идеально подходят для быстрого прототипирования и небольших проектов.
  • 🟡 Уровень 3: интерпретируемые, статически типизированные (TypeScript, mypy, Flow). Просты и удобны, обеспечивают безопасность типов, но всё ещё проигрывают в производительности.
  • 🔵 Уровень 2: компилируемые языки с автоматическим управлением памятью (Go, Java/Kotlin, C#, Swift). Баланс между скоростью разработки и производительностью.
  • 🔴 Уровень 1: компилируемые языки с ручным управлением памятью (Rust, C, C++). Максимальная производительность, но требуют высоких навыков программирования.

Конечно, есть ещё и нулевой уровень — ассемблер, но его мы пока оставим для узких специалистов и хакеров.

🛠️ Почему одного языка недостаточно?

Практически каждая крупная компания вынуждена использовать сразу несколько языков программирования одновременно:

  • 🚀 Производительность: критически важные компоненты требуют максимальной скорости и минимального потребления ресурсов (например, микросервисы, серверы, драйверы).
  • 🧑‍💻 Разработка и поддержка: большинство бизнес-логики пишется на более высокоуровневых языках, чтобы экономить время на разработку и избежать ошибок управления памятью.
  • 🧪 Прототипирование: для проверки гипотез и быстрого создания MVP часто выбирают простые и гибкие динамические языки.

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

🔗 «Набор языков» на основе Rust

Автор предлагает решить эту проблему созданием семейства языков, объединённых общей основой, синтаксисом и экосистемой, но различающихся уровнем сложности и производительностью. Он берёт за основу язык Rust и предлагает создать два его «варианта»:

  • 🌀 RustGC (уровень 2–3) — компилируемый язык с автоматическим управлением памятью (сборка мусора), который идеально подходит для быстрой и комфортной разработки сложных приложений. Во время разработки поддерживается режим интерпретации (быстрое сохранение и выполнение), а для продакшна — полноценная компиляция с производительностью, близкой к Rust.
  • RustScript (уровень 4) — динамический интерпретируемый язык с удобным синтаксисом, позволяющий создавать прототипы максимально быстро и удобно.

Таким образом, разработчик получает сразу три языка (Rust, RustGC и RustScript), объединённых общими правилами, экосистемой и возможностью лёгкого взаимодействия между собой.

💻 Примеры реализации

Вот как выглядят одни и те же программы на разных уровнях:

🔴 Rust (уровень 1):

fn main() {
let rect1 = Rectangle { width: 30, height: 50 };
println!("The area is {}.", area(&rect1));
}

struct Rectangle {
width: u32,
height: u32,
}

fn area(rectangle: &Rectangle) -> u32 {
rectangle.width * rectangle.height
}

🌀 RustGC (уровень 2–3):

fn main() {
let rect1 = Rectangle { width: 30, height: 50 };
println!("The area is {}.", area(rect1));
}

struct Rectangle {
width: int,
height: int,
}

fn area(rectangle: Rectangle) {
rectangle.width * rectangle.height
}

RustScript (уровень 4):

fn main() {
let rect1 = { width: 30, height: 50 };
println!("The area is {}.", area(rect1));
}

fn area(rectangle) {
rectangle.width * rectangle.height
}

Также возможны расширенные сценарии, например:

🔮 Асинхронная обработка в RustGC:

async fn main() {
let user_ids = vec![1, 2, 3];
let user_names = user_ids.iter().map_async(
async |id| => fetch_user_name(id).await,
).await;
println!(user_names.join(", "));
}

🧩 Мнение автора статьи: почему это будущее?

Я считаю, что подход «набора языков» на основе одного мощного ядра (например, Rust) — это большой шаг вперёд для разработки приложений. Это позволит объединить преимущества разных уровней сложности и скорости в единую, гармоничную экосистему.

Однако, такой подход — большой вызов и с точки зрения реализации. Нужно будет создать сложные компиляторы, интерпретаторы и IDE, которые смогут бесшовно переключаться между уровнями и обеспечивать одинаково комфортную разработку. Тем не менее, польза от такого решения перевешивает возможные сложности.

📚 Полезные ссылки и ресурсы:

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