Это - копия документа, находившегося на 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 часа полностью зарядить батареи. Вопрос только, как это сказывается на времени их жизни...
А зарядники на стоянках - дело наживное. Будут три электромобиля в день приезжать на стоянку - будет и зарядник за сто рублей. Будут десять машин в день - будет зарядник по нормальной цене - что-нибудь рубля за полтора на киловатт...
Кстати, то же самое касается и цены самого автомобиля. Мелкосерийное производство всегда дорого обходится.
Короче говоря, думается мне, что через пять лет зарядники на стоянках таки появятся.