Kora просто работает без магиикостылей,грязных хакови обходных путей..
Kora строит граф приложения во время компиляции, генерирует высокопроизводительный исходный код и сразу готова к использованию в облачно-ориентированной среде как простой, понятный, эффективный и уже знакомый стек на JVM.
95%+функциональности покрыто документацией, нейро-навыками и примерами
0скрытой магии — разработка понятная человеку и нейро-агенту
Для команд, которым нужна простота, контроль и эффективность.
Процесс разработки STEP для стажеров, инженеров и нейро-агентов: просто, прозрачно, эффективно и предсказуемо.
01
Знакомые подходы. Единая модель.
Знакомые модули, клиенты, репозитории и контроллеры используют прямой синхронный код на Java и Kotlin с типизированными контрактами и генерацией реализаций. Те же подходы работают для HTTP, OpenAPI, gRPC, данных, обмена сообщениями, отказоустойчивости и конфигурации — ваш опыт JVM-разработки применим во всём стеке.
Пишитепривычные Java и Kotlin
Генерациясвязи, обработчики, репозитории
02
Без магии. Всё под контролем.
Откройте сгенерированный код и проследите реальный путь выполнения: от связывания зависимостей до обработки запросов и обращений к базе данных. Заменяйте стандартные компоненты, меняйте поведение и добавляйте интеграции через явные типизированные контракты — без борьбы с фреймворком и разгадывания скрытых механизмов выполнения.
Контрольчитаемый сгенерированный код
Расширяйтезамена компонентов, свои интеграции
03
Просто и легко. Разработка по шагам.
Явный код, документация по конкретным задачам, запускаемые примеры и официальный Kora нейро-навык снижают когнитивную нагрузку: меньше правил и контекста фреймворка приходится держать в голове. Инженеры и нейро-агенты работают шаг за шагом, используя точную диагностику компилятора и быстрые тесты, чтобы изучать, создавать, проверять и улучшать сервисы.
Осваивайтедокументация, примеры, Kora нейро-навык
Проверяйтедиагностика компилятора, быстрые тесты
04
Оптимизировано. Готово к эксплуатации.
Оптимизации уже сделаны: разработчикам не нужно тратить время на тюнинг фреймворка и держать в голове хаки производительности. Низкое потребление CPU и памяти, быстрый запуск, отказоустойчивость, корректное завершение, а также метрики и трассировка OTel во всех модулях поддерживают стабильную, предсказуемую и наблюдаемую работу сервисов.
Запускготовность, скорость, эффективность
Мониторингметрики, трассировка, завершение
Больше эффективности на ядро — меньше расходов, больше стабильности.
TechEmpower Single query (external): число ответов в секунду при одном запросе к базе данных на HTTP-запрос. Чем больше, тем лучше.
Срез
Single query
Версии фреймворков
Kora 2
2.0.0.RC2
Kora 1
1.2.22
Quarkus
3.40.1
Micronaut
5.2.1
Spring Boot
4.1.1
Helidon
4.5.5
Vert.x
5.2.0
Vert.x (Kora 1)
4.3.8
Ktor
3.6.0
jOOQ
3.21.9
ntex (tokio)
3.12.3
МетрикаОтветов / сек
Kora JDBC Repository134,312
Quarkus JPA Repository132,217
ntex tokio (Rust)131,191
Micronaut Data JDBC126,327
Quarkus jOOQ126,234
Spring JDBC Template120,593
Helidon MP JDBC Client102,580
Ktor CIO JDBC Driver90,310
Spring Data R2DBC Reactive63,798
Spring Data JDBC51,859
Spring Data JPA51,616
Micronaut Data JPA Reactive46,800
Micronaut Data JPA18,671
Значения взяты из интервала "Single query" во внешнем наборе результатов по ссылке. PostgreSQL размещён на отдельном сервере с 16 ядрами CPU и 24 GB оперативной памяти. Приложение и генератор нагрузки работают отдельно друг от друга на втором сервере с 24 CPU и 64 GB оперативной памяти, связанном с сервером БД по локальной сети. Задержка между серверами — в пределах 1 мс, что приближает условия бенчмарка к взаимодействию внутри дата-центра.Открыть TechEmpower
Почему эффективность важна, даже когда производительность вам не нужна▾
Для одного сервиса чистая производительность редко является целью — большинство сервисов спокойно держат свою нагрузку на любом фреймворке, поэтому легко сделать вывод, что эффективность здесь неважна. Для одного сервиса в отрыве от остального это действительно так.
Инженеры часто видят систему только со своей колокольни — свой сервис, свой репозиторий, своя машина, в лучшем случае свой продакшн-стенд — и через эту призму вывод выглядит верным. Но поднимитесь на уровень всей технической инфраструктуры компании — и картина, а вместе с ней и приоритеты, выглядят совсем иначе.
Потому что ничто не работает в единственном экземпляре. Боевой сервис по умолчанию резервируется: минимум два инстанса на дата-центр, чтобы плавный деплой или потеря узла никогда не роняли сервис, и обычно второй дата-центр для отказоустойчивости между регионами — ещё два инстанса. Это четыре и более работающих копии каждого сервиса ещё до того, как придёт хотя бы один реальный пользователь.
Именно здесь потребление на экземпляр перестаёт быть про скорость и становится про деньги. Более тяжёлый рантайм резервирует больше памяти и CPU только для того, чтобы стартовать и оставаться здоровым за разумное время, — это запас, за который вы платите на каждой резервной копии, независимо от того, делает она полезную работу или нет.
Всё дело в масштабе. Возьмите этот один сервис и размножьте его: пара инстансов для резервирования, затем на два дата-центра, затем каждый сервис команды, затем каждая команда в департаменте, затем каждый департамент в бизнес-линии, затем каждая бизнес-линия в компании — и вдобавок ко всему запас CPU и RAM, зарезервированный под пиковые события вроде «чёрной пятницы». А эксплуатация инфраструктуры такого масштаба — это совсем не то же самое, что купить процессор или ПК для локальной работы: каждое зарезервированное ядро и гигабайт несёт свою долю расходов на инженеров эксплуатации на местах, серверные стойки, электричество, охлаждение, сеть и прочие накладные расходы дата-центра, оплачиваемые каждый месяц. Разница на один инстанс, казавшаяся незначительной, теперь умножена на десятки тысяч. Более лёгкий рантайм вроде Kora превращает производительность, которая вам была не нужна, в зарезервированные память и CPU, за которые вы просто перестаёте платить, — та же надёжность, но на значительно меньшем числе ядер.
Посмотрите, как это может масштабироваться на всю организацию
1экземпляр сервиса
×2инстанса для резервирования
×2дата-центра для отказоустойчивости
×20сервисов в команде
×8команд в департаменте
×6департаментов в бизнес-линии
×4бизнес-линий в компании
×1.4запас под пики, резервирование и масштабирование
Зарезервировано RAM
Kora0ГБ
Другой фреймворк0ГБ
Зарезервировано CPU
Kora0vCPU
Другой фреймворк0vCPU
Выделено инстансов (с учётом пикового резерва)0
Насколько больше может потребоваться другому фреймворку по сравнению с Kora0ГБ · 0vCPU · ≈ $0/ год
Цифры приведены для иллюстрации, а не измерены — реальные значения зависят от ваших сервисов, настроек JVM, SLA, пикового запаса и цен облака. Важна форма: потребление × резервирование × сервисы × команды × департаменты × бизнес-линии × пиковый резерв.
Смотрите, как множатся сервисы
one service
1сервисов по всей компании
Kora не стремится к охвату ради охвата, не оборачивает каждую технологию в собственную абстракцию и не заменяет собой всю функциональность других фреймворков и библиотек. Она берет проверенные, широко используемые практики серверной разработки и доводит их до предела: меньше механики во время выполнения, меньше конкурирующих стилей, понятнее контракты и ниже когнитивная нагрузка.
Швейцарский нож предлагает инструмент почти на любой случай, но редко делает всё одинаково хорошо. Kora делает ставку на точечный набор инструментов, которые заточены под свои задачи.
Используйте только нужные вам модули, заменяйте или настраивайте их компоненты и добавляйте свои модули и интеграции через ту же явную модель приложения.
Kora сосредоточена на главном в промышленной серверной разработке и делает этот путь исключительно прямым, прозрачным и максимально эффективным.
Kora просто работает.
Просто. Прозрачно. Предсказуемо. Эффективно.
Такие же подходы делают Kora проще для разработки, отладки и поддержки инженерами: компоненты связываются явно, ошибки компилятор ловит как понятные сообщения вместо сюрпризов во время выполнения, а каждый сгенерированный класс читается как код, который инженер написал бы сам. Та же ясность делает Kora естественной и для разработки с участием нейро-агентов — ничего не скрыто за рефлексией, динамическими прокси или байт-кодом, поэтому нейро-агент может открыть сгенерированные исходники, проследить запрос от начала до конца и доверять увиденному так же легко, как человек.
Принцип STEP
Simple
Просто: меньше сложности.
Transparent
Прозрачно: явный, читаемый код.
Efficient
Эффективно: меньше накладных расходов.
Predictable
Предсказуемо: без скрытой магии.
Разработка Шаг за Шагом — для инженеров и нейро-агентов.
Учитесь на примерах
Документация без воды.
95%+ функциональности Kora описано в документации: пошаговых руководствах, справочниках по модулям и рабочих примерах. Не нужно угадывать, про какую версию ответила нейросеть, собирать ответы по десяткам вкладок и разрозненным обсуждениям на Stack Overflow. А официальный нейро-навык kora-skills делает работу с Kora еще проще для нейро-агентов.
95%+функциональности задокументировано
39+пошаговых руководств
35+справочников по модулям
▾ Посмотрите, как нейро-агент учит вас Kora▴ Скрыть демонстрацию
Учиться Kora сегодня можно просто: установите официальный навык kora-skills и задайте вопрос своему агенту — он сверяется с навыком и объясняет прямо по официальным руководствам и примерам.
claude code — learning-koraOpus 4.8
Контролируемый стек, по компоненту за раз.
Начинайте с малого, добавляйте только те интеграции, которые нужны сервису, и держите каждую зависимость под контролем.
Основы
Просто, легко, знакомо
Компоненты, внедрение через конструктор, модули, типизированная конфигурация и запуск приложения на привычных Java и Kotlin. Подход virtual-thread-first: прямой синхронный код без реактивных цепочек и колбэков.
Компилятор
Прозрачность, никакой магии во время выполнения
Связывание проверяется и генерируется во время компиляции, поэтому ошибки становятся понятными сообщениями компилятора, а не сюрпризами во время выполнения — явный типизированный код с быстрым циклом обратной связи как для инженеров, так и для нейросетей.
HTTP
Серверы, клиенты, OpenAPI
HTTP-серверы, декларативные клиенты, request mapping, interceptors, служебные эндпоинты и строго типизированная генерация OpenAPI. Spec-first подход: серверы и клиенты создаются из OpenAPI-контракта строго типизированным генератором с богатыми настройками.
Данные
Репозитории Kora
Единая модель репозиториев для JDBC и Cassandra: сгенерированные реализации, преобразования во время компиляции, макросы запросов и явный контроль над доступом к данным.
Интеграции
Kafka, gRPC, S3 и не только
Обмен сообщениями, RPC, хранилища, движки бизнес-процессов и инфраструктурные интеграции, построенные вокруг той же явной модели программирования.
AOP
Всё необходимое для промышленной разработки
Проверка данных, кэширование, отказоустойчивость, транзакции, планирование, безопасность и логирование генерируются во время компиляции без прокси-объектов времени выполнения.
Ops
Наблюдаемость из коробки
Метрики и трассировка OTel во всех модулях, структурированное логирование, распространение контекста, проверки работоспособности и корректное завершение встроены с самого начала.
Модули
Создана, чтобы расширяться
Почти любой компонент можно заменить, обернуть или дополнить и адаптировать поведение фреймворка через явный граф приложения, создаваемый во время компиляции.
HTTP
Серверы, клиенты, OpenAPI
Kora держит HTTP-контракты явными, сгенерированными и наблюдаемыми, не пряча обработку запросов за рефлексией во время выполнения.
Что вы получаете
Example.java
Легко понять, просто поддерживать
Стек, в котором легко разобраться.
Явный код, строгие типы, точная обратная связь компилятора и почти полное отсутствие магии — те же качества, что делают код понятным для новичка в команде, делают его посильным и для нейро-агента. Kora привносит эти качества в Java и Kotlin, поэтому разрабатывать сервисы становится удобнее как человеку, так и с помощью новых нейро-инструментов.
Узнать большеСвернуть
claude code — kora-shopOpus 4.8
Настоящий цикл итераций: агент пишет код, компилятор отвечает, агент исправляет и идёт дальше — большинство ошибок ловится ещё до запуска.
01
Быстрые и отзывчивые итерации
Kora позволяет очень быстро проверять каждое изменение на двух уровнях. Сначала внедрение зависимостей на этапе компиляции, обработчики аннотаций и типизация ловят структурные ошибки ещё при сборке. Затем благодаря очень быстрому старту контекста приложения можно дёшево и часто запускать полноценные компонентные и интеграционные тесты. Цикл остаётся коротким: изменил → скомпилировал → получил точные ошибки → поднял контекст → проверил реальное поведение → исправил. Чем короче такой цикл, тем быстрее новичок разбирается в проекте и тем эффективнее работает автономный агент.
02
Без магии в работе
Внедрение зависимостей, HTTP-обработчики, репозитории, AOP и остальная инфраструктура Kora превращаются в обычный код на Java и Kotlin. Сгенерированный исходный код можно открыть, прочитать и проследить реальный путь выполнения. Меньше рефлексии, динамических прокси и скрытого поведения — меньше того, что нужно держать в голове или угадывать нейросети. А поскольку весь путь прозрачен и ведёт напрямую, его легко проследить и отладить — можно просто попросить нейросеть объяснить, как отсюда работает вся цепочка, и она разберёт её по реальному коду.
03
Сквозная типизация
Java и Kotlin вместе с внедрением зависимостей на этапе компиляции дают чётко определённые внутренние контракты, а OpenAPI Generator в Kora распространяет этот подход и на внешнее API: строго типизированные серверные и клиентские API, модели, параметры, запросы и ответы. Ошибочное предположение скорее превратится в ошибку компиляции, чем в ошибку во время выполнения.
04
Явная архитектура
Конструкторы, интерфейсы, @Component, @Module и @KoraApp прямо в исходном коде описывают граф приложения. Проще увидеть, что от чего зависит, где создаётся компонент и какой контракт он реализует, — не восстанавливая в голове состояние контейнера во время выполнения.
05
Один понятный путь
Небольшой набор прямых и независимых абстракций сужает пространство возможных решений. Это одинаково важно и для новичка, и для нейросети: меньше шансов смешать разные поколения API, модели программирования и несовместимые подходы фреймворков.
06
Тонкие абстракции
Kora старается держаться близко к JDBC, Kafka, gRPC, HTTP и другим базовым технологиям, а не строить отдельный мир вокруг фреймворка. Это привычные большинству Java-разработчиков абстракции, которые годами работают в промышленной эксплуатации и знакомы всем. Поэтому почти всё, что вы — или модель — уже знаете о Java, Kotlin и стандартных технологиях, напрямую применимо к коду на Kora.
Явность, прозрачность, строгая типизация, точная обратная связь компилятора и минимум магии делают Kora понятной инженеру, который приходит в проект, и предсказуемой для его инструментов.
Быстрее всех стартует, быстрее всех работает.
Быстрая готовность помогает горизонтальному масштабированию лучше справляться с пиковой нагрузкой, а тонкий слой фреймворка до бизнес кода снижает стартовые просадки SLA во время развертываний. (Меньше значит лучше.)
Обслуживает трафик0.00sKora
0.00sSpring Heavy OptimizedПриложения Spring Boot, к которым применены максимально возможные Runtime + Compile Time оптимизации, включая использование плагина Spring AOT.
0.00sSpring Stock
10x PetClinic-сервисы с полным набором боевых интеграций в Docker-контейнере: 1 CPU, 1 GB памяти, запуск и готовность к обслуживанию.Среднее по 5 запускам на MacBook Pro 2019 Intel i7-9750H(схож с EPYC 7763 согласно GeekBench 5 Single-Core Benchmark).
RSS при готовности, MB (медиана)
0 MBKora
0 MBSpring Heavy OptimizedПриложения Spring Boot, к которым применены максимально возможные Runtime + Compile Time оптимизации, включая использование плагина Spring AOT.
0 MBSpring Stock
10x PetClinic-сервисы на JDK 25 с включёнными compact object headers. Медиана потребления резидентной памяти (RSS) при готовности к обслуживанию по 10 запускам. Меньше значит лучше.
Артефакт собран0.00sKora
0.00sSpring
0.00sSpring Heavy OptimizedПриложения Spring Boot, к которым применены максимально возможные Runtime + Compile Time оптимизации, включая использование плагина Spring AOT.
10x PetClinic-сервисов с полным набором боевых интеграций. Чистая сборка артефакта: ./gradlew clean distTar (Kora) / bootJar (Spring — послойный jar в Docker-образе), запуск с --no-build-cache, --no-configuration-cache, --no-parallel, -Dorg.gradle.daemon=false.Среднее по 5 запускам на MacBook Pro 2019 Intel i7-9750H(схож с EPYC 7763 согласно GeekBench 5 Single-Core Benchmark).
Артефакт собран0.00sKora
0.00sSpring
0.00sSpring Heavy OptimizedПриложения Spring Boot, к которым применены максимально возможные Runtime + Compile Time оптимизации, включая использование плагина Spring AOT.
10x PetClinic-сервисов с полным набором боевых интеграций. Инкрементальная сборка артефакта с включёнными кешами Gradle, конфигурационным кешем, демоном, параллельной и мультимодульной сборкой и инкрементальной компиляцией.Среднее по 5 запускам на MacBook Pro 2019 Intel i7-9750H(схож с EPYC 7763 согласно GeekBench 5 Single-Core Benchmark).
Почему быстрый старт и готовность реально экономят время и деньги▾
Время старта и выхода в готовность воспринимается как локальная эргономика разработчика. В масштабах парка сервисов это операционный драйвер затрат — и в выделяемой инфраструктуре, и во времени инженеров.
Задержка p95 во время плавного деплоя. Свежий экземпляр Kora выходит на установившуюся задержку почти сразу; более тяжёлый рантайм дольше удерживает повышенный хвост выше порога SLA, пока прогревается JIT.
Плавное автомасштабированиеГотовность за секунды позволяет горизонтальному автоскейлеру добавлять мощность в пределах всплеска нагрузки, а не держать статически переразмеренный базовый уровень.
Короче окна деплояКаждая замена в rolling-деплое быстрее выходит в готовность, сокращая интервал сниженной мощности и связанный с ним риск по error budget и SLA по всему парку.
Scale-to-zero и spotБыстрый холодный старт делает жизнеспособными scale-to-zero и прерываемые/spot-инстансы: мощность освобождается при простое и восстанавливается по требованию за секунды, переводя зарезервированную стоимость в оплату по факту использования.
Низконагруженные сервисыУ админок, внутренних инструментов и задач по расписанию расход определяется базовыми накладными расходами рантайма, а не нагрузкой запросами; тонкий рантайм снижает нижний порог памяти и CPU на экземпляр — сервис на Kora может работать всего на 0.1 vCPU, потенциально на 0.05 — высвобождая мощности по всему большому низконагруженному парку.
Обратная связь разработки и CIBlack-box и интеграционные тесты запускают всё приложение на каждом прогоне; меньшее время старта сокращает реальное время на итерацию и на стадию пайплайна, укорачивая цикл обратной связи — время инженеров здесь не просто дефицитный, но и самый дорогой ресурс.
Меньше влияние на SLAСвязывание во время компиляции, тонкие абстракции и отсутствие рефлексии в рантайме делают прогрев в разы меньше — не нулевым — поэтому новый экземпляр близок к установившейся пропускной способности с первых запросов, удерживая хвост p95–p98 при деплоях и масштабировании значительно ниже, чем у рантайма, зависящего от прогрева.
Цена на компиляции — выгода в рантаймеДа, генерация графа немного увеличивает время сборки. Но эта цена платится один раз при сборке — зато на старте сервиса не нужны ни сканирование, ни рефлексия, ни связывание зависимостей. Именно эта работа и обеспечивает быстрый параллельный старт, на который вы рассчитываете на каждом экземпляре, при каждом перезапуске и по всему парку сервисов.
Секунды на экземпляр × весь парк × каждый перезапуск → меньше машин, меньший счёт и более быстрый цикл. Kora строит граф во время компиляции, а на старте всё инициализируется максимально параллельно, насколько возможно, и имеет значительно меньший след прогрева.
База по Kora.
Базовые принципы инженерных решений Kora делают сервисы прозрачными, быстрыми на старте и простыми в поддержке.
01
Внедрение зависимостей во время компиляции
Контейнер зависимостей строится и проверяется во время компиляции из объявлений @KoraApp, @Component, @Module и подмодулей. Отсутствующие или неоднозначные зависимости становятся ошибкой еще до старта сервиса.
02
Сгенерированный исходный код вместо магии во время выполнения
Kora не использует Reflection API, динамические прокси и генерацию байткода во время выполнения для графа приложения. Вместо этого появляется читаемый исходный код, который может изучать, поддерживать, отлаживать и проверять человек или нейросеть
03
Точные и максимально производительные модули
Kora использует тщательно выбранные, быстрые и оптимизированные интеграции и просит включать только те модули, которые нужны сервису. Командам не нужно заранее исследовать, какой веб-сервер, HTTP-клиент, подход к базе данных, Redis-клиент или интеграцию с очередями сделать внутренним стандартом.
04
JVM-абстракции, которые выглядят знакомо
Kora использует нативные конструкции Java и Kotlin для объявления механизмов фреймворка и не заставляет разработчиков переходить на чужеродную модель программирования. HTTP-обработчики, слушатели Kafka, репозитории, интерфейсы конфигурации и аспекты выглядят естественно в языке, которым вы уже пользуетесь, а генерация во время компиляции забирает на себя повторяющуюся работу.
05
Выгрузите контекст из головы
Читаемые сгенерированные исходники, ошибки на этапе компиляции, сфокусированная документация и примеры упрощают погружение в проект. Новые разработчики могут посмотреть, что сделал фреймворк, быстро проверить поведение и попросить нейросеть пройтись по реальному коду вместо угадывания скрытого состояния во время выполнения.
06
Нет магии, нет разочарований
Фреймворки, завязанные на прокси, могут казаться простыми, пока поведение не начинает зависеть от скрытых правил прокси во время выполнения, самовызовов методов, рефлексии или контейнерных соглашений, которые меняются от версии к версии. Kora держит механизм прозрачным: сгенерированный код и документация хранят контекст, поэтому разработчикам не нужно заучивать фольклор вокруг аннотаций или держать невидимое состояние фреймворка в голове.
07
Высокопроизводительные оптимизации из коробки
Kora с первого запроса опирается на оптимизации для высоких нагрузок, проверенные в промышленной эксплуатации: быстрый запуск, явные графы зависимостей, сгенерированные адаптеры и легкие модульные интеграции. Разработчикам не нужно читать сотни статей, смотреть сотни докладов, тратить тысячи часов на замеры производительности внутренностей фреймворка или настраивать сам фреймворк перед выпуском. Это уже сделано внутри Kora. Просто начинайте писать сервисы.
08
Одна проблема, одно решение
Kora предпочитает одно рекомендуемое решение на базе лучших практик JVM вместо множества конкурирующих стилей внутри одного фреймворка. Команды тратят меньше времени на внутренние правила, доклады о правильном использовании и споры о том, какую абстракцию разрешить.
09
Без тайных знаний, Kora просто работает
Вам не нужно огромное сообщество, чтобы разобраться, как работает фреймворк. Не нужно искать ответы среди тысяч обсуждений, сверять противоречивые советы, смотреть десятки докладов или выяснять, почему реальное поведение отличается от документации. Kora просто работает. Документация соответствует реализации, примеры отражают реальные практики, сгенерированный код остаётся читаемым, а нейросеть может объяснить, что происходит внутри, потому что механизмы фреймворка открыты и прозрачны.
10
Простое и быстрое тестирование
Тестируйте сервис через тот же явный граф компонентов, который используется в промышленной эксплуатации. Подставляйте тестовые компоненты, заменяйте зависимости, переопределяйте конфигурацию, держите компонентные тесты быстрыми и добавляйте интеграционные тесты на Testcontainers там, где нужна реальная инфраструктура.
11
Создано с опытом промышленных высоконагруженных систем
Трассировка, метрики, структурированное логирование, проверки работоспособности, отказоустойчивость и корректное завершение для всех модулей спроектированы как возможности фреймворка, а не поздние надстройки. Эксплуатационный контракт остается видимым в сгенерированном и написанном вручную коде.
Соберите первый сервис на Kora.
Пройдите пошаговую настройку, используйте официальные примеры или сразу откройте документацию по модулям для стека, который вам уже нужен.