• Как виртуальные машины исполняют код и как правильно это реализовать?

    WNeZRoS
    @WNeZRoS
    Если вопрос при виртуальные машины по типу тех что используется для исполнения Java или C# кода, то инструкции в них гораздо проще. В CIL например, у большинства инструкций нет параметров, они просто берут нужные данные с конца стека. А когда параметры есть - он один: значение или токен переменной/функции.

    Можно посмотреть как C# преобразуется в инструкции виртуальной машины на sharplab.io, сопоставить и понять как оно выполняется.

    Например
    IL_0000: ldarg 1 // кладёт в стек первый аргумент
    IL_0001: ldarg 2 // кладёт в стек второй аргумент
    IL_0002: sub     // достаёт из стека два последних значения и отнимает последний от пред последнего (т.е. будет arg.2 - arg.1), результат складывается в стек
    IL_0003: brtrue.s IL_0011 // достаёт из стека значение, если оно не 0, переходит к инструкции IL_0011, если 0 исполнения идёт дальше на I_0005
    
    IL_0005: ldstr "zero" // загружает в стек строку "zero"
    IL_000a: call void System.Console::WriteLine(string) // вызывает вывод в консоль, из стека достаются N нужных значений для параметров (в данном случае 1), void функция ничего в стек не добавляет
    IL_000f: br.s IL_001b // переход (jump) к IL_001b
    
    IL_0011: ldstr "not zero" // загружает в стек строку "not zero"
    IL_0016: call void System.Console::WriteLine(string) // вызывает вывод в консоль, из стека достаётся 1 значения для параметра 
    
    IL_001b: ldstr "done" // загружает в стек строку ...
    IL_0020: call void System.Console::WriteLine(string) // ...


    Пример реализации простой виртуальной машины на основе примера выше

    (Код написан так чтобы работал, правильнее писать более безопасно и читабельнее)

    #include <stdio.h>
    
    enum Opcode {
        OP_LOAD_ARGUMENT,
        OP_LOAD_STRING,
        OP_SUBTRACT,
        OP_GOTO,
        OP_GOTO_IF_TRUE,
        OP_CALL,
        OP_RETURN
    };
    
    union Argument {
        int value;
        const void* pointer;
    };
    
    struct Instruction { 
        Opcode opcode; 
        Argument arg; 
    };
    
    void run_vm(const Instruction* instructions, const Argument* args) {
        Argument stack[16];
        
        Argument* stack_pointer = &stack[0];
        int address = 0;
    
        while(true) {
            const Instruction instruction = instructions[address];
            address++;
    
            switch(instruction.opcode) {
                case OP_RETURN:
                    return;
                
                case OP_LOAD_ARGUMENT:
                    *stack_pointer = args[instruction.arg.value];
                    stack_pointer++;
                    break;
    
                case OP_LOAD_STRING:
                    *stack_pointer = instruction.arg;
                    stack_pointer++;
                    break;
    
                case OP_SUBTRACT:
                {
                    stack_pointer--;
                    int b = stack_pointer->value;
                    
                    stack_pointer--;
                    int a = stack_pointer->value;
    
                    stack_pointer->value = a - b;
                    stack_pointer++;
                    break;
                }
    
                case OP_GOTO:
                    address = instruction.arg.value;
                    break;
    
                case OP_GOTO_IF_TRUE:
                    stack_pointer--;
                    if(stack_pointer->value != 0)
                        address = instruction.arg.value;
                    break;
    
                case OP_CALL:
                    void (* fn)(const void*) = (void (*)(const void*))instruction.arg.pointer;
                    stack_pointer--;
                    fn(stack_pointer->pointer);
                    break;
            }
        }
    }
    
    void print(const char* text) { printf("%s\n", text); }
    
    int main(int argc, char** argv) {
        const Instruction instructions[] = {
            /* 0 */ { OP_LOAD_ARGUMENT, { 0 } },
            /* 1 */ { OP_LOAD_ARGUMENT, { 1 } },
            /* 2 */ { OP_SUBTRACT, {} },
            /* 3 */ { OP_GOTO_IF_TRUE, { 0x7 } },
            /* 4 */ { OP_LOAD_STRING, { .pointer = "zero" } },
            /* 5 */ { OP_CALL, { .pointer = (void*)&print } }, // функции надо где-то регистрировать, чтобы знать сколько у них параметров и какого они типа
            /* 6 */ { OP_GOTO, { 0x9 } },
            /* 7 */ { OP_LOAD_STRING, { .pointer = "not zero" } },
            /* 8 */ { OP_CALL, { .pointer = (void*)&print } },
            /* 9 */ { OP_LOAD_STRING, { .pointer = "done" } },
            /* A */ { OP_CALL, { .pointer = (void*)&print } },
            /* B */ { OP_RETURN, {} }
        };
    
        const Argument args[] = { 
            { 100500 },
            { 777 }
         };
    
        run_vm(instructions, args);
        return 0;
    }



    Виртуальные машины для процессоров можно делать по такому же принципу, но они будут медленные и структура инструкций ограничена архитектурой процессора.
    Ответ написан
    Комментировать
  • Как получить путь к испольняющемуся файлу rust?

    @deliro
    use std::env::current_exe;
    
    fn main() {
        let x = current_exe();
        println!("{x:?}")
    }
    Ответ написан
    1 комментарий
  • Почему ругается Vscode на типы?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Ну потому что это union - он строгий, он позволяет получать свойство напрямую только в том случае, если оно есть у всех членов union'а. В ином случае надо руками делать проверку, которая сузит тип до нужного. if ('counter' in ...) и т.п.
    Ответ написан
    Комментировать
  • Есть ли название у подобного подхода?

    What is an early return?
    An early return, or “return early” is an approach to keep readability in functions and methods.

    It is always considered a wise choice to return early if simple conditions apply that can be checked at the beginning of a method.
    https://dev.to/jpswade/return-early-12o5
    Ответ написан
    1 комментарий
  • Как вернуть пункт меню фаил visual studio code в контекстное меню?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    На любом значке правую кнопку мыши нажми и верни проводник
    6496b61f93760495472006.png
    Ответ написан
    Комментировать
  • Что такое Docker простыми словами?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Что такое Docker простыми словами

    простыми словами

    Если совсем прям простыми, то - это некая легковесная оболочка, которая способна изолировать приложение внутри себя от внешнего мира. Очень похож (по логике) на системы виртуализации VMware, VirtualBox, Parallels итп, но сам не является им.

    Возможности:

    - Контейнеризация: Docker позволяет паковать приложения вместе со всеми их зависимостями в контейнеры, обеспечивая тем самым их независимость от конкретной инфраструктуры.
    - Переносимость: Контейнеры Docker могут быть запущены на любом компьютере, который поддерживает Docker, независимо от операционной системы. Это делает распространение и развертывание приложений намного проще.
    - Изоляция ресурсов: Каждый контейнер Docker работает в изолированной среде и не влияет на другие контейнеры или хостовую систему.
    - Слоистая файловая система: Docker использует слоистую файловую систему для хранения данных, что позволяет существенно экономить дисковое пространство и упрощает обновление и распространение контейнеров.
    - Сетевые возможности: Docker позволяет настраивать сетевые параметры каждого контейнера, что позволяет создавать сложные многокомпонентные приложения.
    - Docker Hub: Docker Hub – это репозиторий, где можно хранить и делиться контейнерами. Это облегчает развертывание и распространение приложений.
    - Docker Compose: Это инструмент для определения и запуска многоконтейнерных - Docker-приложений. С помощью Compose вы можете использовать файл YAML для конфигурации служб вашего приложения, а затем с помощью одной команды создать и запустить все службы.
    - Docker Swarm: Docker Swarm предоставляет нативные возможности Docker для оркестрации и масштабирования кластера Docker.
    Ответ написан
    Комментировать
  • Есть ли в РФ учебные заведения, которые выпускают сеньоров или мидлов?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ни в РФ нет, ни где-либо ещё. Это на столько же невозможно, как стать чемпионом мира по боксу, посмотрев бой по телевизору.
    Ответ написан
    Комментировать
  • Как работает finally и then в Promise?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Никто ничего ждать не будет. Исполнение кода пойдёт дальше до самого конца функции.
    Когда промис, который вернул fetch, перейдёт в состояние resolved, в очередь микротасков будет добавлен вызов каллбэк-функции из первого then. Если промис вернёт rejected, то вызова не будет, вернётся новый промис в rejected.
    Когда промис из первого then перейдёт в состояние resolved, в очередь микротасков будет добавлен вызов каллбэк-функции из второго then. Если промис вернёт rejected, то вызова не будет, вернётся новый промис в rejected.
    Когда промис из второго then перейдёт в состояние resolved или rejected, в очередь микротасков будет добавлен вызов каллбэк-функции из finally.
    Ответ написан
    Комментировать
  • Можно ли заменить javascript языком dart/flutter?

    liaFcipE
    @liaFcipE
    Вы написали какую-то ерунду, из которой можно сделать лишь один вывод: вы не знаете JS.
    Изменений в языке, которые ломали бы текущий API - нет (почти), обратная совместимость - основной пункт новых спек языка. Сам язык обновляется, добавляется новый сахар, новые webAPI, etc.

    Но прикладной слой... Мода и подходы довольно часто меняются, но яблоко от яблони... Как правило делают что-то новое, почти с тем же API, конфигурацией, что и у предшественника, только проще, быстрее в работе, сборке или чем-то еще, возможно начинают использоваться какие-то новые, нативные фичи и прочее (это я про всякую сборку, тест-раннеры и др., но лично мне это наоборот нравится, есть свои плюсы)

    > может ли flutter заменить его

    Он точно так же в контекте браузера собирается в JS, как и например TS. Браузер, сейчас, не умеет исполнять ничего, кроме JS. Только, по моему мнению в вебе flutter никому не нужен, слабое комьюнити, а м.б. и Dart вместе с flutter отправится в https://killedbygoogle.com через какое-то время...
    Ответ написан
    1 комментарий
  • Можно ли заменить javascript языком dart/flutter?

    Aetae
    @Aetae
    Тлен
    Если заменить кривой язык для которого за годы и годы работы написали столько костылей, что они уже сложились в более-менее стабильный и устойчивый фундамент, на свежие кривые хипстерские языки от той же тусовки, то всё конечно станет стабильно.
    *сарказм.жпг*

    Ну и интересно, что у тебя там меняется, обратная совместимость в js практически абсолютна. Если ничего не трогать - ничего не сломается.
    Ответ написан
    Комментировать
  • Как реализовать запись аудио через микрофон и отправка на бэкэнд в реальном времени?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Просто берёшь пример из документации и меняешь строку chunks.push(e.data) на отправку blob'а в web-socket.
    Ответ написан
    1 комментарий
  • Не получается установить npm install. требуеться разобрать ошибку?

    scoffs
    @scoffs
    Frontend | C# | Student
    Все пакеты установились, но есть предупреждения о том, что в некоторых из них обнаружены уязвимости.

    Тут можно либо обновить пакеты до актуальных версий (что опасно на старых проектах и не факт, что поможет), либо заменить пакеты на другие. Ну или просто не обращать внимание.
    Ответ написан
    Комментировать
  • Не получается установить npm install. требуеться разобрать ошибку?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Вам английским по черному написали что сделать надо
    Ответ написан
    Комментировать
  • Как сделать такой магазин в телеграме?

    anatoly_kulikov
    @anatoly_kulikov
    Помог ответ? Отметь решением!
    На самом деле все просто - это Telegram Web Apps
    Ответ написан
    Комментировать
  • Странное поведение скрипта js?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    у вас и во втором случае выводится не 2 ***, а 1 *** 2 ***.
    вы добавляете обработчик на каждый раз, а не переопределяете его. вот они и срабатывают все. сначала только 1 обработчик клика, потом 2, потом 3.
    Ответ написан
    9 комментариев
  • В чëм сейчас пишут документацию?

    vabka
    @vabka
    Токсичный шарпист
    Я бы посмотрел в сторону latex, если формул прям много и нужна на выходе адекватная пдфка.

    Схемы - уже зависит от характера схем. Если это какие-то архитектурные диаграммы и блок-схемы с описанием алгоритмов, то я бы взял plantuml и mermaid.

    А про wysiwig бы забыл как страшный сон.
    Ответ написан
    9 комментариев
  • Как вызвать функцию с "именованными аргументами" в JS?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    В целом - ответ "никак". Потому что так делать не надо. Это не очевидно. Код с душком.

    Но если очень хочется, то такие варианты:
    1) Нормальный вариант (даже без душка):
    func(1, undefined, undefined, 2)
    2) Нормальный вариант - объявлять не переменные, а объект на вход c деструктуризацией его свойств:
    function func({ a, b, c, d }) {
      return a+d
    }
    func({ a: 1, d: 2 });

    То есть это сокращённый вариант от такого:
    function func(data) {
      return data.a+data.d
    }
    func({ a: 1, d: 2 });

    3) Грязный вариант - создать новую функцию с забинжеными аргументами:
    function func(a,b,c,d) { return a+d }
    var badFunc = (a,d) => func.bind(null, a, undefined, undefined, d)();
    badFunc(1,2)
    Ответ написан
    4 комментария
  • Можно ли припаять флешку к флешке?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сама идея объединения USB устройств в хабы - заложена в протокол. Благодаря ему и существуют всякие портативные разветвители для ноутбуков. Тоесть 1 слот и там ... до хрена устройств подключить. Это
    как TCP сеть в миниатюре. Вообще после всяких COM/LPT слотов USB шина была прорывом. Размножение
    устройств например на SCSI кабеле было реализовано за счет электрических свойств самого кабеля.
    USB после этого конечно верх удобства.

    По поводу припаять. Скорее всего не получиться. Дело в то что флешка это не кусок памяти. Это
    вполне себе умное и завершенное устройство со своим контроллером и со своими зашитыми
    от производителя возможностями. И это умное устройство паять тоже нужно по умному.

    А так можно попробовать просто вставить 2 флешки в хаб и как-то объединить их в один логический
    volume средствами ОС Linux например. Правда надежность такого волума будет падать.
    Если какое-то устроство отъезжает от случайного шатания слота - то весь диск будет развален.
    Ответ написан
    Комментировать
  • Какое ПО есть для отображения информации на телевизоре?

    datka
    @datka
    В голову приходит только https://magicmirror.builders/
    ну а дальше самому дорабатывать.

    Либо создать локальную страницу и в браузере на телевизоре ёё открыть.
    Ответ написан
    1 комментарий
  • Что написано в .BAT файле?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Удаление пиратского загрузчика.

    Запускаешься в режиме восстановления ОС - она сама все сделает.

    P.S. ты запускаешь левые скрипты, даже не узнав что он делает? Гениально)
    Ответ написан
    6 комментариев