vak: (Default)
[personal profile] vak
Какие скриптовые языки самые распространённые? Перл сходит со сцены, Питон нынче повсюду, про PHP уже забыли, но оказывается, Javascript незримо присутствует в каждом линуксе и маке. Гляньте файл:
$ ls -l /usr/lib/*/libjavascriptcoregtk*.so*
lrwxrwxrwx 1 root       36 Jan  6 04:34 /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18 -> libjavascriptcoregtk-4.0.so.18.25.14
-rw-r--r-- 1 root 30609392 Jan  6 04:34 /usr/lib/x86_64-linux-gnu/libjavascriptcoregtk-4.0.so.18.25.14
Это может быть libjavascriptcoregtk-4.0.so как выше, или *-4.1.so, или *-6.0.so, но какой-нибудь да отыщется. Потому что веб-браузеры в нём нуждаются.

Это Джаваскрипт можно задействовать из Си программы. Есть документация. Понадобятся соответствующие include-файлы, для этого следует установить пакет нужной версии. Скажем, на последнем Дебиане это 6.0:
sudo apt install libjavascriptcoregtk-6.0-dev
Возьмём пример вычисления факториала:
#include <stdio.h>
#include <webkitgtk-6.0/jsc/jsc.h>

const char code[] = "\
function factorial(n) {\
    if (n === 0) {\
        return 1;\
    } else {\
        return n * factorial(n - 1);\
    }\
}\
\
factorial(10)";

int main()
{
    // Create a new JavaScript virtual machine.
    JSCContext *vm = jsc_context_new();

    // Evaluate arbitrary JavaScript code.
    JSCValue *result = jsc_context_evaluate(vm, code, -1);

    // Print the result.
    if (jsc_value_is_number(result)) {
        double value = jsc_value_to_double(result);
        printf("The result is: %f\n", value);
    } else {
        printf("The result is not a number.\n");
    }

    // Deallocate resources.
    g_object_unref(result);
    g_object_unref(vm);
}
Компилируем, запускаем:
$ cc demo.c -o demo `pkg-config --cflags --libs javascriptcoregtk-6.0`
$ ./demo
The result is: 3628800.000000
На маке тоже работает, но интерфейс выглядит несколько по другому:
#include <stdio.h>
#include <JavaScriptCore/JavaScriptCore.h>

const char code[] = "\
function factorial(n) {\
    if (n === 0) {\
        return 1;\
    } else {\
        return n * factorial(n - 1);\
    }\
}\
\
factorial(10)";

int main()
{
    // Create a new JavaScript virtual machine.
    JSGlobalContextRef vm = JSGlobalContextCreate(NULL);

    // Evaluate arbitrary JavaScript code.
    JSStringRef script = JSStringCreateWithUTF8CString(code);
    JSValueRef result = JSEvaluateScript(vm, script, NULL, NULL, 0, NULL);

    // Print the result.
    if (JSValueIsNumber(vm, result)) {
        double value = JSValueToNumber(vm, result, NULL);
        printf("The result is: %f\n", value);
    } else {
        printf("The result is not a number.\n");
    }

    // Deallocate resources.
    JSStringRelease(script);
    JSGlobalContextRelease(vm);
}
Запускаем:
$ cc demo.c -o demo -framework JavaScriptCore
$ ./demo
The result is: 3628800.000000

Date: 2025-02-21 00:16 (UTC)
henry_flower: A melancholy wolf (Default)
From: [personal profile] henry_flower
gtk4 має ув комплекті варіянт мозіловского spidermonkey

деякі декстопні аплікації (foliate, наприклад) написані суто на джаваскрипті gjs, використовуючи gtk віджети

шо цікаво, така аплікація не тягає зі собою 2^16 .js хфайлів, а динамічно імпортить їх з 1 байнарного gresource бандла, де, окрім .js, зберігаються всі айконки, .css і т.і.

Date: 2025-02-21 08:41 (UTC)
henry_flower: A melancholy wolf (Default)
From: [personal profile] henry_flower
gjs використовує spidermonkey, а не вебкіт (тут можна сплутати libjavascriptcoregtk належить до WebKitGTK, але до віджетів gtk4 (з якими дружить gjs) воно не відноситься)

але так, лінукс це їх основна тарґет в обоїх випадках