Открыть сервис

KJS

KJS — это интерпретатор и среда выполнения языка программирования JavaScript, написанный на языке C++ и распространяемый как часть проекта KDE (K Desktop Environment). KJS (KDE JavaScript) является компонентом библиотеки KHTML, на основе которой впоследствии был создан браузерный движок WebKit. Основное назначение KJS — обеспечение поддержки скриптов JavaScript в приложениях KDE, в первую очередь в веб-браузере Konqueror.

История

Разработка KJS началась в конце 1990-х годов в рамках проекта KDE. Изначально он создавался как JavaScript-движок для браузера Konqueror, который использовал рендеринговый движок KHTML. KJS был основан на исходном коде интерпретатора JavaScript из проекта KDE, который, в свою очередь, заимствовал некоторые идеи из ранних реализаций Netscape JavaScript.

В 2001 году компания Apple Inc. приняла решение использовать KHTML и KJS в качестве основы для своего нового браузера Safari. Для этого был создан форк KHTML, получивший название WebKit, а KJS стал основой для JavaScriptCore — движка JavaScript, используемого в WebKit. В ходе этого процесса KJS был значительно переработан: добавлена поддержка JIT-компиляции (Just-In-Time), улучшена производительность и расширена совместимость со стандартами ECMAScript.

Несмотря на то, что KJS утратил своё значение как основной JavaScript-движок для KDE (в более поздних версиях Konqueror используется более современный движок, основанный на V8 или JavaScriptCore), он продолжает существовать как часть библиотеки KDE Frameworks. В настоящее время KJS используется в основном для обеспечения базовой функциональности JavaScript в приложениях KDE, не требующих высокой производительности, таких как встроенные скрипты в KDE Plasma или в некоторых виджетах.

Архитектура и устройство

Компоненты

KJS состоит из нескольких ключевых компонентов:

  • Лексический анализатор (Lexer): разбивает исходный код JavaScript на токены (идентификаторы, ключевые слова, операторы, литералы).
  • Синтаксический анализатор (Parser): на основе токенов строит абстрактное синтаксическое дерево (AST), представляющее структуру программы.
  • Интерпретатор (Interpreter): выполняет код, обходя AST и выполняя соответствующие действия. KJS использует интерпретацию без JIT-компиляции, что делает его относительно медленным по сравнению с современными движками.
  • Сборщик мусора (Garbage Collector): управляет памятью, автоматически освобождая объекты, на которые больше нет ссылок. KJS использует простой алгоритм сборки мусора на основе подсчёта ссылок (reference counting).
  • Объектная модель: предоставляет встроенные объекты JavaScript (Array, Object, Function, String, Number, Boolean, Date, Math, RegExp, Error) и их методы.

Поддержка стандартов

KJS реализует спецификацию ECMAScript 3 (ES3), которая была официальным стандартом JavaScript до появления ES5. Это означает, что KJS не поддерживает многие современные возможности языка, такие как:

Из-за этого KJS не подходит для выполнения современного JavaScript-кода, написанного для веб-браузеров или Node.js.

Применение

В KDE

Основное применение KJS — обеспечение поддержки JavaScript в приложениях KDE. Он используется в:

  • Konqueror: исторически KJS был движком JavaScript для браузера Konqueror. В современных версиях Konqueror (начиная с KDE 4) используется более производительный движок, основанный на WebKit, однако KJS может использоваться для простых скриптов.
  • KDE Plasma: KJS используется для выполнения скриптов в виджетах и плазмоидах, написанных на JavaScript. Это позволяет пользователям создавать простые расширения для рабочего стола без необходимости изучения C++.
  • KDE Frameworks: KJS входит в состав библиотеки KDE Frameworks, предоставляя базовую функциональность JavaScript для других приложений KDE.

В других проектах

Благодаря своей простоте и небольшому размеру, KJS иногда используется в проектах, где требуется минимальная поддержка JavaScript без необходимости в высокой производительности. Например, он может применяться в:

  • Встраиваемых системах: где ресурсы (память, процессор) ограничены.
  • Образовательных проектах: для изучения основ работы интерпретаторов JavaScript.
  • Инструментах для тестирования: где требуется выполнение простых скриптов.

Ограничения и критика

KJS подвергается критике за:

  • Низкую производительность: из-за отсутствия JIT-компиляции и использования интерпретации AST, KJS значительно медленнее современных движков (V8, SpiderMonkey, JavaScriptCore).
  • Неполную поддержку стандартов: KJS реализует только ECMAScript 3, что делает его несовместимым с большинством современных веб-сайтов и приложений.
  • Устаревшую архитектуру: сборщик мусора на основе подсчёта ссылок неэффективен для циклических ссылок, что может приводить к утечкам памяти.
  • Отсутствие активной разработки: после того как WebKit ответвился от KHTML, развитие KJS практически остановилось. Новые возможности и исправления ошибок не добавляются.

Сравнение с другими движками

ХарактеристикаKJSV8 (Chrome, Node.js)SpiderMonkey (Firefox)JavaScriptCore (Safari)
Язык реализацииC++C++C++C++
JIT-компиляцияНетДа (TurboFan)Да (IonMonkey)Да (DFG, FTL)
Поддержка ES6+НетДаДаДа
Сборщик мусораПодсчёт ссылокMark-and-sweepGenerationalMark-and-sweep
ПроизводительностьНизкаяВысокаяВысокаяВысокая
ИспользованиеKDE, встраиваемые системыБраузеры, серверыБраузерыБраузеры, iOS

Интересные факты

  • KJS был одним из первых полностью свободных (open-source) JavaScript-движков, доступных для использования в открытых проектах.
  • Форк KJS, созданный Apple, стал основой для JavaScriptCore, который впоследствии был портирован на множество платформ, включая iOS, macOS и даже Windows.
  • Несмотря на устаревание, KJS продолжает поддерживаться в составе KDE Frameworks, что делает его одним из самых долгоживущих JavaScript-движков.

Источники

  • KDE Documentation: KJS JavaScript Engine
  • ECMAScript Language Specification (ECMA-262)
  • WebKit Project: History of WebKit
  • KDE Frameworks: KJS API Reference
  • Статья «KJS» в Wikipedia (английский язык)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →