it-swarm-eu.dev

Proč není OCaml populárnější?

Vždy jsem slyšel, že C je = jazyk volby, který se používá pro vestavěné systémy, nebo cokoli, co musí běžet maximální rychlostí. Nikdy jsem nevyvinul laskavost pro C, hlavně proto, že se mi nelíbí ukazatelová aritmetika a jazyk je sotva příčka nad assemblerem.

Na druhé straně, ML jazyky jsou funkční, odpadky sebrané jazyky, a OCaml dokonce má objektový model, přesto mají pověst, že jsou tak rychlé jako C. ML jazyky mají abstrakci, kterou by mohl kdokoli požádat o psaní na vysoké úrovni, stručné kód, přesto si zachovává rychlost potřebnou pro psaní vysoce výkonných aplikací.

Zejména OCaml lze použít všude tam, kde se tradičně používá C, například pro vestavěná zařízení, grafické ovladače, operační systémy atd. OCaml by podle všech práv měl nyní ovládnout svět, ale téměř nikdo neslyšel o jazyce, ale sám. použil to.

Toto je subjektivní otázka, ale proč zůstaly OCaml a ML jiné jazyky tak temné, zatímco C a další jazyky se staly populárními?

86
Juliet

První odpověď zní, že nikdo opravdu neví, proč se jazyky stávají populární, a kdokoli, kdo říká jinak, je oklamán nebo má agendu. (Často je snadné zjistit, proč se jazyk selhání stává populárním, ale to je další otázka.)

S tímto zřeknutím se odpovědnosti jsou zde některé body, které jsou sugestivní, nejdůležitější první:

  • První zralý kompilátor C se objevil v roce 1974; první zralý kompilátor OCaml se objevil na konci 90. let. C má náskok 25 let.

  • C byl dodán s Unixem, což byla největší „zabijácká aplikace“ všech dob. Po dlouhou dobu muselo každé oddělení CS na světě mít Unix, což znamenalo, že každý instruktor a každý, kdo absolvoval kurz CS, měl příležitost být vystaven C. C.Caml a ML stále čekají na svou první aplikaci zabijáka. (MLdonkey je v pohodě, ale není to Unix.)

  • C vyplní svůj výklenek tak dobře, že pochybuji, že už nikdy nebude věnován další nízkoúrovňový jazyk pouze programování systémů. (Chcete-li vidět důkazy ve prospěch, přečtěte si dokument Dennisa Ritchieho o historii C z HOPL II.) Není ani jasné, co je OCamlova výklenek, a výklenek Standard ML je jen o něco jasnější. Takže Caml a ML mají poměrně málo konkurentů, zatímco C zabil svého jediného konkurenta (BLISS).

  • Jednou z velkých silných stránek C je to, že jeho nákladový model je velmi předvídatelný: je snadné se podívat na jakýkoli malý fragment kódu C, který může okamžitě získat přesnou představu o tom, jaké operace se strojem je třeba provést, aby se provedlo ten kód. Nákladový model společnosti OCaml je mnohem méně jasný, zejména proto, že přidělení paměti je mnohem méně explicitní a celkové náklady na přidělení paměti (rovná se nákladům na přidělení plus nákladům vzniklým při sběru odpadu) závisí na vznikajících vlastnostech, jako je jak dlouho živé objekty a které objekty odkazují na jiné objekty. Čistým výsledkem je, že výkon je těžké předvídat, a dokonce těžko analyzovat po skutečnosti. (Nástroje OCaml pro profilování paměti nejsou tím, čím by měly být.) Výsledkem je, že OCaml není vhodný pro aplikace, kde výkon musí být velmi předvídatelný - jako vestavěné systémy.

  • C je jazyk se standardem a mnoha kompilátory. OCaml je softwarový artefakt: jediný kompilátor je z jediného zdroje a kompilátor je standard. A to se standard mění s každým vydáním. Pro lidi, kteří si cení stability a zpětné kompatibility, může jazyk s jedním zdrojem představovat nepřijatelné riziko.

  • Každý, kdo má na polovině slušný kurz kompilátoru a hodně vytrvalosti, může napsat kompilátor C, který více či méně funguje as odpovídajícím výkonem. Pro získání implementace OCaml nebo ML ze země vyžaduje mnohem více vzdělání a získání srovnatelného výkonu jako naivní kompilátor C vyžaduje mnohem více práce. To znamená, že existuje mnohem méně fandů, kteří si pohrávají s jazyky, jako je OCaml, takže je těžší pro komunitu vyvinout hluboké porozumění tomu, jak ji využít.

82
Norman Ramsey

Myslím, že problém s OCaml je v tom, že není příliš užitečný „mimo krabici“. Případný důvod, proč lidé používají jazyk, je ten, že obsahuje knihovny, které potřebují. S ničím „mimo krabici“ se však nikdo do projektu nedostane dost daleko, aby si uvědomil, že potřebuje napsat knihovnu. Výsledkem je jazyk bez knihoven, což ztěžuje psaní „skutečných aplikací“.

Myslím, že to je to, co OCaml trpí - nikdo se neobtěžuje zahájit „skutečné projekty“, protože vše je jen programovací jazyk. Ano, mohu přidat dvě a dvě a vytisknout výsledek. Výsledkem je sbírka knihoven, které jsou většinou akademické abandonware (autor získal doktorát a přesunul se dál), což není pro praktikující programátory příliš užitečné.

(Vím, že se pracuje na tom, aby se to změnilo, s projekty jako „Baterie zahrnuty“. Vraťte se sem za 5 let a možná bude OCaml populárnější.)

Z tohoto pravidla existují výjimky. Java začínal bez knihoven, ale Sun platil lidem, aby je psali všichni v domě, a pak z toho prodali peklo. Java certifikace, Java -specifický hardware, Java knihy, Java třídy atd.) Pak většina univerzit přesvědčila, aby se učily výhradně, i když to není velmi dobrý jazyk použít pro výuku programování.

Výsledkem byla popularita. Peníze mohou vyřešit mnoho problémů.

Ve funkční jazykové aréně vidíme, že se Haskell stává velmi populární. Myslím, že většina popularity je způsobena lidmi, jako jsou doni, kteří píší užitečné knihovny, a nikdy nepřestanou uvádět langauge na trh. Každý den uvidíte několik článků Haskell o programování Reddit. Tím se to udržuje v myslích lidí, dokud se nakonec nerozhodnou: „Zkusím Haskella.“ Když tak učiní, vidí užitečné věci, jako jsou webové rámce, databáze objektů, knihovny OpenGL a knihovny zpracování XML. To znamená, že mohou skutečně udělat něco užitečného právě teď. Takže mezi potenciálem být produktivním a hodně o něm slyšet, Haskell získal velkou popularitu.

CL má mnoho stejných knihoven jako Haskell a je téměř stejně rychlý, ale nikdo o tom nemluví, takže je "cítit se mrtvý". Opravdu #LISP je mnohem tišší než #haskell, ale LISP je stále velmi produktivní jazyk se spoustou knihoven. Žádný jiný jazyk nemá SLIME. Marketing je však velmi důležitý a společnost Haskell to dělá lépe než LISP nebo OCaml (a soutěží o stejnou uživatelskou základnu).

Nakonec někteří lidé nikdy „nedostanou“ programování, takže rozbití jejich mentálního modelu (proměnné jsou pole s hodnotami, kód provádí shora dolů) zajistí, že váš jazyk nepoužívají. Tento typ programátoru je velké procento programovací populace, takže to dále omezuje možnou uživatelskou základnu abstraktních jazyků, jako jsou LISP, Haskell a OCaml.

63
jrockway

Mám rád OCaml hodně jako jazyk. ALE...

Podpora nástrojů tam prostě není. Ladicí program funguje pouze v pořádku, ale nefunguje na Windows (naposledy jsem zkontroloval) a není tam tolik vývojových nástrojů, které jsou k dispozici.

Jeho typový systém je občas trochu příliš silný. Pro někoho, kdo nerozumí tomu, jak funguje odvozování typu nebo systém typu ML obecně, je skutečnost, že nemůže do plováku přidat celé číslo, okamžitým velkým odbočením.

Standardní knihovna může někdy mít nekonzistentní pocit.

Zdá se, že objektový model je poněkud vyřešený a standardní knihovna jej sotva používá, místo toho se rozhodla pro knihovny založené na modulech.

Existuje spousta dalších věcí, které v podstatě znamenají, že se jazyk necítí „leštěný“ a který lidi vyhání během velmi kritického období, když si berou jazyk a snaží se rozhodnout, zda se jim to líbí.

Myslím, že jeho nejdůležitějším odkazem bude, že spolu s dalšími ML dialekty měl velmi silný vliv na další funkční jazyky. Většina funkčních jazyků současné generace bere ty nejlepší prvky z dialektů ML a vylepšuje některé nepříjemnosti.

22
user21714

Vestavěné systémy často vyžadují dvě věci: rychlost a determinismus. OCaml může poskytnout rychlost, ale skutečnost, že má sběratel odpadků, z něj dělá neodmyslitelně nedeterministický, a pro systém v reálném čase, který jednoduchý nebude dělat.

21
ctacke

Toto je trochu srovnání jablka-pomeranče. OCaml je poměrně mladý jazyk [1] a nikdy nedošlo k žádnému vážnému a trvalému úsilí o jeho vtlačení do hlavního proudu (s výjimkou současné práce Microsoftu s F #). Na rozdíl od C nejde o lingua franca nejrozšířenějšího a nejvíce napodobeného podnikového operačního systému (tj. UNIX). Na rozdíl od Javy neměla velká společnost, která by ho tlačila jako počítačová platforma nové generace. Na rozdíl od Perlu, Pythona a Rubyho se nezachytil ve vysoce významném, vlivném výklenku (tj. Jeho výklenkem je programovací jazyk a automatizovaný výzkum uvažování - ve srovnání s vývojem webu to není příliš vysoké). Proto to není super-populární.

[1] Po pravdě řečeno, původní jazyk ML byl kolem 70. let. Ale OCaml se neobjevil až v roce 1996 a nezdědil knihovny Standard ML. Je to v praxi mladší jazyk než C, C++, Java, Python, Haskell nebo dokonce Ruby.

18
Chris Conway

Komunitě OCaml se nepodařilo vyvinout velkou a spolehlivou standardní knihovnu (nad rámec toho, co se dnes dodává s OCaml), což usnadňuje vývoj aplikací. Existuje několik pokusů o vyřešení problému, ale stačí se podívat na Python nebo Ruby) a zjistit, co chybí. OCaml je skvělý jazyk, pokud chcete vyřešíte algoritmický problém, který příliš nezávisí na nutnosti interakce s pokročilými standardními moduly, jako je XML, vytváření sítí, výpočet dat atd., které byste raději sami neimplementovali.

Věřím, že součástí problému je způsob, jakým jsou moduly mapovány do souborů pomocí OCaml: koncepčně všechny soubory * .ml žijí ve stejném jmenném prostoru a adresáře nemají žádný význam. Pro komunitu je proto těžké vyvinout knihovnu. Pokud by kompilátor mapoval hierarchie adresářů do hierarchií modulů, viděl bych lepší šanci, že se bude vyvíjet standardní knihovna. To by však vyžadovalo značné úsilí vývojářů jádra kompilátoru. (Jsem si vědom modulů balení, ale myslím, že je to kludge.)

Dalším problémem s knihovnou je binární kompatibilita mezi vydáními kompilátoru. Je docela bezpečné říci, že po aktualizaci kompilátoru musí být celý kód knihovny znovu kompilován. To ztěžuje poskytování binárních vydání modulů nebo knihoven.

15
Christian Lindig

Pravděpodobně proto, že příliš mnoho lidí bylo vyučováno ML jako součást úvodu k podivným a matoucím teoretickým věcem o typech. To se mi stalo.

Byl jsem zobrazen ML a Smalltalk přibližně ve stejnou dobu. Smalltalk prostě vypadal zatraceně cool, a bylo okamžitě pochopitelné, k čemu OO bylo a jak můžete v tomto prostředí udělat pěkné, interaktivní věci. ML bylo o abstraktních matematických věcech to se nezdálo relevantní pro to, co jsem chtěl dělat. A na rozdíl od C mi nesliboval, že mi dovolí psát rychlé hry na 16bitovém mikroskopu.

To je, samozřejmě, hluboce nespravedlivé a subjektivní. Ale to bude pravděpodobně pro většinu lidí skutečný příběh.

V dnešní době se domnívám, že by otázka zněla: teď mám pocit, že potřebuji znát tento podivný a matoucí teoretický materiál o typech, proč bych si měl vybrat ML přes Haskell nebo Erlang?

11
interstar

Věřím, že hlavním problémem je absence skutečné standardní knihovny. Proto projekt OCaml baterie zahrnuty , který se očekává, že výrazně zlepšit situaci. Měl by vstoupit do fáze Beta během několika dnů, takže si musíte položit otázku znovu za jeden rok.

Souhlasím s tím, že špatná podpora Windows, strmá křivka učení a štíhlá standardní knihovna v minulosti potlačily využití OCamlu, ale dodal bych, že ve srovnání s běžnými jazyky, jako je Java, existuje obrovský nedostatek výukových informací (např. Knih) o OCamlu.

Také lidé, kteří znají jazyky jako OCaml, jsou velmi heterogenní. Mezi webovými programátory možná o OCamlu slyšel asi 1 z 1 000. Mezi lidmi, kteří dělají vědecké práce na univerzitě v Cambridge, asi 90% lidí, které jsem znal, plynulo v OCamlu. Opravdu, byl jsem jedním z posledních mezi mými přáteli, který se naučil OCaml. Dokonce jsme spustili OCaml na našem 256 procesorovém superpočítači ...

Také bych měl zmínit, že tyto otázky se rychle řeší. OCaml se v poslední době znovu objevil v programování webových stránek s projekty jako Ocsigen a v této souvislosti již má alespoň dva hlavní průmyslové úspěchy. Nyní je na OCamlu další nová kniha. Komunita spolupracuje na komplexní standardní knihovně nazvané „včetně baterií“, která právě vyšla ve verzi beta a vypadá fantasticky. Nyní bude vydána vícebarevná verze OCaml. Nejnovější verze OCaml také obsahuje mnoho skvělých nových funkcí, jako jsou líné vzory a dynamicky načtené knihovny OCaml s nativním kódem.

8
Jon Harrop

Myslím, že součástí problému je, že funkční programování není pro většinu lidí přirozeným způsobem myšlení (a říkám to jako někdo, kdo má velký zájem o funkční programování a oceňuje ho). Toto je umocněno skutečností, že drtivá většina programátorů se dnes začala učit procedurální programování (nejoblíbenější OOP jazyky jsou stále procedurálními jádry), a tak je funkční jazyky na začátku obtížné přizpůsobit.

Když jsem nastoupil na vysokou školu, už jsem znal rozumné množství BASIC, C++ a Java a trochu jazyka Pascal a x86 Assembly. Byl jsem daleko od odborníka, ale dospěl jsem k (mírně naivnímu) závěru že všechny programovací jazyky byly v zásadě stejné s mírně odlišnou syntaxí. Náš úvod do programovacího kurzu používal ML, které mi rychle tuto myšlenku rychle zbavilo. V té fázi mé programovací kariéry jsem měl potíže dostat hlavu kolem ML a opravdu jsem neviděl bod funkčního programování. Myslím, že to vyžaduje trochu více zkušeností s některými problémy procedurálního programování, abychom skutečně ocenili výhody funkčního přístupu.

Náš přednášející ML často tvrdil, že vyjadřování problémů rekurzivně bylo přirozenější a snazší než použití smyček nebo jiných procedurálních konceptů. Tento požadavek jsem nikdy nepřesvědčil a stále ho nekoupím. Rekurzivní funkce mohou někdy poskytnout zvláště elegantní a výstižná řešení problémů, ale stále mi připadá nepřirozený způsob, jak přemýšlet o problémech. Možná, že pokud máte velmi silné matematické pozadí, zdá se to intuitivnější, ale nemyslím si, že je pro většinu lidí snadné myslet rekurzivně. Vzhledem k ústřednosti rekurzivních funkcí vzhledem k funkčnímu programovacímu paradigmatu se domnívám, že to může být také důvodem pro menší popularitu funkčních jazyků.

Existuje také zpětná vazba na jazykovou popularitu. Když jsem začal programovat, chtěl jsem vědět, jak programovat grafické efekty a hry. Poté, co jsem se naučil trochu BBC BASIC a později QBASIC, jsem přirozeně zkoumal, jaké nejběžnější jazyky používané programátory demo scén a her byly a byly nastaveny na učení C++ a x86 Assembly. V dnešní době by někteří noví programátoři mohli chtít vědět, jak vytvářet webové aplikace, a tak se bude přitahovat k učení PHP, Ruby nebo C #.) Existuje jen velmi málo oblastí aplikace pro samostatně motivované začátečníky, kde je odpověď na otázku „ nejlepším jazykem, který se naučíte programovat něco jako X, bude Ocaml.

Mnoho praktických důvodů uvedených pro Ocamlovu omezenou popularitu (nedostatek vyspělých knihoven, debuggerů, IDE atd.) Řeší oficiální podpora společnosti Microsoft pro F # jako prvotřídní jazyk .NET. Bude zajímavé zjistit, zda F # pomáhá přinést větší úroveň popularity pro funkční programování.

6
mattnewport

Věřím, že jádrem problému je politika. Vývojáři Ocaml se zajímají hlavně o výzkum a nemají prostředky k poskytování a údržbě bohaté knihovny. Nejsou však také ochotni uvolnit kontrolu produktu pro komunitu, která má tyto zdroje, výsledkem je, že několik pokusů o vyřešení tohoto problému se spoléhalo na neexistující spolupráci a financování knihoven třetích stran a tyto pokusy selhaly. Baterie selže ze stejného důvodu, pokud vývojáři Ocaml nezmění svůj postoj.

K vývoji svého produktu používám Ocaml a mám jednoduché pravidlo: minimalizuji závislost na kódu třetí strany. Pokud je užitečná položka třetí strany, pokud je to možné, začleňte zdrojové kódy přímo do balíčku. Například OCS Scheme a Dypgen jsou základní součásti analyzátoru Felix, takže jsou zkopírovány do našich zdrojů, takže nad nimi máme určitou kontrolu. Kontrola je poněkud iluzorní (protože Dypgen je tak složitý, že je nepravděpodobné, že bychom ho mohli udržet, ale alespoň máme kopii, o které si myslíme, že funguje :)

Nebudu používat baterie, protože licence je omezující, takže nemůžu kopírovat zdroj a nemám důvěru v dlouhodobou životaschopnost jako samostatný produkt: jediný způsob, jak bych je mohl použít, je, kdyby byl začleněn přímo do standardní distribuce Ocaml.

Ve světě C++ bych mohl uvažovat o použití Boost: i když se jedná o knihovnu třetích stran, která není součástí standardu, má tak silnou podporu komunity a ve skutečnosti je výborně synchronizována s procesem vývoje standardů. Myšlenky vyvinuté a testované v Boostu se stávají druhem existující praxe, kterou lze standardizovat, a proces standardů je dostatečně otevřený, aby umožnil účast komunity.

Ocaml získal popularitu, kterou ve skutečnosti má, protože je to skvělý produkt, ale to nestačí k tomu, aby se stal běžným jazykem. Java je hrubý, byl populární s miliardami dolarů marketingu a rozvoje knihoven, ale nakonec musel být komunitě propuštěn, aby vůbec přežil.

6
Yttrill

Užil jsem si kódování v ML i C pro celou řadu projektů. Věc, která mi brání používat ML ve vložených projektech (z nichž většina má omezení v reálném čase a vyžaduje ověření), je sběr odpadu.

Existuje výzkum v oblasti správy paměti s regiony (viz MLKit ), ale složitost implementací a školení potřebných pro jejich správné použití (a související rizika) jsou překážkou jejich používání.

5
Doug Currie

Pokud jde o peníze, jak říká @jrockway, uvidíme, jestli F # získá popularitu jako Java nebo C #.

Myslím, že vývojáři se necítí pohodlně s funkčním způsobem dělat věci (to je z F # relace v techdays 2009, kde asi 10 lidí uvedlo, že zná funkční programování mezi téměř 100 osobami).

Začal jsem OCAML letos, nikdy jsem si zašpinil funkční programování, ale teď se opravdu učím nové věci vždy od OCAML a funkční způsob řešení problémů (ale nemohu říci, že se vzdám C # používat OCAML :)).

3
0xFF

IMHO, myslím, že velký problém OCaml není v jazyce (to je skvělé), ale v lidech, kteří jej rozvíjejí, a v důsledku toho jeho licence:

http://caml.inria.fr/ocaml/license.en.html

Pro kompilátor používají licenci Q Public! Ano, licence ex-Trolltech použitá pro knihovny Qt! Zapomeňte na získání jakéhokoli příspěvku s takovou licencí.

Pokud jste zhruba před 7–8 lety kontrolovali přestřelku jazyků ( http://shootout.alioth.debian.org/ ), byla OCaml těsně za C a C++ pro rychlost provádění. Za tu dobu, jiné jazyky (jako Haskell) dostali lepší kompilátor (kvůli jinému komunitnímu přístupu, myslím) a nyní OCaml rychlost provádění není tak velká jako v minulosti.

Zkrátka bych OCaml nepoužíval, protože nevidím, že by to šlo nikam lépe, aniž by někteří opravdu dobří hackeři vytvořili kompilátor OCaml, který má licenci REALLY open source a komunitu se skutečným chováním open source.

3
Patrizio Rullo

Možná se F # stane populární.

2
tuinstoel

To nepomůže, že c-> ocaml je větší mentální přechod než c-> LISP. Několikrát jsem zvažoval ocaml a vždy jsem zjistil, že náklady/přínosy pro mě prostě neexistovaly, takže to znovu odložte. Nebyly to konstrukty, které by vypadaly tvrdě, ty vypadaly skutečně úhledně. Snažil se naučit úplně jiný význam slova „!“. LISP vypadá alespoň tak odlišně, že je snadné se vyhnout nesprávnému výkladu malých kousků jako c.

2
Kim Reece

Pokud chcete, aby se jazyk používal ve vestavěných systémech v reálném čase, potřebujete ukazatele a nemůžete si dovolit GC.

2

Myslím, že hlavním důvodem je, že OCaml zná příliš málo vývojářů.

A když mluvíme s jinými vývojáři (ti, kteří něco slyšeli o Ocaml), vždycky mám dojem, že OCaml považují za jazyk „pouze pro vzdělávání“ ... smutný, ale pravdivý

1
Chris

Mám rád O'caml hodně ... Implementoval jsem spoustu věcí, které používaly, kompilátor, tlumočníci, systém pro komunikaci s C ...

když jsem se to dozvěděl, hlavním problémem bylo to, že chybové zprávy nejsou opravdu jasné ... takže například na začátku jsem si nebyl úplně jistý, kdy dát ';' a to bylo opravdu těžké zjistit, že ve skutečnosti; byl ztracen ...

0
LB40