К. с-ра т-а?
От: Трурль  
Дата: 23.12.05 11:48
Оценка: 39 (2) +1 -1

Dear ...,

I have read Mark Joshi's book on C++ design patterns ...
My interest in the book was to try to learn how theory is put into practise. The best way to do that is by actually implementing things, so I did: I reimplemented his C++ code in OCaml, a functional, OO language that I like using. However, instead of a direct translation of C++ classes to OCaml classes, I chose a non-OO design. The result is quite interesting from the point of view of code complexity and programming productivity (and hence cost).
Here's a summary:

Monte Carlo (datatypes only)
C++: 264 lines of code (LOC), (7 classes, 20 methods), 12 files
ML : 33 LOC, (3 datatypes, 1 function), 2 files
LOC ML/C++: 33/264 = 13%
Binomial trees (datatypes only)
C++: 264 + 138 = 402 LOC, (10 classes, 30 methods), 18 files
ML : 33 + 12 = 45 LOC, (3 datatypes, 3 functions), 2 files
LOC ML/C++: 45/402 = 11%
Binomial trees (datatypes + main algorithm)
LOC ML/C++: 165/522 = 32%

I'm not claiming that Mark's C++ code is bad (actually, it's quite good). However, using a better tool results in obtaining a better final product. (Performance of Ocaml's code is competitive with C++ as well.)


Not bad. But my K implementation only uses 2 lines of code though...

EuroOpt:{[S;K;r;v;T;n;po] / spot, strike, rate, vol, expir, steps, payoff

/ initialize constants
p:(%2*m)*(1%D)-d:a-m:_sqrt -1+a*a:.5*(_exp dt*r+v*v)+D:_exp -r*dt:T%n;

/ apply n binomial steps
:*n{-1_ D*(p*1!x)+x*1-p}/K po' S*(1%d)^(2*!n+1)-n
}

...and here are some test cases...
po:{0|x-y}; / arbitrary payoff function: max(0, K-S) for put

/ compare results for n = 16, 32, 64, 128, and 256
\t EuroOpt[5;10;.06;.3;.5;;po]' _16*2^!5

/ pass in payoff functions for put, call, and digital \t 
EuroOpt[8;10;.06;.3;.5;500;]' {0|x-y},{0|y-x},{y>x}

/ investigating convergence for a digital option with 1-300 steps...
EuroOpt[8;10;.06;.3;.5;;{y>x}]' 1+!300

So yes, I agree with you. Functional languages are cool and C++ is verbose & restrictive. Unfortunately, in the real world people don't care about any of this...

Re: К. с-ра т-а?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.12.05 12:22
Оценка:
Здравствуйте, Трурль, Вы писали:

Ну хоть что-то конкретное!

Т>

Т> C++: 264 lines of code (LOC), (7 classes, 20 methods), 12 files
Т> C++: 264 + 138 = 402 LOC, (10 classes, 30 methods), 18 files


Разбить 264 строки на 12 файлов, это еще суметь нужно.
А в строки кода, входили include-guard-ы и сами include?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: К. с-ра т-а?
От: Кодт Россия  
Дата: 23.12.05 12:28
Оценка: 1 (1) +1 :))) :)))
Здравствуйте, Трурль, Вы писали:

Оверхед не пройдёт!
Перекуём баги на фичи!
Re[2]: К. с-ра т-а?
От: Трурль  
Дата: 23.12.05 12:54
Оценка: 12 (1)
Здравствуйте, eao197, Вы писали:

E>А в строки кода, входили include-guard-ы и сами include?

Да вот оно.
Re[3]: К. с-ра т-а?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.12.05 13:23
Оценка:
Здравствуйте, Трурль, Вы писали:

E>>А в строки кода, входили include-guard-ы и сами include?

Т> Да вот оно.

Спасибо, интересно.
А иходники упомянутых OCaml решений где можно увидеть?
И к какому C++ примеру относиться приведенный на OCaml-е пример с EuroOpt?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: К. с-ра т-а?
От: z00n  
Дата: 23.12.05 13:59
Оценка:
Здравствуйте, eao197, Вы писали:

