Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
9d2ddf6
Initial plan for issue
Copilot Jun 19, 2025
75adaad
Implement basic script caching infrastructure
Copilot Jun 19, 2025
ebdb5da
Complete script caching infrastructure with tests and documentation
Copilot Jun 19, 2025
faa57af
Enhance cache integration with library loading and add documentation
Copilot Jun 19, 2025
6b63e42
Implement full script module serialization/deserialization for caching
Copilot Jun 19, 2025
11f4159
Migrate script serialization from BinaryFormatter to MessagePack
Copilot Jun 19, 2025
b78523a
Fix error handling, configuration, and logging in script caching
Copilot Jun 19, 2025
4eb499d
Enhance method serialization to support MachineMethodInfo structures
Copilot Jun 19, 2025
256893f
Remove redundant checks and implement IoC for cache service
Copilot Jun 19, 2025
cecf707
Address code review feedback: rename config, remove builders, add exc…
Copilot Jun 19, 2025
57f5cc5
Address final code review comments: remove fallback, fix redundant ch…
Copilot Jun 19, 2025
01885f3
Merge upstream develop branch to resolve conflicts
Copilot Jun 19, 2025
c89c18b
Fix failing ScriptCacheServiceTests by adding proper mock setup
Copilot Jun 19, 2025
72fb882
Temporarily disable script caching by default to fix Windows build
Copilot Jun 19, 2025
1078f1b
Fix boolean constant deserialization to handle localized values
Copilot Jun 19, 2025
be42206
Fix compilation errors in boolean and numeric constant deserialization
Copilot Jun 19, 2025
67bb1cb
Enable script caching by default in configuration
Copilot Jun 19, 2025
05c04c9
Fix build issues and CodeRabbit AI concerns - disable caching by defa…
Copilot Jun 19, 2025
712f238
Re-enable script caching by default as requested
Copilot Jun 19, 2025
1a6c1cf
Fix Windows path resolution issue in cached module loading
Copilot Jun 19, 2025
1bab56e
Debug script caching path resolution issue - discovered root cause no…
Copilot Jun 25, 2025
60c1c57
Add oscript_modules directory with package-loader.os for system libra…
Copilot Jun 25, 2025
59251a7
Add comprehensive debug logging for script caching operations
Copilot Jun 25, 2025
1c94e05
Fix library loading issue by diagnosing missing package-loader.os
Copilot Jun 25, 2025
00cf2d6
Fix BslScriptMethodInfo deserialization in caching - add protected co…
Copilot Jun 27, 2025
d0a3e8a
Create copilot-setup-steps.yml
nixel2007 Jun 27, 2025
c860dca
Update copilot-setup-steps.yml
nixel2007 Jun 27, 2025
ded0476
Update copilot-setup-steps.yml
nixel2007 Jun 27, 2025
ff9fe1e
Create copilot-instructions.md
nixel2007 Jun 27, 2025
56d4736
Add test result files for comprehensive build and test validation
Copilot Jun 27, 2025
2a98135
Update copilot-setup-steps.yml
nixel2007 Jun 27, 2025
9610c78
Update copilot-setup-steps.yml
nixel2007 Jun 27, 2025
e319faa
Update copilot-instructions.md
nixel2007 Jun 28, 2025
57ae651
Fix Build.csproj to exclude TestApp and NativeApi from Linux builds
Copilot Jun 28, 2025
5c02c58
Fix script cache deserialization index out of range issues
Copilot Jun 28, 2025
1b80a11
Remove manual cache service setup from AttachedScriptsFactory to fix …
Copilot Jun 28, 2025
a1ba5ce
Remove committed test result files and add them to .gitignore
Copilot Jun 28, 2025
6074475
Удалил кеши, добавленные копилотом
EvilBeaver Jul 9, 2025
f6a5ad6
Рефакторинг после копилота
EvilBeaver Jul 9, 2025
264a48d
Initial plan for issue
Copilot Jun 19, 2025
853aaa2
Implement basic script caching infrastructure
Copilot Jun 19, 2025
cf0eb06
Complete script caching infrastructure with tests and documentation
Copilot Jun 19, 2025
2d72695
Enhance cache integration with library loading and add documentation
Copilot Jun 19, 2025
cf0f1f9
Implement full script module serialization/deserialization for caching
Copilot Jun 19, 2025
137310b
Migrate script serialization from BinaryFormatter to MessagePack
Copilot Jun 19, 2025
9f9a71c
Fix error handling, configuration, and logging in script caching
Copilot Jun 19, 2025
c228753
Enhance method serialization to support MachineMethodInfo structures
Copilot Jun 19, 2025
b0143ed
Remove redundant checks and implement IoC for cache service
Copilot Jun 19, 2025
def85ee
Address code review feedback: rename config, remove builders, add exc…
Copilot Jun 19, 2025
08662b1
Address final code review comments: remove fallback, fix redundant ch…
Copilot Jun 19, 2025
0d37282
Fix failing ScriptCacheServiceTests by adding proper mock setup
Copilot Jun 19, 2025
140d3f7
Temporarily disable script caching by default to fix Windows build
Copilot Jun 19, 2025
697e552
Fix boolean constant deserialization to handle localized values
Copilot Jun 19, 2025
04c71bb
Fix compilation errors in boolean and numeric constant deserialization
Copilot Jun 19, 2025
d2edbac
Enable script caching by default in configuration
Copilot Jun 19, 2025
ba1fb84
Fix build issues and CodeRabbit AI concerns - disable caching by defa…
Copilot Jun 19, 2025
c1143cb
Re-enable script caching by default as requested
Copilot Jun 19, 2025
0e929f4
Fix Windows path resolution issue in cached module loading
Copilot Jun 19, 2025
80e4b7f
Debug script caching path resolution issue - discovered root cause no…
Copilot Jun 25, 2025
357727c
Add oscript_modules directory with package-loader.os for system libra…
Copilot Jun 25, 2025
cf88557
Add comprehensive debug logging for script caching operations
Copilot Jun 25, 2025
737d76d
Fix library loading issue by diagnosing missing package-loader.os
Copilot Jun 25, 2025
2b544df
Fix BslScriptMethodInfo deserialization in caching - add protected co…
Copilot Jun 27, 2025
71d0fbf
Create copilot-setup-steps.yml
nixel2007 Jun 27, 2025
55ae0a0
Update copilot-setup-steps.yml
nixel2007 Jun 27, 2025
a0ce373
Update copilot-setup-steps.yml
nixel2007 Jun 27, 2025
10c49a3
Create copilot-instructions.md
nixel2007 Jun 27, 2025
069e99b
Add test result files for comprehensive build and test validation
Copilot Jun 27, 2025
a62b8c6
Update copilot-setup-steps.yml
nixel2007 Jun 27, 2025
605f72f
Update copilot-setup-steps.yml
nixel2007 Jun 27, 2025
5cb1928
Update copilot-instructions.md
nixel2007 Jun 28, 2025
7ef5c59
Fix Build.csproj to exclude TestApp and NativeApi from Linux builds
Copilot Jun 28, 2025
60c53a7
Fix script cache deserialization index out of range issues
Copilot Jun 28, 2025
9979624
Remove manual cache service setup from AttachedScriptsFactory to fix …
Copilot Jun 28, 2025
d597567
Remove committed test result files and add them to .gitignore
Copilot Jun 28, 2025
94533c2
Удалил кеши, добавленные копилотом
EvilBeaver Jul 9, 2025
d607680
Рефакторинг после копилота
EvilBeaver Jul 9, 2025
d43a159
Merge remote-tracking branch 'nixel2007/copilot/fix-1' into copilot/f…
EvilBeaver Jul 10, 2025
ab67ad3
Установка глобальной библиотеки пакетов
nixel2007 Jul 10, 2025
7bb5d09
Update copilot-instructions.md
nixel2007 Jul 10, 2025
b9547ac
Add script cache files to .gitignore to prevent committing generated …
Copilot Jul 10, 2025
c437e04
Корректный вызов функции в MSBuild
EvilBeaver Jul 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 113 additions & 0 deletions CACHE_DEMO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# Демонстрация кэширования скриптов для библиотек OneScript

