LINUX.ORG.RU

Гради Буч - о средствах разработки и их будущем


0

0

По ссылке вы найдете замечательное интервью с Гради Бучем.

Гради Буч (Grady Booch), главный исследователь корпорации Rational Software, признан всем международным сообществом разработчиков программного обеспечения благодаря его основополагающим работам в области объектно-ориентированных методов и приложений, а также благодаря созданию языка UML. Гради - постоянный автор в таких журналах, как "Object Magazine" и "C++ Report" и автор многих бестселлеров, посвященных объектно-ориентированному проектированию и разработке программ. Гради Буч участвует в написании серии "Разработка объектно-ориентированного программного обеспечения" ("Object-oriented Software Engineering Series"), издаваемой Addison-Wesley Longman.

P.S. Большая благодарность TanaT за интервью.

>>> Подробности

★★★★★

Проверено: maxcom

Ответ на: комментарий от anonymous

А это (нематематические проявления реальной жизни) обычно мало интересует снобов от математики. Это они оставляют плебеям.

svu ★★★★★
()
Ответ на: комментарий от svu

> И в воздухе запахло математическим снобизмом. Может быть, Вы до сих пор думаете, что компьютеры существуют, чтобы что-то ВЫЧИСЛЯТЬ?:)

у меня самого "красный диплом" по прикладной математике и пара лет аспирантуры, но я не стал бы делать таких категоричных выводов; просто человек не умеет себя вести, а такие везде есть... не стоит на него обижаться

dave ★★★★★
()
Ответ на: комментарий от svu

>использовал gcc (уже вижу летящую в меня кучу камней).

Оптимизацию включите, может поможет. Я, помню, давно экспериментировал с KAI, и у меня потоки были сравнимы(?) с printf. Еще, gcc, насколько я помню, умеет разбирать аргументы printf и прочих стандартных функций на этапе компиляции.

anonymous
()
Ответ на: комментарий от svu

=== testout.c ====

#include <stdio.h>

main()
{
    double d = 0.0;

    for(; d < 1e6; d += .6781)
	printf("%6.2f ", d);

    return 0;
}

======

$ gcc -o testout_c testout.c
$ time ./testout_c > /dev/null
4.96user 0.01system 0:04.96elapsed 100%CPU


=== testout.cc ===
#include <iostream>

using namespace std;

int 
main()
{
    double d = 0.0;

    for(; d < 1e6; d += .6781)
    {
	cout.width(6);
	cout.precision(2);
	cout.setf(ios_base::left, ios_base::adjustfield);
	cout << d << ' ';
    }

    return 0;
}
=======

$ g++ -O3 -o testout_cc testout.cc
$ time ./testout_cc > /dev/null
17.42user 0.03system 0:17.45elapsed 99%CPU


=== testou2.cc ===
#include <iostream>

using namespace std;

int 
main()
{
    double d = 0.0;
    
    // Нечестно, т.к. разные форматы могут идти вперемешку
    cout.width(6);
    cout.precision(2);
    cout.setf(ios_base::left, ios_base::adjustfield);
    for(; d < 1e6; d += .6781)
    {
	cout << d << ' ';
    }

    return 0;
}
======

$++ -O3 -o testout_cc2 testout2.cc
$ time ./testout_cc2 > /dev/null
17.28user 0.01system 0:17.29elapsed 99%CPU


gcc version 3.2.2

anonymous
()
Ответ на: комментарий от anonymous

Какую именно оптимизацию? Просто -Ox я пробовал - не помогает. А плюсовых ключей оптимизации я не знаю (я от С++ ушел еще с Борланда и Вижуала - на g++ реально не работал). А при чем тут аргументы printf? У меня же там просто строка - без форматов.

Я же говорю - предложения по ключам оптимизации приветствуются.

svu ★★★★★
()
Ответ на: комментарий от svu

>А это (нематематические проявления реальной жизни) обычно мало интересует снобов от математики.

А че здесь нематематического?

a + b != b + a отсюда следует, что а и b могут входить в некоммутативную

группу относительно операции +

Sun-ch
()
Ответ на: комментарий от anonymous

Кажется, выводы у нас одинаковые:) Поражает, однако, цикл по вещественной переменной d. Особенно - значение шага:)))

svu ★★★★★
()
Ответ на: комментарий от svu

Господа, вот наверняка среди вас есть \w/ кодеры, хотелось бы получить совет по какой книжке учить C (не C++, как я понял ну его..)..

Раньше писало только на ASM и редко на паскакале, и только под DOS :-(

Если она еще есть и в электронном виде - это будет вообще класс. Заранее санкс.

anonymous
()
Ответ на: комментарий от anonymous

>по какой книжке учить C (не C++, как я понял ну его..)..

Керниган, Ритчи "Прогаммирование на C" - руле-з-з-з форевер! :-) Ищи на http://lib.itsoft.ru/, там ещё много интересного по *nix.

