ЯзÑки пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑÑловиÑÑ , пÑиближеннÑÑ Ðº боевÑм
ÐоÑле вÑÑ
ода вÑоÑого номеÑа жÑÑнала "ÐÑакÑика ÑÑнкÑионалÑного пÑогÑаммиÑованиÑ" Ñ Ð¼ÐµÐ½Ñ ÑоÑÑоÑлаÑÑ Ð¸Ð½ÑеÑеÑÐ½Ð°Ñ Ð¿ÐµÑепиÑка Ñ Ð½ÐµÐºÐ¸Ð¼ пÑогÑаммиÑÑом, коÑоÑÑй оÑÐµÐ½Ñ Ð»ÑÐ±Ð¸Ñ Ð¿Ð¸ÑаÑÑ Ð½Ð° C.
ÐÑлÑминаÑией ÑÑой пеÑепиÑки ÑÑало Ñо, ÑÑо он пÑедложил мне ÑледÑÑÑее паÑи: Ñ ÑоÑмÑлиÑÑÑ Ð¿ÑоÑÑенÑкÑÑ Ð·Ð°Ð´Ð°ÑÑ, поÑле Ñего Ð¼Ñ Ð¾Ð±Ð° ÑеализÑем ее - он на С, Ñ - на Haskell. ÐоÑле ÑÑого в ÑÑловие вноÑÑÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие коÑÑекÑÐ¸Ð²Ñ (моделиÑÑем поведение ÑÑебований в ÑеалÑном миÑе), а Ð¼Ñ Ð²Ð½Ð¾Ñим коÑÑекÑÐ¸Ð²Ñ Ð² наÑи пÑогÑаммÑ. РезÑлÑÑаÑÑ ÑÑавниваÑÑÑÑ Ð¿Ð¾ ÑкоÑоÑÑи иÑполнениÑ, обÑÐµÐ¼Ñ Ð¿Ð¾ÑÑеблÑемой памÑÑи, колиÑеÑÑÐ²Ñ ÑÑÑок кода.
Ðой Ð¾Ð¿Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¸Ð·Ð½Ð°ÑалÑно бÑл поÑÑавлен в неÑавнÑе ÑÑловиÑ, Ñ.к. Ñ Ð¼Ð¾Ð³ подобÑаÑÑ Ð·Ð°Ð´Ð°ÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÐµÐµ бÑло Ñдобно ÑеализовÑваÑÑ Ð¼Ð½Ðµ, и неÑдобно ÑеализовÑваÑÑ ÐµÐ¼Ñ. ÐпÑоÑем, Ñ Ð¿Ð¾ÑÑаÑалÑÑ Ð²ÑбÑаÑÑ Ð·Ð°Ð´Ð°ÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÐµÐµ ÑеÑение не ÑÑебовало ÐºÐ°ÐºÐ¸Ñ -Ñо ÑзкоÑпеÑиалÑнÑÑ Ð·Ð½Ð°Ð½Ð¸Ð¹. ФакÑиÑеÑки, Ð¼Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°Ð»Ð¸ÑÑ Ñем, ÑÑо ÑиÑали из Ñайла и обÑабаÑÑвали некÑÑ ÑложнÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ . (ÐеÑалÑное ÑÑловие Ñ ÑÑÑ Ð½Ðµ пÑивожÑ, ÑÑÐ¾Ð±Ñ Ð½Ðµ "ÑбиваÑÑ Ð¿ÑиÑел" вÑоÑой половине поÑÑа).
ÐÐ¾Ñ Ð¿ÐµÑÐ²Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð°ÐºÑивно иÑполÑзовала Data.Generics и библиоÑеÑнÑе паÑÑеÑÑ Ð½Ð° Ð¸Ñ Ð¾Ñнове, поÑÑÐ¾Ð¼Ñ Ð²ÑигÑала в ÑазмеÑе и ÑиÑаемоÑÑи кода, но пÑолеÑела по обÑÐµÐ¼Ñ Ð¿Ð¾ÑÑеблÑемой памÑÑи. ÐпÑоÑем, мой Ð¾Ð¿Ð¿Ð¾Ð½ÐµÐ½Ñ Ð½Ð°ÑÑолÑко понадеÑлÑÑ Ð½Ð° моÑÑ C, ÑÑо ÑеÑил не иÑполÑзоваÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑеÑнÑй qsort, а ÑеализоваÑÑ insertion sort ÑамоÑÑоÑÑелÑно. ÐÑо ÑамÑм пагÑбнÑм обÑазом ÑказалоÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑи (LOCs - ÑÑÑоки кода, памÑÑÑ - в мегабайÑÐ°Ñ , вÑÐµÐ¼Ñ - в ÑекÑÐ½Ð´Ð°Ñ ):
ÐÑоме Ñого, вÑÑÑнилоÑÑ, ÑÑо мой Ð¾Ð¿Ð¿Ð¾Ð½ÐµÐ½Ñ Ð²ÑÑÑеÑки "ÑÑÐµÐ·Ð°ÐµÑ ÑглÑ" в погоне за пÑоизводиÑелÑноÑÑÑÑ. ÐапÑимеÑ, ÑÑнкÑÐ¸Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑаннÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð² Ñайл пÑинимала, в ÑиÑле пÑоÑÐ¸Ñ , ÑиÑловой паÑамеÑÑ, на коÑоÑÑй ÑмножалиÑÑ Ð¾Ð¿ÑеделеннÑе Ð¿Ð¾Ð»Ñ ÑÑÑÑкÑÑÑÑ Ð¿ÐµÑед ÑÐ¾Ñ Ñанением - Ñаким обÑазом ÑкономилÑÑ Ð¾Ð´Ð¸Ð½ ÑекÑÑÑивнÑй Ð¾Ð±Ñ Ð¾Ð´ вÑей ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ .
Ð ÑезÑлÑÑаÑе Ñ Ñоже ÑеÑил "ÑÑезаÑÑ ÑглÑ", и пÑинеÑÑи кÑаÑоÑÑ ÐºÐ¾Ð´Ð° в жеÑÑÐ²Ñ ÑкоÑоÑÑи. Ðой же Ð¾Ð¿Ð¿Ð¾Ð½ÐµÐ½Ñ Ð²Ð·ÑлÑÑ Ð·Ð° qsort, и к вÑоÑÑе (ÑиналÑнаÑ) веÑÑии наÑего кода "ÑиниÑиÑовали" Ñ Ñакими ÑезÑлÑÑаÑами:
Я пÑедполагал, ÑÑо ÑооÑноÑение ÑиÑÑ Ð±ÑÐ´ÐµÑ Ð³Ð¾Ñаздо ÑилÑнее не в полÑÐ·Ñ Haskell. ÐпÑоÑем, Ð¼ÐµÐ½Ñ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло Ð±Ñ Ð¾Ð±Ð²Ð¸Ð½Ð¸ÑÑ Ð² пÑедвзÑÑом Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ к ÑоÑмÑлиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑловий.
Ð ÑÐµÐ¼Ñ Ñ Ð²Ñе ÑÑо ведÑ?
СÑÑеÑÑвÑÐµÑ ÐºÐ»Ð°ÑÑиÑеÑÐºÐ°Ñ ÑÑаÑÑÑ "Haskell vs. Ada vs. C++ vs. Awk vs. ... An Experiment in Software Prototyping Productivity", напиÑÐ°Ð½Ð½Ð°Ñ Ð² 1994-м годÑ. Ðа 15 Ð»ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾Ðµ изменилоÑÑ, и, дÑмаеÑÑÑ, многим бÑло Ð±Ñ Ð¸Ð½ÑеÑеÑно пÑоÑиÑаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ ÑÑаÑÑÑ Ð¿Ñо положение дел ÑегоднÑ.
Ð ÑвÑзи Ñ ÑÑим иÑÑÑÑÑ:
1)УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑей задаÑи (кÑиÑеÑии Ñм. ниже)
2)ÐелаÑÑие ÑеализоваÑÑ ÐµÐµ на Haskell/C+/Ocaml/Java/Scala/C#/... Ñ Ñем, ÑÑÐ¾Ð±Ñ Ð²Ð°Ñ ÐºÐ¾Ð´ бÑл неÑадно ÑÑавнен Ñ Ð´ÑÑгими и опÑбликован Ð´Ð»Ñ Ð²ÑеобÑего обозÑениÑ.
Q:ÐаÑем вÑе ÑÑо делаеÑÑÑ?
A:Ðа дÑÑÐ³Ð¸Ñ Ð¿Ð¾ÑмоÑÑеÑÑ, ÑÐµÐ±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ. Ð ÑаÑÑноÑÑи, ÑÑÐ¾Ð±Ñ Ð»Ñди имели возможноÑÑÑ Ð¿Ð¾ÑмоÑÑеÑÑ Ð½Ð° ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ , и ÑоÑÑавиÑÑ Ð¾ Ð½Ð¸Ñ ÐºÐ°ÐºÐ¸Ðµ-Ñо мнение.
Q:Чем не ÑÑÑÑÐ°Ð¸Ð²Ð°ÐµÑ The Great Language Shootout?
A:Тем, ÑÑо Ñам оÑдаеÑÑÑ Ð¿ÑедпоÑÑение "бÑÑÑÑÑм и гÑÑзнÑм" ÑеÑениÑм, коÑоÑÑе вÑÑÑеÑки "ÑÑезаÑÑ ÑглÑ". Ðо-пеÑвÑÑ , в Ñаком ÑÑиле пиÑеÑÑÑ Ð´Ð°Ð¹ бог ÑÑÐ¾Ð±Ñ 5% Ð¾Ñ Ð²ÑÐµÑ Ð¿ÑогÑамм, во-вÑоÑÑÑ , лÑдÑм, не знаÑÑим ÑзÑк X, ÑÑÑого пÑоÑивопоказано ÑмоÑÑеÑÑ Ð½Ð° ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° ÑзÑке X в Language Shootout - оÑÑанеÑÑÑ Ð¿ÑевÑаÑное впеÑаÑление.
Q:Ðак бÑдÑÑ ÑÑавниваÑÑÑÑ ÑеÑениÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð¿Ð¾Ð±ÐµÐ´Ð¸ÑелÑ?
A:Ðикак, Ñ.к. победиÑелей не бÑдеÑ. ÐÑдÑÑ Ð¿Ñиведена опÑÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÑÑаÑиÑÑика по вÑем ÑеÑениÑм, без вÑводов.
Q:Ðакой Ñогда ÑÑимÑл ÑÑаÑÑвоваÑÑ?
A:Ðа дÑÑÐ³Ð¸Ñ Ð¿Ð¾ÑмоÑÑеÑÑ, ÑÐµÐ±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ :)
Ðакой должна бÑÑÑ Ð·Ð°Ð´Ð°Ñа?
1)Ðе заÑоÑенной под конкÑеÑнÑÑ ÐС (Ñ.е. "РеализоваÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ, вÑÑÑаеваемÑй в Word" или "плагин Ð´Ð»Ñ libpam" - не каÑиÑ)
2)Ðе заÑоÑенной под конкÑеÑнÑй ÑзÑк/ÑÑеймвоÑк/... (Ñ.е. "полÑÑиÑÑ ÑпиÑок ÑигнаÑÑÑ Ð¼ÐµÑодов вÑÐµÑ Ð¾Ð±ÑекÑов Ñказанной ÑбоÑки .Net" - не каÑиÑ)
3)ÐÑли глÑбокие Ð·Ð½Ð°Ð½Ð¸Ñ Ð² пÑедмеÑной облаÑÑи даÑÑ ÑеÑаÑÑее пÑеимÑÑеÑÑво - ÑÑо fail (Ñ.е. "ÑеализоваÑÑ DES-CBC" - не каÑиÑ)
4)ЧÑÐ¾Ð±Ñ Ð¾Ð½Ð° не бÑла из каÑегоÑии "мне не нÑжно, ÑÑÐ¾Ð±Ñ Ð¿Ð»Ð°Ñ Ð±Ñл ÑиÑÑÑй, а нÑжно, ÑÑÐ¾Ð±Ñ Ð²Ñ Ð·Ð°Ð´Ð¾Ð»Ð±Ð°Ð»Ð¸ÑÑ" (Ñ.е. "ÑаÑпаÑÑиÑÑ XLS-Ñайл, не полÑзÑÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеками" - не каÑиÑ)
5)ÐадаÑа не должна ÑÑебоваÑÑ Ð¼Ð½Ð¾Ð³Ð¾ вÑемени на ÑеализаÑÐ¸Ñ (еÑли ÑÑо бÑдÑÑ Ñеловеко-недели - никÑо за нее не возÑмеÑÑÑ)
Ðакой должна бÑÑÑ ÑеализаÑиÑ?
1)ЧÑÐ¾Ð±Ñ ÐµÐµ бÑло не ÑÑÑдно показаÑÑ Ð´ÑÑгим. Ð ÑаÑÑноÑÑи, ÑÑÐ¾Ð±Ñ ÑеÑение на ÑзÑке X не заплевали Ð±Ñ ÐºÐ°Ðº кÑивое и неидиомаÑиÑное дÑÑгие пÑогÑаммиÑÑÑ, знаÑÑие ÑзÑк X.
2)ÐдеалÑно бÑло Ð±Ñ Ð´Ð°Ð²Ð°ÑÑ Ð´Ð²Ðµ ÑеализаÑии: пеÑвÑÑ Ñ Ð¾ÑиенÑиÑом на "кÑаÑоÑÑ", "обÑазÑово-показаÑелÑноÑÑÑ" и легкоÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжки/ÑазвиÑÐ¸Ñ ÐºÐ¾Ð´Ð° (Ñ.е. пиÑем как пÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð´Ð°, коÑоÑÑй бÑÐ´ÐµÑ Ð¿ÑилагаÑÑÑÑ Ðº ÑезÑме :), а вÑоÑÑÑ - "гÑÑзнÑÑ Ð¸ бÑÑÑÑÑÑ".
3)Т.к. библиоÑеки - ÑÑо неоÑÑÐµÐ¼Ð»Ð¸Ð¼Ð°Ñ ÑаÑÑÑ ÑÐ¸Ð»Ñ Ð¸ попÑлÑÑноÑÑи ÑзÑка, библиоÑеками "обÑего назнаÑениÑ" (конÑейнеÑÑ, паÑÑинг, ...) полÑзоваÑÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ и нÑжно
4)Ðо! РеÑение, коÑоÑое ÑвелоÑÑ Ðº иÑклÑÑиÑелÑно к Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð¹-Ñо (ÑзкоÑпеÑиалÑной) библиоÑеки Ð½Ð¸ÐºÐ¾Ð¼Ñ Ð½Ðµ инÑеÑеÑно и ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ðµ бÑдеÑ.
ÐÑбиÑаÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑее ÑÑловие бÑÐ´ÐµÑ Ð¶ÑÑи, пÑедÑÑавлÑÑÑее апологеÑов вÑÐµÑ ÑеÑений и напÑавлений, в Ñом ÑиÑле - вклÑÑаÑÑее ÑÐµÑ , кÑо кÑиÑиÑеÑки оÑзÑвалÑÑ Ð¾ маÑеÑÐ¸Ð°Ð»Ð°Ñ , Ñже вÑÑедÑÐ¸Ñ Ð² fprog.ru.
ÐÑли Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð¸Ð´ÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑией задаÑи и Ð²Ñ Ñ Ð¾ÑиÑе ей поделиÑÑÑ - напиÑиÑе комменÑаÑий, а?
ÐÑлÑминаÑией ÑÑой пеÑепиÑки ÑÑало Ñо, ÑÑо он пÑедложил мне ÑледÑÑÑее паÑи: Ñ ÑоÑмÑлиÑÑÑ Ð¿ÑоÑÑенÑкÑÑ Ð·Ð°Ð´Ð°ÑÑ, поÑле Ñего Ð¼Ñ Ð¾Ð±Ð° ÑеализÑем ее - он на С, Ñ - на Haskell. ÐоÑле ÑÑого в ÑÑловие вноÑÑÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие коÑÑекÑÐ¸Ð²Ñ (моделиÑÑем поведение ÑÑебований в ÑеалÑном миÑе), а Ð¼Ñ Ð²Ð½Ð¾Ñим коÑÑекÑÐ¸Ð²Ñ Ð² наÑи пÑогÑаммÑ. РезÑлÑÑаÑÑ ÑÑавниваÑÑÑÑ Ð¿Ð¾ ÑкоÑоÑÑи иÑполнениÑ, обÑÐµÐ¼Ñ Ð¿Ð¾ÑÑеблÑемой памÑÑи, колиÑеÑÑÐ²Ñ ÑÑÑок кода.
Ðой Ð¾Ð¿Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¸Ð·Ð½Ð°ÑалÑно бÑл поÑÑавлен в неÑавнÑе ÑÑловиÑ, Ñ.к. Ñ Ð¼Ð¾Ð³ подобÑаÑÑ Ð·Ð°Ð´Ð°ÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÐµÐµ бÑло Ñдобно ÑеализовÑваÑÑ Ð¼Ð½Ðµ, и неÑдобно ÑеализовÑваÑÑ ÐµÐ¼Ñ. ÐпÑоÑем, Ñ Ð¿Ð¾ÑÑаÑалÑÑ Ð²ÑбÑаÑÑ Ð·Ð°Ð´Ð°ÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÐµÐµ ÑеÑение не ÑÑебовало ÐºÐ°ÐºÐ¸Ñ -Ñо ÑзкоÑпеÑиалÑнÑÑ Ð·Ð½Ð°Ð½Ð¸Ð¹. ФакÑиÑеÑки, Ð¼Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°Ð»Ð¸ÑÑ Ñем, ÑÑо ÑиÑали из Ñайла и обÑабаÑÑвали некÑÑ ÑложнÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ . (ÐеÑалÑное ÑÑловие Ñ ÑÑÑ Ð½Ðµ пÑивожÑ, ÑÑÐ¾Ð±Ñ Ð½Ðµ "ÑбиваÑÑ Ð¿ÑиÑел" вÑоÑой половине поÑÑа).
ÐÐ¾Ñ Ð¿ÐµÑÐ²Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð°ÐºÑивно иÑполÑзовала Data.Generics и библиоÑеÑнÑе паÑÑеÑÑ Ð½Ð° Ð¸Ñ Ð¾Ñнове, поÑÑÐ¾Ð¼Ñ Ð²ÑигÑала в ÑазмеÑе и ÑиÑаемоÑÑи кода, но пÑолеÑела по обÑÐµÐ¼Ñ Ð¿Ð¾ÑÑеблÑемой памÑÑи. ÐпÑоÑем, мой Ð¾Ð¿Ð¿Ð¾Ð½ÐµÐ½Ñ Ð½Ð°ÑÑолÑко понадеÑлÑÑ Ð½Ð° моÑÑ C, ÑÑо ÑеÑил не иÑполÑзоваÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑеÑнÑй qsort, а ÑеализоваÑÑ insertion sort ÑамоÑÑоÑÑелÑно. ÐÑо ÑамÑм пагÑбнÑм обÑазом ÑказалоÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑи (LOCs - ÑÑÑоки кода, памÑÑÑ - в мегабайÑÐ°Ñ , вÑÐµÐ¼Ñ - в ÑекÑÐ½Ð´Ð°Ñ ):
| LOCs | MEM max | Runtime, sec | |
| Haskell, v1 | 72 | 580 | 88 |
| C++, v1 | 861 | 55 | 383 |
ÐÑоме Ñого, вÑÑÑнилоÑÑ, ÑÑо мой Ð¾Ð¿Ð¿Ð¾Ð½ÐµÐ½Ñ Ð²ÑÑÑеÑки "ÑÑÐµÐ·Ð°ÐµÑ ÑглÑ" в погоне за пÑоизводиÑелÑноÑÑÑÑ. ÐапÑимеÑ, ÑÑнкÑÐ¸Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑаннÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð² Ñайл пÑинимала, в ÑиÑле пÑоÑÐ¸Ñ , ÑиÑловой паÑамеÑÑ, на коÑоÑÑй ÑмножалиÑÑ Ð¾Ð¿ÑеделеннÑе Ð¿Ð¾Ð»Ñ ÑÑÑÑкÑÑÑÑ Ð¿ÐµÑед ÑÐ¾Ñ Ñанением - Ñаким обÑазом ÑкономилÑÑ Ð¾Ð´Ð¸Ð½ ÑекÑÑÑивнÑй Ð¾Ð±Ñ Ð¾Ð´ вÑей ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ .
Ð ÑезÑлÑÑаÑе Ñ Ñоже ÑеÑил "ÑÑезаÑÑ ÑглÑ", и пÑинеÑÑи кÑаÑоÑÑ ÐºÐ¾Ð´Ð° в жеÑÑÐ²Ñ ÑкоÑоÑÑи. Ðой же Ð¾Ð¿Ð¿Ð¾Ð½ÐµÐ½Ñ Ð²Ð·ÑлÑÑ Ð·Ð° qsort, и к вÑоÑÑе (ÑиналÑнаÑ) веÑÑии наÑего кода "ÑиниÑиÑовали" Ñ Ñакими ÑезÑлÑÑаÑами:
| LOCs | MEM max | Runtime, sec | |
| Haskell, v2 | 169 | 130 | 8 |
| C++, v2 | 950 | 54 | 5 |
Я пÑедполагал, ÑÑо ÑооÑноÑение ÑиÑÑ Ð±ÑÐ´ÐµÑ Ð³Ð¾Ñаздо ÑилÑнее не в полÑÐ·Ñ Haskell. ÐпÑоÑем, Ð¼ÐµÐ½Ñ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло Ð±Ñ Ð¾Ð±Ð²Ð¸Ð½Ð¸ÑÑ Ð² пÑедвзÑÑом Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ к ÑоÑмÑлиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑловий.
Ð ÑÐµÐ¼Ñ Ñ Ð²Ñе ÑÑо ведÑ?
СÑÑеÑÑвÑÐµÑ ÐºÐ»Ð°ÑÑиÑеÑÐºÐ°Ñ ÑÑаÑÑÑ "Haskell vs. Ada vs. C++ vs. Awk vs. ... An Experiment in Software Prototyping Productivity", напиÑÐ°Ð½Ð½Ð°Ñ Ð² 1994-м годÑ. Ðа 15 Ð»ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾Ðµ изменилоÑÑ, и, дÑмаеÑÑÑ, многим бÑло Ð±Ñ Ð¸Ð½ÑеÑеÑно пÑоÑиÑаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ ÑÑаÑÑÑ Ð¿Ñо положение дел ÑегоднÑ.
Ð ÑвÑзи Ñ ÑÑим иÑÑÑÑÑ:
1)УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑей задаÑи (кÑиÑеÑии Ñм. ниже)
2)ÐелаÑÑие ÑеализоваÑÑ ÐµÐµ на Haskell/C+/Ocaml/Java/Scala/C#/... Ñ Ñем, ÑÑÐ¾Ð±Ñ Ð²Ð°Ñ ÐºÐ¾Ð´ бÑл неÑадно ÑÑавнен Ñ Ð´ÑÑгими и опÑбликован Ð´Ð»Ñ Ð²ÑеобÑего обозÑениÑ.
Q:ÐаÑем вÑе ÑÑо делаеÑÑÑ?
A:Ðа дÑÑÐ³Ð¸Ñ Ð¿Ð¾ÑмоÑÑеÑÑ, ÑÐµÐ±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ. Ð ÑаÑÑноÑÑи, ÑÑÐ¾Ð±Ñ Ð»Ñди имели возможноÑÑÑ Ð¿Ð¾ÑмоÑÑеÑÑ Ð½Ð° ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ , и ÑоÑÑавиÑÑ Ð¾ Ð½Ð¸Ñ ÐºÐ°ÐºÐ¸Ðµ-Ñо мнение.
Q:Чем не ÑÑÑÑÐ°Ð¸Ð²Ð°ÐµÑ The Great Language Shootout?
A:Тем, ÑÑо Ñам оÑдаеÑÑÑ Ð¿ÑедпоÑÑение "бÑÑÑÑÑм и гÑÑзнÑм" ÑеÑениÑм, коÑоÑÑе вÑÑÑеÑки "ÑÑезаÑÑ ÑглÑ". Ðо-пеÑвÑÑ , в Ñаком ÑÑиле пиÑеÑÑÑ Ð´Ð°Ð¹ бог ÑÑÐ¾Ð±Ñ 5% Ð¾Ñ Ð²ÑÐµÑ Ð¿ÑогÑамм, во-вÑоÑÑÑ , лÑдÑм, не знаÑÑим ÑзÑк X, ÑÑÑого пÑоÑивопоказано ÑмоÑÑеÑÑ Ð½Ð° ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° ÑзÑке X в Language Shootout - оÑÑанеÑÑÑ Ð¿ÑевÑаÑное впеÑаÑление.
Q:Ðак бÑдÑÑ ÑÑавниваÑÑÑÑ ÑеÑениÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð¿Ð¾Ð±ÐµÐ´Ð¸ÑелÑ?
A:Ðикак, Ñ.к. победиÑелей не бÑдеÑ. ÐÑдÑÑ Ð¿Ñиведена опÑÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÑÑаÑиÑÑика по вÑем ÑеÑениÑм, без вÑводов.
Q:Ðакой Ñогда ÑÑимÑл ÑÑаÑÑвоваÑÑ?
A:Ðа дÑÑÐ³Ð¸Ñ Ð¿Ð¾ÑмоÑÑеÑÑ, ÑÐµÐ±Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ :)
Ðакой должна бÑÑÑ Ð·Ð°Ð´Ð°Ñа?
1)Ðе заÑоÑенной под конкÑеÑнÑÑ ÐС (Ñ.е. "РеализоваÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ, вÑÑÑаеваемÑй в Word" или "плагин Ð´Ð»Ñ libpam" - не каÑиÑ)
2)Ðе заÑоÑенной под конкÑеÑнÑй ÑзÑк/ÑÑеймвоÑк/... (Ñ.е. "полÑÑиÑÑ ÑпиÑок ÑигнаÑÑÑ Ð¼ÐµÑодов вÑÐµÑ Ð¾Ð±ÑекÑов Ñказанной ÑбоÑки .Net" - не каÑиÑ)
3)ÐÑли глÑбокие Ð·Ð½Ð°Ð½Ð¸Ñ Ð² пÑедмеÑной облаÑÑи даÑÑ ÑеÑаÑÑее пÑеимÑÑеÑÑво - ÑÑо fail (Ñ.е. "ÑеализоваÑÑ DES-CBC" - не каÑиÑ)
4)ЧÑÐ¾Ð±Ñ Ð¾Ð½Ð° не бÑла из каÑегоÑии "мне не нÑжно, ÑÑÐ¾Ð±Ñ Ð¿Ð»Ð°Ñ Ð±Ñл ÑиÑÑÑй, а нÑжно, ÑÑÐ¾Ð±Ñ Ð²Ñ Ð·Ð°Ð´Ð¾Ð»Ð±Ð°Ð»Ð¸ÑÑ" (Ñ.е. "ÑаÑпаÑÑиÑÑ XLS-Ñайл, не полÑзÑÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеками" - не каÑиÑ)
5)ÐадаÑа не должна ÑÑебоваÑÑ Ð¼Ð½Ð¾Ð³Ð¾ вÑемени на ÑеализаÑÐ¸Ñ (еÑли ÑÑо бÑдÑÑ Ñеловеко-недели - никÑо за нее не возÑмеÑÑÑ)
Ðакой должна бÑÑÑ ÑеализаÑиÑ?
1)ЧÑÐ¾Ð±Ñ ÐµÐµ бÑло не ÑÑÑдно показаÑÑ Ð´ÑÑгим. Ð ÑаÑÑноÑÑи, ÑÑÐ¾Ð±Ñ ÑеÑение на ÑзÑке X не заплевали Ð±Ñ ÐºÐ°Ðº кÑивое и неидиомаÑиÑное дÑÑгие пÑогÑаммиÑÑÑ, знаÑÑие ÑзÑк X.
2)ÐдеалÑно бÑло Ð±Ñ Ð´Ð°Ð²Ð°ÑÑ Ð´Ð²Ðµ ÑеализаÑии: пеÑвÑÑ Ñ Ð¾ÑиенÑиÑом на "кÑаÑоÑÑ", "обÑазÑово-показаÑелÑноÑÑÑ" и легкоÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжки/ÑазвиÑÐ¸Ñ ÐºÐ¾Ð´Ð° (Ñ.е. пиÑем как пÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð´Ð°, коÑоÑÑй бÑÐ´ÐµÑ Ð¿ÑилагаÑÑÑÑ Ðº ÑезÑме :), а вÑоÑÑÑ - "гÑÑзнÑÑ Ð¸ бÑÑÑÑÑÑ".
3)Т.к. библиоÑеки - ÑÑо неоÑÑÐµÐ¼Ð»Ð¸Ð¼Ð°Ñ ÑаÑÑÑ ÑÐ¸Ð»Ñ Ð¸ попÑлÑÑноÑÑи ÑзÑка, библиоÑеками "обÑего назнаÑениÑ" (конÑейнеÑÑ, паÑÑинг, ...) полÑзоваÑÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ и нÑжно
4)Ðо! РеÑение, коÑоÑое ÑвелоÑÑ Ðº иÑклÑÑиÑелÑно к Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð¹-Ñо (ÑзкоÑпеÑиалÑной) библиоÑеки Ð½Ð¸ÐºÐ¾Ð¼Ñ Ð½Ðµ инÑеÑеÑно и ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ðµ бÑдеÑ.
ÐÑбиÑаÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑее ÑÑловие бÑÐ´ÐµÑ Ð¶ÑÑи, пÑедÑÑавлÑÑÑее апологеÑов вÑÐµÑ ÑеÑений и напÑавлений, в Ñом ÑиÑле - вклÑÑаÑÑее ÑÐµÑ , кÑо кÑиÑиÑеÑки оÑзÑвалÑÑ Ð¾ маÑеÑÐ¸Ð°Ð»Ð°Ñ , Ñже вÑÑедÑÐ¸Ñ Ð² fprog.ru.
ÐÑли Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð¸Ð´ÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑией задаÑи и Ð²Ñ Ñ Ð¾ÑиÑе ей поделиÑÑÑ - напиÑиÑе комменÑаÑий, а?