## Обзор

Система кэширования скриптов интегрирована с загрузчиком библиотек OneScript и автоматически работает с методами `ДобавитьКласс` и `ДобавитьМодуль`.

## Как работает кэширование

1. **Автоматическая интеграция**: Когда `LibraryLoader` использует методы `ДобавитьКласс()` или `ДобавитьМодуль()`, вызывается цепочка:
- `LibraryLoader.CompileFile()`
- `AttachedScriptsFactory.CompileModuleFromSource()`
- `ScriptCacheService.TryLoadFromCache()` и `ScriptCacheService.SaveToCache()`

2. **Кэш-файлы**: Для каждого скрипта создаются:
- `script.os.metadata.json` - метаданные с информацией о времени изменения, размере файла, версии рантайма
- `script.os.obj` - объектный файл с информацией о модуле

3. **Валидация кэша**: Кэш автоматически становится недействительным при:
- Изменении исходного файла (время модификации или размер)
- Обновлении версии рантайма OneScript

## Тестирование кэширования

### Включение отладочного режима

```bash
export OS_CACHE_DEBUG=1
```

### Включение трассировки загрузки библиотек

```bash
export OS_LRE_TRACE=1
```

### Создание тестовых файлов

1. **Тестовый модуль** (`/tmp/test_module.os`):
```bsl
// Тестовый модуль для демонстрации кэширования
Функция ПолучитьВремя() Экспорт
Возврат ТекущаяДата();
КонецФункции
```

