fruchtzwerg - К-лассика
[Recent Entries][Archive][Friends][User Info]
04:08 am
![[User Picture]](http://l-userpic.livejournal.com/8967943/1438222) [Link] |
К-лассика Умора. Рико пытаются удивить компактностью кода. Для тех, кто не в курсе, Рико заварил себе милый Веб-проектик под названием KQuant, типа портал посвященный вычислительным финансам. Бросил туда пару статеек на тему "все кванты казлы", пару обозрений на книги, которых он не читал и просто заумный базар. Сайт в целом мертв, отслужил свою цель, а именно прикинутся именитым экспертом и получить много денег за страдание хуйней, гордо именуемой вычислительными финансами. В результате, Рико взяли в Морган Стэнли Лондон штук на 200 GBP и только потом заметили, что у него отсутствует элементарная докторантура. Моргану стало стыдно, и они послали Рико доучиваться, не снимая с довольствия. В результате, Рико числится в докторантуре в Оксфорде, где его не очень гоняют, потому что человек же параллельно вкалывает в Сити и на Моргане, где его тоже не очень гоняют, потому что думают что он параллельно изо всех сил учится в Окфорде. Такой схемы не постеснялись бы и такие легендарные мастера неконкретной аффилиации как Тельнов и Вадя Опа-опа-опа-па (в миру (номенклатуре DMV) Vadim von Hilliard XIV) Какие они эти финансисты в глубине души совестливые-то люди. Поди и бонусом с ребенком поделятся :)
Короче, к удивлению Рико, у сайта откуда-то появились настоящие читатели. Вот например пишет британский юноша с красивым именем Vermin, по поводу какой-то там забубенной книжки о правильной имплементации какой-то там финансовой шняги на C++. Мальчик взял и перевел код из книжки на какой-то функциональный язык, то ли OCaml, то ли ML и с удивлением обнаружил, что из многих, многих тысяч строк прегромоздкого кода осталось пара сотен строк. Потом мальчик взял, и переписал функциональный код обратно на C++, но сохраняя функциональный стиль вместо ООП. Код сразу стал резко короче, всего-то около тысячи строк.
Рико отвечает, "молодец мальчик, но я вообще-то пользуюсь К, где это проблема решается двумя строчками". Полюбуйтесь:
Hi Fermin,
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... :-)
Cheers, - Rico
On Wed, 12 Oct 2005, Fermin Reig wrote:
> Dear Rico, > > I have read Mark Joshi's book on C++ design patterns (as well as your > review) and I'd like to share my opinion of the book with you. (By the > way, I find the information in your website very useful.) > > 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.) > > I have written slides with more details about this, which I have shown > to a few friends. If you would like to see them, I can email them to > you. (I have also told Mark Joshi about my evaluation.) > > Regards, > Fermin
That's my boy. Жалко, что так мало инстанций, где К пересекается с мейнстримом. Код к тому же наверняка летает по сравнению с компилированным C++. Мораль сей басни по-видимому такова - К это среда, которая заставляет девелопера за деревьями увидеть лес :) C++ же IMHO надо вообще не допускать к использованию корпоративными IT-шниками. Ни разу в жизни не видел, чтобы "в индустрии" хоть один проект на C++ был когда-нибудь доведен до рабочего состояния. Особенно теперь, когда все поняли, что С++ на самом деле совершенно неправильный язык для ООП, а и вовсе генеративный. Генеративный же код стопудово не по зубам корпоративным дронам.
|
|
| | | From: | 9000 |
| Date: | November 13th, 2005 08:57 pm (UTC) |
|---|
| | | (Link) |
|
K -- это идейно круто, но синтаксис ужасен. Бесчеловечен, как перл. Жду прихода второй волны, на тех же идеях, но человечнее (как питон после перла).
Думаю, большинство завершённых проектов на C++ -- это игры. Ну и пара офисных пакетов отчасти на C++ (В MSO до последнего времени и Word, и Excel были на чистом C). ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 13th, 2005 11:41 pm (UTC) |
|---|
| | | (Link) |
|
Ты не понял, когда речь идет о паре строчек, синтах похую. У функций К есть и вербозные имена. Вот утилит: http://www.cs.nyu.edu/~waldman/kparse.htmlкоторый зачитывает К на человеческом языке, только им не пользуется никто. Главная проблема нечитаемости чужого К не в синтаксе, а в монолитности. Традиционный divide-and-conquer approach частенько обламывается. Например, попытка пошаговой эвалюации скорее всего ничего не добавит твоему понимаю, а скорее наоборот - промежуточные состояния всех ихних аггрегатных структур данных будет крайне контр-интуитивны. Поэтому чтобы такую вот строчечку понять, надо на нее тупо пялятся и пытаться понять in its entirety. Мне так приходилось на одну строчку пялится часами. По-моему, fair game, с учетом того что строчечка может нести смысловую нагрузку тысяч линий обычного кода. Все равно получается быстрее, чем врубаться в тысячи линий чужой халтуры. Главное же, получается лучше. Потому как уж если понял, то понял досконально. Потом ты знаешь эту программу наизусть, она вся у тебя сидит в визуальном буфере. У тебя нету дуплицированного кода, заброшенных каких-то кусков, заплаток и cruft-а и чего-то, что давно бы пора слить вместе или еще как рефактурировать. Код, как алмаз, ничего ни убавить, не прибавить. Вообще свой символ/иероглиф для каждой функции, как в оригинальном APL, IMHO очень правильный подход. Экономит место в визуальном буфере. Вот только с ASCII это не катит, символов не хватает, приходтся все оверлодать по двадцать раз. Я немного отстал от жизни, но вроде как в последней версии (называется оффициально Q, ака K4) в самом языке у всех функций есть вербозные версии. Типа KSQL и К окончательно слились в экстазе в единое целое. По большому счету, никакого kdb и не было никогда, а был k db, т.е. была библиотечка db, которая в основном добавляла мощные сетевые примитивы, ну и еще парсер с KSQL на К и с SQL92-basic. SQL92 работал так-сяк, но как полагается SQL, a вот в случае KSQL Артур не видел причин себе в чем-то отказывать, так что он и раньше мог почти все, что мог K. KSQL queries, написанные самим Артуром вообще как правило выглядят неосмысленно с точки зрения SQL, например спокойно прожевывают данные не в форме двухмерных таблиц/реляций или используют аггрегатные функции в "запрешенных" местах. Почему я и говорю, что несмотря на меньший словарный запас, KSQL является функциональным суперсетом стандартного SQL. ![[User Picture]](http://l-userpic.livejournal.com/7703639/652114) | | From: | dym |
| Date: | November 20th, 2005 10:29 pm (UTC) |
|---|
| | | (Link) |
|
K is the only CS artifact that I didn't get at all (that probably influences my opinion of K, since I generally think that I am smart so I assume it's not my fault.) You are right that the problem is that it's monolythic. It's like those quasi-3D pictures: you either see it, or you don't. (I don't see those pictures either.)
It would take me less than two hours to understand a 1000 lines of well-written code: I can read code at more lines/minute than regular text. So I don't think that there are significant savings there. Divide and conquer is a critical tool in debugging and understanding. I don't want to give it up.
I am yet to be convinced that K scales. It may be good as a scripting language for certain domains, but what large-scale projects use K? The only one I know is kdb. Kdb wins because it uses the right model: in-memory database with no concurrency. I don't think that a webbrowser written in K would be a big win, because there is so much randomness in the problem statement, and by information-theoretical argument it cannot be compressed into two lines.
The future of software development is intentional programming. As a language designer I want to learn from K anyway, but I don't see anything I can apply to a general-purpose language. Can you break out a K feature that I can use on its own, or do I have to buy the whole package? ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 21st, 2005 07:08 am (UTC) |
|---|
| | | (Link) |
|
I use the "customized Occam's razor" too. If something is too hard for me to understand, it must be wrong :)
Not all of K code is so dense, only the "stupid multidimensional array tricks are". I suppose you have to be born with an ability to visualize higher-dimensional data, which ain't as cool as you might think, because the higher the dimension, the less useful forms of symmetry there are. Don't ask. It has something to do with that wacky "APL is prose, K is poetry" thing. They are actually trying to "rhyme" data, which has something to do with the conformity of one multidimensional thingie with some other multidimensional thingie it is being transformed into. I don't really get how it works, but I suppose this is their alternative to divide-and-conquer. Good K has pretty rhymes :)
You know there are a few people out there who can crank out lines of K with the same speed mortals crank out Java or VB? They are total productivity monsters, as you might expect.
Why would K not scale? It has no locks. It doesn't ever wait for any kind of I/O. It forces you to refactor the heck out superfluous flow control and special cases. It doesn't need tricky "application-level" recovery, cause there is no such thing as mutli-tiered apps in K. Split transactions are verboten. All of the most common sources of bugs and lag in database appas are eliminated. I'd say, it scales like nothing else out there.
However, I do not advocate use of K as a general-purpose language. It's too weird. I do however, advocate its use as an 'escape language' in stored procedures. In general, the idea of a functional, fully reflexive database is way elegant, don't you think? I especially advocate its use where you want a "final solution". You know, mission-critical code you don't won't to be touching for the next 20 years, something you just need to work forever.
You are right, there is no particular benefit in using K for any application which has nothing to do with bulk data. However, these are exactly the apps that are very tricky to get right with other tools. It is an in-cache database I'd say, not in-memory :)
Since when is kdb a large app? It's smaller than your typical nekkid JPEG :) Powerful, not large. No transactional database is really concurrent, per definition. What does a database do for you? Global SERIALIZATION of all yer transactions. If you look carefully at any RDBMS, there is always only one thread that actually writes to disk. All others are there to faciliate user interaction somehow. Just admitting that gives kdb lots of special powers, like totally async replication.
Well, you could try implementing various tricky ways of mapping aggregate collections of lambdas on aggregate data? Or I/O based entirely on mmap instead of stdio? Never use malloc/new? Make everything out of identical vectors, so that your memory allocation/garbage collection is very simple and stupid? Have unusual and cruel scoping rules, just so your parser needs no lookahead and never backtracks? Have your parser accept code, preparsed parse trees or any semi-digested combination thereof? Don't have a language, write directly in bytecode? Misuse your execution stack/tree for data? (Forth does that, too :) Make scope, extent and class one and the same? (Smalltalk does that, Java should have done that. Granted, it is a poor way of explaining K Tree, which is not really an OOP construct, but could be abused as such) ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 13th, 2005 11:51 pm (UTC) |
|---|
| | | (Link) |
|
Нет, успешных проектов на C++ полно, но все они были сделаны в софтверный индустрии, фирмами для которых производство софта насущный хлеб. Я имею в виду случаи, когда за C++ берутся IT-шники, которые работает не в софтверной индустрии, а делают какой-то внутренний проект на какой-то фирме, для которой софт не источник прибыли, а издержка. Скажем, в банке. Эти проекты априори обречены на провал. К счастью, в наше прогрессивное время попсовые IT-шные ООП-шники толпоми переходят на Яву. На Яве код у них тоже кривой, но хотя бы есть шанс довести проект до рабочего состояния. | From: | 9000 |
| Date: | November 19th, 2005 10:21 pm (UTC) |
|---|
| | | (Link) |
|
Ну да -- я сразу выкинул из рассмотрения C++-ные проекты внутри-IT-шного использования, а из тех, что выходят во "внешний мир", imho, мало успешных ибо язык слишком низкоуровневый (несмотря на возможности писать *также и* на прилично высоком уровне). В этом смысле java уровнем повыше, потому и success rate повыше, а smalltalk -- ещё выше, но у него плохая карма %), потому его знямя неожиданно подхватывают совсем с другого края пришедшие python и ruby. ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 13th, 2005 11:59 pm (UTC) |
|---|
| | | (Link) |
|
![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 14th, 2005 12:10 am (UTC) |
|---|
| | | (Link) |
|
Да, а новая волна тоже уже есть. Не считая Q/kdb+, давным-давно существует вербозный диалект APL2? под названием Nial, ну и конечно есть еще препопулярнейшая Mathematica, тоже кстати чистой воды APL-диалект. Это просто у них особенно не афишируется, потому что в большей части индустрии и академии APL-щиков считают полными ебаньками, а APL мертвым языком. В большинстве учебников по дизайну языков программирования APL упоминается только в footnote, как "пример языка с бредовым синтаксом". Попсеем, блин. | From: | 9000 |
| Date: | November 19th, 2005 10:21 pm (UTC) |
|---|
| | | (Link) |
|
О, Mathematica -- другой разговор :) Это то самое "очеловечение". Т.е. идеи-то богатые, но выразить их надо уметь так, чтобы сделать learning curve приемлемой крутизны, иначе 90% тех, кому такой подход очень пригодился б, обломают зубы и плюнут. ![[User Picture]](http://l-userpic.livejournal.com/78776355/2464048) | | From: | inv2004 |
| Date: | November 14th, 2005 12:19 pm (UTC) |
|---|
| | | (Link) |
|
Напишу сначала тут, а потом в своём ЖЖ. покурив в выходные я решил всё же перестать играться с K, и написать на нём что-нибудь настоящее. решил сделать клиента и базу данных, клиент парсит ini файл с рекордами из одной игры и дёргает функции на сервере.
для начала написал простой парсер ini, о чём написал в ru_declarative. при этом я не обладал совсем знанием словаря, по началу только нашёл ' (map), потом добавилось &, ну и ещё ? и _ (cut), и получилось довольно прилично. при условии что мой словарь был как у жителя племени мумба-юмба, что тут можно сделать зная весь словарь - боюсь представить.
проблем добавления функциональности - не испытал. с пониманием кода tab.k в examples - вроблем не возникло тоже.
после чего я хотел было перенести преложение на ocaml - но после первой страницы - я понял что уже не осилю и бросил это занятие.
![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 14th, 2005 04:26 pm (UTC) |
|---|
| | | (Link) |
|
Различных вариаций на тему map в К пруд-пруди. Самый мэпистый язык на свете, причем частенько мэпается не одна функция, а сразу целый клубок. ![[User Picture]](http://l-userpic.livejournal.com/78776355/2464048) | | From: | inv2004 |
| Date: | November 14th, 2005 09:23 pm (UTC) |
|---|
| | | (Link) |
|
Пока не изучил. стараюсь познавать по мере потребности при написании. но уже даже вариации этих нескольких слов впечатляют. странно, почему они не впечатляли в других языках ? наверно потому как там были другие пути. ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 14th, 2005 09:58 pm (UTC) |
|---|
| | | (Link) |
|
Я не знаю других языков, где есть больше одного способа мэпать функции на аггрегатные структуры. da, shveithasrtev mozhno (i nuzhno) ne lubit, nu uvazhat stoit. Rico zhe vobshe 110% teflon. Odnako ti muchandr zzesh, napisal huevu tuchu huinei za poslednie 3 dnya. Is there something you are not telling me? ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 15th, 2005 12:10 am (UTC) |
|---|
| | | (Link) |
|
Not yet, but soon :) ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 15th, 2005 12:21 am (UTC) |
|---|
| | | (Link) |
|
Rico is special. He's the only person who doesn't think I've gone nuts. Being the living little Swiss clock he is, he was the only one who actually bothered to check my math and dutifully informed me that it is not necesserily wrong, but yet incomplete. This was the right answer.
And yet, he is not even my friend, but rather an extremely close business associate. Nakama, as the Japs say :) We barely ever hang out socially (his idea of bespredel is to go out to a titty bar and drink a glass of milk), but he is definetely going to be a part of any major future business venture I undertake. Same for him. ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 15th, 2005 12:36 am (UTC) |
|---|
| | | (Link) |
|
Who do you think he heard this from? :) ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 15th, 2005 12:44 am (UTC) |
|---|
| | related story | (Link) |
|
Image Bear Stearns, their main trading floor in NYC. The main trader guy, the one with the mike who cracks the whip on all the others, on the loudspeaker, "Where the fuck is this what's his name. I mean the one who's named like some fucking porn star. What's his face. Aha, Rico Blaser!"
Incidentally, Blaser also means "one giving blowjobs" in his native German. also, I dunno if Rico cares, but on this pages http://www.kquant.com/mathematics.html "Mathematics & Economics" is written in a font that is same color as the left background, same on couple of others. This kinda of stuff just jumps at me so just passing it on. ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 15th, 2005 12:39 am (UTC) |
|---|
| | | (Link) |
|
Dude, it is a dead site. Once he got a job actually doing this shit, he lost all interest in it. It really is too trivial to think about it too much, despite these people's having fancy PhDs and all. ![[User Picture]](http://l-userpic.livejournal.com/9806300/1438222) | | From: | muchandr |
| Date: | November 15th, 2005 01:01 am (UTC) |
|---|
| | | (Link) |
|
А за что швейцарцев не любить? Они же не австрийцы какие-нибудь, как никак :) | From: | (Anonymous) |
| Date: | May 6th, 2007 05:48 pm (UTC) |
|---|
| | K | (Link) |
|
Я прошу прощения - я не в струе обсуждения и не имею аккаунта, но искал где бы скачать хоть какую-то evaluation version языка К или какой-то подобный дистриб, и наткнулся на эту ветку. Мучандр, может подскажешь, или еще кто знает, такое вообще в сети встречается, или может кто-нибудь может по почте послать? Я слышал раньше такой дистриб был в интернете, но убрали..
Сайт KQuant я знаю, там действительно в основном белиберда всякая, и ссылки на вакансии по 500 000 фунтов/год (несколько сайтов), там такие job-ы прямо пачками висят:)
Очень хочется увидеть и потрогать К - уже пробовал Руби и Смоллток, впечатление от синтаксиса приятное. Если кто может помочь - аська 123957369
Антон. Если ты попросишь старый К (до 3.2) для учебных целей, тебе стопудово дадут. ![[User Picture]](http://l-userpic.livejournal.com/63524386/12063416) | | From: | mt_christo |
| Date: | August 13th, 2007 08:15 am (UTC) |
|---|
| | программирование на К | (Link) |
|
Мучандр, а не знаешь, как короче всего сделать FFT (быстрое преобразование Фурье) на К? Сам написать конечно могу, но если подскажешь что-то эталонное на этот счет (емкое, красивое), был бы очень признателен. По инету лазил долго и впустую..
Заранее спасибо! |
|