it-swarm-eu.dev

Jaký programovací jazyk generuje nejméně obtížně dostupných chyb?

Jaký jazyk podle vašeho názoru umožňuje průměrnému programátorovi vydávat funkce s nejmenším množstvím těžko dostupných chyb? To je samozřejmě velmi široká otázka a zajímají mě velmi široké a obecné odpovědi a moudrost.

Osobně zjišťuji, že trávím velmi málo času hledáním podivných chyb v programech Java a C #), zatímco kód C++ má odlišnou sadu opakujících se chyb a Python/podobný má svou vlastní sadu společných a hloupé chyby, které by kompilátor detekoval v jiných jazycích.

V tomto ohledu je také obtížné uvažovat o funkčních jazycích, protože jsem nikdy neviděl velký a složitý program napsaný ve zcela funkčním kódu. Váš vstup prosím.

Úpravy: Úplně libovolné vyjasnění těžko vyhledatelné chyby: Reprodukce trvá déle než 15 minut nebo nalezení příčiny a nápravy déle než 1 hodinu.

Odpusťte mi, pokud se jedná o duplikát, ale na tomto konkrétním tématu jsem nic nenašel.

54
Magnus Wolffelt

Čím silnější je typový systém jazyka, tím více chyb bude zachyceno při kompilaci samotné.

Následující obrázek porovnává některé dobře známé programovací jazyky z hlediska výkonu, jednoduchosti a bezpečnosti jejich typů systémů. [ Zdroj ]

alt text

* Faktoring schopnosti používat nebezpečné konstrukty.

C # se plní do nebezpečného řádku kvůli „nebezpečnému“ klíčovému slovu a přidruženému stroji ukazatelů. Ale pokud o nich chcete uvažovat jako o nějakém inline mechanismu pro cizí funkce, neváhejte narazit na C #.

Haskell '98 jsem označil jako čistý, ale GHC Haskell jako čistý kvůli nebezpečné * rodině funkcí. Pokud deaktivujete nebezpečný *, pak GHC Haskell odpovídajícím způsobem vyskočte.

58
missingfaktor

Podle mého názoru vám Haskell pomůže vyhnout se některým běžným zdrojům chyb:

  • je to čistě funkční: funkce nemohou mít (neúmyslné) vedlejší účinky, což usnadňuje vícejádrové programování a méně náchylné k chybám
  • je silně napsáno: nemůžete např. náhodně smíchejte hodnoty bool, char, int a float
  • je to staticky napsané: mnoho chyb programování je zachyceno při kompilaci
  • null není součástí definice typu hodnoty: tímto se vyhnete chyba v miliardách dolar
  • existuje spousta hotových funkcí vyššího řádu, které můžete znovu použít místo psaní vlastních, případně vadných implementací
  • má sběratel odpadků: chyby paměti jsou téměř eliminovány (s výjimkou „úniku místa“ kvůli jeho líné vyhodnocovací strategii)
20
LennyProgrammers

Tradičně nejtěžší najít chyby jsou závodní podmínky ve vícevláknových aplikacích tak, jak jsou

  • téměř nemožné reprodukovat
  • může být velmi jemný

Proto potřebujete jazyky, které vám parallismus zvládnou co nejvíce a nenápadně. Ty ještě nejsou tradiční. Java něco dělá, ale nechte tě na tvrdé části).

K mému pochopení potřebujete funkční jazyk, protože „bez vedlejších účinků“ je věc, která na prvním místě způsobí, že dva kulky zmizí. Viděl jsem, že práce na průhlednosti dělá z Haskell efektivního vícevláknového jazyka, a věřím, že Fortress je od základu navržen jako účinný paralelní jazyk.


Úpravy: V Java Executors zpracovává ještě více tvrdých částí. Jednotlivé úkoly je třeba přizpůsobit rozhraní Callable.

18
user1249

Ada je navržena tak, aby co nejvíce bylo zachyceno spíše při kompilaci než při běhu. To znamená, že získání kompilačního programu v Adě často trvá asi 10x déle, než by odpovídalo ekvivalentu v Java), ale když se kompilace, můžete si být jistější, že celé třídy chyb se při spuštění programu neprojeví.

13
Mark Pim

Nejprve definice: těžko najít chybu, jak ji chápu, je chyba, kterou lze reprodukovat, ale příčinu je těžké najít.