2. **Тестовый класс** (`/tmp/test_class.os`):
```bsl
// Тестовый класс для демонстрации кэширования
Перем Значение;

Процедура ПриСозданииОбъекта()
Значение = "Тест";
КонецПроцедуры

Функция ПолучитьЗначение() Экспорт
Возврат Значение;
КонецФункции
```

3. **Загрузчик библиотеки** (`/tmp/package-loader.os`):
```bsl
Функция ПриЗагрузкеБиблиотеки(ПутьКБиблиотеке, СтандартнаяОбработка, ОтменитьЗагрузку)

// Добавляем модуль - будет создан кэш
ДобавитьМодуль("/tmp/test_module.os", "ТестМодуль");

// Добавляем класс - будет создан кэш
ДобавитьКласс("/tmp/test_class.os", "ТестКласс");

СтандартнаяОбработка = Ложь;

КонецФункции
```

### Проверка создания кэша

После выполнения загрузки библиотеки должны появиться файлы:
- `/tmp/test_module.os.metadata.json`
- `/tmp/test_module.os.obj`
- `/tmp/test_class.os.metadata.json`
- `/tmp/test_class.os.obj`

### Пример метаданных кэша

```json
{
"FormatVersion": 1,
"SourceModifiedTime": "2025-06-19T09:30:15.123456+00:00",
"SourceSize": 145,
"SourcePath": "/tmp/test_module.os",
"CacheCreatedTime": "2025-06-19T09:30:16.789012+00:00",
"RuntimeVersion": "2.0.0.0"
}
```

## Статус реализации

✅ **Готово:**
- Интеграция кэша с `AttachedScriptsFactory`
- Автоматическое кэширование при использовании `ДобавитьКласс` и `ДобавитьМодуль`
- Валидация кэша по времени изменения файла, размеру и версии рантайма
- Создание метаданных и объектных файлов
- Конфигурируемое включение/отключение кэширования

