FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

GitHub Viewer

# Developer Docs — архитектура и навигация по проекту OneScript (для новых контрибьюторов) Этот документ помогает быстро разобраться, что лежит в репозитории, зачем это нужно, как устроено внутри и как использовать. См. также: - [`README.md`](../README.md) — общее описание, установка, сборка, тесты; - [`docs/contexts.md`](contexts.md) — практическое руководство по добавлению BSL-контекстов и глобальных методов; - [`CODESTYLE.md`](../CODESTYLE.md) — требования к стилю кода на C#. ## 1. Картина целиком: из чего состоит OneScript OneScript — открытая реализация языка, совместимого с синтаксисом 1С/BSL, поверх .NET. В основе — стековая виртуальная машина. Проект включает реализацию компилятора, исполняющей среды, системы типов и стандартной библиотеки BSL. Поверх этого — инструменты (CLI, раннер), отладка (DAP), веб-обёртки и API для нативных расширений. Сценарии исполняются CLI `oscript` либо встраиваются в приложения через `HostedScript`. Слои (сверху вниз): - Приложения и инструменты: - `src/oscript` — консольный хост, основное приложение; - `src/VSCode.DebugAdapter` — адаптер DAP; - `src/OneScriptDocumenter` — генерация документации; - `src/TestApp`, `src/Component` — примеры использования. - Хостинг и сервисы: - `src/ScriptEngine.HostedScript`, - `src/OneScript.DebugServices`, - `src/OneScript.Web.Server`. - Рантайм (компиляция/исполнение, встроенные функции): - `src/ScriptEngine` — стековая ВМ; - `src/OneScript.Native` — нативный бэкенд (Expression Trees). - Ядро/язык: - `src/OneScript.Core` — типы/контексты, базовая инфраструктура для обоих рантаймов; - `src/OneScript.Language` — лексер/парсер/AST. - Стандартная библиотека языка BSL: - `src/OneScript.StandardLibrary` — стандартные прикладные классы (массивы, работа с файлами, сетью и пр.). - Интеграции: - `src/ScriptEngine.NativeApi` — мост к внешним компонентам на C++, совместимым с NativeApi 1С. - Инструмент генерации автодокументации `src/OneScriptDocumenter`. ## 2. Быстрый старт для контрибьютора - Где собирать: решение `src/1Script.sln`. - Целевой фреймворк: `net8.0` (см. `src/oscommon.targets`), `LangVersion 8.0`. - Входной CLI: `src/oscript` (консольное приложение для запуска `.os`-скриптов). - Запуск тестов: - модульные C#-тесты — проекты `src/Tests/*` (xUnit/NUnit); - приёмочные BSL-скрипты — каталог `tests/*.os`, запуск через `tests/run-bsl-tests.cmd`/`tests/run-bsl-tests.sh`. - Сценарий полной сборки и прогона тестов описан в [`README.md`](../README.md) и [`.github/copilot-instructions.md`](../.github/copilot-instructions.md). - Если добавляете новый контекст/тип — обычно правки в `OneScript.Core`/`ScriptEngine`/`StandardLibrary`, плюс модульные тесты. Подробности — в [`docs/contexts.md`](contexts.md). Соглашения: - Псевдонимы API двуязычные: `РусИмя`/`EngName` (см. атрибуты `ContextClass`/`ContextMethod`/`ContextProperty`). - Все ссылки в этом документе указываются относительно корня репозитория. ## 3. Обзор проектов (назначение, ключевые узлы) Ниже по каждому проекту — зачем он нужен, где искать основную логику и какие классы отвечают за ключевые задачи. ### 3.1. OneScript.Language — лексер/препроцессор/парсер/AST Назначение: преобразует исходный BSL-код в токены и синтаксическое дерево, обрабатывает директивы препроцессора. Проект сделан максимально независимым и отчуждаемым: его можно использовать в других решениях, не связанных с 1Script, как просто парсер BSL. - Где в коде (пути относительно `src/OneScript.Language/`): - `LexicalAnalysis/*` — лексер. `DefaultLexer.cs`, различные состояния (`String`/`Number`/`Comment`/`PreprocessorDirective`/etc). - `SyntaxAnalysis/*` — парсер и AST: `DefaultBslParser.cs`, `BslSyntaxWalker.cs`, `AstNodes/*` (`ModuleNode`, `MethodNode`, `CallNode`, `TryExceptNode`, `*LoopNode`, `BinaryOperationNode`/`UnaryOperationNode` и др.). - Препроцессор (в `SyntaxAnalysis/`): `PreprocessingLexer.cs`, `PreprocessorHandlers.cs`, `RegionDirectiveHandler.cs`, `ImportDirectivesHandler.cs`, `ModuleAnnotationDirectiveHandler.cs`. - Диагностика: `CodeError.cs`, `ErrorPositionInfo.cs`, `SyntaxErrorException.cs` (в корне проекта) и `SyntaxAnalysis/LocalizedErrors.cs`. - Жизненный цикл: 1. Лексер производит `Lexem` с типом/токеном. 2. Препроцессор обрабатывает директивы (`#Если`/`#Область`/`#Использовать`). 3. Парсер строит AST (`BslSyntaxNode`), восстанавливается после ошибок (`IErrorRecoveryStrategy`). 4. AST передаётся компилятору (`CompilerFrontend`) рантайма. - Точки расширения: - собственные директивы препроцессора (`IDirectiveHandler` → зарегистрировать в DI); - обход AST через `BslSyntaxWalker`. На выходе вы получаете `ModuleNode`/AST, пригодный для компиляции рантаймом/бэкендом или для обработки статическим анализатором. ### 3.2. OneScript.Core — система типов, значения, отражение контекстов Назначение: общий объектный каркас значений BSL, контекстов (объекты/методы/свойства), аннотаций и исключений. Содержит базовые `IValue`/`BslValue`, ссылки на значения, метаданные контекстов (классов/методов/свойств), атрибуты, исключения, символы компилятора. - Где в коде: - `Values/*` — `BslValue` и производные: строки/числа/дата/`Null`/`Undefined`/`Type`/`Object`, сравнения/преобразования; ссылки: `IValueReference`/`Variable`/`PropertyValueReference`/`IndexedValueReference`. - `Contexts/*` — атрибуты `ContextClass`/`ContextMethod`/`ContextProperty`, `GlobalContextAttribute`, `ScriptConstructorAttribute`; построители `Bsl*Info`, отражение классов, поддержка устаревания (`ISupportsDeprecation`, `DeprecatedNameAttribute`). - `Compilation/Binding/*` — `SymbolTable`, `SymbolScope`, `SymbolBinding`, `*Symbol`-интерфейсы. - `Exceptions/*` — `RuntimeException`, `TypeConversionException`, `PropertyAccessException` и др. - Жизненный цикл контекстов: 1. `ContextDiscoverer` (в `ScriptEngine.Machine.Contexts`) сканирует сборки, находит `[ContextClass]`/`[GlobalContext]`/`[EnumerationType]`/`[SystemEnum]`. 2. Регистрирует типы/глобальные контексты в `IRuntimeEnvironment`/`IGlobalsManager`. 3. Отражение формирует `Bsl*Info` для рантайма/документации. ### 3.3. ScriptEngine — движок выполнения (стековая ВМ и бэкенд компилятора для стековой машины) Основная среда исполнения на базе стековой виртуальной машины. Назначение: организует выполнение скриптов, стек вызовов, области видимости, глобальные функции и интеграцию с отладкой. - Где в коде (пути относительно `src/ScriptEngine/`): - `Compiler/*` — `CompilerFrontend`, `CompilerBackendSelector`, `StackMachineCodeGenerator` (байткод), `EvalCompiler`, `CodeGenerationFlags`. - `Machine/*` — `StackMachineExecutor`, `MachineInstance` (командный цикл, стек/кадры/исключения/итераторы), `ExecutionContext`/`ExecutionFrame`, `BuiltinFunctions`, `ValueFactory`, `GlobalInstancesManager`. `CodeStat/*` — статистика покрытия кода. - `Hosting/*` — `DefaultEngineBuilder`, DI (`TinyIoC`), `EngineBuilderExtensions` (регистрация сервисов, предобработчики). - `ScriptingEngine.cs` — фасад движка: загрузка сборок, `Initialize`, `NewProcess`, компиляция. - `ContextValuesMarshaller` — преобразователь типов C# в типы BSL и обратно. - Точки расширения: - дополнительные `IExecutorProvider` (альтернативные рантаймы); - предопределённые интерфейсы/итераторы (`Interfaces`/`Iterables` handlers); - сбор статистики покрытия (`ICodeStatCollector`). ### 3.4. OneScript.Native — нативный бэкенд (Expression Trees) — компилятор/исполнитель и встроенные функции Альтернативная среда исполнения (не основная). Предоставляет компиляцию BSL в Expression Trees фреймворка .NET. Имеет ряд ограничений и в целом является экспериментом. В какой именно среде будет исполнен скрипт, решает директива в начале скрипта: - `#native` — скрипт будет скомпилирован в Native Runtime; - `#stack` или отсутствие директивы — скрипт будет исполнен основной стековой средой. Назначение: преобразует AST + символы в исполняемую форму и предоставляет нативный бэкенд выполнения, включая встроенные функции. - Компиляция: `Compiler/` - `ModuleCompiler.cs`, `MethodCompiler.cs` — генерация модулей/методов. - `ExpressionTreeGeneratorBase.cs`, `BinaryOperationCompiler.cs` — выражения/операции. - `BuiltInFunctionsCache.cs`, `ContextMethodsCache.cs` — кеширование метаданных/встроенных функций. - Исполнение: `Runtime/` - `NativeExecutorProvider.cs` — провайдер исполнителя. - `BuiltInFunctions.cs` — реализации встроенных функций. - `DynamicOperations.cs` — динамические операции. Ограничения: может не поддерживать полный паритет со стековой машиной. Выбор режима делает `CompilerBackendSelector` по соответствующим директивам в начале файла. ### 3.5. ScriptEngine.HostedScript — хостинг, загрузка библиотек, конфигурация Назначение: безопасная обвязка движка для встраивания, инициализация стандартного глобального контекста, загрузка библиотек, конфигурирование. - Где в коде: - `HostedScriptEngine.cs` — инициализация, глобальные контексты (`SystemGlobalContext`, `DynamicLoadingFunctions`), создание процессов. - `LibraryLoader.cs` — `package-loader.os`, подключение `.os`-модулей/классов/макетов; `FileSystemDependencyResolver.cs` — поиск библиотек, цикл обработки, защита от циклических зависимостей. - `Extensions/EngineBuilderExtensions.cs` — `UseSystemConfigFile`/`UseEnvironmentVariableConfig`/`UseEntrypointConfigFile`; `UseImports`/`UseFileSystemLibraries`/`UseNativeRuntime`/`UseEventHandlers`. - Жизненный цикл: 1. Читает настройки из системного `oscript.cfg`, файла `oscript.cfg` рядом с entrypoint и переменной окружения `OSCRIPT_CONFIG` (в порядке возрастания приоритета — переменная окружения перезаписывает все предыдущие настройки). 2. Инициализация `HostedScriptEngine` → глобальные объекты → процесс → компиляция/исполнение модуля. 3. Загрузка библиотек: дефолтный или кастомный `package-loader.os`, последующая регистрация символов и компиляция отложенных модулей. ### 3.6. OneScript.StandardLibrary — стандартная библиотека Назначение: коллекции, файлы/потоки, текст и кодировки, сеть/HTTP, JSON/XML, ZIP, процессы, таймзоны и др. - Коллекции: `Collections/` - `ArrayImpl.cs`, `MapImpl.cs`, `StructureImpl.cs`, `ValueList/ValueListImpl.cs`. - Таблицы/деревья значений: `ValueTable/ValueTable.cs` (+ `ValueTableColumn.cs`/`ValueTableRow.cs`), `ValueTree/ValueTree.cs`. - Файлы/потоки/текст: `FileOperations.cs`, `FileContext.cs`, `Text/*` (`TextReadImpl.cs`, `TextWriteImpl.cs`), `CustomLineFeedStreamReader.cs`. - Сеть/HTTP: `Http/*` (`HttpRequestContext.cs`, `HttpResponseContext.cs`, `HttpRequestBody*`, `InternetProxyContext.cs`). - JSON: `Json/*` (`JSONReader.cs`, `JSONWriter.cs`, `JSONDataExtractor.cs`, `JSONWriterSettings.cs`). - XML/XSLT: `Xml/*` (`XmlReaderImpl.cs`, `XmlWriterImpl.cs`, `XSLTransform.cs`). - ZIP: `Zip/*` (`ZipReader.cs`, `ZipWriter.cs` и перечисления параметров). - Процессы: `Processes/*` (`ProcessContext.cs`, `GlobalProcessesFunctions.cs`). - `StandardGlobalContext.cs` — набор полезных глобальных функций/свойств (например, `Символы`, `Приостановить`/`Sleep`, `ЗначениеЗаполнено` и т.п.). - Разное: `RandomNumberGenerator.cs`, `StringOperations.cs`, `Timezones/*`. ### 3.7. OneScript.Web.Server — веб-обёртки для BSL (ASP.NET Core) Назначение: адаптеры поверх ASP.NET Core API, чтобы работать с HTTP/WebSocket из BSL. - `WebServer.cs` — базовая обвязка. - `Http*Wrapper.cs` — `HttpContext`/`Request`/`Response`/`Cookies`. - `WebSockets/*` — `WebSocketWrapper`, `WebSocketsManagerWrapper`. ### 3.8. Отладка: OneScript.DebugProtocol, OneScript.DebugServices, VSCode.DebugAdapter - Протокол (`OneScript.DebugProtocol`): - `TcpServer/*` (`DefaultMessageServer.cs`, `JsonDtoChannel.cs`, `DispatchingServer.cs`) — транспорт и сериализация. - Модель отладки: `Breakpoint.cs`, `StackFrame.cs`, `Variable.cs`, `DebuggerSettings.cs`. - Сервисы (`OneScript.DebugServices`): - `DefaultDebugger.cs`, `DefaultBreakpointManager.cs`, `DefaultVariableVisualizer.cs` — серверные сервисы отладки и визуализации переменных. - `ThreadManager.cs`, `TcpDebugServer.cs` — управление потоками и TCP-сервер. - Адаптер для VS Code (`VSCode.DebugAdapter`): - `DebugSession.cs`, `OscriptDebugSession.cs` — основная сессия и проксирование событий. - `ServerProcess.cs`, `DebugeeProcess.cs` — управление процессом отлаживаемого приложения. ### 3.9. Приложения/утилиты - `oscript` (CLI): `src/oscript` - `Program.cs` — входная точка. - `ConsoleHostBuilder.cs` — сборка консольного хоста. - Поведения (режимы): `ExecuteScriptBehavior.cs`, `CheckSyntaxBehavior.cs`, `ShowVersionBehavior.cs`, `DebugBehavior.cs` и др. - `StandaloneRunner` — сборка самодостаточных пакетов/запуск: - `Program.cs`, `ProcessLoader.cs`, `StandaloneApplicationHost.cs`, `StandaloneProcess.cs`, `StandaloneTemplateFactory.cs`. - `OneScriptDocumenter` — генерация документации по сборкам: - на вход получает список DLL (рядом должны лежать xml-docs от этих dll) и файл оглавления (готовый `OneScriptDocumenter/default_toc.json` лежит в репозитории); - на выходе формирует файл документации в формате JSON и/или каталог с документацией в формате Markdown. - Примеры/демо: - `Component` — простая .NET-библиотека/компонент и примеры использования. - `TestApp` — WPF-приложение-песочница (подсветка синтаксиса, запуск модулей). ### 3.10. ScriptEngine.NativeApi — C++ API для нативных расширений - Основные файлы: `NativeApiProxy.cpp`, `NativeInterface.cpp`, `include/*` (`AddInDefBase.h`, `ComponentBase.h` и др.). - Задача: писать нативные аддины, видимые в BSL как объекты/контексты. ## 4. Как компоненты связаны между собой (словесная диаграмма) - `OneScript.Language` → даёт AST и ошибки компиляции. - `OneScript.Core` → базовые типы/контексты; используется в `OneScript.Native`, `ScriptEngine`, `OneScript.StandardLibrary`. - `OneScript.Native` → компилирует и исполняет, опирается на `OneScript.Language`/`OneScript.Core`. - `ScriptEngine` → организует выполнение (стековая ВМ), использует `OneScript.Native` и `OneScript.Core`. - `ScriptEngine.HostedScript` → высокий уровень хостинга поверх `ScriptEngine`. - `OneScript.StandardLibrary` → реализована на `OneScript.Core`/`ScriptEngine`. - `OneScript.DebugProtocol`/`OneScript.DebugServices` ↔ `ScriptEngine` — обмен данными отладки; `VSCode.DebugAdapter` ↔ `OneScript.DebugServices`. - `OneScript.Web.Server` ↔ ASP.NET Core API — обёртки для работы из BSL. - `oscript`/`StandaloneRunner`/`OneScriptDocumenter`/`TestApp`/`Component` — надстройки поверх ядра/рантайма. - `ScriptEngine.NativeApi` ↔ `ScriptEngine`/`OneScript.Core` — нативные расширения. ## 5. Типичные сценарии доработок (куда лезть) - Добавить объект/контекст с методами: `OneScript.Core/Contexts/*` (атрибуты `Context*Attribute`); подробности и шаблоны — в [`docs/contexts.md`](contexts.md). - Добавить функцию в стандартную библиотеку: соответствующий раздел `OneScript.StandardLibrary` (например, `Json/` или `Collections/`), плюс экспорт в общий контекст (`StandardGlobalContext.cs` или `SymbolsContext.cs`, если нужно). - Встроенная функция языка/операция: `OneScript.Native/Runtime/BuiltInFunctions.cs` и/или `Compiler/*`, при необходимости — поддержка в `ScriptEngine/Machine`. - Отладка: `OneScript.DebugServices`/`OneScript.DebugProtocol` — добавление/изменение событий или представления переменных; `VSCode.DebugAdapter` — проксирование. ## 6. Навигация по тестам - C#-тесты: `src/Tests/*`: - Язык: `src/Tests/OneScript.Language.Tests/*` (лексер/парсер/препроцессор). - Ядро/типы/контексты: `src/Tests/OneScript.Core.Tests/*`. - Динамика/нативный рантайм: `src/Tests/OneScript.Dynamic.Tests/*`. - Стандартная библиотека: `src/Tests/OneScript.StandardLibrary.Tests/*`. - Документатор: `src/Tests/DocumenterTests/*`. - Отладчик: `src/Tests/VSCode.DebugAdapter.Tests/`, `src/Tests/OneScript.DebugProtocol.Test/`. - Скриптовые тесты: `tests/*.os` — поведенческие сценарии языка и стандартной библиотеки. Запускаются скриптами `tests/run-bsl-tests.cmd`/`tests/run-bsl-tests.sh` через свежесобранный `oscript` (см. [`README.md`](../README.md), раздел «Тестирование»).

Back | FazBrowse Home | New Git URL