Pravděpodobně nejdůležitějším aspektem je to, čemu bych říkal úzkost, tj. Jak daleko může chyba uniknout, jak velký je rozsah, který může chyba potenciálně ovlivnit. V jazycích jako C, chyba, např. index negativního pole nebo neinicializovaný ukazatel, může ovlivnit doslova všechno všude v celém programu, takže v nejhorším případě musíte zkontrolovat vše všude a najít zdroj vašeho problému.

Dobré jazyky v tomto ohledu podporují modifikátory přístupu a vynucují je tak, že je obtížné nebo nemožné je obejít. Dobré jazyky vás vyzývají, abyste omezili rozsah vašich proměnných, místo aby bylo příliš snadné mít globální proměnné (např. „Vše, co není explicitně deklarováno, je globální proměnná s výchozím typem a hodnotou“).

Druhým důležitým aspektem je souběžnost. Závodní podmínky jsou obecně obtížně reprodukovatelné, a proto je těžké je najít. Dobré jazyky nabízejí snadno použitelné synchronizační mechanismy a jejich standardní libs jsou v případě potřeby bezpečné.

Tím již můj seznam doplním; další věci, jako je silné psaní, pomáhají chytit chyby v době kompilace, ale ty chyby pravděpodobně nebude později těžké najít.

Vzhledem k tomu všemu bych řekl, že Java a C # a mnoho dalších jazyků ve světě JVM a .net) je vhodné vyhnout se obtížně vyhledávatelným chybám.

7
user281377

Protože Excel je nejpoužívanější DSL, půjdu s Excelem. (samozřejmě s výjimkou VBA)

To se hodí k účtu:

  • Reprodukce je vždy snadná (zde je tabulka - nefunguje)
  • Je docela snadné najít chybu, protože je zcela „funkční“ - začněte s chybnou buňkou a sledujte zpět všechny její závislosti.
7
Scott Whitlock

To je obtížná otázka, protože většina chyb není chybou samotného jazyka - spíše chybou vývojářů, kteří dělají chyby v tom, jak jazyk používají.

Věřím, že existuje několik aspektů jazykových funkcí, které ovlivňují pravděpodobnost chyb:

  • Interaktivita - dynamické jazyky s REPL podporují interakci/experimentování s běžícími programy a mnohem menší cykly kódů/testů. Pokud si myslíte, že iterace je dobrý způsob, jak objevit čistá jednoduchá řešení a odhalit/odstranit chyby, pak by to mělo sklon upřednostňovat interaktivní jazyky.

  • Expresivita - pokud je kód kratší a má menší konektivitu/náhodnou složitost, pak je snadnější vidět chyby/logické chyby.

  • Typová bezpečnost - čím větší je kontrola kompilace času, tím více chyb bude chycen kompilátorem, takže obecně je bezpečnost typu dobrá věc. Obvykle však nejsou obtížné najít chyby - i v plně dynamickém jazyce bude nesprávný typ ve struktuře dat obvykle způsobovat velmi zjevnou runtime chybu a TDD téměř vždy vybírá do těchto druhů chyb.

  • Neměnitelnost - mnoho tvrdých chyb je způsobeno složitou interakcí proměnlivého stavu. Jazyky, které zdůrazňují neměnitelnost (Haskell, Clojure, Erlang), mají obrovskou výhodu tím, že se vyhýbají mutabilitě

  • Funkční programování - funkční přístupy k psaní kódu bývají „prokazatelně správné“ než objektově orientovaný kód s komplexními sekvencemi efektů/interakcí. Moje zkušenost je, že FP pomáhá vyhýbat se komplikovaným chybám - věřím, že někde existuje nějaký akademický výzkum, který v současné době nemohu najít, co by to podpořilo.

  • Podpora souběžnosti - problémy se souběžností jsou obzvláště obtížné detekovat a ladit, což je důvod, proč je to tak důležité. Všechno, co vyžaduje ruční zamykání, je nakonec odsouzeno k selhání (a to zahrnuje do značné míry každý objektově orientovaný přístup ke shodě). Nejlepší jazyk, který v tomto ohledu znám, je Clojure - má jedinečný přístup ke správě souběžnosti, který kombinuje softwarovou transakční paměť s neměnnými datovými strukturami, aby získal nový, spolehlivý a skládatelný rámec souběžnosti. Další informace naleznete na stránce http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

7
mikera

