Skip to content

Latest commit

 

History

History
162 lines (151 loc) · 18.1 KB

status.md

File metadata and controls

162 lines (151 loc) · 18.1 KB

OneScriptJS — статус (компактная сводка)

Движок OneScript (язык 1С/BSL), переписанный на TypeScript. Работает в Node и браузере. Оригинал (эталон) — reference/OneScript/ (C#), не коммитится.

Формат наших скриптов — .osjs (OneScriptJS, браузер). .os — чужой формат ванильного C#-OneScript для бэкенда: движок его исполняет (общая грамматика BSL, эталонный корпус — внутренний регресс), но не блокирует и не переименовывает. Решение и границы — specs/013-osjs-format/spec.md.

Состояние

  • Перенос по старому плану T1–T49 закрыт: язык, стандартная библиотека, браузерная интеграция (DOM, события, декларативные data-os-*), xUnit-раннер и прогон эталонных тестов.
  • pnpm typecheck ✓, pnpm test ✓ — 520 тестов (66 файлов Vitest).
  • Текущая ветка — master.
  • Прогон reference/OneScript/tests/*.os: 18/66 файлов проходят целиком; ошибка разбора осталась одна (annotations.os); events.os разбирается, но падает на ПодключитьСценарий (спека 004).
  • Старый docs/plan.md удалён: незавершённые работы вынесены в спецификации specs/; спеки 001, 008, 009, 010, 011, 012 и 013 реализованы, 002, 003, 005, 006, 007 — пока только spec.

Архитектура (слои)

src/lexer (токены) → src/parser (AST + препроцессор #) → src/runtime (values, scope+Ref, context, async (MaybePromise/drive/кванты), interpreter на генераторах с синхронным быстрым путём, enum, object, type, error-info, runner) → src/stdlib (global-context, collections, strings, math, bitwise, json, types, enums, format, tasks/фоновые задания) → src/browser/onescript.ts (<one-script>) и src/node/ (cli, context, files) → src/testing (xUnit-раннер).

Сборка: dist/onescript.js (браузер, IIFE), dist/node/index.{js,cjs,d.ts} (библиотека), dist/cli.mjs (CLI).

Что реализовано

  • Язык: переменные, если/иначеесли/иначе, циклы (Для/Пока/Для Каждого, Прервать/Продолжить), процедуры/функции (Знач/по ссылке), исключения, Перейти/метки, аннотации, тернарный ?(), Новый, препроцессор #.
  • Структура модуля: #Использовать → Перем → методы → исполняемый код; импорт после кода — ошибка. Локальные Перем — в начале метода; объявления после кода и вложенные методы — ошибка разбора (как в DefaultBslParser). Контекст операторов тоже проверяется: Возврат — только в методе (в функции со значением, в процедуре без), Прервать/Продолжить — только в цикле, ВызватьИсключение; — только в блоке Исключение.
  • Импорт файлов: #Использовать "<файл>" — модули-синглтоны с экспортными членами и классы (ПриСозданииОбъекта, Новый), кеш на run() и защита от циклов; Node читает через fs, браузер — через fetch по URL. Работает и из ЗагрузитьСценарийИзСтроки (относительно имени/текущего сценария).
  • Значения/типы: числа, строки, булево, даты, Null/Неопределено, Тип/ТипЗнч, перечисления (НаправлениеПоиска, СтатусСообщения, ХешФункция, ЦветКонсоли, КодировкаТекста, СпециальнаяПапка, ТипДиска, НаправлениеСортировки, СпособКодированияСтроки) и Символы.
  • Коллекции: Массив (многомерный), Структура, Соответствие (+ фиксированные), СписокЗначений, ТаблицаЗначений, ДеревоЗначений.
  • Двоичные данные: БуферДвоичныхДанных, ДвоичныеДанные (hex/Base64/строка, BOM).
  • Система: СистемнаяИнформация, УникальныйИдентификатор, переменные среды, ПустаяСтрока.
  • РегулярноеВыражение (совпадения/группы/имена в нумерации .NET).
  • ГенераторСлучайныхЧисел (диапазон uint32, воспроизводимость по seed).
  • Сценарии: ЗагрузитьСценарийИзСтроки, ЗагрузитьСценарий (файл, Node), ТекущийСценарий, СтартовыйСценарий (тип Сценарий).
  • Pow в decimal-точности 1С (29 значащих цифр для целой степени).
  • Валидация смещений ПобитовыйСдвиг*; методы тест-контекста (ПодробныеОписанияОшибок, ИмяВременногоФайла, ТестПровален, ПроверитьТип).
  • Динамическое исполнение: Выполнить (оператор) и Вычислить (функция) в текущей области видимости; 1/0 → «Деление на ноль»; переменная Для … По … после цикла = «по + 1»; НСтр извлекает язык из ru='…';en='…'.
  • BSL-события (спека 001): ДобавитьОбработчик/УдалитьОбработчик (+ AddHandler/ RemoveHandler), ВызватьСобытие/RaiseEvent, ЭтотОбъект/ThisObject; реестр подписок общий для исполнения, локальная и объектная формы обработчика, порядок подписки и дедупликация, диагностика «Ожидается имя события»/«Ожидается имя обработчика события»/«Метод объекта не обнаружен».
  • Браузер (Фаза 7): объект Документ, события DOM из BSL (Элемент.НаСобытие(Имя, Код), объект Событие), декларативные data-os-* — только в браузерной сборке, src/stdlib остаётся Node-совместимым.
  • Лексер: многострочные литералы с продолжением |.
  • stdlib: Сообщить (со статусом), строковые, математические, поразрядные (uint32), JSON, Формат (число/дата), файловые (Node: ЧтениеТекста/ЗаписьТекста/ОбъединитьПути), asserts (Ожидаем.Что(…).Равно(…) + сравнения/ЭтоНе/ИмеетДлину/Существует/Содержит), динамический Новый(Тип, …), двоичные данные (БуферДвоичныхДанных, ДвоичныеДанные, hex/Base64/строка).
  • Парсер: Перем a, b, c; (с Экспорт), пропущенные аргументы f(,23), конкатенация смежных строк "a" "b", ВызватьИсключение; (перевыброс), конец блока как терминатор оператора без ;, ключевые литералы как имена свойств (Структура.Истина), пустые операторы ;;.
  • Тестирование: xUnit-раннер runTests (ЮнитТестирование с Проверить*).
  • HTTP-клиент (спека 010): HTTPСоединение/HTTPConnection, HTTPЗапрос/HTTPRequest, HTTPОтвет/HTTPResponse с методами эталона (GET/POST/PUT/DELETE/PATCH/HEAD и произвольный метод), basic-auth, кодировки тела, gzip-нормализация. Вызовы синхронные: в браузере — синхронный XHR, в Node — дочерний процесс с fetch; прокси, SSL-сертификаты, файловое тело и потоки — вне scope.
  • Фоновые задания (спека 011): глобальное ФоновыеЗадания/BackgroundJobs (МенеджерФоновыхЗаданий), ФоновоеЗадание, перечисление СостояниеФоновогоЗадания, методы Выполнить/Очистить/ОжидатьВсе/ОжидатьЛюбое/ ОжидатьЗавершенияЗадач/ПолучитьФоновыеЗадания/ПолучитьТекущее, глобальная Приостановить/Sleep. Модель кооперативная: задания — логические потоки в одном JS-потоке с общим состоянием модуля; переключение в точках ожидания и по квантам (~10 мс), поэтому страница не блокируется. Настоящего параллелизма CPU, ТекущийПоток, БлокировкаРесурса и изоляции данных потоков нет (осознанное расхождение с эталонными потоками C#). Async-рантайм (генераторный интерпретатор с синхронным быстрым путём) стал фундаментом для Асинх/Ждать.
  • Асинхронные методы (спека 012): Асинх/Async перед Процедура/Функция, Ждать/Await и непрозрачное Обещание/Promise. Синтаксис/диагностика — из парсера эталона, семантика — 1C:Enterprise 8.3.18+: вызов async-функции/процедуры сразу возвращает Обещание, Ждать даёт результат или бросает ошибку в точке ожидания, повторное ожидание кэшируется, параметры — по значению, ошибки до первой приостановки сохраняются в Обещании, необработанные — уходят в console.error/stderr. Хост дожидается async-тела и всех Обещаний (flush). Осознанные расхождения: рантайм реализован (в эталоне только разбор); Ждать разрешён в теле модуля; async-процедура тоже возвращает Обещание.

Спецификации — работы в specs/

Спека Тема Состояние
001-bsl-event-handlers BSL-события: ДобавитьОбработчик/УдалитьОбработчик, ВызватьСобытие, ЭтотОбъект реализовано
002-nested-annotations Вложенные и именованные аннотации (парсер) spec
003-date-precision Точность и арифметика дат 1С (1/10000 с) spec
004-script-attach ПодключитьСценарий / ЗагрузитьСценарий из файла spec; ЗагрузитьСценарий (US3) реализован
005-system-settings config.os: ОбновитьНастройкиСистемы / ПолучитьЗначениеСистемнойНастройки spec
006-dynamic-names Разрешение имён в Выполнить/Вычислить («Неизвестный символ») spec
007-browser-playwright Приёмка в реальном браузере (Playwright) spec
008-use-directive #Использовать "<файл>": модули и классы из файлов реализовано
009-module-structure Порядок секций модуля и контекст операторов (паритет парсера) реализовано
010-http-client HTTP-клиент BSL: HTTPСоединение/HTTPЗапрос/HTTPОтвет реализовано
011-background-jobs Фоновые задания: ФоновыеЗадания, ФоновоеЗадание, Приостановить (кооперативная модель) реализовано
012-async-await Асинхронные методы: Асинх/Ждать, Обещание (поверх фоновых заданий) реализовано
013-osjs-format Формат .osjs — отделение от ванильного OneScript; .os — чужой формат, не блокируется реализовано

Для незавершённых спек следующий шаг — /speckit-plan или /speckit-tasks в её каталоге; реализованы 001, 008, 009, 010, 011, 012 и 013.

Следующая запланированная работа — редакторные инструменты для .osjs: подсветка, линтер/диагностика и language server (возможно, отдельный плагин VS Code). Анализ и план не начаты; заметка с контекстом договорённостей — в specs/013-osjs-format/spec.md (раздел «Следующая работа»).

Известные пробелы

  • annotations.os — после спеки 002 перестанет падать на разборе, но чтение аннотаций требует Рефлектор (вне scope 002).
  • events.os — требует 004 (ПодключитьСценарий, самоподключение файла): 8 сценариев событий уже воспроизведены в tests/events.test.ts (спека 001), полный прогон файла отложен до 004.
  • #Использовать (спека 008) импортирует только файлы: поиск библиотек по имени (lib.config, версии, OSCRIPT_LIB) не поддерживается; #Использовать asserts остаётся no-op. ЗагрузитьСценарийИзСтроки резолвит импорты (Node — с чтением с диска, браузер — только из предзагруженных источников).
  • eval.os: ТестДолжен_ПроверитьРаботоспособностьВПодключенныхСценариях требует #Использовать/библиотеки (спека 008 покрывает импорт файлов; поиск библиотек по имени остаётся вне scope), остальные — 004 (ЗагрузитьСценарий реализован) и Node-контекст (ОбъединитьПути).
  • date-behavior.os — заблокирован JSON/XML-подсистемами (ЗаписьJSON/ЧтениеJSON как объекты, XMLСтрока, ФорматДатыJSON), часовыми поясами и ЗначениеЗаполнено (вне 003).
  • Вне старого плана и спецификаций (нужны отдельные спеки): ТекстовыйДокумент, ЧасовойПояс, ХешированиеДанных, КвалификаторыЧисла/КвалификаторыСтроки, ЗначениеЗаполнено, ПолучитьИмяВременногоФайла; объектные ЗаписьJSON/ЧтениеJSON (сейчас функции с одним аргументом); Формат: ЧГ с кастомными размерами, ДП/ДД.
  • Процессы, COM, XML, прокси/SSL-сертификаты и файловые тела HTTP — вне scope первой очереди; HTTP-клиент реализован в спеке 010.
  • Асинхронность языка (Асинх/Ждать, Обещание) реализована (спека 012), но без отмены, таймаутов ожидания и КогдаВсе/КогдаЛюбой; async-конструкторы, async-обработчики событий с ожиданием, async-импорт модулей и async HTTP (fetch) — вне scope. Job, нацеленный на async-метод, получает Обещание как Результат и не ждёт его.
  • Фоновые задания: нет отмены, приоритетов и настоящего параллелизма; Приостановить и ожидания — единственные точки переключения основного скрипта; импортируемые модули рекомендуется держать синхронными; xUnit-раннер не поддерживает тесты с приостановкой (shortcut).