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...
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...
Здравствуйте, eao197, Вы писали:
E>И к какому C++ примеру относиться приведенный на OCaml-е пример с EuroOpt?
На K, не на Ocaml-e. Но вообще к Monte Carlo, судя по всему.
Конечно же пришлось средние величины сначала сохранять в локальные переменные, а уже затем выводить в cout. Сразу, конечно же нельзя было.
А без считывания какого-то левого значения в tmp перед выходом вообще нельзя было обойтись.
И все же без исходников решения на OCaml нет полной картины. Как я понял, C++ решения используют реюзабельные классы (тот же Parameter), за счет чего и получается большое количество файлов.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
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.
)
Посмотрим на реальный мир (надеюсь, аналогия будет подходящей)
1. Нужно записать "значение X равно семме Y и Z"
Очевидно, для этого отлично подходит математическа запись:
X = Y + Z
Кратко и понятно.
Лучше тут уже ничего не придумать, разве что спорить какая закорючка лучше.
2. Нужно записать инструкцию по эксплуатации устройства Штуковина.
Здесь я вижу 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
Т># ВиМ
Т># 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
GN>ВиМ не дураки делали, что бы убрать краткую запись для вещей, где это не ухудьшает читабелтность.
Но тогда это уже язык Не Столь Великий И Могучий А Отчасти Немногословный