Это - копия документа, находившегося на http://dz.ru. Авторские права, если не указано иначе, принадлежат Дмитрию Завалишину и/или Евгении Завалишиной. Все изменения, внесенные мной, находятся в этой рамочке.Пожалуйста, прочитайте disclaimer. |
"Ты ужасна, спору нет..."
Привет Дмитрий,
Прочитал все выпуски от начала 99 года, интересные были
темы. Давненько не было темы о программировании, в
частности, ОО. Так что решусь высказать некоторые свои мысли. Однако,
сегодня речь пойдет не об ОО, а о простом и насущном C++. И чем он
мне не прельстив. А не прельстив он мне прежде всего ужасным, просто невообразимым
синтаксисом. О как!
Теперь, чтобы пояснить свой наезд, давайте вспомним древнюю
как сами компьютеры статью под названием "Настоящие программисты не используют
Паскаль. Статья весьма претенциозна и о ее ценности мы говорить не
будем.
Поговорим об одной цитате.
"...Затем я попал в реальный мир. Моей первой задачей
было прочитать и понять фортрановскую программу емкостью 200000 строк,
а затем увеличить скорость ее работы в 2 раза. Любой настоящий программист
скажет вам, что все структурированное программирование мира
не поможет вам решить проблемы вроде этой - решение этой задачи требует
настоящего таланта."
Сейчас выделенное будет звучать "все объектно-ориентированное
программирование мира...". Действительно, то ли это мне так везет, то ли на большее не способен,
но вот уже в который раз я попал на работу, где надо разбираться в тоннах
исходников на C++, один ужаснее другого. Все красивые каноны ОО идут в
лес, надо просто понять проблему и решить ее. Потому что перепроектировать
всю систему, ясен перец, не под силу. Исходники именно на C++, с классами
на 1000 строк, кошмарными иерархиями, открытыми data-membera'ми. Да еще
и с templata'ми. А потом кто-то в некотые места STL
прикрутил. Не будем рассуждать о создателях и проектировщиках и не будем
ругать их. Понятно, что нужно было проектировать тщательнее, писать аккуратнее,
blah-blah, blah-blah, blah-blah. Но сейчас-то что делать? Тем более, что
что система работает, эксплуатируется, приносит деньги (их которых
мне зарплату платят) и снаружи выглядит вполне прилично.
И чего же мне надо? А вот чего - одной простой программки
под названием типа cxx2html. В старых выпусках dzOnline кто-то возжелал печатать
свои исходники и потом в них таращиться. Настоящий индеец. Потому что,
как вполне справедливо заметил dz, программа представляет собой K-мерную
стркутуру и рассматривать ее приходится во многих плоскостях. А распечатанный
текст исходников - это все равно что распечатанные на бумаге значения координат
объектов в Quake. Но это все, что мы имеем! А хочется большего. По меньшей
мере - html со всеми возможными ссылками. То
есть буквально - со всеми возможными. Тогда практически
весь текст превращается в ссылки. Любой класс, метод, переменная, перегруженный
оператор, template, константа, define, typedef. И это уже хорошо, но это
лишь "жалкий частный случай для K равного 2" (c) Анекдот про математика.
Но даже такое сделать непросто, по крайней мере я не нашел ни одной
толковой реализации (говорят, для emacs есть, но я не видел). Почему?
В силу чудовищности синтакса C++. Чтобы распарсить все в точном соответствии
со стандартом, с разрешением всех неоднозначностей и корректным поиском
всех перегруженных методов и операторов, надо пол-компилятора написать.
Причем с почти такой-же диагностикой ошибок. Но и этого мало, хоть и облегчило
бы жизнь при разбирательстве в тоннах кода. Надо еще что-то типа Rational
Rose, чтобы рассмотреть все это в разных плоскостях. Но в Rational Rose
ставилась другая задача, а именно - проектирование. Поэтому,
не удивительно, что с задачей Reverse Engineering он справляется весьма
посредственно. Все что делает, к примеру Visual Studio, это строит иерархию
классов. Тоже мне достижение! А где мне взять структуру взаимодействия
объектов? Кто что в себе инкапсулирует? Где стрктура алгоритмической декомпозиции?
И все это мне нужно с различной степенью детализации - ZoomIn, ZoomOut
изменяют мастаб. А на самом нижнем уровне - разукрашенные исходники. Причем,
разукраска тоже может быть разной. Например:
class string {...}
void foo(const string&
var);
. . .
. . .
const char* str = "const string1";
foo("const string");
(1)
foo(str);
(2)
. . .
. . .
В случае (1) очевидно, что при нажатии на эту ссылку,
мы попадаем в констркуктор string::string(const char*). В случае
(2) нам было бы полезно попасть как на объявление переменной, так
и на тот же констуктор string. А еще, хотелось бы проследить цепочку exception,
да и вообще - цепочку истории происходения любого объекта - откуда он
взялся или мог бы взяться. В особо запущенных случаях (а такие тоже встречаются)
- простая разукраска уровней вложенности скобок также помогла бы. В общем
много чего хотелось бы. И сдается мне, что простой html здесь уже не потянет.
Хотя бы потому, что в броузере текстового курсора нет :-)
Кто-то скажет, дескать все это уже есть, вон там-то
и там-то. Но такого чтобы все в одном флаконе - что-то не видать. Может
искал плохо. Все что я нашел - это различные документаторы, типа
Doc++, но они -
именно документаторы, исходники они теряют.
Такие дела.
В следующий раз расскажу, в чем я вижу главный тормоз
прогресса при использовании C++.
McSeem
|
Спасибо за письмо.
Синтаксис C++ (как, впрочем, и обычного C) действительно ужасен. Даже и спорить не о чем.
Планарное (текстовое) представление исходников программ изжило себя уже в пору структурного программирования, а уж в объектном plain text как носитель информации - нонсенс.
Говоря о языке синтаксис стоит рассматривать лишь как способ промежуточного хранения информации - такого, на который не должен смотреть глаз человека. Он должен быть легко разбирабелен, но не для того, чтобы легко писать на нём и читать его. Не надо его читать, вообще смотреть на него не надо, как не надо смотреть на исполняемые файлы.
Программировать нужно на следующем уровне - пользуясь метаязыками, которые пригодны для описания конкретных "срезов" программы. Находясь в некоторой её точке я хочу иметь возможность посмотреть на любую интересующую меня в данный момент проекцию многомерной структуры программы на плоскость (экрана:). Глядя на конструктор я мог бы заинтересоваться классом, к которому он принадлежит (все методы и конструкторы/деструкторы), дерево типов, к которому он принадлжит, ветвям flow control-а, в которых он участвует, и так далее.
Беда в том, что я не уверен, что и это решит проблему необозримости существующих программных систем.
Одно из следствий ухода от ассемблера к си было в том, что на Си труднее "наворотить". Не невозможно, конечно, но более трудно. Я боюсь, что это - единственный путь. Создавать языки более жёсткие, ограничивающие свободу программиста, вынуждающие его к применению "зашитой" в язык парадигмы. Это - надругательство над свободой программиста, как конвейер - надругательство над человеком вообще. Но, наверное, единственный способ порождать программы, пригодные для сопровождения.
Электромечта и электрореальность.
Hello dz, Ну люблю я почитывать твои журналы порою, хотя то-ли я брюзжать последнее время начал, то-ли таки да, меньше мне стали твои выпуски нравиться... Но это все вступление, я по поводу электромобилей. В своем выпуске за 7 Апреля, под заголовком "Чудеса в решете" Вы написали про электромобиль Oka и сокрушались, что не серийные они все, но... Маленькое отступление про гибридные полноприводники - эта идея уже давно не нова и давно муссируется всякими джиперами (в смысле производителями оных) и вроде как последняя модель новорусского танка Mitsibishi Pajero (еще вроде как не производится) имеет именно описанный Вами привод. Но вернемся к нашим баранам, а именно электромобилям. Спешу Вас обрадовать, что таковые уже дааавно (почти два(!) года) выпускаются серийно и свободно (почти) продаются там... А именно FIAT SEICENTO Elettra. Аккумуляторы там на самом деле обычные свинцовые необслуживаемые 12-ти вольтовые, только их там много (уже не упомню сколько точно, где-то ~18), ну плюс еще один как положено автомобилю и... топливный бак!.. но для дизельного отопителя. Вобщем если бы не цена ~$20900-22400 (В зависимости от комплектации), и не отсутствие зарядочных станций в побличных местах (в смысле на стоянках и в гаражах)... хотя последнее не столь значительное препятствие на фоне первого :-( Best regards,
|
Спасибо.
Интересно, что по заявленным характеристикам Фиат нашей Оке отчасти уступает. Аккумуляторы весят на 100 Кг больше (400 против 300, 13 квт.ч против 12), пробег без подзаряда - 90 км против 100. Правда, разгон более энергичный - 8 секунд до 50 км/ч (у Оки - 14 до 60).
Из интересного - скоростной зарядник, позволяющий за 2.5 часа полностью зарядить батареи. Вопрос только, как это сказывается на времени их жизни...
А зарядники на стоянках - дело наживное. Будут три электромобиля в день приезжать на стоянку - будет и зарядник за сто рублей. Будут десять машин в день - будет зарядник по нормальной цене - что-нибудь рубля за полтора на киловатт...
Кстати, то же самое касается и цены самого автомобиля. Мелкосерийное производство всегда дорого обходится.
Короче говоря, думается мне, что через пять лет зарядники на стоянках таки появятся.