anonymous
()
Ответ на: комментарий от svu

Почему издеваться? Товарищ правильно поднял проблему.

Уровень математической культуры у многих программистов, действительно

невысок. Многие могут часами рассуждать о ООП, экстремальном,

функциональном программировании, при этом упоминание термина "алгебра

Каца-Муди", вызывает у них приступы нездорового смеха.

Sun-ch
()
Ответ на: комментарий от svu

> Поражает, однако, цикл по вещественной переменной d. Особенно - значение шага:)))

Мне нужон был не цикл по переменной (? ;))), а много-много значений с плав.точкой для скармливания printf :))))

anonymous
()
Ответ на: комментарий от Sun-ch

> термина "алгебра Каца-Муди",

Хаа-хха-хаха.

anonymous
()
Ответ на: комментарий от anonymous

> по какой книжке учить C продолжение...

Когда прочитаете Кернигана и Ритчи (только проверьте, чтобы было 2-е издание), почитайте "Энциклопедию С" изд-ва Диасофт, в сети нет, по-моему, зато на сайте издательства код примеров. Скачайте и будете пользоваться всеми этимим списками, деревьями, хэш-массивами и пр., чем господа Сипипишники так гордятся:-).

Вообще, по С почти все книжки хорошие, тк их пишут профессионалы, а не пиарщики и преподаватели информатики :-).

anonymous
()
Ответ на: комментарий от svu

Два вопроса:

- (2svu, хотя, может кто ещё ответитЮ) как можно писать на "не-ОО" языке "ОО" способом? (желательно либо с кодом, либо с ссылкой)

- почему никто Object-C не рассматривает?

xlex
()
Ответ на: комментарий от xlex

- посмотреть сырцы gtk+ (или xview)
- м/б Objective C ?

anonymous
()
Ответ на: комментарий от adarovsky

А что такое loki?

>А что такое loki?

Generic библиотека C++, разработанная Anrei Aleksandresku - автором
"Modern C++ Design". Ее (loki) можно найти по адресу
http://sourceforge.net/projects/loki-lib.

Для сети (и не только) - ACE. http://www.cs.wustl.edu/~schmidt/ACE.html

Удачи.

Captain.

anonymous
()
Ответ на: комментарий от Vinni_Pooh

Не, помнится была одна задачка, провести через n точек гладкую

кривую, дык все супер-кодеры на Delphi и МС VC сели в лужу,

а один дедок написал ее за полчаса на бумаге.

Поскольку он знал про сплайны :)

Sun-ch
()
Ответ на: комментарий от xlex

2xlex (*) (20.11.2003 16:18:10)

> как можно писать на "не-ОО" языке "ОО" способом?

http://www.enet.ru/win/cherezov/sp-forth.html

Обрати внимание на: * реализация ООП-расширений Форта

