Серия «Доступно об АйТи»

1561

Ответ на пост «Или не имеет смысла»3

Доступно об АйТи: Почему осталось всего два браузерных движка

Исходный мем

Исходный мем

Я застал время, когда движков было четыре: Trident (IE), Gecko (Firefox), WebKit (Chrome) и Presto (Opera).

Ныне осталось два: Quantum (Firefox) и Blink (Chrome).

На первом работают специализированные «лисицы» вроде какого-нибудь полностью освобождённого IceWeasel или защищённого Tor Browser. На втором — целая плеяда хромоидов вроде Opera, Vivaldi, Brave и (тьфу-тьфу) Амиго, а также куча софта вроде Steam и Slack, представляющие собой браузер, показывающий единственный сайт.

А причины две — крайняя сложность и проникшая в веб-стандарты защита от копирования.

Сложность

Я по крайней мере в браузере вижу такие основные части.

  1. Сетевая подсистема — обращение к сети, поддержка протоколов.

  2. Движок рендеринга — показ страниц.

  3. Типографский движок — вывод текста.

  4. Движок скриптинга — выполнение JavaScript.

  5. Фреймворк безопасности — дополнительная защита от ошибок.

Когда человек пишет мини-браузер, предназначенный для показа каких-то текстов в его проге, он пишет только одно — рендерер, причём не с веб-качеством.

«С веб-качеством» означает: настолько защитное программирование, что маловероятно, что обнаружится критичная ошибка. Кстати, Rust — новый язык программирования, набирающий силу — был сделан именно для Firefox, чтобы уменьшить вероятность таких ошибок.

Скорость тоже важна — долго Firefox тормозил на системе отслеживания ошибок Jira.

Собственный типографский движок позволяет рендерить загружаемые шрифты, снижает риск критичной ошибки при рендеринге сложных строк и раньше всех поддерживает новые версии Юникода. Так уж вышло, что ставший де-факто стандартом формат шрифтовых инструкций OpenType определённые свойства символов берёт из типографского движка — в отличие от альтернативного Graphite, который всё своё носит с собой.

В сентябре 2024 года в Юникод добавили гарай — экспериментальную (уступившую латинице и нко) африканскую письменность. Юникод устроен так, что проги давным-давно знают, что определённый диапазон кодов зарезервирован под письменности справа налево, но с умляутами беда. Firefox первым корректно поддержал гарай около Нового 2025 года, a хромоиды всё ещё (октябрь 2025) не поддерживают.

Простите за корявость

Простите за корявость

Кстати, типографский движок у всех браузеров один — Skia за авторством Гугла. Просто Рыжая добавила в него свежие базы Юникода, а авторы хромоидов — нет.

Почти все сайты заскриптованы так, что превратились в настоящие программы, и браузер должен уметь выполнять эти программы корректно и быстро. Оба движка, Blink и Quantum, не просто интерпретируют JavaScript, но и умеют компилировать его в процессорный код!

Наконец, фреймворк безопасности — сравнительно новое (десять лет в обед 😊) изобретение Гугла, впоследствии реализованное и Firefox в своём Quantum. Уязвимости случаются, и задача этого компонента — сделать, чтобы «пробитая» память не доросла до критической уязвимости. Для этого браузер раскидывает работу по процессам с минимальными правами, в результате ошибки закрываются без особого шума, браузер редко зависает целиком, никогда не «падает» и потребляет уйму памяти. 😊

Если вы писали расширения браузера, то знаете, что есть центральный скрипт и скрипт вкладки, и между ними общение только сообщениями — это тоже «вина» фреймворка безопасности.

Защита медиаконтента от копирования

У нас не важно, на Западе — очень.

Скорее всего, была пролоббирована Netflix. До этого он использовал Silverlight, и часто этот странный плагин устанавливали только для того, чтобы смотреть Netflix. Существуют три подсистемы защиты: Microsoft, Apple и Google; все хромоиды и Firefox управляются последней. Гугл даёт ключи неохотно: появившийся в 2015 году Vivaldi только в 2020-м отпраздновал включение в гугловский Widevine.

Главное препятствие для написания своей системы — убедить киношников доверять ей.

Как-то так. Когда-то самолёты строили в гаражах, сейчас нельзя. По моим прикидкам, некоторые отрасли являются таким хайтеком, что для прибыльности нужен едва ли не целый мир, и устойчивая конфигурация там — один лидер и один аутсайдер, не дающий лидеру заламывать любые условия. И Гугл намеренно содержит аутсайдера Firefox: останется один — государства на него обрушатся и/или вырастет значительно менее удобный для него аутсайдер.

Показать полностью 2
13

Доступно об АйТи: Нейросеть в роли депутата2

