- wachag blogja
- A hozzászóláshoz be kell jelentkezni
- 1858 megtekintés
Hozzászólások
504 gateway timeout?
--
"Van olyan ember sok az oldalon, akinek a kommentjeinek 100%-a zaj, oket miert nem kommentelitek ilyen lelkesen?" (hrgy84)
- A hozzászóláshoz be kell jelentkezni
Már elmúlt :-P
- A hozzászóláshoz be kell jelentkezni
gondolom, "if (!new_opts)"-ra gondolt a szerzo...
--
"Van olyan ember sok az oldalon, akinek a kommentjeinek 100%-a zaj, oket miert nem kommentelitek ilyen lelkesen?" (hrgy84)
- A hozzászóláshoz be kell jelentkezni
Komolyan, nem tesztelt előtte? Egyből kibukott volna ez a kis logikai hiba, ami miatt pont az ellenkezőjét csinálja a kód, mint ami a commit message-ben le van írva.
- A hozzászóláshoz be kell jelentkezni
Na pontosan ezért nem C-ben kellene már programozni.
- A hozzászóláshoz be kell jelentkezni
kernel javaban? OK, gyenge vicc volt...
--
"Van olyan ember sok az oldalon, akinek a kommentjeinek 100%-a zaj, oket miert nem kommentelitek ilyen lelkesen?" (hrgy84)
- A hozzászóláshoz be kell jelentkezni
Sebaj, majdnem felnevettem :). Ideje lenne már meghaladni az assembly-t C-t. Amit nem tudok, hogy használnak ezek valami automatizált kód analízist? Az ilyen hibák azonnal kijönnének, fejlettebb nyelv/IDE párosnál már gépelés közben jön a warning.
- A hozzászóláshoz be kell jelentkezni
Nem, ez nem vicc. De amúgy nem feltétlenül kell azonnal menedzselt kódra gondolni, elég lenne egy erősen típusos nyelv. Persze amíg az egész rendszer egy negyven (!) éves paradigmát követ (Unix), addig nincs min csodálkozni.
- A hozzászóláshoz be kell jelentkezni
Igen, a Singularity-re évek óta lelkesen utalgatnak. Ezen kívül bármi haladás van vele?
- A hozzászóláshoz be kell jelentkezni
Kísérleti rendszer. A tapasztalatok fognak átkerülni majd éles rendszerekbe, idővel. Ez nem Linux, hogy a kísérleti dolgokat éles rendszeren próbálgassák :)
- A hozzászóláshoz be kell jelentkezni
Fognak, majd, idővel.
Hány éve fut a dolog?
A többivel egyetértek.
- A hozzászóláshoz be kell jelentkezni
Singularity sosem készült éles operációs rendszernek, csupán egy kutatási projektnek, ahol ki lehet próbálni új dolgokat.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Ezt értem. És ezekkel az új dolgokkal kezdtek valamit?
Értsd: gyakran előjött egy flame során, hogy managelt nyelven írt kernel, de szép, de jó.
De csak publikálnak dolgokat róla, vagy tényleg alkalmazzák is a kutatás eredményeit (pl. bekerülnek dolgok az ntoskrnl-be)?
- A hozzászóláshoz be kell jelentkezni
Ez minden nyelvben ugyanekkora gondot okozott volna. Se pointer, se buffer overflow, etc., semmi csak C kodra jellemzo hiba nem volt abban a sorban.
- A hozzászóláshoz be kell jelentkezni
Mutatót használni logikai kifejezésként... Normális nyelv nem enged ilyet.
- A hozzászóláshoz be kell jelentkezni
Nem minden nyelvben. Amikor minden tipus lehet logikai ertek, az csak a gyengen tipusos nyelvekben hiba. A C ilyen.
Erosen tipusos nyelvben ilyen kod le sem fordul.
- A hozzászóláshoz be kell jelentkezni
Mennyi takolas... Harom szo: Railway oriented programming.
Lepesek egy szebb vilag fele:
0) Mivel egy csomo mas nyelvben is elojohet egy bool ellenorzesekor, hogy lemarad az egy karakternyi negalas, ezert talaljunk jobb nyelvet. Igen, az atyauristen javaban is.
1) Hasznaljunk Just|Nothing pattern matchinget.
2) vagy mivel a Maybe monad, igy do-blockba fuzve szep kodot is kapsz, gotok, ifek, try-catch, es Just|Nothing patmatch nelkul is.
3) PROFIT!!!!
Kivancsi vagyok, mikor aldoz le a C/C++-ban takolt kernelek kora, ha egyaltalan. Illetve van-e elkepzelheto nyelv jelenleg erre (ami nem abbol all, hogy amint hardverhez kell nyulni, C-s FFI van)
- A hozzászóláshoz be kell jelentkezni
Swift? Gepi kodra fordul optimalis futasidovel ;)
- A hozzászóláshoz be kell jelentkezni
Az "optimalis" valoszinuleg eleg megalapozatlan kijelentes.
En Rustra gondoltam, vagy Go. Rustrol tobb jot hallottam.
- A hozzászóláshoz be kell jelentkezni
Go-val az a baj hogy a Google csinalja. Amit meg tudunk milyen: 50% esellyel egy nap csak bejelentik hogy nem csinaljak tobbe, plusz szeretnek ulni a kodon toketlenkedve semmit nem csinalva evekig. Amit az Apple elkezdett az meg sose volt sok, de legalabb vegigcsinaltak, meghozza gyorsan. A Swiftrol meg megintcsak latszik hogy komolyan veszik, a Go ahhoz kepest egy helyben totyorog mar eleve. Sot, emlekeztetoul a Swift meg egy eves sincs (tavaly nyaron jelentettek be egyaltalan), es mar rengeteg fontos iOS es Mac OS X alkalmazas keszult benne, Goban meg hany eve nincs semmi komolyabb alkalmazas irva ekozben? Mindemelle nyilt a clanggal egyutt, ergo senki nem kenyszerit arra, hogy a Cocoa/Cocoa Touch API-kkal hasznald, onnantol meg hogy ezeket nem hasznalod, tenyleg azt csinalsz vele, amit akarsz. Szerintem a legmegbizhatobb jovokeppel rendelkezo uj generacios kompilalt nyelv a Swift mindenkeppen jelenleg.
Rustot mondjuk nem ismerem, utananezek.
Swiftnek meg valoban kell meg fejlodnie, de ahogy C-nel is eljutottunk oda 45 ev utan, hogy sok esetben nem tudsz olyan optimalis ASM kodot csinalni, mint a C forditok, ugy Swiftnel is siman eljuthatunk oda, hogy nem tudsz olyan optimalis Obj-C kodot (majd abbol assembly-t) irni, mint a Swift foridtok.
Raadasul erdekesseg meg a Swiftben, hogy ha lefordult tipusellenorzessel, lefordithatod anelkul is (-Ofast parameter), de onnantol ugyanazok a problemak fennallnak a forditott koddal, amik C/C++ eseten, csak ugye kicsit gyorsabb, mert futasidoben nem nezi ugyanis a typingos if agakat szigoruan. Megfelelo tesztelesi es kodanalizalasi rendszereket hozzaepitve ebben a gondolatmenetben en megintcsak komoly jovot latok.
- A hozzászóláshoz be kell jelentkezni
Goban meg hany eve nincs semmi komolyabb alkalmazas irva ekozben?
Ebben biztos vagy? Ott van kapásból a Docker. Nem kerestem, de biztos van több is.
-----
„Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben.”
rand() a lelke mindennek! :)
Szerinted…
- A hozzászóláshoz be kell jelentkezni
0) Szerintem inkább arról van szó, ha a nyelv kikényszeríti, hogy kiírjad így: ptr != NULL, akkor jobban kiveri az ember szemét egy ilyen elírás. Nekem pl eltartott egy pár percig, mire megértettem, hogy mit is akart volna csinálni a kód és ehelyett mit csinál (egyébként a goto vonta el a figyelmemet, először akörül kerestem a hibát).
Egyébként a bajok nagy részét már a C++ is megoldaná. Hardverhez nyúlkálni abból is lehet és magasabb szintű design patterneket is elég jól lehet benne használni.
---
Régóta vágyok én, az androidok mezonkincsére már!
- A hozzászóláshoz be kell jelentkezni
Monád-jellegű kódszervezést megpróbált Bartosz Milewski C++-ban. Azt a hányást nem kívánom senkinek.
- A hozzászóláshoz be kell jelentkezni
A monad valóban nem biztos, hogy jó példa C++-ra, de option patternt meg lehet oldani máshogy is, nemcsak maybe monaddal.
---
Régóta vágyok én, az androidok mezonkincsére már!
- A hozzászóláshoz be kell jelentkezni
Meg, de egy C-jellegű switch-case vagy neadjég if-ezés eléggé tönkreteszi a szép kódot (lásd belinkelt if(...) goto), míg ha van rá szintaxcukorka (do-block), kicsit szebb a kód.
test1 :: Whatever a => ... -> Maybe a
test2 :: Whatever b => ... -> Maybe b
railway :: Maybe String
railway = do
test1 $ ...
test2 $ ...
return "MyPreciousString"
Es semmi if, semmi trycatch, etc. megis compile timeba tettunk egy csomo hibakezelest. Nyilvan a koncepcio fenyevekre van a C/C++-tol, a szintaxisrol nem is beszelve.
- A hozzászóláshoz be kell jelentkezni
Ezekkel nekem csak annyi volt mindig a problémám, hog az Exceptionokat is az esetek 99%-ában messze nem ott kezeljük le, ahol kiváltódnak, hanem esetenként 3 réteggel odébb és hagyjuk az egész folyamatot elhalni. Ez meg (számomra ránézésre) ugyanazt eredményezi, mint a Java a checked exceptionjaival: rákényszerít egy halom plusz ellenőrzésre ott, ahol nem lenne rá semmi szükség, csak hagyni kellene megdögleni az egész függvényt, folyamatot, stb.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
A kivételkezelési alapszabály: A kivételeket nem ott kell kezelni, ahol kiváltódnak, hanem ott, ahol érdemben tudsz tenni azért, hogy az alkalmazás normális mederben folytassa tovább a futását. Ha nincs ilyen réteg, akkor bizony az alkalmazásnak el kell hasalnia, mivel helyre nem állítható állapotban van. Van, amikor egy szint nem tud arról, hogy "na, akkor most mit is kéne itt csinálni", mert az őt hívó absztrakciós réteg tudja csak, hogy mi a teendő, ha mondjuk nem elérhető egy hálózati végpont, nem elérhető egy file stb. Például egy hálózati kódot akár több üzleti logikai alrendszer / objektum / whatever meghívhat, így nem rakhatsz üzleti logikai döntést a hálózatot kezelő kódba, hiába ott fog felbukkanni az Exception.
Az alacsonyszintű kód nem szabad, hogy tudja, mi a teendő az üzleti logikában, ha valami nem várt esemény történik. De azt megteheted, hogy továbbdobsz egy "üzleti" exceptiont mondjuk IOException helyett.
- A hozzászóláshoz be kell jelentkezni
Ezzel én tisztában vagyok, pontosan ezt mondtam én is. Csak egyesek ezt nem egészen értik ezt. Igaz ebben benne van a vaskalapos nézet is, hogy a "hibát mindig le kell kezelni ott, ahol kiváltódik", amit egyetemeken szoktak oktatni.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
> hagyni kellene megdögleni az egész függvényt
Pontosan ezt csinalja. Ha a test1 fassaggal ter vissza, akkor az egesz fv. elnothingol, vegre sem hajtva a tobbi (test2, etc) fv.
- A hozzászóláshoz be kell jelentkezni
Igen, de ha jól értem ezeket az ellenőrzéseket minden egyes fv hívás után végig kell zongorázni, ahol ilyen maybe XYZ lehetőség van.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Hát két lehetőséged van (mint ahogy bármely más programozási nyelv esetén):
1) Vagy beépíted az Option(al)/Maybe absztrakciót a fél API-odba és továbbgyűrűzik (ahogy exceptionökkel is tennéd)
2) Vagy pedig a megfelelő szinten, ahol van értelme, eldobod, és nem foglalkozol vele (ahogy exceptiönöknél is tennéd).
A 2)-es pont gyakori. Tfh. van egy pont az üzleti logikádban, ahol egy "Mennyiséget" várnál válaszul, és a "0" válasz értelmezett. Ha bármelyik a kompozált függvényeidből Nothing-gal tér vissza, akkor azt egy ponton 0-vá alakíthatod. De mint ezt mondtam, így működik bármelyik nyelvben.
Hogy akkor mi a szép/jó a fenti kódban? Pontosan ennek a 0-vá alakításnak a módja. ADT-kkel dolgozol (kb. C-s unionokhoz hasonló, amiben van egy enum az union "típusára" vonatkozó adatokkal), amik minden lehetséges típusát ellenőrizned kell (kb. enum-ra switch-case), hogy leforduljon a kódod. Mas nyelven is meg tudod ezt csinalni, de pl. Java/C++ eseten hanyast kapsz eredmenyul (nem nagyon van szintaxisoldalrol megtamogatva), amit aztan nehez karbantartani. Itt van harom megoldas a fenti problemara:
-- A fuggvenyunk tipusa:
businessLogicFun :: Maybe Int -> Int
-- (1) ADT pattern matching
businessLogicFun Just i = i
businessLogicFun Nothing = 0
-- (2) Mivel rajohettel, hogy ez eleg gyakori, van mar ra fugfveny a std libekben.
-- A fromMaybe ket parametere: egy default ertek (mi 0-t adunk at,
-- String eseten pl. empty/error Stringet, stb.), es egy Maybe monad.
businessLogicFun m = fromMaybe 0 m
-- (3) Ugyanaz mint az elozo, de Curryzett verzio => Matematikailag preciz, keveseb verbose
businessLogicFun = fromMaybe 0
A hibat (ahogy persicsb is irta) a legvegen igyis-ugyis szemantikai szinten kell ellenorizni, a megfelelo helyen. Viszont az eredeti problemam (nekem legalabbis) az volt, hogy a van egy C-s fv a kernelben (lasd OP), akkor a "hibakezeles" miatt tele van rakva goto-val, ifekkel, mashol try-catch-csel. Nem latod ranezesre, mit is kell csinalnia a kodnak. Azt latod, hogy felcsillio elagazas van benne.
Egy do-blokkba szervezett monadikus kod eseten nem ez tortenik. A "hibakezeles" implicit, szintaktikai segitseget kapsz, anelkul, hogy keywordokkel raknad tele a kododat.
- A hozzászóláshoz be kell jelentkezni
Nem, esetünkben nem a goto-s dolgokkal van a baj, hibakezeléshez többnyire elég korrektül használják.
Más kérdés, hogy a maybe monad hasznos.
- A hozzászóláshoz be kell jelentkezni
Ertelek, de ez a szal onnan indult, hogy elmondtam, mekkora taknyolas folyik, es hogy erre mar feltalaltak szebb megoldasokat.
Ha az eredeti problemafelvetesre is reagalni akarok, akkor elmondhatom, hogy hat igen, egy erosen tipusos nyelv eseten ez nem fordulhat elo, etc. Ezt igy '15-ben kevesnek gondolom. C++-szal/Javaval ugyanugy teletaknyolnad ifekkel, try-catch-csel, nabumm, legalabb a maintainelhetetlen fos _ebben az esetben_ nem lenne _logikailag_ hibas.
Szerk.: Na jo, befejezem. Egy Java/C# mar jobb valasztas (nyilvan nem kernel irasara). Bar teny, hogy a mindennapjaimban az is elofordul, hogy a C-s takolt cucc (linux) nem hagy cserben, mig a Javas nagyonfenszi cucc (mobile bank) meg igen. Ez pedig szepen bizonyitja, hogy attol, hogy egy nyelv jobb, mindig fognak tudni benne takolni :)
- A hozzászóláshoz be kell jelentkezni
Egyébként: https://wiki.haskell.org/Kernel_Modules
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Én ugyan nem azt mondom, hogy nem _lehet_ kernelt / meglévő kernelhez modult írni :-) De a nyelvnek nem ez a célja és a jelenlegi architektúrájával soha nem is lesz az. Eleve purefunctional nyelvhez mindenképpen kell GC, ez pedig lassú modulok írásához elég, core funkcionalitáshoz nem.
Ha jól látom a metasepi cikk pont ezt próbálja amúgy megoldani. Ezt a cikket nem ismertem, köszi.
- A hozzászóláshoz be kell jelentkezni
>> Eleve purefunctional nyelvhez mindenképpen kell GC,
purefunctional nyelv is lehet strict, akkor szerintem nem kell hozza GC.
- A hozzászóláshoz be kell jelentkezni
Igazad van, ofkoz a non-strictness (aka laziness) miatt kell a GC. My bad.
Amúgy pont most beszélgettem erről egy hozzáértővel, mert azt gondoltam, hogy egy kis escape analízis, és máris lehet az immutable objektumjainkat mutableként kezelni a compiler szintjén (esetleg még stacken allokálni). Kiderült, hogy - ghc-ben legalábbis - nem ez történik, Generational GC van, amellett pedig nem éri meg vesződni vele, a short-living objectekre jó az (ebből pedig egy pure nyelven sok van).
Sokkal többet szeretnék erről a témáról amúgy tudni mint most, majd egyszer visszanézek még ebbe a topikba :-)
- A hozzászóláshoz be kell jelentkezni
Nem rossz :-)
- A hozzászóláshoz be kell jelentkezni
Java 8-ban ugyanezt megteheted Optional-lal.
http://www.oracle.com/technetwork/articles/java/java8-optional-2175753…
- A hozzászóláshoz be kell jelentkezni
Tudom, ezért is írtam, hogy
> beépíted az Option(al)/Maybe absztrakciót
:-)
De ez nem "ugyanez". Ugyanis javaban ezzel csak összetaknyolod a kódot. Még. Talán ahogy az iterator pattern a nyelv részévé vált, ez is azzá fog, ahogy Haskellben is.
- A hozzászóláshoz be kell jelentkezni
Nagyrészt egyetértek, de mégis vitatkoznék egy kicsit. :) Az optional nagyon jó, ha azt akarod jelezni, hogy normális állapot az, ha valamilyen eredményt nem lehet előállítani. Pl. egy keresésnek nincs találata. De fent inkább hibakezelésről volt szó, amire az optional azért nem feltétlenül a legjobb megoldás, mert nem fogod tudni, hol és milyen hiba történt. Milyen jó is lenne, ha a a kivételkezelést pont ugyanúgy lehetne használni, ahogyan az optionalokat... :)
- A hozzászóláshoz be kell jelentkezni
Data.Either szerintem alkalmazható arra, amit gondolsz.
Ha Left, akkor minden oké.
Ha Right, akkor az burkolja a hibát, és az átesik a további függvényeken.
- A hozzászóláshoz be kell jelentkezni
Try-catch nem pure (IO monadban van ertelmezve). Maybe/Either igen. Ez fontos különbség. Amíg a kódnak nincs mellékhatása, addig tökéletesen lehet az utóbbit használni, és pontosan ez a railway oriented programming lényege; nem is _érdekel_, hogy mi volt a hiba, a lényeg, hogy korrekt kódot kapj minden eset lekezelésével (ifek+goto err helyett). Ha ennél több kell, akkor Either, Writer monad, State monad, stb.
- A hozzászóláshoz be kell jelentkezni
Vicces a thread.
En gyakran kihagyok tagadast `halando` szovegbol, lehet meg kene tanulnom bushmanul es akkor minden jo lesz :)
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni