всем здравствуйте! помогите пожалуйста с выбором ПЕЧАТНОЙ книги про робототехнику...первый раз тут, попросил муж…..нужна книга без перехода на сторонние источники, либо также на печатные книги.по обстоятельствам нет возможности зайти в интернет…ранее работал сис.админом…что-то не совсем для новичков( про робототехнику, технологии...спасибо!
Снова показываю как вести разработку «голыми руками» — без IDE, документации и даже интернета. На этот раз с помощью «пользовательской» Ubuntu Linux и OpenJDK.
Поскольку современные разработчики постоянно жалуются на завышенные требования технических интервью вообще и на мою «дурную практику» написания кода от руки в частности — показываю на личном примере как все это работает.
Жертвам «слабой памяти» посвящается.
Заодно узнаете как можно вести разработку на Java хоть в чистом поле — в самолете, в поезде или на закрытом объекте, без подключения к интернету и документации.
Видео
На этот раз для большего угара помимо статьи было записано и видео, где показан весь процесс «полевой разработки» на Java, с одним только JDK:
Для большей чистоты эксперимента был взят Live-образ Ubuntu Desktop 24.04.3 LTS, записан на флешку, флешка вставлена в один из рабочих ноутбуков, который затем с нее был загружен.
Таким образом получилась абсолютно чистая система, без средств разработки и с отключенной сетью.
Из инструментов у нас будет лишь текстовый редактор и JDK.
И все.
Что будем писать
Самое простое что можно написать в таких полевых условиях — реверс-шелл HTTP-сервер. На самом деле написать можно много чего, особенно если посмотреть в каталог demo внутри OpenJDK:
Набор демо-проектов из состава OpenJDK 24
Здесь и далее скриншоты из другой системы (Manjaro), чтобы не заморачиваться с их перебрасыванием из Live-системы и добавлением в статью. Тем не менее на видео все описываемые в статье шаги и весь код вбиваются каноничным способом — полностью вручную, на чистой системе, загруженной с Live USB.
Демо
Упомянутый выше каталог demo содержит набор довольно серьезных примеров проектов, которых вам вполне хватит для начальной стадии изучения или в качестве основы для какого-нибудь прототипа, особенно если никаких других инструментов и интернета — нет.
Так выглядит демо-проект Notepad, реализующий простейший текстовый редактор:
Окно отладки справа — часть демо‑проекта.
Так выглядит демо Metalworks, с простейшей реализацией мульти-оконной системы (MDI):
Обратите внимание на меню Theme, даже у демо-проекта есть скины!
Напоминаю, что вся эта благодать находится внутри стандартной поставки любой версии JDK, начиная с незапамятных времен 8й версии.
Все демо-проекты содержат исходный код в архивах src.zip и собираются без внешних зависимостей.
К сожалению каталог с демо иногда вырезается ментейнерами дистрибутивов линукса ради экономии места и переносится в отдельный пакет, который пользователи разумеется забывают установить.
Ручная разработка
В ролике в записи показано как автор последовательно вводит и запускает в работу примерно такой код:
// разумеется я не помню названий абсолютно всех // импортируемых классов, поэтому тут стоит '*' importjava.io.*; importjava.net.*; import java.util.concurrent.*;
publicclass MyWebServer {
staticvoid handle(Socket s) { // метод getId() устарел, поэтому его использование в // последних версиях JDK выдает предупреждение System.out.println("Thread: %d" .formatted(Thread.currentThread().getId()));
// самое сложное место, которое удалось повторить на записи // далеко не с первой попытки try(PrintWriter out = new PrintWriter(s.getOutputStream()); BufferedReader in = new BufferedReader( new InputStreamReader(s.getInputStream()));) { // поскольку используется чтение и запись строк а не байт - читаем // строку целиком, т.е. до символа \n String l = in.readLine(); // тут просто показываем в консоль System.out.println(l); // этим простым способом читаем только строку запроса, // которая идет первой, пропустив все заголовки // \r\n (пустая строка) - признак завершения запроса while (l==null || l.isEmpty() || "\r\n".equals(in.readLine()));
// тут мы 'в лоб' сравниваем строку HTTP-запроса целиком // так она выглядит до работы парсера if ("GET /test HTTP/1.1".equals(l)) { // поскольку мы реагируем только на один url '/test' // формируем ниже статичный ответ String data = "Hello from alex0x08 at "+ new Date(); // так выглядят стандартные поля ответа в 'raw' виде, без обработки out.println("HTTP/1.1 200 OK"); // 'close' дает указание браузеру разорвать соединение // с сервером сразу после получения данных out.println("Connection: close"); // поскольку мы отдаем строку - ставим MIME тип 'text/plain' out.println("Content-Type: text/plain"); // опционально отдаем размер данных out.println("Content-Length: " + data.length()); // пустая строка - признак начала блока с данными out.println(); // отдаем сами данные out.println(data); } else { // во всех остальных случаях формируем ответ 404 out.println("HTTP/1.1 404 Not Found"); out.println("Connection: close"); out.println(); } // нужно обязательно вызывать поскольку PrintWriter кеширует данные out.flush(); } catch (Exception e) { e.printStackTrace(); } finally { // в любом случае закрываем клиентский сокет try {s.close();} catch (Exception ee) {} } } // стартовый метод приложения publicstaticvoid main(String[] args) throws Exception { System.out.println("Starting.."); // тоже сложное место, которое было непросто ввести по памяти ExecutorService p = Executors.newFixedThreadPool(10); // создание 'серверного' сокета, который будет прослушивать // указанный порт // поскольку хост не указан - будут прослушиваться все (0.0.0.0) ServerSocket ss = new ServerSocket(8089); // бесконечный цикл, который нужен тк метод accept() - блокирующий // и выход из него произойдет после получения входящего подключения while (true) { // получен клиентский сокет Socket s = ss.accept(); // запуск асинхронной обработки p.execute(() -> handle(s)); } } }
Комментариев в той версии кода, который был показан на записи разумеется нет, они были добавлены уже после — для большего понимания.
Данный исходный код реализует простейший многопоточный веб-сервер на Java, который отвечает лишь на один URL /test и отдает заранее заданную строку с датой.
Как видите даже столь небольшого количества строк достаточно, чтобы можно было подключиться из современного браузера Chrome:
Компиляция выполняется как и в записи всего одной командой:
После чего появится один единственный class-файл c совпадающим именем. Поскольку пакеты не использовались, для запуска достаточно указать в качестве classpath текущий каталог:
java -cp . MyWebServer
Но это все лирика и понты.
Когда кончается человеческая память
Разумеется невозможно запомнить абсолютно все и рано или поздно вы столкнетесь с названием метода или класса, которые надо где-то подсмотреть.
Для примера, автор при записи видео столкнулся с таким в двух местах:
длинные классы-обертки над потоками (stream) сокета и сложное название статичного метода, создающего экземпляр ExecutorService.
И то и другое получилось правильно ввести далеко не с первой попытки.
Возвращаясь к ситуации когда нет доступа к интернету и полноценной среды разработки, зато на машине есть JDK — показываю что можно сделать в этом непростом случае.
Невероятно но факт:
подсмотреть названия системных классов и методов можно.. в самом JDK!
Вот это поворот!
В последних версиях JDK появилась интересная утилита jimage, которая находится в каталоге bin (там же где и главные бинарники java и javac).
С помощью этой штуки можно легко посмотреть полные названия всех системных классов:
Листинг системных классов JDK с полными именами.
Правда знание полного имени класса не всегда помогает, поскольку в JDK много вложенных системных классов, которые по идее вызывать снаружи не надо.
Команда для запуска:
jimage list $JAVA_HOME/lib/modules |less
Где переменная JAVA_HOME указывает на каталог с установленной JDK:
Так вы увидите названия всех системных классов, но что делать с методами?
Вытаскиваем сигнатуры методов
Тут тоже есть решение, поскольку эта же самая утилита позволяет распаковывать jmod-файлы в которых находятся системные классы JDK:
А еще одна утилита javap позволяет посмотреть метаданные class-файла, в том числе сигнатуры всех методов:
cd /opt/src/tmp/jre javap java.base/java/nio/Bits.class
Так выглядит результат:
Вот этого уже с запасом хватит для полевой разработки в условиях крайнего Севера.
Если у вас есть реальный, не "нарисованный" опыт разработки на Java, двух этих трюков будет достаточно для работы в поезде или самолете или на чужом компьютере — в тех местах и обстоятельствах, где нет подготовленного рабочего места.
Исходники JRE
Если вам совсем повезет, в каталоге JDK/lib будет находиться файл src.zip, внутри которого будут исходники всех системных классов JRE:
«Повезет» — потому что также как и demo, этот файл часто удаляют ментейнеры дистрибутивов Linux, с переносом в отдельный пакет. Но разумеется если он присутствует, то поможет гораздо больше чем все приседания с javap.
В распакованном виде:
Внутри находится исходный код всех классов Java, используемых в JDK:
cat java.base/java/io/Bits.java |less
Для примера, так выглядит исходный код класса java.io.Bits, который мы просматривали выше с помощью javap:
Как видите тут есть все, включая комментарии.
Эпилог
Смысл такой «полевой разработки» — в первую очередь глумеж над джунами проверка реальных практических навыков, которые находятся в голове у программиста, а не где‑то в интернете. К сожалению ныне можно констатировать, что такие навыки являются большой редкостью и мало кто из кандидатов, которых я когда-либо собеседовал могли осилить написание хотя‑бы трети подобного кода.
Кстати в нашем Телеграм-канале выложено первое техническое видео, где впервые получилось проверить всю эту идею.
Периодически думаю про Римскую империю отечественную микроэлектронику, Байкалы и Эльбрусы. И вот захотелось поделиться своим проектом. Вообще, ситуация с разработкой чипов у нас двоякая: с одной стороны, компаний, которые умеют проектировать процессоры, в мире по пальцам пересчитать, и мы в этом клубе. С другой — сами понимаете, своего массового современного производства пока не хватает.
Отрасль надо поднимать, и очевидно, что начинать растить инженеров нужно со школы. У крупных контор вроде YADRO есть свои образовательные инициативы, но порог входа там обычно довольно высокий.
Я сам когда-то давно преподавал архитектуру ЭВМ студентам И, честно говоря, объяснять работу процессора, стоя у меловой доски — то еще удовольствие. Рисуешь эти триггеры, мультиплексоры, шины... Студенты кивают, но по глазам видно: для многих системный блок так и остается «черным ящиком» с какой-то непонятной магией внутри. Я долго искал простой наглядный тренажер, чтобы можно было прямо руками пощупать логику, но ничего подходящего не нашел. Ну и в итоге решил написать свой.
Что получилось
Сделал браузерный симулятор (соответственно, скачивать и даже регистрироваться не надо). Назвал «Алгоритм Ершова» — в честь нашего академика Андрея Петровича Ершова (я сам из Академгородка, у нас это имя знаковое). Он говорил, что «программирование — вторая грамотность». А мне кажется, что понимание того, как это программирование физически работает на уровне железа — это тот самый базис, без которого никуда. Примерно как буквы в общей грамотности :)
Алгоритм Ершова, простая схема
По сути, это игра-головоломка. Вы начинаете с абсолютного нуля:
Сначала просто соединяете проводами вентили И, ИЛИ, НЕ.
Потом из этого собираете сумматоры и ячейки памяти.
Шаг за шагом сложность растет, и в финале вы строите полноценный 8-битный процессор по гарвардской архитектуре. А потом еще и пишете для него код на ассемблере.
Алгоритм Ершова, сумматор
Зачем пишу сюда
Проект полностью бесплатный. Моя глобальная цель — допилить его до такого состояния, чтобы можно было спокойно внедрять в учебный процесс в школах, кружках робототехники или универах вместо скучных лаб.
Поэтому пришел за критикой к местным гикам и айтишникам. Потыкайте, пожалуйста. Где криво? Где логика ломается? Где слишком сложно для новичка?
А я всеми конечностями за классическую клавиатуру. 101/103 или 105 клавиш (сейчас пересчитал на своей).
Используются абсолютно все кнопки - и пауза и скрол-лок, в том числе.
Нас столько лет приучали к ней, и это был такой кайф после тугих резиновых 40 клавиш "Спектрума". Да, иногда приходилось перепаивать убитые клавиши после матчей по Mortal Kombat, но это уже лирика..
Она классно заменяла тупящие мышки с шариком. При использовании "КоммандЭра"(хоть Norton(VC/DN), хоть Total) мышь не нужна и любые операции с файлами легко осуществляются вслепую, ибо все комбинации клавиш очень удобны. Горячие клавиши в Winamp, браузере, Word/Excel. Не надо лезть никуда в меню - всё легко запоминается и потом многократно используется в полной темноте.
Далее пошли ноутбуки - кнопки в куче, переставлены местами, где-то совсем(!) нет клавиши вызова контекстного меню (благо, что Shift+F10 помним с 90-х) или Delete в другом месте - просто пытка!
А потом производители клавиатур стали извращаться и даже на полноразмерных клавиатурах стали менять расположение кнопок как им вздумается! Зачем, бл...??? Найти стандартную клавиатуру из дешёвых уже не так просто, потому что блок PrintScreen-ScrollLock-Pause уехал в лево, F12 сместили, блок PgUp-Delete всё чаще стоит вертикально. На хрена так делать???
Извиняюсь, за этот крик. Может это просто бред старпёра, который не принимает и не понимает новые технологии с сенсорными экранами и хочет нормальный выбор смартфонов с цифровой клавиатурой. Ну реально, как классно было на Symbian набирать тексты в форумах цифрами - нас ведь столько лет учили писать SMSки на цифровой тугой клавиатуре.
Эх, где мои 17 лет KBS-720 c железным днищем, недорогие, но приятные!
Можно чёрную! Можно плоскую(LCDS)! Но, чтобы все кнопки были на своих местах, без перестановок и укороченных бэкспейсов и шифтей и "ВК"!
[картинка KBS-ки, для примера, из глобальной сети]
Когда человек впервые видит раздельную клавиатуру, разговор почти всегда начинается с вопроса: — На ней вообще можно работать?
Следом звучит второй: — И зачем переучиваться, если обычная клавиатура и так выполняет свои функции?
Мне кажется, проблема в том, что большинство из нас никогда и не переучивались печатать. Мы просто один раз привыкли к той клавиатуре, которая стояла перед нами.
Поэтому сравнивать особенно не с чем.
Первая неделя. Кажется, я разучился печатать
Первые несколько дней проходят довольно странно. Ты знаешь, где находятся буквы, но пальцы упорно тянутся в другие места. Скорость падает, ошибок становится намного больше. В такие моменты хочется достать обычную клавиатуру и просто нормально закончить работу.
Большую часть жизни мы печатаем не потому, что помним расположение клавиш. За нас всё делает мышечная память. И вот эта память внезапно дает сбой. Пальцы едут туда, где кнопок уже нет. Руки на автомате пытаются соединить две половинки корпуса обратно, а большие пальцы вообще не понимают, почему теперь им тоже придется работать.
Появляется мысль: «Наверное, это была плохая идея».
Вторая неделя. Начинаешь замечать вещи, которых раньше не видел
Внимание с клавиатуры переключается на собственные руки. Постепенно осознаешь, что во время работы ты не только набираешь текст. Твои кисти почти не стоят на месте: ты постоянно тянешься к стрелкам, уводишь руку к цифрам, почти все сочетания клавиш нажимаешь мизинцем, а большие пальцы просто лежат на пробеле.
Раньше эти микродвижения казались естественными, но из них складывается весь рабочий день. До этого момента ты их просто не замечал. Они настолько вошли в привычку, что казались неотъемлемой частью процесса.
Только теперь начинаешь задаваться вопросом: обязательно ли вообще так много двигать руками? Начинаешь отделять саму задачу от инструмента, которым она решается.
Третья неделя. Мозг начинает перестраиваться
К третьей неделе происходит самое интересное. Вдруг ловишь себя на мысли, что больше не ищешь взглядом каждую клавишу. Пальцы привыкают. Но главное изменение случается, когда начинаешь разбираться, зачем нужны слои. До этого они казались странной и избыточной затеей: «Зачем прятать цифры?», «Почему нет стрелок?».
Но стрелки никуда не исчезли. Они находятся прямо под пальцами и появляются ровно в тот момент, когда необходимы. Зажал одну клавишу — и буквенный блок превратился в навигационный. То же самое происходит с цифрами, скобками и функциональными клавишами.
Руки двигаются заметно меньше. Оказывается, важно не количество клавиш перед тобой, а скорость доступа к нужной кнопке.
Через месяц клавиатура больше не отвлекает
В какой-то день обнаруживаешь, что совсем перестал думать о раскладке. Ты больше не вспоминаешь, где находится тот или иной символ, и не тянешься к отдельному блоку стрелок. Процесс становится непрерывным: внимание сфокусировано на тексте, коде или задаче, а не на поиске кнопок.
Большие пальцы наконец-то берут на себя полезную нагрузку. Под них обычно переносят клавиши, которые нажимаются сотни раз за день: Enter, Backspace, переключение слоев и модификаторы. В результате рутинные действия перестают быть нагрузкой только для слабых мизинцев. Два самых сильных пальца руки годами бездействовали просто из-за стандартной конструкции.
Кисти почти не меняют своего положения. Цифры, стрелки, скобки, символы и горячие клавиши теперь нажимаются из одной позиции. Со временем это становится новой нормой.
Инструмент подстраивается под тебя, а не под привычки производителя
На обычной клавиатуре все пользуются примерно одним и тем же расположением клавиш.На раздельной же впервые задаешь себе вопрос: «Что именно я нажимаю чаще всего?».
Если ты целый день пишешь код — хочется, чтобы рядом были скобки, спецсимволы и хоткеи IDE. Если работаешь с текстом — важнее становятся Enter, Backspace, выделение слов и навигация. Если редактируешь фотографии — приоритет отдается совсем другим сочетаниям. Постепенно девайс начинает отражать именно твой стиль работы. Горячие клавиши перестают быть неудобными акробатическими комбинациями, ведь их можно расположить там, куда палец ложится сам.
Значит ли это, что обычная клавиатура плохая?
Нет.
Она справляется со своей задачей и остается универсальным решением для миллионов людей.
Однако после месяца с раздельной клавиатурой ты перестаешь воспринимать её как готовый продукт с неизменяемым набором кнопок, который обязан подходить всем. Это инструмент, который можно и нужно адаптировать под себя. Кто-то переносит стрелки, кто-то меняет логику цифр, кто-то создает отдельные слои под Photoshop или код. Клавиатура становится продолжением рабочего процесса её владельца.
Когда я только начинал этот эксперимент, мне казалось, что главная цель — привыкнуть к новому устройству. Через месяц ты просто перестаешь их сравнивать.
Вместо этого у тебя появляются вопросы к стандартным:
Почему клавиши расположены именно так, со смещением?
Почему большие пальцы почти не используются?
Почему стрелки вынесены в отдельный далекий блок?
Почему ради базовых символов приходится сдвигать всю кисть?
Многие вещи, которые всю жизнь казались единственно верными, — это просто старые инженерные компромиссы, к которым мы привыкли. Почти каждое из них — расположение клавиш, работа больших пальцев, отдельный блок стрелок, верхний ряд — всего лишь один из вариантов.
И это, пожалуй, стало моим самым неожиданным открытием.
Если вам тоже интересно исследовать, почему клавиатуры устроены именно так, я веду телеграм-канал ergosplits.
Там я рассказываю о сборках, раскладках, прошивках и эргономике. Показываю модели, которые собираю сам, и делюсь клавиатурами, которые можно заказать.
Это настройка, где можно самому разметить экран чтения: какая область листает вперёд, какая назад, где открывается меню, где меняется яркость, а где вообще ничего не происходит.
Сначала думал, что это будет небольшая фича. Ну что там: прямоугольник, действие, сохранить.
Но дальше началось интересное.
Нужно было сделать так, чтобы зоны можно было двигать, растягивать, удалять, пересекать друг с другом и при этом не превратить настройку в панель управления космическим кораблём.
В текущем виде задумано так:
можно создать несколько зон;
перетащить зону куда удобно;
растянуть за угол;
выбрать действие;
поставить пресет;
очистить всё и вернуться к обычной схеме.
Из действий есть листание вперёд/назад, меню, закладки, оглавление, яркость плюс/минус, TTS, выход из приложения и “ничего”.
“Ничего” оказалось не шуткой. Иногда реально нужна область экрана, которая не делает ничего. Например, если туда часто случайно попадаешь при чтении.
Отдельно пришлось решать пересечения.
Например, можно сделать большую зону “вперёд” почти на весь правый край, а поверх неё маленькую зону “меню” в углу. Тогда возникает вопрос: если тап попал сразу в обе зоны, кто победил?
Я сделал правило простым: побеждает меньшая зона. Обычно маленькую область ставишь специально, а большая работает как фон.
Самая неприятная часть была не в математике прямоугольников, а в жестах.
В Compose зона могла начать перетаскиваться, потом интерфейс пересобирался, pointerInput перезапускался, и drag срывался прямо во время движения. Визуально это выглядело так, будто блок просто отлип от пальца.
Починилось через стабильные ключи для зон. Без key Compose начинал путать элементы при изменении порядка отрисовки, особенно когда выбранная зона поднималась поверх остальных.
В итоге фича получается больше, чем я ожидал. Не просто «тап слева/справа», а маленький редактор управления чтением. Выйдет в следующем обновлении.
Параллельно в последних версиях уже завезено: полка «Читаю», дробные проценты прогресса, PDF-фильтры, кроп, контраст, настройка карточек в библиотеке и фиксы для больших библиотек.
Но тап-зоны сейчас, наверное, самая заметная штука именно в интерфейсе чтения.
MRead бесплатный, без рекламы. GitHub использую как страницу релизов: APK, changelog и контрольные суммы.
Скачать, посмотреть changelog и закинуть баг/идею удобнее всего через канал - там же все ссылки на сторы в закрепе:
Продолжаем развивать игровую платформу. Добавил 9 игру всем знакомую классику. Принципиально не использую эмуляторы или сторонние библиотеки. Пока мобильными версиями не занимался, имбо не хочу сейчас. Но в целом прогресс идет.
Так же добавил фильтрацию, которая находиться на главной странице и подгружает данные с сервера. Сейчас буду начинать доделывать то, что хотел, а именно чат. Отдельный чат как у телеграмм( правда только 2 варианта, мини на самом сайте и веб версию), шифрование для запрета доступа к данным и просмотра их без мастер ключа , я уже сделал. Самого мастер ключа на сервере нет в принципе. Только ручной ввод.
Сам ИИ раскрывается только после регистрации . ДО нее он на минималках.
Следующие игры которые я планировал (так как у меня есть возможность сделать 3Д ввиду изначальной разработки платформы под масштабирование) 1) Бомбермен 2) Танчики (онлайн , ии и т.д) 3) Пак ман 4) Тут уже будет полноценная однопользовательская игра написанная под движок платформы. Начнем с Синдиката . 5) X-Com Единственная проблема кака я рисовать это буду, так как нужны спрайты .
Так как я использую свой код , название меняю. ТО во первых платформа не может попасть под санкции. Так как идея и механика не может быть запатентована. Ну и так же работают без задержек и прогрузки, так как нет эмуляторов.
Или что бывает если заставить очень опытного разработчика заниматься не своим делом. Думаю после этой статьи термин «overqualified» заиграет для вас новыми красками.
Пять минут вдумчивого изучения этого скриншота могут привести к нервному срыву, я предупредил.
Наш волшебный дикий веб
Что первым делом приходит в голову, когда говорят о «веб-разработке»? Наверное что-то вроде "создание сайтов или веб-приложений"?
Лендинги, сайты-визитки, интернет-магазины или какие-нибудь веб-порталы в ад.
Самые продвинутые из читателей вспомнят PWA или какой-нибудь React Native с Flutter — предел полета фантазии обычного разработчика.
Что плохо:
главное что отделяет человека от великих свершений это его фантазия — точно нельзя сделать только то, что невозможно вообразить.
Поэтому сейчас мы будем расширять ваше воображение — в превентивных мерах, дрелью и дыроколом подручными средствами. Перед вами шесть проектов отборнейшей дичи — реализующих самые безумные идеи с помощью вполне обыденных инструментов современного веб-разработчика.
Пожалуйста не пытайтесь рассказывать о таком на интервью в обычных компаниях — пожалейте интервьюера и его нежную психику.
Дичь первая: HTMLang
Не смог пропустить столь жизнеутверждающее описание от автора этого замечательного проекта:
They were laughing that HTML was not a real programming language... WHO"S LAUGHING NOW!!11
Да, это именно то что вы подумали — кто-то будучи сильно не в духе взял общий синтаксис HTML и создал на его основе полноценный язык программирования.
Не представляю что будет если самому Джоэлу выдать его же знаменитый «FizzBuzz» в такой реализации — есть шанс что старый сишный программист впадет в рекурсию.
Кстати кто там рассказывал на лекциях про «декларативный язык разметки» и «общую неполноценность»?
HTML (от англ. HyperText Markup Language — «язык гипертекстовой разметки») — стандартизированный язык гипертекстовой разметки документов для просмотра веб-страниц в браузере.
Зря старались, автор этого проекта тем временем спокойно пишет в консоль тегами HTML:
А все потому, что не надо нанимать системных программистов, прошедших полноценное обучение по дисциплинам CS (вроде курса по разработке компиляторов) для работы штатным говночистом разработчиком в обычном корпоративном проекте.
Дичь вторая: HTML-as-programming-language
Нехорошие мысли терзают многих опытных разработчиков — все та же идея «полноценной разработки на HTML» не дает покоя и автору данного проекта.
Но только он зашел в этом процессе несколько дальше предыдущего.
Как вам например функция на чистом HTML:
<def multiplyFunction returns=int> <!-- You can create functions --> <param a type=int/> <param b type=int/> <return>a * b</return> </def>
<def main> <var result type=int> <!-- Create variables --> <multiplyFunction> <!-- and store the result of the function in the variable --> <param>5</param> <param>6</param> </multiplyFunction> </var> </def>
Известная библейская истина «многие знания — многие печали» — как раз про этот проект, например я бы очень хотел все это забыть и никогда о подобном не знать.
Но к сожалению уже слишком поздно, поэтому делюсь откровениями:
Замечательный пайплайн с вызовом компилятора HTML, правда?
Да, вы все правильно поняли — это самый настоящий компилятор из HTML в нативный ELF64.
А сейчас совсем поплохеет:
To write code for Adruino/AVR microcontrollers, (Arduino UNO for example) you need to put a DOCTYPE tag in your HTML file.
For example:
<!DOCTYPE avr/atmega328p>
Да, это была оригинальная задумка автора — разработка для микроконтроллеров на HTML, я ничего не придумываю.
К слову, небольшая магия с #include <stdio.h> на скриншоте выше была необходима как раз потому, что компилятор предназначен для микроконтроллеров и не добавляет в генерируемый код на С этот стандартный для обычной ОС заголовок.
Вот так выглядит эта железка, если никогда не видели.
К сожалению у меня не оказалось под рукой такого девайса, так что полноценную работу и весь пайплайн проверить не смог. Но если среди читателей найдутся смелые люди, которые смогут это запустить — с радостью почитаю о впечатлениях.
А мы тем временем переходим к следующему замечательному проекту.
Несмотря на то что автор честно пишет о куче недоработок:
Work in progress: it works, but only about 70% of ES3 specification is currently supported: statements and expressions - 95%, built-in objects - 17%.
Скажу что это самый работоспособный проект из серии, все остальное буквально рассыпается в руках. Рассыпается и валится как и следующий объект исследования.
Дичь пятая: nerd
Как легко и быстро понять что исследуемый проект — дикое, нерабочее и глючное говно?
По описанию, обещающему бесконечные ништяки:
Javascript's God Mode. No VM. No Bytecode. No GC. Just native binaries.
Отсылка к чему-то божественному в описании технического проекта это вообще практически 100% диагноз, можно отбраковывать только по одному этому признаку — врядли ошибетесь.
Как нетрудно догадаться, вместо нормального JavaScript тут тоже что-то свое божественное:
NerdLang is a substract of JS with some additions, focus on efficiency.
И это «свое» скажем так застряло в далеком прошлом:
Supporting EcmaScript 3 standard
На минуточку, 3я редакция стандарта вышла еще в далеком 2000м году.
А сам проект пытается в который раз «натянуть сову на глобус» и залезть туда, где последовательно обломали клыки все крупные корпрорации уровня Google:
Nerd is a JavaScript native compiler aiming to make JavaScript universal, Nerd is able to compile native apps for Windows, Mac, Linux, iOS, Android, Raspberry, STM32 and more.
Разумеется я не мог пройти мимо такого, поэтому всю эту дичь собрал и запустил, хотя и пришлось немного исправлять скрипты сборки.
Пайплайн (присутствует на титульном скриншоте) выглядит вот так:
Автор настолько суров, что запихал инстукции сборки и линковки модуля работы с сокетами в package.json:
Увидев вот такой package.json, знакомый веб-разработчик решил навсегда уйти из профессии и теперь пасет коз в горах Кавказа. Ну а я всего лишь не рискнул адаптировать такое для сборки под Linux, так что вы останетесь без примера запуска HTTP-сервера на этом чудище.
Дичь шестая: lemon
Наконец последний на сегодня проект, который по сравнению с предыдущими является можно сказать нормальным и где-то даже применимым:
Lemon is a framework for building Javascript runtime software, built on the Chrome V8 Javascript Engine.
Мне он понравился своей предельной простотой (по сравнению со всеми остальными проектами) и легкостью встраивания.
Ниже показано как выглядит двойной «Hello, world», в котором есть как часть на JavaScript так и часть на C++ — немного подумав объединил два примера из документации в один.
App.js:
version(); console.log("Превед из JS"); helloworld();
App.hpp:
#ifndef APP #define APP
#include "../engine/Lemon.hpp" using v8::Context;
class App : public Lemon { public: void Start(int argc, char* argv[]); void SetupEnvironment(); }; #endif
for (int i = 1; i < argc; ++i) { // Get filename of the javascript file to run constchar* filename = argv[i]; // Create a new context for executing javascript code Local<Context> context = this->CreateLocalContext(); // Enter the new context Context::Scope contextscope(context); this->CreateGlobalObject("console") .SetPropertyMethod("log", Log) .Register(); // Run the javascript file this->RunJsFromFile(filename); } }
Чудны дела твои Господи, коль даже перебирая запредельную дичь есть шанс найти столь мощный проект.
Спросите с чего столько радости?
Потому что это самый настоящий V8, не самопал с реализацией ECMAScript «в переводе Гоблина», а именно тот самый движок, который используется в браузере Chrome — со всеми оптимизациями и наворотами.
А значит при определенных усилиях, у вас будет работать практически любой JavaScript код — в вашем нативном приложении, без всяких жирных Node.js и всех проблем с линковкой и версиями.
Словом берите на вооружение, пригодится.
Одной строкой
Конечно же интересных проектов в области творения дичи куда больше чем хватит сил описать, поэтому ниже небольшая подборка найденного и интересного, но неработающего.
Compile javascript to LLVM IR, x86 assembly and self interpreting
К сожалению оказался прибит гвоздями к определенной версии MacOS, ни нормально собрать ни прогнать тесты под Linux не удалось. Интересен тем что в одном проекте собран и интерпретатор и компилятор, причем в нативный бинарник.