Как сказал один депутат, «у нейросети нет совести». У мало-мальски опытного политика её тоже нет. А у нейросети нет кое-чего другого.

Иллюстрация на тему китайской комнаты

Иллюстрация на тему китайской комнаты

LLM не знает фактов, она запоминает слова. Существует мысленный эксперимент под названием «китайская комната». Вы сидите в комнате, наполненной карточками с иероглифами. Вы не знаете китайского, но имеете огромный свод правил типа: получив иероглиф 1, ответить иероглифом 2. Считаетесь ли вы знающим язык?

Но ведь большая языковая модель — это именно китайская комната, только очень сложная.

Интереса ради я спросил у DeepSeek: «Российская подводная лодка всплыла на озере Титикака — будет это поводом к войне?» Да, она отлично поняла, что такая ситуация невозможна и вопрос скорее провокационный, и это делает ей честь, но приведу кусочек ответа.

Подняться в горы на высоту более 3800 метров. Озеро Титикака — высокогорное. Подводная лодка — это тяжелое судно, которое невозможно транспортировать по горным дорогам скрытно. Единственный теоретический путь — через реки, но они либо несудоходны для таких размеров, либо ведут к водопадам и порогам.

Другими словами, DeepSeek не знает, что озеро Титикака изолировано от Мирового океана. Совсем изолировано — из него вытекает одна река в бессточное озеро.

Нейросеть не знает, что такое нейросеть не знает. Ни одна известная мне нейросеть не может сказать: я не знаю. На задачи, далёкие от обучающей выборки, она постоянно пытается придумать отговорки, как последний троечник.

Чтобы заглючить DeepSeek, я написал ей: «Сяпала Калуша по напушке и увазила бутявку», и она сработала не блестяще, но очень хорошо:

Это замечательная фраза из языка «Каламбура» или так называемого «абсурдного стиля», который использовали писатели-обэриуты (Даниил Хармс, Александр Введенский и другие).

Калуша — вымышленное существо, похожее на птицу или некое живое существо (сравни: «курица», «луша»).

Вот из-за этого «луша» я и не могу сказать, что «блестяще». Но тогда я пришёл к DS с прямым вопросом: «Кому фраза принадлежит?» И она ответила: Даниилу Хармсу.

Нет, ребята, фраза принадлежит Людмиле Петрушевской.

На эту тему есть очень много любительских мультиков, но я специально привёл тот самый из девяностых.

По одним данным, автопилот Tesla работает значительно лучше людей, по другим — несколько более аварийный (сам я полагаю нечто среднее: почти не влезает в микро-ДТП, но если бахнет, то гарантированно убьёт). Но меня шокировала одна из аварий — автопилот ночью врезался в перевернувшуюся фуру. Грузовик перегораживал дорогу, и автопилот его не распознал как непонятное препятствие, не тормозил вообще и поздно пошёл в объезд. Это то самое — нейросеть не знает, что такое нейросеть не знает.

И уж тем более нейросеть не способна на режим «я не знаю, но знаю, где узнать» — мы, айтишники, постоянно этим занимаемся.

Как быть с постоянно меняющейся ситуацией в мире? Обучение нейросети — серьёзная задача, игрушечная нейросеть из пары сотен нейронов, которой я приближал физические модели, обучается несколько секунд. DeepSeek V3 обучался 2,8 млн GPU-часов. Как обучать нейросеть новым фактам и новой статистике?

И последнее — человеческий фактор. Подбором обучающих данных, указанием важности, заданием особых правил всё равно занимаются люди. Которые значительно более уязвимы, чем депутаты — их единицы (максимум десятки), они не так охраняются, они люди подневольные, их легче подкупить. Да, некоторые силы любят депутатов без бизнеса, и ровно по этой причине: они тоже подневольные и будут голосовать ровно так, как скажут сверху.

По этой причине, кстати, некоторые виды цифровизации очень любимы марионеточными режимами, но трудноосуществимы в суверенном государстве — слишком уязвимы люди, отвечающие за работу системы.

Нужна ли нейросеть депутату? Нужна. Но не для того, чтобы писать законы, а чтобы оттачивать формулировку. Возможно, подсказывать какие-то места из законов. Но на современном уровне развития техники машина не может писать законы для людей.

И простите, если дудоню бутявку.

Показать полностью 2
146

Доступно об АйТи: «Сейчас, погоди, дискетку доформатирую»

Начнём с анекдота.

Подходит ребёнок к Гейтсу:
— Покажи, что такое многозадачность.
— Сейчас, погоди, дискетку доформатирую.

Попытаюсь объяснить, откуда ноги растут.

На самом низком уровне

Компьютерное железо на уровне процессорных команд представляет собой некое подобие памяти. Если говорить упрощённо, есть адрес памяти или несколько — например, от B800:0000 до B800:3FFF (страница цветного текстового режима, если что). Пишем в эти адреса данные, текст появляется на экране.

Всё классно, кроме одного вопроса.

Если платформа «взлетит», в будущем появятся компьютеры с другой конфигурацией «железа». Как обеспечить совместимость сверху вниз, чтобы уже сейчас теперешнее ПО было готово к ещё не появившимся компьютерам?

И тут есть два способа.

  1. В новом «железе» сделать совместимый режим, принимающий такие же команды, как и старое. Известный пример — переход накопителей в начале 2010-х на 4-килобайтный сектор диска, когда винчестеры делали вид, что секторы на диске старые 512-байтовые (ценой сниженной производительности).

  2. Сделать программную прослойку — драйвер. Грубо говоря, мы у драйвера спрашиваем: а что ты можешь? И он отвечает: я диск из 500 миллиардов 4-килобайтовых секторов, механический. А давай прочитай сектор №1234…

Кто пишет драйверы?

В реалиях современных 32- и 64-битных ОС — производитель «железа» и собственно ОС. Опустим проблему, когда аппаратура есть, а драйвера под нужную ОС нет. С критичным «железом» — экраном, дисками, клавиатурой — получается порочный круг.

Где хранится драйвер? — На диске!

Как читать диск? — Через драйвер!

Как разорвать круг?

Знакомьтесь, BIOS!

Basic input/output system = базовая система ввода вывода. Это прошивка материнской платы, изначально (в исходном IBM PC) вообще 8 килобайт, решающая три основных задачи.

  1. Минимальный тест памяти и прочего оборудования.

  2. Конфигурирование оборудования, задание последовательности загрузки.

  3. Простейший драйвер для критичного оборудования вроде дисков и клавиатуры.

А теперь вопрос: как сослаться на функцию, например, «считать сектор диска»? Старый компьютер ZX Spectrum вызывал функции своего BIOS просто через адреса памяти, но это также мешает совместимости. В современных ОС за всё это отвечает динамическая компоновка программ — где-то в исполняемом файле есть команда «найти адрес функции ReadFile, и подставь его по адресам X и Y». Сложно.

Как это сделано в BIOS, а также в минималистичных ОС вроде DOS?

Процессор иногда для нужд аппаратуры может совершить прерывание — бросить то, чем он занимается, экстренно обслужить клавиатуру или таймер, и вернуться к делу. Процессор 8086 имеет целых 256 прерываний, 8 из них используются самим процессором, например для работы с делением на ноль. Компьютер IBM AT имеет для своих железных нужд всего два контроллера прерываний, по 8 штук каждый.

Остальные 232 прерывания программные — вызываются только вручную и пущены на такие вот драйверы. Существуют резидентные программы (драйверы, антивирусы и прочее) — они подменяют адреса функций прерывания (перехватывают прерывания), чтобы добавить или подкорректировать функциональность. Я и сам писал мелкие резиденты — например, чтобы в Doom отключить ось Y мыши (она отвечала за хождение взад-вперёд и только мешала).

Что же с дисками?

Дисками — посекторным чтением, записью и форматированием — занимается прерывание 13, принадлежащее BIOS. Кто пишет BIOS? — Производитель материнской платы или нанятая им компания.

Windows 95 сделала очень многое для эмуляции DOS, многие из старых программ будут работать на Windows и даже получат немножко новой функциональности вроде вставки из буфера обмена. Но на самом деле всей железной функциональностью занимаются 32-битные драйверы.

Форматирование диска, когда на нём ничего нет, кроме магнитного слоя,— задача сложная, и часто работает в жёстком реальном времени — нужно точно отсчитать время, когда головка над нужным… тем, что должно стать сектором. И в Windows для совместимости не нашли ничего лучшего, чем вызывать не 32-битные драйверы, а чистое прерывание 13 из BIOS и/или резидента!

Для этого Windows отключает немалую часть своей функциональности, пока исполняется старая функция форматирования. Включая планировщик, основанный… сюрприз, на таймере!

Разумеется, всё это касается только DOS-форматёров, в частности FORMAT . COM. Новый оконный форматёр, спрятанный где-то в Проводнике, этого недостатка не имеет.

Показать полностью
221

Доступно об АйТи: Этимология клавиш на наших клавиатурах

Escape

С терминалов. Точного значения не нашёл, но подозреваю такое.

Буквопечатающий терминал работает так: при нажатии на кнопку он печатает символ на бумаге и одновременно передаёт в линию. Мейнфрейм не возвращает его «эхом» назад.

