Находясь здесь, в Сан-Рафаэле, казалось, что это хорошая возможность нарисовать пером на бумаге внутренности JavaScript API, представленного в AutoCAD 2014. Это тема, к которой я собирался добраться в течение некоторого времени, и сидя в кубе рядом Альберт Сильваси помогает мне получить информацию прямо изо рта лошади, как это было (без обид, Альберт ;-).
Для тех из вас, кто не знает Альберта, он оказал невероятное влияние на продукт AutoCAD на протяжении многих лет, особенно с точки зрения платформы. Альберт был человеком, который разработал и представил AutoCAD .NET API, и теперь делает то же самое для JavaScript.
Альберт и я возвращаемся назад. Впервые я встретил Альберта в 1996 году (как мне кажется), когда я был в «Developer Consulting Group» (прежнее воплощение «Developer Technical Services» — или DevTech — технический отдел команды ADN). Я выступал на первой конференции разработчиков в Восточной Европе, которую мы провели, в Брно, в Чешской Республике. Я представлял API AutoCAD с особым акцентом на ARX (до того, как он был известен как ObjectARX), и в аудитории был один очень проницательный парень — конечно, Альберт, задававший очень острые вопросы. В то время он еще учился в университете в Венгрии и делился своим опытом реализации проекта, связанного с робототехникой, в AutoCAD с использованием ARX. После мероприятия мы разделили несколько напитков, и я был очень рад, когда Альберт в конечном итоге присоединился к команде ADN в Сан-Рафаэле.
Но я отвлекся: давайте вернемся к разговору о JavaScript внутри AutoCAD …
Чтобы JavaScript работал внутри AutoCAD, мы интегрировали в продукт компонент Chromium с открытым исходным кодом . Это дает нам крайне важную среду V8 для выполнения JavaScript, а также браузер на основе WebKit для рендеринга содержимого HTML. Возможно, вы слышали, что Google форкирует WebKit, чтобы продолжить разработку своего механизма рендеринга Blink . Это ничего не должно изменить для нас, продвигаясь вперед: мы можем в какой-то момент выбрать — перейти на более новую версию Chromium, и она будет основана на Blink .
Одна из главных причин перехода с Chromium, а не с WebKit, заключается в том, что его движок JavaScript — V8 — расширяем. Это позволяет нам добавлять наши специфичные для AutoCAD JavaScript API в движок, делая их доступными для выполняемого им кода.
Chromium размещается в отдельном процессе для AutoCAD: AcWebBrowser.exe. Этот процесс связывается с AutoCAD через IPC — что должно быть хорошо даже для интерактивных процессов, таких как джиг (где мы должны передавать точку из AutoCAD в наш код JavaScript для каждого движения мыши). Это не значит, что с этим взаимодействием не связаны какие-то издержки на маршаллинг — он есть — но преимущества отдельного процесса, выполняющего код, особенно в части изоляции отказов, привели к тому, что мы пошли на компромисс.
Компонент браузера загружает так называемый JavaScript Shaping Layer при запуске. Это общий уровень реализации API, который взаимодействует с хост-средой — в нашем случае AutoCAD — через небольшое количество точек входа / выхода: exec (), execAsync () и registerCallback (). Любые аргументы, необходимые для этих функций, такие как опции, предоставляемые методу getInteger (), будут закодированы в JSON для передачи через механизм IPC.
Прелесть ограничения реализации для использования этих нескольких функций заключается в том, что становится гораздо проще переводить на другие платформы — сам уровень является переносимым, а меньшее количество точек подключения уменьшит объем собственной разработки, необходимой для каждой платформы. По крайней мере, это наше ожидание. Это, конечно, не означает, что не требуется никакой работы для фактического заполнения реализации за этими точками входа / выхода — это работа, которая явно должна произойти, — но мы сохраняем количество основных точек подключения до небольшое количество и разработка их как можно более упорядоченной, что также должно помочь минимизировать воздействие, которое испытывают накладные расходы МПК.
Эта сортировка происходит между собственным прокси-сервером внутри процесса AcWebBrowser.exe и собственной заглушкой в AutoCAD. С — как упоминалось ранее — сортировка данных происходит через JSON.
Что-то, что интересно для разработчиков — и я знаю, что Филипп Лифсма занимался этим и, несомненно, скоро опубликует что-то в AutoCAD DevBlog — это возможность использовать acjsDefun () для регистрации ваших собственных функций-заглушек, которые могут быть получателями входящих вызовов в через IPC. Вероятно, вам потребуется существенно расширить слой Shaping с помощью вашего дополнительного кода JavaScript, который использует вызовы exec (), execAsync () и / или registerCallback (), но вам не нужно будет реализовывать собственный код для расширения реализации прокси внутри процесса браузера.
Одна вещь, которую стоит упомянуть о JavaScript Shaping Layer, который мы создали: он написан на TypeScript , что дает нам возможность работать более объектно-ориентированным образом, чем это обеспечивает JavaScript, до его компиляции в JavaScript и публикации результатов. Это, безусловно, то, что люди, использующие JavaScript API, захотят посмотреть сами, в зависимости от сложности приложения, над которым они работают.
Я думаю, что на сегодня достаточно информации (интересно, если бы кто-то действительно сделал это так далеко — пожалуйста, оставьте комментарий, если вы это сделали! . Я буду следить за дополнительной информацией об этой новой возможности API, когда я ее обнаружу (или раскрою).
Источник — through-the-interface.typepad.com