E>И к какому C++ примеру относиться приведенный на OCaml-е пример с EuroOpt?

На K, не на Ocaml-e. Но вообще к Monte Carlo, судя по всему.
Re[4]: К. с-ра т-а?
От: reductor  
Дата: 23.12.05 14:00
Оценка:
Здравствуйте, eao197, Вы писали:

E>И к какому C++ примеру относиться приведенный на OCaml-е пример с EuroOpt?


Это не окамл, это К.
И в общем все остальное тоже очевидно из комментариев — TreeMain.cpp
Re: К. с-ра т-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.12.05 14:16
Оценка: +2 :))) :)
Здравствуйте, Трурль, Вы писали:

Это русскоязычный форум. Другие языки здесь допускаются только ради исключения.

В данном сообщении нет ни одного русского слова (если не считать слова "К").

В следующий раз подобные темы/сообщения будут удаляться без предупреждения. Так что потрудитесь переводить публикуемую информацию.

PS

В бане мест еще много, так что если кто хочет провести следующую недельку весело, то присоединяйтесь.
Подробности здесь
Автор: VladD2
Дата: 24.12.05
.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: К. с-ра т-а?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.12.05 14:44
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>

Т>I'm not claiming that Mark's C++ code is bad (actually, it's quite good).


Да уж, примеры 'quite good' кода:
Parameters& Parameters::operator=(const Parameters& original)
{
   if (this != &original)
   {   
      delete InnerObjectPtr;
      InnerObjectPtr = original.InnerObjectPtr->clone();
   }
   return *this;
}

это безопасный с точки зрения исключений код вообще.

Или в конце функции main в TreeMain.cpp:
    double averageEuro = 0.5*(euroPrice + euroNewPrice);
    double averageAmer = 0.5*(americanPrice + americanNewPrice);
    double averageForward = 0.5*(forwardPrice + forwardNewPrice);

    cout << "euro av price " << averageEuro << " amer av price " << averageAmer << "\n";
    cout << "av forward " << averageForward << "\n";

    double tmp;
    cin >> tmp;

    return 0;
}

Конечно же пришлось средние величины сначала сохранять в локальные переменные, а уже затем выводить в cout. Сразу, конечно же нельзя было.
А без считывания какого-то левого значения в tmp перед выходом вообще нельзя было обойтись.




И все же без исходников решения на OCaml нет полной картины. Как я понял, C++ решения используют реюзабельные классы (тот же Parameter), за счет чего и получается большое количество файлов.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: К. с-ра т-а?
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.12.05 21:47
Оценка: :))) :)
Предупреждение весельчакам

Следующее веселье по поводу предупреждений модератора или дискуссия с модератором в открытом форуме приведет в баню.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: К. с-ра т-а?
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 26.12.05 08:47
Оценка:
Кодт,

К>Оверхед не пройдёт!


Не то слово! Симплекс-метод на J:

pivot=: 4 : 0
'r c'=. x.
col=. c{"1 y.
y. - (col-r=i.#y.) */ (r{y.)%r{col
)
simplex=: 3 : 0
min=. i. <./
m=. y.
while.
  r0=. }:{.m
  c=. min r0
  0 > c{r0
do.
  t=. {:"1 m
  d=. c{"1 m
  f=. (0 > d){0 _    
  r=. min f + t % d
  m=. (r,c) pivot m
end.
)

quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: К. с-ра т-а, но Талант был писателем :-)
От: gear nuke  
Дата: 29.12.05 10:53
Оценка: 26 (2) :))) :)))
Разные это вещи.

Посмотрим на реальный мир (надеюсь, аналогия будет подходящей)

1. Нужно записать "значение X равно семме Y и Z"
Очевидно, для этого отлично подходит математическа запись:
X = Y + Z
Кратко и понятно.
Лучше тут уже ничего не придумать, разве что спорить какая закорючка лучше.