Терминал — сравнительно «тупое» устройство для доступа к удалённому компьютеру. Представлял собой сначала электрическую пишущую машинку с модемом, потом сравнительно простое логическое устройство с небольшим количеством памяти, монитором и модемом.

Мейнфрейм — большой многопользовательский компьютер, обеспечивавший доступ через терминалы.

У машинки есть спусковой механизм, совсем как в часах, по-английски escapement — он сдвигает каретку по одному знакоместу за раз. На время передачи многосимвольной управляющей команды (так называемой escape sequence) спусковой механизм терминала блокировался и кнопки не выдавали видимых символов.

Когда терминалы перешли с машинок на видео, кнопка по омонимии (escape — сбежать) стала использоваться для выхода откуда-то.

Надпись АР2, встречающаяся на некоторых клавиатурах, кириллическая, означает «авторегистр 2» и восходит к тем же управляющим командам.

Спусковой механизм машинки

Спусковой механизм машинки

F1…F12

С электронных машинок.

С ними всё просто: это функциональные клавиши, функция 1…12 — значение не определено и может меняться от программы к программе. Собственно, и на машинках часто функций было больше, чем кнопок, и можно было коммутатором выбрать те, которыми чаще пользуешься.

Backspace

С механических машинок. Что написано пером, не вырубишь топором — так что кнопка всего лишь делала пробел назад, то есть сдвигала каретку на одно знакоместо назад.

В советских компьютерах звалась «ЗБ = Забой».

Tab

С механических машинок

Клавиша «табуляция» использовалась, как ни странно, для набора таблиц, перегоняя каретку прямо к запрограммированной позиции.

В интерфейсах по аналогии прыгает между полями.

Shift

Разрешите не по порядку. С механических машинок.

Shift — сдвиг. Клавиша сдвигала вверх каретку пишущей машинки, чтобы получить второй регистр букв и знаков. При отпускании клавиши каретка возвращалась вниз под собственным весом.

В советских компьютерах звалась «Регистр».

Рычаги машинки. Видны два регистра на одном рычаге.

Рычаги машинки. Видны два регистра на одном рычаге.

Caps Lock

С миникомпьютеров и терминалов 1970-х — не могу сказать, кто там первый.

Миникомпьютер — однопользовательский компьютер на микросхемах небольшой степени интеграции, размером в одну-две стойки. В отличие от микрокомпьютера, который сделан на процессоре высокой степени интеграции, умещается на столе и по первым порам был слабее мини-.

Кнопки машинки требуют нажатия с усилием, да и каретка весит немало — потому сложно печатать много, удерживая Shift. Так что каретку можно было зафиксировать в верхнем регистре клавишей с говорящим названием «Shift lock», фиксация сдвига. В таком виде она попала и на компьютеры.

На более продвинутых компьютерах она фиксировала не все символы, а только буквенные, и получила название «фиксация заглавных» — Capitals Lock. Хорошие нестирающиеся клавиши или гравированные, или отлитые из двух разных пластмасс — обе технологии не позволяют мелкого шрифта, потому Caps.

Ctrl

С терминалов. Control characters — управляющие символы, символы с кодами от 0 до 31, использовавшиеся как дополнительные команды.

В советских компьютерах звалась «Упр» или «УС».

Alt

С миникомпьютеров 1970-х.

Использовалась для передачи дополнительных символов из второй половины кодировки, с номерами от 128 до 255 (alternate characters).

Клавиатура Найта от миникомпьютера, поддерживавшего язык LISP (середина 1970-х)

Клавиатура Найта от миникомпьютера, поддерживавшего язык LISP (середина 1970-х)

AltGr

С миникомпьютеров 1970-х.

Использовалась для передачи дополнительных и псевдографических символов из второй половины кодировки (alternate/graphic characters).

Очевидно, если у кодировки была вторая половина, именно там валялись европейские умляуты, и вводились через этот AltGr. Так что клавиша получила дальнейшую жизнь в локализованных под Европу IBM’ах — часть символов, в основном какие-нибудь собаки @, приходилось вводить удержанием этого самого AltGr.

Print Screen

С компьютера IBM PC.

Компьютер имел в BIOS особый обработчик, отпечатывавший на принтере целый экран.

SysRq (=Alt+PrtSc)

С компьютера IBM PC/AT.

Клавиша «системный запрос» (System request) обращалась напрямую к ОС, чтобы, например, завершить работающую программу. Впервые замечена в упрощённых моделях IBM PC/XT, выполнявших одну функцию — терминал к мейнфреймам IBM/370.

Когда процессор 80286 позволил минимальную многозадачность, потребовалась дополнительная клавиша, чтобы эту многозадачность обеспечивать, и для этого клавишу «системный запрос» сделали и в IBM PC/AT. Ныне используется исключительно в Unix для насильного «выбивания» программ из памяти и прочих жёстких перезагрузок.

