Дистрибутив Tcl для WebAssembly або Javascript
Це дистрибутив Tcl для WebAssembly (webassembly.org). Це дозволяє веб-розробникам вбудовувати інтерпретатор Tcl у браузер та інтегрувати Tcl із JavaScript. Це дозволяє розробникам Tcl використовувати свої інструменти та мову для створення клієнтських веб-додатків. Це дозволяє всім розробникам повторно використовувати чудову та (протягом десятиліть) розроблену кодову базу корисних пакетів і сценаріїв, таких як tclib, для використання у веб-браузерах.
Це розширення проекту Emtcl Ейдана Хобсона, який можна знайти тут. Але Wacl йде на кілька кроків далі: він інтегрує повнофункціональний інтерпретатор Tcl у веб-сторінку та додає наступні функції:
- Основний інтерпретатор tclsh і можливість досягти цього за допомогою JavaScript
- Цикл подій для обробки всіх подій Tcl (події таймера, події файлів, спеціальні події)
- Клієнтський сокет. Команда socket -async … підключається до сервера WebSocket за допомогою бінарного протоколу. Отриманий дескриптор можна використовувати для передачі двійкових даних, як звичайний TCP-сокет.
- Бібліотека Tcl: модулі та пакунки у віртуальній файловій системі Emscripton. Ви можете додати свій власний пакет!
- Правильна ініціалізація через Tcl_Init()
- Розширення для виклику функцій JavaScript із Tcl
- Різні корисні розширення (список і коментарі див. нижче)
Оригінальні ілюстративні команди DOM було переміщено до простору імен “wacl” у однойменному пакеті, який доступний лише під час запуску. Цей пакет також містить команду ::wacl::jscall для виклику функцій JavaScript із Tcl, які були попередньо зареєстровані за допомогою функції модуля jswrap().
Код правильно компілюється за допомогою JavaScript і WebAssembly з Emscripten 1.37.9. Останній є кращим форматом: JavaScript WebAssembly лише вдвічі менший за вихідний файл «asm.js» (~1,4 МБ проти 2,9 МБ) і принаймні вдвічі швидший! Однак це може спричинити несумісність із старими браузерами, які (ще) не підтримують WebAssembly.
Наступні розширення включені до Wacl
- рідне розширення wacl із командами wacl::dom і wacl::jscall
- tDOM для аналізу та створення вмісту XML і HTML
- писати за допомогою json і json::tclib
- tclib в html
- tclib до javascript
- ncgi як залежність для html
- rl_json Тип Tcl_Obj для ефективного аналізу та генерації JSON
Більше розширень можна легко включити та використовувати. Розширення C можна скомпілювати за допомогою Emscripten (з вимкненим USE_TCL_STUBS і статично ініціалізованим через waclAppInit()), а розширення Tcl можна включити у віртуальну файлову систему бібліотеки.
Але майте на увазі, що включення розширень є компромісним рішенням: ви платите за додаткову функціональність за допомогою більшого розміру завантаження. Наприклад, справді корисне розширення tDOM розширює дистрибутив Wacl до розміру не менше ніж 400 Кбайт, який користувач-клієнт повинен завантажити, щоб запустити програму на основі WACL, і це може бути болючим із низькою пропускною здатністю. Тому краще обмежити кількість пакунків найнеобхіднішим, а не створювати дистрибутив із багатим акумулятором, який включає все.
Ви можете спробувати це тут. Ви можете завантажити попередньо скомпільовану версію зі сторінками індексу для запуску на власній веб-сторінці, завантаживши попередньо скомпільований двійковий файл звідси. Обидві ці сторінки потребують останньої версії браузера з підтримкою WebAssembly:
- Mozilla Firefox >=52.0
- Google Chrome >=57.0
- Microsoft Edge (оновлення Windows 10 Creators)
- Опера
Wacl збиратиметься в середовищах Unix/Linux шляхом встановлення таких інструментів:
- Emscripton SDK. Встановлення задокументовано на веб-сторінці
- зробити, автоконф
- Відмінності, патчі (деякі патчі повинні бути застосовані до оригінальних джерел, це здебільшого робиться автоматично)
Windows не підтримується, але macOS з відповідними інструментами від MacPorts, ймовірно, працюватиме (сам не перевіряв).
Перший крок — перевірити це сховище. Це призведе до перевірки файлів у поточному каталозі. Існує Makefile з кроками збирання та README з інструкціями. Процес створення просто завантажує вихідні коди ядра Tcl, застосовує невеликий патч, налаштовує та збирає інтерпретатор за допомогою WebAssembly, а також файлів .data + .js. Ці файли можна розгорнути у відповідних каталогах веб-джерел. Emscripten має бути на SDK PATH (тобто через джерело $EMSCRIPTEN/emsdk_set_env.sh). Після створення wacl його можна використовувати в будь-якому браузері, який підтримує WebAssembly, навіть у Windows.
Вилучивши прапорець -s WASM=1 зі змінної BCFLAGS у Makefile, систему збірки можна змінити на створення JavaScript замість WebAssembly. Це створить більший (~2,8 МБ), але менший вихід .js, який повільніше під час виконання, але сумісний із браузерами, які не підтримують WebAssembly.
Щоб створити його, вам потрібен Emscripton SDK на вашому шляху. Потім:
$ make waclprep # One off prep - tcl-core download, hacks.patch application and autoconf
$ make config # create build directory and run emconfigure tcl/unix/configure
$ make [all] # create the library and emtcl.js
$ make install # copy emtcl.js to ../www/js/
Якщо ви хочете повністю скинути всі файли збірки в ./tcl/ і почати знову:
Це видаляє всі зміни та невідстежувані файли, тому будьте обережні!
Якщо ви внесли будь-які значні зміни в tcl/, метою є відтворення виправлення
Він завантажує tcl-core (якщо його ще не існує), розпаковує його та запускає різницю між ним і tcl/. Результатом є патч, застосований за допомогою «make tclprep» вище