2. Нужно записать инструкцию по эксплуатации устройства Штуковина.
Здесь я вижу 2 варианта:
  1. Записать это нормальным человеческим языком:

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

  2. Нарисовать весь процесс картинками.
    Рисовать не буду, т.к. не умею, да и в общем случае только картинками без словесных пояснений не обойтись.

Варианты с художественными произведениями, картинами и т.п. не рассматирвается, там и так выбор очевиден



А теперь примеры из реального мира нужно закодировать на некоторых языках программирования.

У нас есть 2 универсальных языка: "НМС" (Немногословный) и "Великий И Могучий".

Запись первого примера:

X = Y + Z
на этих 2х языках выглядит одинаково.


А вот 2й:

# НМС
#
# Комментарий:
# Положь колдобину со стороны загогулины и два раза дергани за пимпочку. 
# Опосля чего долбани плюхалкой по кувывалке и, коды чвокнет, отскочь дальшее...
@>!%~&^
2 {;)`
?/$&*


# Великий И Могучий

# Управление Штуковиной
Положь: колдобину со_стороны загогулины
2 раза: дергани за пимпочку
долбани: плюхалкой по кувывалке
коды чвокнет, отскочь дальшее


Какой вариант предпочтительнее выбрать, учитывая что Проект будет развиваться 25 лет?

Очевидно, для Гуру НМС коментарии не нужны, он и так сходу прочитает код. Поэтому можно сильно сэкономить дорогое пространство на винчестере и выкинуть лишнее. Выбрав этот язык, мы гарантируем, что в проекте случайных студентов не окажется, что увеличит качество конечного продукта.

Исходный код на "Великом И Могучем" с усилиями понимает начинающий Вася Пупкин, поскольку он в повседневной речи использует некоторую часть операторов языка. Вася Пупкин может скачать исходники проекта с sf.net и подправить пару мест, что бы прикрутить поддержку Заковыкалки. Зачем Проекту этот Глючный Код, написанный непонятно кем?..


Хотя если уж совсем точно, у нас ещё есть вариант 2b — "МегаВизуальный Язык Для Домохозяек", он находится в постоянной разработке... письмо разработчику для реализации Визуализатора_для_описания_Штуковины отправлено, он обещает добавить в следующей версии, так что пока подождём. Может быть это и будет тот Язык, на котором надо писать.


P.S.
Всё это не больше чем шутка, все имена и названия вымышлены, совпадения с реальными являются чистой случайностью
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: К. с-ра т-а, но Талант был писателем :-)
От: Трурль  
Дата: 29.12.05 13:03
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Запись первого примера:


GN>
GN>X = Y + Z
GN>
на этих 2х языках выглядит одинаково.


Не совсем

# НМС
X = Y + Z


#  ВиМ
# X = Y + Z
возьми чаво там в Y
прибавь к нему то, что в Z
то что получилось зафигач в X
Re[3]: К. с-ра т-а, но Талант был писателем :-)
От: gear nuke  
Дата: 29.12.05 13:35
Оценка:
Здравствуйте, Трурль,

Т>
Т># НМС
Т>X = Y + Z
Т>


Т>
Т>#  ВиМ
Т># X = Y + Z
Т>возьми чаво там в Y
Т>прибавь к нему то, что в Z
Т>то что получилось зафигач в X
Т>


Нет. ВиМ не дураки делали, что бы убрать краткую запись для вещей, где это не ухудьшает читабелтность.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: К. с-ра т-а, но Талант был писателем :-)
От: Трурль  
Дата: 30.12.05 05:52
Оценка: 7 (1) +1 :)
Здравствуйте, gear nuke, Вы писали:


GN>ВиМ не дураки делали, что бы убрать краткую запись для вещей, где это не ухудьшает читабелтность.

Но тогда это уже язык Не Столь Великий И Могучий А Отчасти Немногословный
Re[3]: К. с-ра т-а?
От: Трурль  
Дата: 30.12.05 11:54
Оценка: 75 (3) :))) :))) :)))
Здравствуйте, VladD2. Вам удивительно идет розовый цвет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.