Scroll Lock

С компьютеров IBM PC.

Переключает режим прокрутки — в одном режиме кнопки-стрелки двигают курсор, в другом прокручивают всё окно. И поныне так действует большинство электронных таблиц, включая Excel и LibreCalc.

Pause

Я не нашёл этой клавиши на компьютерах более ранних, чем IBM PC/AT.

Понятно, что эта клавиша годится только для медленных однопользовательских машин — приостанавливает вычисление, чтобы пользователь мог спокойно прочитать бегущий текст.

Зато в терминалах существовала клавиша «Hold», выкидывавшая пришедшие с мейнфрейма данные в никуда — тоже чтобы прочитать хоть часть бегущего текста.

Break (=Ctrl+Pause)

С телеграфа, и там означает «разрыв»!

Сброс телеграфной сессии происходит разрывом линии. В дальнейшем кнопка разрыва проникла в терминальные протоколы, а потом и во все возможные микрокомпьютеры, только уже ничего не разрывала. В советских компьютерах, как правило, называлась «Стоп».

Ныне прерывает консольную программу. С полноэкранными, как правило, ничего не делает.

UPD:

AltGr: компьютер IBM PC был хорош тем, что локализовался полностью программно, изначально на заводе, а с видеоадаптера EGA — и пользователем через резидентную программу. Так что ничего не стоило вкорячить другую раскладку — правда, ценой некоторых символов.

Так, в немецком нужны девять новых символов (три умляута, эсцет ß только строчный, градус ° и параграф §), добавилась одна кнопка — а через правый Alt, переименованный в AltGr, вводили собаку @, скобки {}[], вертикальную черту | и тильду ~, итого семь.

С появлением евро и Юникода всё больше раскладок, даже те, которые изначально AltGr-слоя не имели, его получили.

Print Screen: некоторые терминалы имели кнопку Copy, которая делала то же самое.

Показать полностью 3
12

Доступно об АйТи: Тот секретный ингредиент, который испортил сайты на Node.JS

Тот самый протестный пакет

Тот самый протестный пакет

На Пикабу возник огромный спор, насколько (без)опасны открытые библиотеки, если их производитель может в любой момент стать враждебным. Мой ответ — могут быть опасны при определённых условиях, основное из них — разработчик бездумно обновляет библиотеку, не делая ревизии.

Библиотека подпрограмм — несамостоятельный набор кусочков программного кода, предназначенный, чтобы их вызывали из других программ. Например, это может быть компонент визуального оформления, или библиотека для доступа к сети, обработки текстов, компьютерной математики…

Но открытый исходный код лучше, чем закрытые библиотеки в виде DLL, те опасны изначально.

Но на Node.JS, распространившейся в серверном вебе системе, есть нечто, сильно упрощающее жизнь одиночке-разработчику, но и позволившее эту атаку.

Пакетный менеджер.

Пакетный менеджер — программа, отслеживающая взаимосвязи между компонентами ПО, и централизованно устанавливающая, удаляющая и обновляющая их.

Это значит: программа делится на независимо разрабатываемые пакеты, и для каждого указано, какие пакеты ему нужны для работы. Например, в NPM, тот самом менеджере для Node.JS:

Пример манифеста Node.JS

Пример манифеста Node.JS

Первыми пакетный менеджер стали использовать сборщики дистрибутивов Linux. Потом — языки Python и JavaScript. И только в 2011 подтянулся менеджер Chocolatey для Windows.

Пакетный менеджер никак не проверяет свои пакеты на вредность. И если версия 1.0.0 проверена как безвредная, где гарантия, что 1.0.1 не получит бэкдор? Вот в этом была проблема: вышло вредоносное обновление, и пакетные менеджеры в разных концах мира обновились до него.

Бэкдор — «чёрный ход», секретная функциональность, позволяющая пробраться в систему постороннему.

Другие известные мне пакетные конфузы

2016: NPM left-pad

Азер Кочулу, американский программист турецкого происхождения, имел несколько пакетов на NPM. Один из этих пакетов звался kik. И вот однажды высоколобые канадцы из Kik Messenger просят его переименовать пакет — он отказался, сославшись, что пишет открытый пакет с таким именем. Они ответили настолько эпично, что разрешите уж процитировать письмо.

Мы не хотим быть кондомами насчёт него [пакета], но это зарегистрированный товарный знак в большинстве стран мира, и если вы выпустите проект по имени Kik, наши юристы по товарным знакам будут долбить в вашу дверь, стирать ваши аккаунты и всё прочее — и у нас нет выбора, ведь мы должны или насаждать товарный знак, или терять его. Можем ли мы прийти к какому-то компромиссу, не привлекая юристов?

