Исходники: текст или что-то другое?
Последние две недели мне приходилось разбираться в чужом коде с целью отловить и уничтожить неведомую ошибку. Не сказать, чтобы код был особенно сложен, но сам я настолько далек от звания гуру современного программирования, что несколько седых волос где-то в глубинах моей шевелюры наверняка за это время зародились. Задача усугублялось невозможностью выполнить код под отладчиком (это был планировщик ОС), так что в моем распоряжении были только
- заботливо раскиданная по коду отладочная печать на терминал и
- пресловутый «долгий пристальный взгляд».
Были еще встроенные в ОС средства протоколирования, но они именно в эти две недели не работали. Удивительное совпадение. Хотя нет, скорее, все дело в кривизне рук. Неважно.
Так вот, отладочная печать прекрасно себя зарекомендовала. Изучение длинных простыней протоколов из строк вроде «(kernDispatchThread) pre-switch ct=174380000 diff=55489 nn=4», «test 4»и даже просто «hahaha!!!» позволяют получить истинное удовольствие от расследования а-ля Хаус. Ну-ка, кто у нас тут вытеснил этот поток? Но вот аномальная последовательность строк найдена, и теперь никуда не денешься — придется разглядывать код, который эту аномалию продемонстрировал.
Казалось бы, самое время сказать: «Трепещите, о презренные байты! Склонитесь перед интеллектом Человека!». Но нет, байты трепетать отказываются, функции плодятся прямо на глазах, макросы-сволочи делают вид, что они функции, или даже того хуже — оперируют именами локальных переменных (ужас-ужас!). Вся эта компания разбегается по двум десяткам файлов, откуда, ехидно посмеиваясь, гадит в глобальные переменные, норовя смешать физическую и виртуальную адресацию.
Вот как-то так я и провел две недели.
И не переставало мне думаться, что текст в качестве носителья исходного кода всем хорош: и редактировать его легко, и всякие diff’ы со слияниями делать, и от платформы не зависит (ну, почти), да и сколько уже проверенных временем алгоритмов на строках есть. Вот только читать чужие исходники неудобно. Хорошая IDE позволяет от вызова функции перейти к ее определению, но серебряной пулей тут и не пахнет. Пока читаешь код вызванной функции, забываешь, что делала вызывающая. И хорошо еще когда в когнитивном процессе участвует две функции. А что если 10? Или 50?
В таком случае поможет только абстрагирование: надо поделить 50 функций на 5 групп, рассмотреть взаимодействие этих групп, а потом — внутри каждой в отдельности. Да, модульное программирование явно неглупые люди придумали. Вот только выделение абстракций — отдельная большая работа. Если мы читаем свой код, то эта работа уже сделана еще при его написании. А вот выделение абстракций на уже существующем коде… Вот тут-то его текстовая природа и подкладывает нам козу: чтобы выделить абстракции, нужно сначала код прочитать и понять.
Короче, умные люди решили, что неплохо бы дать возможность людям видеть сразу весь интересующий их код. А чтобы удобнее было выделять абстракции, дать возможность еще и как-то помечать фрагменты. Ну и редактировать, само собой. Примерно так и работает Code Bubbles. Обязательно посмотрите демонстрационное видео.
В таком подходе есть ряд очевидных недостатков. Например, нужен гигантский монитор. И отсутствие аллергии на работу мышкой. И ширина строк кода должна быть вменяемой (обратили внимание, какие они короткие в демке?). Но в целом идея здравая: кто сказал, что код — это обязательно плоский текст? (Я не говорил.) При анализе чужого кода такая штука уж точно будет полезной.
P.S. Я давно уже дочитал «Организацию ЭВМ» и с пяток книжек сверху. Просто под линуксом не работает мой антикварный сканер. Постараюсь что-нибудь придумать.


Да блин. У меня даже студия не понимает где лежит определение типа в CGAL. И я тоже не понимаю, а ищу по имени хедера. Ибо (см. пример ниже). Чую матерую С/С++ библиотеку на шаблонах и макросах никакой Code Bubble не проглотит.
Пример объявления типов для не особо сложного CGAL приложения:
typedef CGAL::Quotient Number_type;
typedef CGAL::Lazy_exact_nt Lazy_exact_nt;
typedef CGAL::Cartesian Kernel;
typedef CGAL::Gps_circle_segment_traits_2 Traits_2;
typedef Traits_2::General_polygon_with_holes_2 General_polygon_with_holes_2;
Причем CGAL::Gmpzf, CGAL::Quotient, CGAL::Cartesian — все взаимозаменяемые типы,
хотя не наследуют от общего класса. Они взаимозаменяемые потому что в шаблонах вызываются
операции, которые в них есть.
А полигон состоит из X_monotone_curve_2, которые определены как подтип в Traits:
typedef Traits_2::X_monotone_curve_2 X_monotone_curve_2;
И чтобы до их определения добраться, нужно знать, кто такой Traits_2:
template
class Gps_circle_segment_traits_2 : public Gps_traits_2<Arr_circle_segment_traits_2 >
template <typename Arr_traits, typename General_polygon_t = General_polygon_2 >
class Gps_traits_2 : public Arr_traits
И примерно половину из переходов GoToDefinition IDE не находит.
PS Выговорился.
Движок съел скобки-уголки в объявлении типов =(
В общем, типы там все шаблонизированы.
Думаю, он не потянет даже простейший полиморфизм. Вызвается метод через интерфейс — что будем показывать? Это не говоря уже о какой-нибудь рефлексии.
Важен сам подход — другой способ восприятия кода.
Напоминает reverse engineering в CASE средстве.
Или опять же RE в IDA Pro. Только там asm…
Вообще очень интересно это будет изучать на доске с touch возможностями.
Надеюсь я застану время, когда что-то вроде MS surface будет висеть на стенках и с помощью него будут проектировать.
Да, для высокоуровневого проектирования мультитач + большой экран — самое оно. Правда, мне не обязательно, чтобы Surface был именно MS :)
Говорил, кстати, недавно с Лехой Тетеревым.
Говорит Surface Team сейчас переживает не лучшие времена. Разработчиков оттуда перевели в другие, более денежно-приносящие места.
Обложки книжек можно копипастить с озона/амазона.
Или у тебя аутентичные издания?
На амазоне разве есть русские издания? Вот например я читаю сейчас «Мир Лиспа» 1990 г. выпуска…
Ну вдруг ты Таненбаума в оригинале читаешь.
А вообще http://images.google.ru/images?um=1&hl=ru&newwindow=1&tbs=isch%3A1&sa=1&q=%D0%9C%D0%B8%D1%80+%D0%9B%D0%B8%D1%81%D0%BF%D0%B0+1990&aq=f&aqi=&aql=&oq=&gs_rfai=&start=0
Ты размеры этих картинок видел? :)
Тогда ставь сканер под вайн =)
Кстати, какой вайн? Ты же на Win7 вроде.
Черт, спалился )
Win7-то у меня стоит, но как-то так выходит, что у меня моя аспирантская деятельность происходит под Linux, ну и лень перезагружаться туда-сюда. Комп-то у меня бывает неделями не перезагружается. Вот и получается — то неделю под Linux, то неделю под виндой. Только вот вспоминаю, что надо книжки отсканировать аккурат когда Линукс загрузился )
Да лентяй я просто…
Интересно, что прочитанная недавно книжка «Современные ОС» показалась далеко не такой серьезной и правильной, как когда я ее в институте читал. Куча ошибок там, концептуальных несоответствий и просто нежизнеспособных идей. Видно, что автор из академического мира, короче )