<<<предыдущий список следующий>>>

Это - копия документа, находившегося на http://dz.ru. Авторские права, если не указано иначе, принадлежат Дмитрию Завалишину и/или Евгении Завалишиной. Все изменения, внесенные мной, находятся в этой рамочке.Пожалуйста, прочитайте disclaimer.


12 апреля

"Ты ужасна, спору нет..."

   
From: Maxim Shemanarev
Subject: What's wrong with C++
Привет Дмитрий,
 
Прочитал все выпуски от начала 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-а, в которых он участвует, и так далее.

Беда в том, что я не уверен, что и это решит проблему необозримости существующих программных систем.

Одно из следствий ухода от ассемблера к си было в том, что на Си труднее "наворотить". Не невозможно, конечно, но более трудно. Я боюсь, что это - единственный путь. Создавать языки более жёсткие, ограничивающие свободу программиста, вынуждающие его к применению "зашитой" в язык парадигмы. Это - надругательство над свободой программиста, как конвейер - надругательство над человеком вообще. Но, наверное, единственный способ порождать программы, пригодные для сопровождения.

Электромечта и электрореальность.

   
From: Alexey Ryabtsev
Subject: ElectroCar

Hello dz,

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

В своем выпуске за 7 Апреля, под заголовком "Чудеса в решете" Вы написали про электромобиль Oka и сокрушались, что не серийные они все, но... Маленькое отступление про гибридные полноприводники - эта идея уже давно не нова и давно муссируется всякими джиперами (в смысле производителями оных) и вроде как последняя модель новорусского танка Mitsibishi Pajero (еще вроде как не производится) имеет именно описанный Вами привод.

Но вернемся к нашим баранам, а именно электромобилям. Спешу Вас обрадовать, что таковые уже дааавно (почти два(!) года) выпускаются серийно и свободно (почти) продаются там... А именно FIAT SEICENTO Elettra. Аккумуляторы там на самом деле обычные свинцовые необслуживаемые 12-ти вольтовые, только их там много (уже не упомню сколько точно, где-то ~18), ну плюс еще один как положено автомобилю и... топливный бак!.. но для дизельного отопителя. Вобщем если бы не цена ~$20900-22400 (В зависимости от комплектации), и не отсутствие зарядочных станций в побличных местах (в смысле на стоянках и в гаражах)... хотя последнее не столь значительное препятствие на фоне первого :-(

Best regards,
Alexey
mailto:ryabtsev@upi.com.ua

 

Спасибо.

Интересно, что по заявленным характеристикам Фиат нашей Оке отчасти уступает. Аккумуляторы весят на 100 Кг больше (400 против 300, 13 квт.ч против 12), пробег без подзаряда - 90 км против 100. Правда, разгон более энергичный - 8 секунд до 50 км/ч (у Оки - 14 до 60).

Из интересного - скоростной зарядник, позволяющий за 2.5 часа полностью зарядить батареи. Вопрос только, как это сказывается на времени их жизни...

А зарядники на стоянках - дело наживное. Будут три электромобиля в день приезжать на стоянку - будет и зарядник за сто рублей. Будут десять машин в день - будет зарядник по нормальной цене - что-нибудь рубля за полтора на киловатт...

Кстати, то же самое касается и цены самого автомобиля. Мелкосерийное производство всегда дорого обходится.

Короче говоря, думается мне, что через пять лет зарядники на стоянках таки появятся.