Азер разозлился, назвал авторов письма «корпоративными кондомами», и потребовал целых 30 тысяч долларов. Владельцы NPM вручную передали Kik контроль над пакетом, и тогда Азер со злости удалил все свои проекты — в том числе тривиальный left-pad, дополнявший строку до длины N. Это парализовало Babel (транслятор JavaScript, выдававший код, совместимый со старыми версиями интерпретаторов) и React (крупную фронтэнд-библиотеку, то есть выполняющуюся на браузере).

Пакет восстановили.

2020: комбинирование внутренних и общих пакетов

Если ваш пакет внутренний и вы не хотите его никому показывать, в дополнение ко всеобщему хранилищу можно использовать дополнительное.

И тут хакер, подписывавшийся как Alex Birsan, выяснил такое: если каким-то образом пронюхать имя внутреннего пакета, что-то вроде «auth-paypal», и создать одноимённый общедоступный, можно запустить его в глубинных сетях PayPal, Apple и Tesla. Выдавать внутренние имена — это не единичная ошибка, очень многие фирмы делали это. Хакер получил за это по программе охоты на баги минимум 60 тысяч.

Есть борьба?

Иногда. Допустим, тот же NPM позволяет зафиксировать версию конкретного пакета на 1.0.0, указывать его контрольную сумму. Это позволяет загружать только те пакеты, что прошли ревизию.

А что же на Android?

На Android программы более монолитны, и за библиотеками должен смотреть сам разработчик. Не будет того, что программа запустится в не предусмотренной разработчиком конфигурации.

Правда, есть две оговорки — иногда программа для Android представляет собой браузер, показывающий один сайт. Такая прога уязвима настолько же, как и любой другой сайт.

Кроме того, у любой сетевой программы есть серверная сторона, но она обычно устроена значительно проще, чем у сайта с фронтэндом и бэкэндом.

А можно встроить бэкдор так, чтобы он прошёл ревизию?

Можно, но это целая шпионская история, о которой когда-нибудь напишу — если смогу описать её захватывающе. Кто разбирается в компьютерах, гуглите «Бэкдор в XZ».

А вот другая уязвимость, Heartbleed — по-видимому, её когда-то упомянули в документах Сноудена, но это простая ошибка. Просто замеченная государственными хакерами раньше, чем независимыми.

Показать полностью 1
57

Ответ на пост «Потому что кожаные должны страдать?»1

Доступно об АйТи: Почему Python сам не может добавить кавычки?

У меня есть две серии, «Детские вопросы» и «Доступно об АйТи» — вопрос подходит к обеим.

Мем, вызвавший мою заметку

Мем, вызвавший мою заметку

Вкратце: в спецификации языка программирования очень подробным образом описано, какая программа корректна, а какая нет. Но спецификация совершенно не говорит, что делать при ошибке, и компилятор вправе подсказать человеческим языком, чего не хватает. Но незаметно «помочь», то есть принять как корректную — грубое нарушение.

А теперь давайте расскажу, как происходит разбор любого языка.

Я не настолько силён в Python, писать простенькие скрипты могу, но синтаксис ещё не засел в подкорку — так что разрешите за пример брать Паскаль и Си. Начнём со строчки Паскаля (не совсем стандартного, скорее Delphi, но пусть будет).

procedure Print(x : string = '');

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

ключевое слово PROCEDURE
идентификатор (имя) PRINT
знак (
идентификатор X
знак :
идентификатор STRING
знак =
строка пустая
знак )
знак ;

