среда, 14 июля 2010 г.

[prog.memories] 2-я часть пути к отладчику, с отладчиком и…

Продолжение, начало было вчера.

В конце 92-го, начале 93-го довелось приобщиться к программированию под Windows. Тогда еще к Windows 3.0 и 3.1.

Сразу же пришлось отказываться от привычного стиля работы. К тому времени я уже плотно пересел на Borland C++ 2.0 – все делал в этой IDE: и исходный текст набирал, и компилировался, и отлаживался. В Borland C++ 2.0 был включен Windows SDK, поэтому с помощью Borland C++ можно было писать программы под Windows. Чем мы и попытались воспользоваться.

В нашем распоряжении были только слабенькие 286-ые IBM AT-шки с 1Mb памяти (640Kb из которых было доступно для MS-DOS-а, а еще 384Kb т.н. расширенной памяти под DOS-ом можно было задействовать через пляски с бубном). Так вот оказалось, что если в Borland С++ под DOS-ом запустить компиляцию даже простенького Windows-приложения, то Borland сначала долго-долго компилировал исходники, а затем приступал к линковке, окончания которой мы так никогда и не дожидались. Помогало вот что: в самой начале линковки процесс построения проекта прерывался, затем запускался вновь – на этот раз сразу начиналась линковка, без компиляции. В таком случае линковка заканчивалась успешно и, что удивительно, быстро.

Понятное дело, продолжать работать в IDE Borland C++ 2.0 было нельзя. Поэтому пришлось осваивать компилятор и линкер командной строки, изучать утилиту make и редактор MultiEdit (вот тут уж точно, не было счастья, так несчастье помогло – MultiEdit на много лет стал моим рабочим редактором). Набор исходного текста программы шел в MultiEdit-е, из него же запускалась компиляция через make. Все происходило гораздо быстрее, чем в Borland C++.

Но все это делалось под DOS-ом, поскольку в самом Windows провести компиляцию не удавалось – мало памяти, жуткие тормоза. Поэтому компилировались в DOS-е, потом запускали Windows и свою программу.

Но запустить программу мало, нужно ее еще и отлаживать. Тут мы использовали автономный Borland-овский Turbo Debugger for Windows (tdw.exe). Интересная штука – запускалось оно как Windows-приложение, но сразу же переходило в текстовый режим. А при необходимости возвращала пользователя в Windows. Работало все это не быстро, экран моргал ужасно, и иногда повешивал все. Но самым страшным оказалось не это.

Страшнее всего оказался поток Windows-сообщений, с которым нужно было что-то делать. Когда мы начинали программировать под Windows, в нашем распоряжении не было каких-либо объектных библиотек вроде MFC (даже Borland-овский OWL попал в наши руки позже, вместе с Borland C++ 3.1, если не ошибаюсь). А это значит, что все у нас строилось через WndProc с большим switch-ем внутри.

Вот тут то пошаговая отладка оказалась не то, чтобы невозможной, а очень неудобной. Функцию WinMain можно было протрассировать только до начала цикла сообщений. В WndProc же отладчиком можно было попасть только установив там очку прерывания.

Но если поставить точку прерывания на входе в WndProc, чтобы затем обработку сообщения протрассировать – и тут же тебя затопчет толпа самых разнообразных сообщений WM_*, о которых ты и знать не знал. В TDW можно было фильтры для сообщений настраивать, но это было мутное дело, да и повторять его приходилось при каждом запуске отладчика. А еще и ряд действий выполняется через Callback-и – т.е. в одном месте ты что-то из Windows вызывал, а спустя какое-то время сама Windows твою функцию вызвала. Нужно помножить все это еще и на изрядную неспешность тогдашних машин и получится, что отладчик вовсе не ускорял отладку, а только усложнял ее.

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

Так начались первые шаги в сторону от отладчика. Пока еще маленькие и робкие :) Со временем довелось пересесть на более мощные машины и более современные средства разработки (Borland C++ 3.1 и Borland C++ 4.01/4.5). В каком-то из них, кажется, уже был встроенный в IDE отладчик, работающий в графическом режиме. Хотя помощь от него при программировании под Windows (из-за особенностей самого программирования через WndProc) все равно была меньше, чем от отладчика под DOS-ом.

В общем, где-то в районе 1994-95 отладчиком я все еще пользовался регулярно, хотя и в меньшем объеме, чем в 1992-1993-м. А потом мне довелось перебраться под Win32 с реальной многозадачностью, плотно попрограммировать в OS/2 и поэкспериментировать с Linux-ом…

Продолжение следует.

PS. Перечитываю свой текст и ловлю себя на мысли, что меня обязательно спросят: “А зачем нужен был весь этот мазохизм с Windows на 286-х в 1992-93?” Была у нас тогда уверенность в том, что времена MS-DOS-а и самодельных пользовательских интерфейсов и самописных драйверов для принтеров уже прошли. Будущее за Windows-программированием. И что техника не всегда у нас будет такой допотопной. Так в принципе и вышло.

2 комментария:

Rustam комментирует...

Интересно пишешь :)
Но думаю практически бесполезно убеждать, пока на своей шкуре не почувствуешь, через COM порт релизы не поотлаживаешь не дойдет :)

eao197 комментирует...

>Интересно пишешь :)

Спасибо

>Но думаю практически бесполезно убеждать, пока на своей шкуре не почувствуешь, через COM порт релизы не поотлаживаешь не дойдет :)

А я и не убеждаю. Просто рассказываю, как это было у меня. Чтобы объяснить, что это не придурь сумашедшего оригинала, а результат стечения нескольких обстоятельств.

Ну и плюс -- очередной всплеск графомании :)