Наблюдаемость на первом месте

Перевод статьи Rambles around computer science | Автор: Stephen Kell (спасибо!)

На прошлой неделе у меня состоялся увлекательный разговор с Марком Шинвеллом и Стивеном Доланом, двумя коллегами, которые знают среду исполнения OCaml вдоль и поперек. Мы говорили о том, как сделать скомпилированный код OCaml наблюдаемым: поддерживающим интерактивную отладку и различные другие динамические анализы (в частности, профилирование памяти).

Оказалось, что хотя это и не невозможно, но очень сложно. Справедливо будет сказать, что среда выполнения OCaml не была разработана с учетом того, что наблюдаемость находится в списке желаний. В этом она далеко не уникальна: языки семейства ML обычно не реализуются с учетом наблюдаемости. На самом деле, можно утверждать, что ML явно рассчитан на ненаблюдаемость. Ортодоксы того времени считали, что хранение с метками - наивная техника реализации, а стирание меток во время выполнения - хорошая штука, главным образом потому, что это позволяет получить скромный прирост производительности. Более того, это означало, что доказуемая стираемость меток стала считаться ценным математическим результатом, касающимся языковых конструкций в целом и ML в частности. Остаточный побочный эффект заключается в том, что это стирание также устраняет возможность прямого декодирования программных данных из их кодировки в памяти. В отсутствие какого-либо другого механизма - которого у основного OCaml в настоящее время нет - это значительно ухудшает наблюдаемость.

ML не одинок в этом. Хотя я готов поспорить, что Haskell в GHC страдает от подобных ограничений наблюдаемости, а может быть, и хуже, поскольку он делает более обширные преобразования во время компиляции, и их нелегко "просмотреть" во время выполнения. Это делает еще более трудным объяснение состояния выполняющейся программы, видимого во время выполнения, в терминах исходного кода. Кроме того, я не выделяю функциональные языки. Java имеет серьезные недостатки в механизмах наблюдаемости, открываемых ее виртуальной машиной, о чем я однажды написал небольшую статью.

C, как обычно, интересный случай. На первый взгляд кажется, что он рассчитан на малую наблюдаемость или ее отсутствие. Он определенно не генерирует много метаданных во время выполнения. Это упущение можно рассматривать как стирание неявных меток, подобное ML. Однако это не совсем точное представление. Прагматичные работающие программисты, такие как Ритчи и Томпсон, хорошо знают ценность интерактивной отладки. Первое издание Unix включало db, интерактивный отладчик на уровне ассемблера, который в основном использовался для работы с кердампами. К восьмому изданию два отладчика, adb и sdb, были документированы в разделе 1 руководства, последний поддерживал отладку на уровне исходного кода, а третий отладчик (pi; построен на procfs Киллиана) был включен в состав дополнений, которые стали Plan 9. Более современные отладчики идут в ногу (более или менее!) с более продвинутыми оптимизациями компилятора, используя сложные форматы метаданных, такие как DWARF, для описания того, как их увидеть. (Это не пуленепробиваемо, и имеет свои проблемы, но работает удивительно хорошо для Си). В результате код на языке Си стал постоянно хорошо наблюдаемым - хотя и не без сорокалетнего непрерывного труда по совместному развитию необходимой инфраструктуры на уровне языка и системы.

Эта коэволюция тоже интересна. Механизмы достижения наблюдаемости в коде Си лежат вне языка. Coredumps и таблицы символов - это системные, а не языковые механизмы. Наблюдаемость в Unix была частью дизайна, вписанной в ткань системы; она не является чем-то второстепенным. Системный дизайнер (хорошо, я сделаю шаг вперед) может заявить, что наблюдаемость слишком важна, чтобы оставлять ее разработчикам языка. Тем не менее, есть некоторые пробелы, которые нужно заполнить, и некоторые менталитеты, которые нужно преодолеть, чтобы применить инфраструктуру отладки в стиле Unix к ML-подобным языкам. В другом посте, в ближайшем будущем, я немного углублюсь в OCaml, рассмотрев полиморфизм (и почему это не совсем та проблема, которой она кажется).

Хотите больше полезных советов? Смотрите и подписывайтесь на наш канал! Здесь я публикую лучшие советы для пользователей Андроид, Windows, iOS и Mac OS. Также вы можете задать мне любой вопрос, подписавшись на канал.

Наш канал в Telegram