Čím je jazyk méně výkonný, tím méně možností vám dá natočit vlastní nohu.

Jazyky vysoké úrovně jako Java a C # budou produkovat méně chyb než jazyky nízké úrovně jako C++.

Po tom, co jsem řekl, věřím, že Java je bezpečnější než C #. Java je uměle omezeno), aby jej mohl zvládnout průměrný programátor bez pokročilých znalostí a produkovat stabilní programy.

5
user8685

Jaký jazyk podle vašeho názoru umožňuje průměrnému programátorovi vydávat funkce s nejmenším množstvím těžko dostupných chyb?

Podle mého názoru Delphi. Protože je jazyk založený na Pascalu, jazyk je dostatečně jednoduchý a intuitivní pro průměrného programátora (nebo dokonce nezkušených programátorů) , aby jej snadno vyzvedl, a jeho bohatá podpora nástrojů a knihoven usnadňuje nalezení většiny chyb.

  • Silné psaní a přísný kompilátor, který zachycuje mnoho běžných chyb.
  • Intuitivní syntax, která nepodporuje běžné chyby. ("Poslední chyba na světě," if (alert = RED) {LaunchNukes;}, se například nezkompiluje.)
  • Dobře navržený objektový model, který eliminuje mnoho běžných chyb C++ OOP).
  • Kontrola hranic a kontrola dosahu vestavěná do jazyka, drasticky snižující šance na bezpečnostní problémy.
  • Pravděpodobně nejrychlejší kompilátor, který je člověku znám, což zvyšuje vaši produktivitu a ztěžuje ztrátu myšlenek při čekání na sestavení.
  • Ladicí program Visual Studio debugger chce být jako když vyroste.
  • Sledování netěsností vestavěné přímo do správce paměti, takže hledání a opravování úniků paměti je triviální.
  • Velká, vyspělá standardní knihovna poskytující předdefinované a předem vyzkoušené způsoby, jak provádět běžné úkoly, aniž by bylo nutné budovat vlastní, případně buggy implementace.
  • Lodě s užitečnými nástroji, jako je výkonný systém protokolování a profiler, usnadňují sledování problémů.
  • Silná podpora komunity pro běžné problémy, které nejsou ve standardní knihovně, včetně výkonná knihovna třetích stran .
3
Mason Wheeler

Jedna věc, kterou je třeba vzít v úvahu, je doba obratu.

Asi za posledních pět let jsem hlavně vyvíjel webové aplikace v Java (JSF, Seam atd.). Nedávno jsem dostal novou práci a používáme Perl (s Katalyzátor a Moose).

V Perlu jsem mnohem produktivnější než v Javě.

Jedním z důvodů není potřeba kompilace a (horké) nasazení. Zjistil jsem také, že případy použití písem jsou jednodušší, protože to lze provést iteračnějším způsobem. A rámce v Java se zdají být zbytečné složité, alespoň pro projekty, kterých jsem se účastnil).

Myslím, že počet chyb v mém kódu Perl je víceméně stejný jako počet chyb v mém Java kódu, může to být dokonce vyšší. Ale je pro mě jednodušší a rychlejší najít a opravit tyto chyby.

2
slu

Možná by bylo možné prozkoumat počet nástrojů dostupných pro statickou a dynamickou analýzu kódu pro každý programovací jazyk. Čím více nástrojů pro jazyk, tím je pravděpodobnější, že jazyk je buď velmi populární mezi uživateli, nebo velmi populární při generování těžko dostupných chyb. Ale nemůžu přimět Google, aby mi ukázal na jakoukoli studii provedenou na toto téma. Je třeba také poznamenat, že některé jazyky, například C, lze použít k obcházení základních hardwarových chyb, jakož i k opotřebení hardwaru během jeho stárnutí.

1
vpit3833

Místo mluvení o jazycích, co mluvení o jazykových funkcích

  • Java vás nutí přemýšlet o výjimkách (vyvolá ...) a tyto výjimky musíte zveřejnit nebo je zpracovat. To mi opravdu brání zapomenout na chyby nebo používám více výjimek, které jsou odvozeny od SystemException, které tuto manipulaci nepotřebují?
  • co třeba „design by contract“ (http://en.wikipedia.org/wiki/Design_by_contract), které mě nutí myslet na předběžné a postkontinentální podmínky. Četl jsem, že je nyní možné s c # -4.0.
1
k3b