Кстати, в spf4 предлагались несколько вариантов реализации ООП
(микроклассы, множественное наследование, например:

HERE
USER-VALUE self
: FIELD
    CREATE OVER , +
    DOES> @ self + ;
: _exitm
   R> TO self ;
: _in
   R>
   self >R
   ['] _exitm >R
   >R TO self ;
: M: : POSTPONE _in ;
: DO-IT-DEF
  GET-ORDER 1+      
   VOC-LIST @ CELL+ 
    SWAP SET-ORDER  
  DEFINITIONS ;
: CLASS: ( "name" -- 0 ) VOCABULARY DO-IT-DEF ;
: ;CLASS  PREVIOUS FORTH-WORDLIST SET-CURRENT ;
: CHILD: ( -- u )
          CONTEXT @ @ PREVIOUS VOCABULARY DO-IT-DEF
          GET-CURRENT ! ;
: WITH        ALSO ; IMMEDIATE
: ENDWITH PREVIOUS ; IMMEDIATE
: LOOK-FOR-INIT (  -- 0 | xt 1 | xt -1 )
   S" INIT" CONTEXT @ SEARCH-WORDLIST ;
: LOOK-FOR-DESTROY ( wid -- 0 | xt 1 | xt -1 )
   S" DESTROY" ROT SEARCH-WORDLIST ;
: OBJECT  ( length  -- addr )
     HERE OVER ALLOT
      DUP ROT ERASE
       LOOK-FOR-INIT
       IF
         EXECUTE
       THEN ;
: (NEW) ( length  -- addr )
     DUP ALLOCATE THROW
      DUP ROT ERASE ;
: NEW ( -- )
  STATE @
  IF
    POSTPONE (NEW)
    LOOK-FOR-INIT
    IF
      COMPILE,
    THEN
  ELSE
    (NEW)
    LOOK-FOR-INIT
    IF
      EXECUTE
    THEN
  THEN
; IMMEDIATE
: INHERIT ( -- )
   SMUDGE
   LATEST COUNT DUP >R
   PAD SWAP CMOVE
   HIDE PAD R>
   CONTEXT @ SEARCH-WORDLIST
   IF
     5 +     COMPILE,
   THEN
; IMMEDIATE

Вот и вся реализация микроклассов/ООП...    красиво.

     CLASS: Test
        0
          CELL FIELD x
          CELL FIELD y
        CONSTANT /Test
     ;CLASS

     WITH Test CHILD: Test1
        /Test
          CELL FIELD z
        CONSTANT /Test1
     ;CLASS

     WITH Test1
       /Test1 OBJECT
       ...
     WITHOUT

 http://sourceforge.net/projects/spf/

Обрати внимание на библиотеки Dmitry Yakimov (aka ~day)

joop (just OOP, его же) код поболее будет, аж 5276 байт, постить не буду...

anonymous
()
Ответ на: комментарий от anonymous

>До чего убогий язык, если простую фразу "вывести hello-world ровно
>константу раз" в нем нужно записывать через цикл с изменяемой
>переменной :)

А вот здесь Вы облажались милейший. На вскидку:

-----------------------------------
#include <iostream>

struct __dummy {};

std::ostream& operator << ( std::ostream& os, const __dummy& ) {
os << "Hello World" << '\n';
return os;
}

template<const int n>
struct _dummy : public __dummy {
_dummy() {
std::cout << _dummy<n-1>();
}
};

template
struct _dummy<0> : public __dummy {
};

int main(void)
{
_dummy<10>();
}
------------------------------

Captain.


anonymous
()
Ответ на: комментарий от svu


А Вы значит считаете, вывод в C++ поток и sprintf это одно и тоже? Если
Вы не понимаете разницы - почитайте книжки там какие нибудь или
посмотрите на реализацию что ли.


к.т.н то блин ... детский сад.


Captain.

anonymous
()
Ответ на: комментарий от anonymous

А я где-нибудь утверждал, что это одно и то же? Просто в данном конкретном обсуждаемом случае функциональность программы - та же самая. А скорость - ну, Вы сами видите.

Кстати, на реализацию потоков я смотрел. Мне кажется, это тот самый случай, когда С++ по сложности восприятия догоняет Перл:). На С так сложно написать - это надо очень постараться:)

Так-то, тов. капитан.

svu ★★★★★
()
Ответ на: комментарий от anonymous

М-м. Я уж лучше цикл напишу. Быстрее, эффективнее, читаемей.

svu ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо за ответ, но если честно, ни черта не понял...

А можно объяснение для тех, кто программирует на PHP (немного на Си), а как выглядит чистый виндоус (а тем более разработка для него) уже не помнит? Идеально, если на том же Си...

xlex
()
Ответ на: комментарий от anonymous

До чего убогий язык, если простую фразу "вывести hello-world ровно константу раз" в нем нужно записывать через запись десятка строчек кривых ++ных шаблонов :)

PS dummy, _dummy, __dummy, ___dummy, ____dummy

anonymous
()
Ответ на: комментарий от dsa

Дайте и мне ударить!...

Как, разозлившись, кричала моя племяница: - "... не держите меня, я все равно плюну в дедушку!!!..."

2dsa (*) (20.11.2003 11:07:33)

А нук-ка Жабу не трож! Что в одну кучу валишь? Что общего у С++ с java?

vada ★★★★★
()
Ответ на: комментарий от svu

> И не хами, парень.

svu, вы решили поругаться со студиоузами у которых гонора на три пуда, а знаний на грош? Я лично считаю ваши доводы разумными, но стоит ли "играть в бисер перед свиньями" (c)?

anonymous
()
Ответ на: комментарий от svu

>функциональность программы - та же самая

Упффф... Эдак утверждать, так функциональность летащего кирпича и
скажем баллистической ракеты одинакова - и то и другое летает.

Обработка исключений, потдержка информации о состояние потока,
наконец форматирование ( facets ). Все это работает в С++ версии за
сценой, а как известно за все надо платить.
Не хотите платить - пользуйтест той же printf - в C++ она есть
не знали?

Captain.

anonymous
()
Ответ на: комментарий от xlex

2xlex (*) (20.11.2003 17:33:14)

> Идеально, если на том же Си...

Идеально получилось бы для gforth... :-)

> объяснение для тех, кто программирует на PHP (немного на Си)

...а нужно ли это и стоит ли оно того?

:-)

anonymous
()
Ответ на: комментарий от anonymous

>До чего убогий язык, если простую фразу "вывести hello-world ровно
константу раз" в 

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

struct out_any_string {
  out_any_string(const string& S) 
   :m_str(S) {
  }
  string& operator() {
   return m_str; 
  }
  string m_str;
}

