Запрос «что такое kmp» чаще всего приводит к двум разным ответам: это либо Kotlin Multiplatform — технология кроссплатформенной разработки от JetBrains, либо алгоритм Кнута — Морриса — Пратта для поиска подстроки в строке. Оба значения относятся к программированию, но решают совершенно разные задачи, и путать их нельзя.
В этой статье разберём оба значения аббревиатуры, но основной фокус — на Kotlin Multiplatform, поскольку именно эта технология чаще всего подразумевается в контексте разработки приложений для Android, iOS, десктопа и веба. Вы узнаете, как устроен KMP, чем он отличается от Flutter и React Native, и в каких случаях его внедрение оправдано.
Что такое Kotlin Multiplatform (KMP)
Kotlin Multiplatform — это технология от компании JetBrains, позволяющая писать общий код на языке Kotlin и использовать его сразу на нескольких платформах: Android, iOS, desktop (Windows, macOS, Linux), веб и серверной части. Ключевая идея — не «написать один раз, запустить везде», а переиспользовать бизнес-логику, оставляя нативный UI на каждой платформе.
Это принципиальное отличие от классических кроссплатформенных фреймворков. KMP не навязывает собственный движок отрисовки интерфейса: экраны можно делать нативно — через Jetpack Compose на Android и SwiftUI на iOS, а общей оставить только логику: сетевые запросы, работу с базой данных, валидацию, модели данных.
Общий код компилируется в платформенные форматы: для Android — в JVM-байткод, для iOS — в нативный фреймворк через Kotlin/Native, для веба — в JavaScript или WebAssembly. Таким образом, производительность общей части близка к нативной.
Как устроена архитектура KMP-проекта
Проект на KMP делится на так называемые source sets — наборы исходного кода. Есть общий модуль commonMain, где лежит платформенно-независимая логика, и платформенные модули: androidMain, iosMain и другие. В них размещается код, специфичный для конкретной системы.
Когда в общем коде нужен доступ к платформенной возможности (например, к файловой системе или настройкам), используется механизм expect/actual: в общем модуле объявляется ожидание (expect), а в каждом платформенном — его реализация (actual).
// commonMain
expect fun getPlatformName(): String
// androidMain
actual fun getPlatformName(): String = "Android"
Такой подход позволяет гибко дозировать долю общего кода: в одних проектах это только сетевой слой, в других — почти всё приложение, включая ViewModel и навигацию.
Где применяется KMP на практике
Технология особенно востребована в командах, где уже есть Android-разработчики на Kotlin и нужно выйти на iOS без полного дублирования логики. Общими обычно делают следующие части приложения:
- 🌐 Сетевой слой — запросы к API, сериализация JSON, обработка ошибок (часто на базе Ktor).
- 💾 Работа с данными — кэш и локальная база (например, через SQLDelight).
- 🧮 Бизнес-логика — расчёты, валидация форм, правила предметной области.
- 🧭 ViewModel и состояние экранов — при использовании подходящих архитектурных библиотек.
Известно, что KMP применяют или применяли в своих продуктах крупные компании — среди публично упоминаемых примеров встречаются Netflix, Philips, McDonald's и другие. Публичные кейсы и актуальный статус технологии стоит проверять в официальной документации JetBrains, так как экосистема активно развивается.
KMP не заменяет нативную разработку полностью — он сокращает дублирование логики между платформами, сохраняя нативный UI и производительность.
Сравнение KMP с другими кроссплатформенными решениями
Чтобы понять место KMP среди альтернатив, сравним его с популярными фреймворками по ключевым критериям.
| Критерий | KMP | Flutter | React Native |
|---|---|---|---|
| Язык | Kotlin | Dart | JavaScript/TypeScript |
| UI | Нативный или Compose Multiplatform | Собственный движок отрисовки | Нативные компоненты через мост |
| Доля общего кода | Гибкая, от сетевого слоя до почти всего приложения | Обычно почти всё приложение | Обычно большая часть |
| Доступ к платформенным API | Прямой, без мостов | Через platform channels | Через нативные модули |
| Порог входа для Android-разработчика | Низкий | Средний (новый язык) | Средний (новый стек) |
Главное преимущество KMP — постепенное внедрение. Технологию можно добавить в существующее нативное приложение по частям, не переписывая его целиком. С Flutter или React Native такой поэтапный путь, как правило, сложнее.
⚠️ Внимание: экосистема KMP и Compose Multiplatform быстро меняется. Статус стабильности отдельных целевых платформ (iOS, web, desktop) различается от версии к версии — перед стартом проекта проверяйте актуальную информацию в официальной документации JetBrains, а не в статьях двухлетней давности.
Слабые стороны и ограничения
Честный разбор невозможен без минусов. Во-первых, для полноценной работы с KMP в команде нужны специалисты, понимающие обе платформы: общий код пишется на Kotlin, но интеграция с iOS требует знания Xcode, Swift и особенностей сборки под Apple-платформы.
Во-вторых, инструментарий для iOS-разработчиков исторически был менее привычным: отладка общего кода из Xcode и настройка сборки могут вызывать сложности у команд без опыта. Ситуация улучшается с каждым релизом, но полностью «бесшовной» её назвать нельзя.
- 🧩 Меньше готовых библиотек по сравнению со зрелыми нативными экосистемами.
- ⏱️ Время сборки iOS-части может быть заметным на больших проектах.
- 👥 Нужен обмен знаниями между Android- и iOS-командами, иначе общий код становится «чужим» для половины разработчиков.
Начинайте внедрение KMP с небольшого изолированного модуля — например, сетевого слоя или парсинга моделей. Это позволит оценить технологию на реальном проекте без риска для всего приложения.
Как начать работу с KMP: первые шаги
Для старта понадобится Android Studio с плагином Kotlin Multiplatform — он позволяет создать шаблонный проект с готовой структурой общего и платформенных модулей. Для сборки и запуска iOS-части потребуется macOS с установленным Xcode.
Вам нужно пройти примерно такой путь: создать проект из шаблона, запустить Android- и iOS-версии, затем вынести первый кусок логики (например, запрос к API) в общий модуль и убедиться, что обе платформы получают одинаковый результат. Точные названия шаблонов и пункты мастера создания проекта могут отличаться между версиями IDE — сверяйтесь с официальным руководством JetBrains.
☑️ Чек-лист перед стартом KMP-проекта
⚠️ Внимание: не переносите в общий код всё подряд на старте. UI-специфичные вещи, работа с разрешениями, push-уведомления и платформенные API всё равно потребуют нативных реализаций через expect/actual — чрезмерное обобщение усложнит проект.
Второе значение: алгоритм Кнута — Морриса — Пратта
Если вы встретили аббревиатуру KMP в контексте алгоритмов и структур данных, речь идёт об алгоритме Кнута — Морриса — Пратта — классическом методе поиска подстроки в строке. Он назван по фамилиям трёх учёных: Дональда Кнута, Джеймса Морриса и Вона Пратта.
Суть алгоритма — избежать лишних сравнений символов. При несовпадении он не возвращается назад по тексту, а использует предварительно построенную префикс-функцию для искомого образца, чтобы сдвинуть его сразу на максимально возможную позицию. Благодаря этому время работы линейно зависит от суммы длин строки и образца, что делает KMP эффективнее наивного перебора на больших данных.
Алгоритм изучают в университетских курсах, применяют в задачах обработки текста и часто спрашивают на технических собеседованиях. Если ваша цель — именно алгоритм, ищите материалы по запросу «префикс-функция» и «алгоритм KMP поиск подстроки».
Как понять, какое значение KMP имеется в виду?
Смотрите на контекст. Если рядом слова «Android», «iOS», «общий код», «JetBrains», «Compose» — это Kotlin Multiplatform. Если «подстрока», «префикс-функция», «сложность O(n)», «собеседование» — это алгоритм Кнута—Морриса—Пратта.
Часто задаваемые вопросы
KMP — это фреймворк или язык?
Ни то, ни другое. Kotlin Multiplatform — это возможность языка Kotlin и его инфраструктуры компилировать общий код под разные платформы. Поверх неё существуют библиотеки и фреймворки (например, Compose Multiplatform для UI), но сам KMP — это технология компиляции и организации кода.
Можно ли на KMP написать UI для iOS?
Да, есть два пути: классический — нативный интерфейс на SwiftUI поверх общей логики, и Compose Multiplatform, который позволяет писать общий UI на Kotlin. Второй подход развивается, и его стабильность для iOS следует уточнять в актуальной документации JetBrains на момент старта проекта.
Чем KMP отличается от Flutter?
Flutter — самодостаточный фреймворк со своим движком отрисовки UI и языком Dart. KMP — надстройка над Kotlin, которая делит между платформами только логику, оставляя нативный интерфейс. KMP проще внедрять постепенно в существующие нативные приложения, Flutter чаще выбирают для проектов «с нуля» с единым UI.
Подходит ли KMP для небольших проектов и стартапов?
Зависит от команды. Если в ней уже есть Kotlin-разработчики и планируются минимум две платформы, KMP может сократить дублирование кода. Если команда маленькая и не знакома с Kotlin, освоение технологии и поддержка двух нативных UI может оказаться дороже, чем выигрыш от общей логики.
Какое отношение KMP имеет к алгоритму поиска подстроки?
Только общую аббревиатуру. Алгоритм Кнута — Морриса — Пратта и Kotlin Multiplatform — не связанные между собой вещи из разных областей: первый — теория алгоритмов, второй — инженерная технология кроссплатформенной разработки.