{"id":13600000,"url":"https://github.com/russo-2025/papyrus-compiler","last_synced_at":"2025-04-10T17:33:16.138Z","repository":{"id":46802067,"uuid":"354376896","full_name":"russo-2025/papyrus-compiler","owner":"russo-2025","description":"An open-source implementation of Papyrus scripting language compiler","archived":false,"fork":false,"pushed_at":"2024-09-15T20:57:48.000Z","size":1152,"stargazers_count":21,"open_issues_count":1,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-09-16T11:27:56.131Z","etag":null,"topics":["compiler","language","papyrus","programming-language","scripting"],"latest_commit_sha":null,"homepage":"","language":"Papyrus","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/russo-2025.png","metadata":{"files":{"readme":"README.RU.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-03T19:28:03.000Z","updated_at":"2024-09-15T20:53:35.000Z","dependencies_parsed_at":"2024-08-29T22:57:21.803Z","dependency_job_id":null,"html_url":"https://github.com/russo-2025/papyrus-compiler","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/russo-2025%2Fpapyrus-compiler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/russo-2025%2Fpapyrus-compiler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/russo-2025%2Fpapyrus-compiler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/russo-2025%2Fpapyrus-compiler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/russo-2025","download_url":"https://codeload.github.com/russo-2025/papyrus-compiler/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223442813,"owners_count":17145835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compiler","language","papyrus","programming-language","scripting"],"created_at":"2024-08-01T17:01:24.390Z","updated_at":"2025-04-10T17:33:16.125Z","avatar_url":"https://github.com/russo-2025.png","language":"Papyrus","funding_links":[],"categories":["V","Applications"],"sub_categories":["Interpreters/Compilers"],"readme":"# Papyrus Compiler\n\nКомпилятор скриптового языка Papyrus с открытым исходным кодом. На данный момент компилятор поддерживает только Skyrim (тестировался на Skyrim SE/AE). \n\nКомпилятор был создан для следующих целей:\n1. **Понимание языков программирования:** Проект разработан для того, чтобы глубже понять, как работают языки программирования.\n2. **Эксперименты с языком V:** Использует язык программирования V для реализации.\n3. **Ускорение компиляции:** Стандартный компилятор Papyrus работает очень медленно, поэтому данный проект направлен на оптимизацию этого процесса.\n4. **Улучшенные сообщения об ошибках:** Предоставляет более качественные и понятные сообщения об ошибках для упрощения отладки.\n\n## Оглавление\n- [Использование](#использование)\n  - [Команды](#команды)\n  - [Аргументы команды `compile`](#аргументы-команды-compile)\n  - [Примеры использования](#примеры-использования)\n  - [Файлы заголовков/импортов](#файлы-заголовковимпортов)\n- [Сборка](#сборка)\n  - [Требования](#требования)\n- [Тестирование](#тестирование)\n- [Ссылки](#ссылки)\n\n## Использование\n1. Скачайте архив с компилятором со страницы [Github Releases](https://github.com/russo-2025/papyrus-compiler/releases) и распакуйте его.\n2. Откройте консоль в директории, куда распаковали компилятор.\n3. Используйте следующий синтаксис для работы с компилятором:\n\n```\npapyrus \u003ccommand\u003e [arguments]\n```\n\n### Команды:\n- `compile`: Компилирует файлы с расширением `.psc` в бинарный формат `.pex`.\n- `read`: Читает и дизассемблирует файл с расширением `.pex`, выводя его содержимое в человекочитаемом формате в консоль.\n- `disassembly`: Читает и дизассемблирует файл с расширением `.pex`, сохраняя содержимое в человекочитаемом формате в текстовый файл.\n- `create-dump`: Создаёт файл `dump.json` с информацией о `.pex` файлах, находящихся в указанной директории.\n- `help`: Выводит список доступных команд и их описание.\n\n### Аргументы команды `compile`:\nС командой `compile` могут использоваться следующие аргументы:\n\n- `-i`, `-input`: Указывает каталог с `.psc` файлами или `.psc` файл для компиляции.\n- `-o`, `-output`: Указывает каталог для сохранения скомпилированных `.pex` файлов.\n- `-h`, `-headers-dir`: Указывает каталог с .psc файлами заголовков/импортов, которые будут проанализированы компилятором, но не будут скомпилированы. Используется для того, чтобы компилятор знал о существующих скриптах (`Form`, `ObjectReference`, `Actor`, ...) и их методах/функциях/свойствах/переменных. Смотрите раздел «Файлы заголовков/импортов».\n- `-nocache`: Игнорирует кэш и принудительно компилирует все файлы.\n- `-silent`: Отключает вывод сообщений об ошибках в консоль.\n- `-original`: Использует оригинальный компилятор Papyrus для компиляции.\n- `-stats`: Сохраняет статистику по скомпилированным файлам в .md файлы (количество вызовов функций, наследований, файлов).\n- `-check`: Проверяет синтаксис .psc файлов без генерации .pex файлов.\n- `-verbose`: ...\n\n### Примеры использования\nНиже приведены несколько примеров, демонстрирующих использование различных команд и аргументов компилятора для компиляции скриптов, чтения скомпилированных скриптов и т.д.\n\n#### Компиляция всех скриптов в директории с игнорированием кэша:\n```bash\npapyrus compile -nocache -i \"D:\\Steam\\steamapps\\common\\Skyrim Special Edition\\Data\\Scripts\\Source\" -o \"../test-files/compiled/skyrimSources\"\n```\nЭта команда компилирует все скрипты (кэш игнорируется), расположенные в `D:\\Steam\\steamapps\\common\\Skyrim Special Edition\\Data\\Scripts\\Source`, и помещает скомпилированные `.pex` файлы в каталог `../test-files/compiled/skyrimSources`.\n\n#### Компиляция всех скриптов в директории:\n```bash\npapyrus compile -i \"../../RH-workspace/scripts\" -o \"../../RH-workspace/compiled\"\n```\nЭта команда компилирует все скрипты, расположенные в `../../RH-workspace/scripts`, и помещает скомпилированные `.pex` файлы в каталог `../../RH-workspace/compiled`.\n\n#### Компиляция скриптов с использованием файлов заголовков/импортов:\n```bash\npapyrus compile -nocache -h \"D:\\Steam\\steamapps\\common\\Skyrim Special Edition\\Data\\Scripts\\Source\" -i \"../test-files/compiler\" -o \"../test-files/compiled\" \n```\nЭта команда скомпилирует все скрипты из каталога `../test-files/compiler` в каталог `../test-files/compiled`, а недостающая информация об объектах (`Form`, `ObjectReference`, `Actor` и т.д.) будет взята из `.psc` файлов в каталоге `D:\\Steam\\steamapps\\common\\Skyrim Special Edition\\Data\\Scripts\\Source`.\n\n#### Чтение скомпилированного `.pex` файла:\n```bash\npapyrus read \"../test-files/compiled/ABCD.pex\"\n```\n\n#### Создание JSON-дампа `.pex` файлов:\n```bash\npapyrus create-dump \"../folder_with_pex_files\"\n```\nСоздает JSON-файл `dump.json`, содержащий некоторую информацию обо всех `.pex` файлах, расположенных в каталоге `../folder_with_pex_files`. Вот как это будет выглядеть:\n```json\n[\n  {\n    \"name\": \"ActiveMagicEffect\",\n    \"parent_name\": \"\",\n    \"methods\": [\n      {\n        \"name\": \"RegisterForUpdate\",\n        \"arguments\": [\n          {\n            \"name\": \"afInterval\",\n            \"type\": \"Float\"\n          }\n        ],\n        \"return_type\": \"None\",\n        \"is_native\": true,\n        \"is_global\": false\n      }\n    ],\n    \"global_functions\": [...]\n  },\n  ...\n]\n```\n\n### Файлы заголовков/импортов\nПо умолчанию компилятор не знает о существующих скриптах (`Form`, `ObjectReference`, `Actor` и т.д.), их наследовании (`ObjectReference` -\u003e `Form`) и доступных методах/функциях/свойствах/переменных. \n\nВы можете исправить это двумя способами:\n1. Укажите путь к каталогу с оригинальными скриптами (например, `..\\Skyrim\\Data\\Scripts\\Source`) с помощью аргумента `-h \"...\"`.\n2. Создайте каталог с заголовочными файлами, указывающими существующие объекты и их методы, функции и т.д., и укажите его с помощью аргумента `-h \"...\"`.\n\nПример заголовочного файла `Actor.psc`:\n```papyrus\nScriptName Actor extends ObjectReference\n\nFunction EquipItem(Form akItem, bool abPreventRemoval = false, bool abSilent = false) native\n```\n\nПроанализировав этот файл, компилятор узнает о существовании объекта `Actor`, его наследовании от `ObjectReference` и наличии функции `EquipItem` с соответствующими аргументами (для некоторых из которых есть значения по умолчанию). Флаг `native` позволяет пропустить написание тела функции в заголовочном файле, так как эти скрипты используются только для анализа. Это значительно ускоряет компиляцию.\n\nСкрипты из каталога, указанного аргументом `-h \"...\"`, НЕ БУДУТ скомпилированы и помещены в каталог, указанный с помощью `-o \"...\"`.\n\n## Сборка\n\n### Требования:\n- [V compiler f3d2eb1 (weekly.2025.09)](https://github.com/vlang/v/releases/tag/weekly.2025.09)\n\n```bash\nv -o \"bin\\papyrus.exe\" -prod -gc none compiler.v\n```\n\n## Тестирование\n\n```bash\nv -stats test modules\n```\n\n## Ссылки\n- [Papyrus docs](https://ck.uesp.net/wiki/Category:Papyrus)\n- [VS Code Extension: Papyrus Language Tools](https://github.com/joelday/papyrus-lang)\n- [Creation Kit Papyrus Reference](https://www.creationkit.com/index.php?title=Category:Papyrus)\n- [Compiled Script File Format](https://en.uesp.net/wiki/Skyrim_Mod:Compiled_Script_File_Format)\n- [Caprica](https://github.com/Orvid/Caprica) - A compiler for the Papyrus scripting language used by the Creation Engine.\n- [Champollion](https://github.com/Orvid/Champollion) - A PEX to Papyrus Decompiler for Fallout 4\n- [PapyrusDotNet](https://github.com/zerratar/PapyrusDotNet) - PapyrusDotNet - A .NET Papyrus Compiler for Fallout 4 and Skyrim\n- [Open Papyrus - Docs](https://open-papyrus.github.io/docs/Papyrus_Language_Reference/index.html)\n- [Open Papyrus - Compiler](https://github.com/open-papyrus/papyrus-compiler) - (WIP, Rust lang) Open-source compiler for the Papyrus scripting language of Bethesda games.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frusso-2025%2Fpapyrus-compiler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frusso-2025%2Fpapyrus-compiler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frusso-2025%2Fpapyrus-compiler/lists"}