⚠️ **В разработке:**
- Полная сериализация/десериализация `IExecutableModule`
- Загрузка скомпилированных модулей из кэша

## Результат

Система кэширования **уже работает** с методами загрузчика библиотек `ДобавитьКласс` и `ДобавитьМодуль`. Кэш-файлы создаются автоматически, валидация работает корректно.

Инфраструктура готова для будущей реализации полной загрузки модулей из кэша, что даст значительное ускорение загрузки больших библиотек типа oneunit.
59 changes: 59 additions & 0 deletions CACHE_IMPLEMENTATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Кэширование скомпилированных сценариев

## Описание

Данная реализация добавляет возможность кэширования предкомпилированных сценариев для ускорения повторной загрузки. Кэш сохраняется в файлы `.obj` и `.metadata.json` рядом с исходными файлами сценариев.

## Состав изменений

### Новые файлы:
- `src/OneScript.Core/Compilation/IScriptCacheService.cs` - интерфейс сервиса кэширования
- `src/OneScript.Core/Compilation/ScriptCacheService.cs` - реализация кэширования
- `src/OneScript.Core/Compilation/CacheMetadata.cs` - структура метаданных кэша
- `src/OneScript.Core/Compilation/IModuleSerializer.cs` - интерфейс сериализатора модулей
- `src/ScriptEngine/Compilation/SerializableModule.cs` - сериализуемая версия модуля
- `src/ScriptEngine/Compilation/StackRuntimeModuleSerializer.cs` - сериализатор для StackRuntimeModule

### Изменения в существующих файлах:
- `src/ScriptEngine/Machine/Contexts/AttachedScriptsFactory.cs` - интеграция кэширования в процесс загрузки
- `src/ScriptEngine/ScriptingEngine.cs` - методы управления кэшированием

## Принцип работы

1. При загрузке сценария через `AttachedScriptsFactory.LoadFromPath()` сначала проверяется наличие валидного кэша
2. Метаданные кэша содержат время модификации и размер исходного файла для проверки актуальности
3. Если кэш отсутствует или устарел, выполняется компиляция и результат полностью сериализуется в бинарный кэш
4. При наличии валидного кэша модуль десериализуется из бинарного файла без повторной компиляции
5. Кэширование работает только для файловых источников без внешнего контекста

## Текущие ограничения

- **Полная сериализация/десериализация IExecutableModule реализована** - в текущей версии полностью работает сериализация и восстановление `StackRuntimeModule`
- Загрузка из кэша работает для файловых источников без внешнего контекста
- Кэш автоматически создается и используется при загрузке скриптов

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

```csharp
// Включение/отключение кэширования
scriptingEngine.SetScriptCachingEnabled(true);

// Кэш автоматически используется при загрузке сценариев
var script = dynamicLoadingFunctions.LoadScript(process, "/path/to/script.os");
```

## Файлы кэша

- `script.os.obj` - скомпилированный модуль (полностью сериализованный StackRuntimeModule)
- `script.os.metadata.json` - метаданные кэша в формате JSON

## Тестирование

Создан набор тестов `ScriptCacheServiceTests` для проверки базовой функциональности кэширования.

## Следующие шаги

1. ~~Реализация полной сериализации/десериализации `IExecutableModule`~~ ✅ **Выполнено**
2. Добавление более сложной логики инвалидации кэша
3. Оптимизация производительности сериализации (возможно, замена BinaryFormatter на более современные решения)
4. Интеграция с пакетным загрузчиком (package-loader.os)
4 changes: 4 additions & 0 deletions src/OneScript.Core/Compilation/Binding/SymbolBinding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,18 @@ This Source Code Form is subject to the terms of the
----------------------------------------------------------*/

using System;
using MessagePack;