int main(int argc, char* argv[])
{
generate_n(ostream_iterator(cout,"\n"),10,out_any_string("hellowo
rld!"));

return 0;
}

Гы-гы :)

anonymous
()
Ответ на: комментарий от anonymous

>generate_n(ostream_iterator(cout,"\n"),10,out_any_string("hel lowo rld!"));

Тьфу, вот что значит перебивать!! generate_n(ostream_iterator<string>(cout,"\n"),10,out,any_string ("helloworld!"));

anonymous
()
Ответ на: комментарий от anonymous

И еще проще

const char* sam_durak()
{
  return "sam durak!!!";
}

int main(int argc,char* argv[])
{
  generate_n(ostream_iterator<const char*>(cout,"\n"),10,sam_durak);
  return 0;
}

anonymous
()
Ответ на: комментарий от anonymous

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

P.S. В качестве д/з можешь посмотреть реализацию generate_n - там тот же цЫкл, а мне нужно решение времени компиляции (но не такое громоздкое, как предложил капитанчик).

anonymous
()
Ответ на: комментарий от anonymous

>В качестве д/з можешь посмотреть реализацию generate_n - там тот же цЫкл,

В последнем примере строчек было намного меньше, это раз. То, что generate -- это цикл, я как бы и без тебя в курсе, спасибо, это два.

anonymous
()

>До чего убогий язык, если простую фразу "вывести hello-world ровно
>константу раз" в нем нужно записывать через цикл с изменяемой
>переменной :)

...соревнование, кто дальше спрячет счетчик?

anonymous
()
Ответ на: комментарий от anonymous


Бороться и искать, найти и перепрятать?

:-)

anonymous
()
Ответ на: комментарий от anonymous

Нет, функциональность баллистической ракеты другая - убойная сила отличается на порядки. Даже при неядерной боеголовке.

Про исключения - мы уже договорились, что исключения в первой версии не обрабатываются нормально (потому как код конструктора выполняется вне контекста какой-либо функции). "Поддержка информации о состоянии потока" в данном примере никак не используется. Форматирования printf хватает для базовых ситуаций. Получается - _в_данном_конкретном_случае_ (и во многих других) мы платим производительностью (причем нехило так платим) за то, что не используем. Купили Феррари и ездим по городу со скоростью 60кмч.

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

Я в курсе, что libc можно использовать из С++. Но мы же измеряли скорость ОО подхода в ОО языке против не-ОО подхода в не-ОО языке, правда?

svu ★★★★★
()
Ответ на: комментарий от anonymous

Просто интересно - для себя. Может буду пользовать, а может выясню, что давно этим пользуюсь... Самосовершенствование, так сказать... =)

xlex
()
Ответ на: комментарий от anonymous

Кстати, хороший пример того, как С++ провоцирует на ошибки. Ладно, в этом случае Вы бы получили ошибку компиляции. А вот сколько прог стали кривыми, глюкавыми из-за пропущенного знака "&"?

svu ★★★★★
()
Ответ на: комментарий от Pavel_and

> Чем не устроит?

         movl    $9, %ebx
        .p2align 4,,7
.L6:
        subl    $12, %esp
        decl    %ebx
        pushl   $.LC0
.LCFI3:
        call    printf
        addl    $16, %esp
        testl   %ebx, %ebx
        jns     .L6

Вот этим (если испраить твои ошибки и скомпилять). Должно быть 10 вызовов printf.

anonymous
()
Ответ на: комментарий от obp

>А про eiffel не скажу точно, но сдается мне(возможно я и ошибаюсь) что он тоже шьет байт код и интерпретатор оного в один исполняемый файл

http://smalleiffel.loria.fr/

What is SmallEiffel?

SmallEiffel The GNU Eiffel compiler is the fastest and the slimmest multi-platform Eiffel compiler on Earth! It is also one of the cheapest, since it is completely FREE !

SmallEiffel also features many other Eiffel tools and a very large library of general purpose Eiffel classes (click here to view the READ_ME of the SmallEiffel distribution).

Version - 0.74 (read "minus 0.74"), released on Tuesday May 07th, 2002 is the latest available from the current page. It is the 27th version of SmallEiffel. To be sure to get the most up-to-date version, always check the original SmallEiffel Web page at SmallEiffel.loria.fr.

SmallEiffel The GNU Eiffel Compiler is a free open-source Eiffel compiler distributed under the terms of the GNU General Public License as published by the Free Software Foundation. It is a complete, small and very fast, free Eiffel compiler. It is available for a very wide range of platforms. In fact, SmallEiffel should run on any platform for which an ANSI C - POSIX compiler or a standard JVM exists.

The current distribution includes an Eiffel to C compiler, an Eiffel to Java bytecode compiler, a documentation tool, a pretty printer and various other tools, with their sources.

xacid

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.