Этот поток слов и знаков идёт на синтаксический анализ, и он происходит так.

  1. Видим ключевое слово PROCEDURE, переходим в режим «заголовок процедуры».

  2. Видим идентификатор PRINT, это название процедуры.

  3. Видим знак (, переходим в режим «список параметров».

  4. Видим идентификатор X, переходим в режим «однотипные параметры».

  5. Видим знак :, переходим в режим «тип».

  6. В режиме «тип» получается считать только идентификатор STRING.

  7. В режиме «однотипные параметры» видим знак равенства и считываем значение по умолчанию (пустую строку), разрешите дальше не расписывать.

Вот этот разбор «видим-переходим» самый простой и пишется опытным программистом по наитию.

Язык Си действует сложнее, аналогичную строку

void print(char* x = "")

Си начинает понимать, что здесь написано, когда увидит круглую скобку, и только тогда он говорит: это заголовок функции. Потом возвращается назад и смотрит, что было до этого. Как вы видите, уже есть элементы разбора текста справа налево. Разбор таких языков часто программирует автоматика по формальному описанию языка, примерно такому:

<direct-declarator> ::= <identifier>
| ( <declarator> )
| <direct-declarator> [ {<constant-expression>}? ]
| <direct-declarator> ( <parameter-type-list> )
| <direct-declarator> ( {<identifier>}* )

(специально нашёл именно тот кусок языка Си, что относится к нашей строчке.)

Другими словами, за разбором компьютерных языков выстроена немаленькая теория.

А что будет, если язык будет подчищать за человеком такие ошибки?

Первое. Часто подобные предположения неоднозначны. Возьмём процедуру посложнее:

procedure Print(x : string = ''; y : integer = 0);

…и вызовем её Print('text, 10); Оба места, где можно поставить закрывающуюся кавычку — после text или после 10 — дают корректный вызов. А может, программист вообще не хотел открывать кавычку и text — это чьё-то имя (идентификатор)?

Второе. Как вы уже видите, исходный текст подаётся в компилятор от начала к концу, компилятор держит в памяти очень небольшой кусок. Чтобы понять, что хотел человек, нужно окинуть взглядом текст в целом. Компиляторы крупных производителей сейчас умные и действительно окидывают, но для этого должен прозвенеть звонок: в тексте ошибка. И окидывают не потому, что это говорит спецификация, а потому что так удобнее.

Третье. Если окидывать постоянно, начнётся такое: при удлинении текста вдвое время сборки повысится вчетверо. Мой хобби-проект «Юникодия» (только собственные файлы, написанные человеком — без библиотек, программно генерируемых и файлов данных) занимает 1,2 мегабайта на языке Си++. Мой рабочий проект, который пишется бригадой примерно из 15 прогеров,— сотни мегабайт. Компиляция таких монстров будет занимать вечность!

Ускоритель компиляции Си++ под названием Unity (не путать с одноимённым игровым движком!) работает так: когда программа состоит из тысячи модулей, он объединяет их по 10, и получается 100 штук. Работает Unity именно потому, что в Си++ всё наоборот: один длинный модуль компилируется быстрее десяти коротких.

Четвёртое. Это бессмысленно удлиняет спецификацию, а главное — стройная теория формальных языков, которую задел по поверхности, перестаёт работать. Даже если условный Бьярне Гослинг (комбинация имён Бьярне Строуструп, автор Си++, и Джеймс Гослинг, автор Java) напишет свой личный язык с таким сервисом, существует множество программ более тупых, чем компиляторы, которым, тем не менее, нужен корректный исходный текст.

  • Начнём с форматёров — они берут исходный текст и расставляют в нём отступы в соответствии с принятой в конторе системой.

  • В бытность программистом Java для мобилок я сделал небольшой препроцессор языка, объединявший несколько модулей в один, для экономии размера архива — чтобы можно было на освободившееся место втиснуть графику и уровни.

  • В ту же степь — вышеупомянутый ускоритель Unity.

  • Есть система локализации Gettext — она просматривает программу на предмет строк и спрашивает у программиста: какие из них подлежат переводу? Те, что подлежат, она вносит в языковый ресурс.

Пятое. А это уже реальный случай с языком Go от Google. Языки типа Паскаля, к которым относится и Go, имеют свободный синтаксис (расстановка пробелов и переводов строк не важна). Такие языки традиционно после каждого оператора ставят точку с запятой, и чтобы избавиться от «рака точек с запятой» и в то же время лучше задействовать доступный инструментарий, они решили автоматически расставлять точки с запятой ещё до лексического анализа — именно так, перевод строки не внесён в синтаксис языка!

Привело это к тому, что годятся не все стили текста.

func f() { // Этот стиль работает

}

func g() // А этот нет — тут автомат ложно поставит точку с запятой

{

}

Вот как-то так, спасибо за внимание!

Показать полностью 1

Ответ ArtemMSK в «ЦА»11

Доступно об АйТи: Почему всё больше «водяных» видео там, где всё решит страничка текста?

Причин много связанных: YouTube — отличная платформа, у него другая модель монетизации, да и видеохостинг позволил выехать на чужом контенте.

Реклама:

  • в общем вебе — засоряет поисковую выдачу, так что часто первые пара страниц — джинса;

  • на видеохостинге — проигрывается перед/после видео, и любой прошаренный её может убрать.

Продвижение блога:

  • на большинстве блогоплатформ — продвигаются только топовые;

  • YouTube — продвинет любого, просто не так активно. Методы продвижения YouTube значительно честнее.

Обман поисковых систем (поисковый шум);

  • в общем вебе — с помощью специальных методов в ключевых словах, заголовках и тексте страницы;

  • на YouTube — текст видео, конечно, играет роль, но не главную. Заголовок и короткое описание — наше всё.

Проверка качества поисковой выдачи:

  • в общем вебе — только переход и иногда жалоба;

  • на централизованной платформе (даже на Пикабу) — для этого есть лайк и комментарии. На видеохостинге ещё и время просмотра.

Возможность выехать на чужом контенте:

  • в общем вебе — поисковик быстро обозначит сайт как вторичный;

  • на видеохостинге — можно, например, начитывать чужой контент, приделав к нему рандомный видеоряд. Или не рандомный: прочитать что-то на форуме про свою машину и попробовать повторить на живой машине, пусть в игрушечном режиме.

Показать полностью
20

Ответ на пост «Мем смешной, а к такому меня не готовили)»1

А теперь мой собственный заголовок:

Доступно об АйТи: Keyboard not found, press F1

Это сообщение стало мемом задолго до того, как слово «мем» разлетелось по интернетам. И вообще до интернетов как таковых — оно ходило ещё по ФИДО (почтовой сети, работавшей на модемах).

Офтопик для олдфагов: кто помнит, что объединяет эти программы? И какой не хватает? Какой неприятный запах? И какая должна играть мелодия? (Не «Вильгельм Телль» и не «Попкорн», если что)

Три программы. Что их объединяет и какая четвёртая? И какая должна играть мелодия?

Три программы. Что их объединяет и какая четвёртая? И какая должна играть мелодия?

Ныне это, как правило, попадос на деньги: отказал мультиконтроллер, микросхема на материнской плате, отвечающая за поддержку старой аппаратуры вроде PS/2 и COM-портов. Реже — неудачно настроенная BIOS (большинство компов отлично загружаются и без клавиатуры).

Некоторое время, пока внедрялась USB, а также и поныне на отдельных компьютерах со встроенной клавиатурой (ноутбуках) это сообщение мешает работать, если в штатном порту клавиатуры нет (а есть в USB).

А откуда оно взялось — есть несколько теорий. Возможно, играли роль и все четыре.

Экономия памяти

Исходный IBM PC имел 1 мегабайт адресуемой памяти. Из них до 640 килобайт — это оперативная память (так называемая память DOS или обычная память; ко всему, что сверх, был доступ только окольными путями), а оставшиеся 384 — верхние адреса памяти, позволявшие обращаться ко всякой аппаратуре — видеопамяти, BIOS материнской платы (прошивке, запускавшей компьютер и дававшей минимальную функциональность) и BIOS видеоплаты.

В любом случае BIOS была невелика, изначально всего 8 килобайт, и приходилось экономить: после каждой ошибки писало стандартное «Press F1 to continue». Вот только для клавиатуры это бессмысленно — а на «интуитивность» интерфейса тогда особо не смотрели.

Подключи и нажми

Большинство аппаратуры могло сломать материнскую плату, если подключать её «на горячую», этот вопрос решил только USB. Один из немногих разъёмов, допускавших такое обращение,— старый 5-штырьковый разъём клавиатуры: можно было просто подключить и нажать. Проверка аппаратуры в то время длилась пару минут, если выждать тест памяти, и секунд 15, если пропустить, так что немного времени экономилось. (Правда, чтобы пропустить, требовалось нажать Esc на той же клавиатуре.)

Матплата переходного периода: и DIN, и PS/2

Матплата переходного периода: и DIN, и PS/2

Запавшая кнопка

Третья теория — система обнаруживала, что на клавиатуре одна из кнопок вечно нажата, и выводила ошибку. Можно было нажать F1 и продолжить работу.

Совместимость

Четвёртая теория. У ранних IBM существовали несколько не совместимых друг с другом клавиатур. Я этих времён не застал, но отголоски есть в API Windows — коды аппаратных клавиш, одинаковые для Q американского, A французского и Й русского/украинского, совпадают с кодами XT (а не современными AT и USB).

Если BIOS поддерживала их все, она предполагала, что в порту, например, клава от IBM PC/XT. А если оказывается, что другая, просит нажать F1, чтобы подтвердить, что это клава от PC/AT, записать это в настройки BIOS и больше не спрашивать. При потере настроек терялся и запомненный тип клавиатуры, и снова требовалось нажать F1.

Французская клава

Французская клава

Ответ на загадку

Имеются в виду анекдоты про COMMAND. COM и Norton Commander, другой образчик старого компьютерного юмора. Прочие распространённые герои — Digger и Windows. Так что какая программа — Windows 3 или более ранняя. Какая мелодия — Yankee Doodle: один из первых вирусов-шутников, когда их общее количество, и шуточных, и вредных, исчислялось единицами. Какой неприятный запах — мышей: «от Windows мышами пахнет», ведь она, формально способная управляться с клавиатуры, по факту требовала мышь.

Показать полностью 4
Отличная работа, все прочитано!