namespace OneScript.Compilation.Binding
{
[Serializable]
[MessagePackObject]
public struct SymbolBinding : IEquatable<SymbolBinding>
{
[Key(0)]
public int ScopeNumber { get; set; }

[Key(1)]
public int MemberNumber { get; set; }

public bool Equals(SymbolBinding other)
Expand Down
48 changes: 48 additions & 0 deletions src/OneScript.Core/Compilation/CacheMetadata.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*----------------------------------------------------------
This Source Code Form is subject to the terms of the
Mozilla Public License, v.2.0. If a copy of the MPL
was not distributed with this file, You can obtain one
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/

using System;

namespace OneScript.Compilation
{
/// <summary>
/// Метаданные кэшированного модуля
/// </summary>
[Serializable]
public class CacheMetadata
{
/// <summary>
/// Версия формата кэша
/// </summary>
public int FormatVersion { get; set; } = 1;

/// <summary>
/// Дата модификации исходного файла на момент компиляции
/// </summary>
public DateTime SourceModifiedTime { get; set; }

/// <summary>
/// Размер исходного файла на момент компиляции
/// </summary>
public long SourceSize { get; set; }

/// <summary>
/// Путь к исходному файлу
/// </summary>
public string SourcePath { get; set; }

/// <summary>
/// Время создания кэша
/// </summary>
public DateTime CacheCreatedTime { get; set; }

/// <summary>
/// Версия среды выполнения, использованной для компиляции
/// </summary>
public string RuntimeVersion { get; set; }
}
}
32 changes: 32 additions & 0 deletions src/OneScript.Core/Compilation/IModuleSerializer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*----------------------------------------------------------
This Source Code Form is subject to the terms of the
Mozilla Public License, v.2.0. If a copy of the MPL
was not distributed with this file, You can obtain one
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/

using OneScript.Execution;

namespace OneScript.Compilation
{
/// <summary>
/// Интерфейс для сериализации исполняемых модулей
/// </summary>
public interface IModuleSerializer
{
/// <summary>
/// Сериализовать модуль в поток
/// </summary>
void Serialize(IExecutableModule module, System.IO.Stream stream);

/// <summary>
/// Десериализовать модуль из потока
/// </summary>
IExecutableModule Deserialize(System.IO.Stream stream);

/// <summary>
/// Проверить, может ли сериализатор работать с данным типом модуля
/// </summary>
bool CanSerialize(IExecutableModule module);
}
}
44 changes: 44 additions & 0 deletions src/OneScript.Core/Compilation/IScriptCacheService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*----------------------------------------------------------
This Source Code Form is subject to the terms of the
Mozilla Public License, v.2.0. If a copy of the MPL
was not distributed with this file, You can obtain one
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/

using System;
using OneScript.Execution;
using OneScript.Sources;

namespace OneScript.Compilation
{
public interface IScriptCacheService
{
/// <summary>
/// Попытаться загрузить предкомпилированный модуль из кэша
/// </summary>
/// <param name="sourceFile">Путь к исходному файлу сценария</param>
/// <param name="module">Загруженный модуль, если кэш валиден</param>
/// <returns>true, если модуль успешно загружен из кэша</returns>
bool TryLoadFromCache(string sourceFile, out IExecutableModule module);

/// <summary>
/// Сохранить скомпилированный модуль в кэш
/// </summary>
/// <param name="sourceFile">Путь к исходному файлу сценария</param>
/// <param name="module">Скомпилированный модуль для сохранения</param>
void SaveToCache(string sourceFile, IExecutableModule module);

/// <summary>
/// Очистить кэш для указанного файла
/// </summary>
/// <param name="sourceFile">Путь к исходному файлу сценария</param>
void ClearCache(string sourceFile);

/// <summary>
/// Проверить валидность кэша для файла
/// </summary>
/// <param name="sourceFile">Путь к исходному файлу сценария</param>
/// <returns>true, если кэш существует и валиден</returns>
bool IsCacheValid(string sourceFile);
}
}
Loading