npm package: @moskva/runtime
Description: JavaScript-рантайм «Москва» с Java-подобной моделью выполнения: вызываемые Runnable-экземпляры, изоляция памяти и предсказуемая инициализация.
Latest version: 0.1.9

# Рантайм Москва

<p>
<!-- <img src="https://media-743523.gitlab.io/img/header-npm.jpg" alt="РАНТАЙМ МОСКВА NPM ПАКЕТ"> -->
<a href=https://рантайм.москва>
<img src="https://медиа.рантайм.москва/img/header_npm.jpg" alt="РАНТАЙМ МОСКВА - RUNTIME MOSKVA">
</a>
</p>

Этот рантайм предоставляет вызываемые экземпляры функциональных интерфейсов
`Выполнимый`. `Выполнимый` — это экземпляр класса, который можно вызывать как
функцию, аналогично лямбда-выражениям в Java.

```java
// java:
interface Выполнимый {
 void вып() {}
}
```

<!-- Любой интерфейс в Java с одной абстрактной функцией будет функциональным. -->

## Использование

Пример ниже показывает, что несмотря на то, что `выполнимый` является
экземпляром класса, его всё равно можно вызывать как функцию:

```js
var{Выполнимый}=require('@moskva/runtime')

var выполнимый=new class extends Выполнимый {
 конструктор(){
  this.тест=[new Date]
 }
 тест2(){
  return this.тест
 }
 вып(){
  console.log(' < Привет, выполнимый; тест =',this.тест2())
 }
}

console.log('вызов выполняемого:')
выполнимый()
```

```sh
создан новый функциональный [class Выполнимый]
вызов выполнимого:
 < Привет выполнимый; тест = [ 2026-01-28T02:20:37.339Z ]
```

### Назначение

Экземпляры стандартных, не-выполнимых классов нельзя вызывать. Такое поведение
доступно только при наследовании от `Выполнимый` и предназначено для эмуляции
функциональных интерфейсов Java, которые предполагают реализацию одного метода.

## Требования к реализации

* Метод `вып` **обязан** быть реализован. Он является точкой входа, которая
  вызывается при обращении к экземпляру как к функции.
* Реализация может получать доступ к дополнительным внутренним API через `this`.

## Правила инициализации

Поля экземпляра должны инициализироваться внутри `конструктор`-а.

Синтаксис полей класса не поддерживается. Реализация основана на Прокси, и
создание `Выполнимых` с инициализаторами полей приведёт к бесконечной рекурсии
при попытке вызвать конструктор для инициализации полей. В настоящее время не
существует безопасного способа перехватить или извлечь инициализаторы полей.

<!-- Пока не будет найдено жизнеспособное решение, это ограничение сохранится. -->

---

<details>

<summary>

# Runtime Moskva

This runtime provides callable instances of `Runnable` functional interfaces. A
`Runnable` is a class instance that can be invoked like a function. Read more >

</summary>

```js
interface IRunnable {
 run() {}
}
```
<!-- Instances are allocated memory and can request compute via the event loop. -->

## Usage

An example below shows that even though `runner` is an instance, it can still be
invoked as a function:

```js
var{Runnable}=require('@moskva/runtime')

var runner=new class extends Runnable {
 const(){
  this.test=[]
  this.test.push(new Date)
  // or this.test=['test']
 }
 test2(){
  return this.test
 }
 run(){
  console.log(' < Hello runner; test =',this.test2())
 }
}

console.log('calling runner:')
runner()
```

```sh
created new functional [class Runnable]
calling runner:
 < Hello runner; test = [ 2026-01-27T23:19:34.106Z ]
```

### Purpose

Since instances of standard, non-runnable classes cannot be invoked. This
behaviour is only available when extending `Runnable`, to enable emulation of
Java's functional interfaces that are supposed to implement 1 method.

## Implementation requirements

* The `run` method **must** be implemented. It is the entry point invoked when
  the instance is called.
* The implementation can access additional internal APIs via `this`.

## Initialisation rules

Instance fields must be initialised inside the `const` method.

Class field syntax is not supported. The implementation relies on a proxy, and
constructing a `Runnable` with field initialisers would cause infinite
recursion. There is currently no safe way to intercept or extract field
initialisers.

Unless a viable solution is found, this limitation will remain.

</details>


---

(c) 2026