it-swarm-eu.dev

Nízkoúrovňové programování - co je v mně?

Celé roky jsem zvažoval kopat do toho, co považuji za „jazyky nízké úrovně“. Pro mě to znamená C a shromáždění. Na to jsem však ještě neměl čas a ani to nebylo nutné.

Teď, protože nevidím vznikající nutnost, mám pocit, že bych měl buď naplánovat nějaký okamžik, kdy budu studovat předmět, nebo plán navždy opustit.

Moje pozice

Za poslední 4 roky jsem se zaměřil na „webové technologie“, které se mohou změnit, a jsem vývojář aplikací, který se pravděpodobně nezmění.

Ve vývoji aplikací si myslím, že použitelnost je nejdůležitější věc. Píšete aplikace, které uživatelé „spotřebují“. Čím jsou tyto aplikace použitelnější, tím větší hodnotu jste vytvořili.

Abychom dosáhli dobré použitelnosti, věřím, že následující věci jsou životaschopné

  • Dobrý design: Promyšlené funkce dostupné prostřednictvím promyšleného uživatelského rozhraní.
  • Správnost: Nejlepší design nestojí za nic, pokud není implementován správně.
  • Flexibilita: Aplikace A by se měla neustále vyvíjet, aby její uživatelé nemuseli přecházet na jinou aplikaci B, která má nové funkce, které by mohla implementovat A. Aplikace, které se zabývají stejným problémem, by se neměly lišit funkcemi, ale filosofií.
  • Výkon: Výkon přispívá ke spokojenosti uživatelů. Aplikace je v ideálním případě vždy citlivá a plní své úkoly přiměřeně rychle (na základě jejich frekvence). Hodnota optimalizace výkonu za bodem, kde je uživatel viditelný, je sporná.

Myslím, že programování na nízké úrovni mi s tím nepomůže, s výjimkou výkonu. Ale psaní celé aplikace v jazyce nízké úrovně kvůli výkonu je pro mě předčasnou optimalizací.

Moje otázka

Co mě může naučit nízkoúrovňové programování, jaké další jazyky by mě neučily? Chybí mi něco, nebo je to jen dovednost, která je pro vývoj aplikací jen velmi málo užitečná? Prosím pochopte, že nezpochybňuji hodnotu C a Shromáždění. Je to jen to, že v mém každodenním životě jsem docela šťastný, že všechny složitosti tohoto světa jsou odvedeny pryč a spravovány pro mě (většinou vrstvami napsanými v C/C++ a samotném shromáždění). Prostě nevidím žádné koncepty, které by pro mě mohly být nové, pouze detaily, s nimiž bych si musel plit hlavu. Co je v tom pro mě?

Můj závěr

Děkujeme všem za odpovědi. Musím říct, že mě nikdo opravdu nepřekvapil, ale alespoň teď jsem si zcela jistý, že tuto oblast zájmu upustím, dokud nevznikne potřeba.
Podle mého porozumění je psaní dnešní montáže pro procesory, které se používají v dnešních procesorech, nejen neúmyslně komplikované, ale může vést ke zhoršení běhového výkonu než protějšek C. Optimalizace ručně je díky OOE téměř nemožná, zatímco nedostanete všechny druhy optimalizací, které kompilátor dokáže automaticky. Kód je také přenosný, protože používá malou podmnožinu dostupných příkazů, nebo je optimalizován, ale pak pravděpodobně funguje pouze na jedné architektuře.
Psaní C už není zdaleka tak nutné, jako tomu bylo v minulosti. Kdybych měl psát aplikaci v C, tak bych stejně používal testované a zavedené knihovny a rámce, které by mi ušetřily implementaci rutin kopírování řetězců, třídění algoritmů a dalších druhů věcí sloužících jako cvičení na univerzitě. Můj vlastní kód by se spouštěl rychleji za cenu bezpečnosti typu. Nemám zájem znovu objevovat kolo v průběhu normálního vývoje aplikací, ani se nesnažím ladit tím, že se podívám na základní výpisy: D
V současné době experimentuji s jazyky a tlumočníky, takže pokud existuje něco, co bych chtěl zveřejnit, předpokládám, že bych do C přenesl pracovní koncept, i když C++ by stejně dobře mohl udělat trik.
Znovu děkuji všem za vaše odpovědi a pochopení.

32
back2dos

Nízkoúrovňové programování je pro rohové případy, kdy na běžných stolních počítačích není požadavek okamžitě přítomen. Může se jednat o překážku rychlosti nebo o překážku paměti nebo o něco úplně jiného a je velmi zajímavé sledovat, co lze s ohledem na tyto požadavky udělat.

Představte si to jako Haikus nebo Limericks, kde to omezení činí zajímavým.

Abychom vám poskytli představu o tom, co je možné v tom, co by se dnes zdálo nemožné, je zde jeden z největších hacků všech dob. Šachy v 1 Kb RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/

9
user1249

Právě jsem si to nedávno myslel. V současné době bych se považoval za vývojáře C # - což je pro moji kariéru naprosto v pořádku.

Každopádně mi však chybí opravdu nízká úroveň věcí (v zásadě „zašpinit si ruce“ pomocí ovladačů assembleru nebo zařízení v C). Prostě mi chybí programování. Neočekávám, že mi to v mé kariéře masivně pomůže. Pokud jsou ovladače zařízení nebo vestavěné systémy vaší věcí, mohlo by to hodně pomoci.

Čím více jsem programoval v abstrahovaných jazycích, tím více mi chybělo to, co mě do počítačů dostalo: vrhal se kolem počítače a viděl, jaké záškuby. Assembler a C se velmi hodí pro poking :)

Používáním starších jazyků si myslím, že jste nuceni dělat skoro všechno sami. V C # mohu dělat něco jako myArray.SortBy(x=>x.Name). V žádném případě bych to nemohl udělat v C. Souhlasím s tím, že jazyk pro mě provede nejlepší třídění. Kdybych to měl udělat v C, mohl bych se vrátit k dobám svých univerzitních modulů a revidovat své různé algoritmy řazení a vyhledávání.

Takže si myslím, že jazyky nižší úrovně by vám pomohly revidovat některé z dávno zapomenutých bitů, které jsou všechny abstrahovány pryč. Je to spíše osobní výzva než kariéra postupující.

29
Jonathon

Mým návrhem je pohrávat si s C jako s intelektuální zvědavostí. Nerobte těžkou investici, protože to nestojí za to.

Navrhované cíle:

  • Obnovte paměť o základních datových strukturách a algoritmech.
    • Je to jen něco dobrého vědět, jako je algebra a geometrie.
    • Zkuste provést některá cvičení s učebnicí učebnice nebo programové hádanky v C.
  • Lepší zhodnocení hierarchie paměť (šířka pásma), a to od mezipaměti CPU k transeceanické latenci sítě. Pomůže to vašim schopnostem vývoje aplikací na všech úrovních.
    • A co je nejdůležitější, je dobré se dozvědět o scénářích, ve kterých a malý nenápadné přeskupení kódu vysoké úrovně může vést k dramatické zlepšení rychlosti.
      • Důvod může být někdy pochopen pouze při implementaci na nízké úrovni v kontextu hierarchie paměti.
      • Nerozumění přirozené příčině této možnosti vede k nevědomosti , strachu , a nakonec popření , domnívající se, že pro vývojáře na vysoké úrovni je špatné využívat tento druh optimalizace. Ve skutečnosti s tím není nic špatného.
  • Oceňujte estetiku softwarových systémů založených na komponentách , které umožňují použití komponentů nízké úrovně vyvinutých v C/C++/Assembly pro systémy na vysoké úrovni.
    • Estetika je naprosto stejná jako použitelnost softwaru:
      • Dobrý design (výkonný, snadno použitelný, promyšlený)
      • Správnost
      • Flexibilita (rozšíření a nová chování prostřednictvím složení existujících částí, každá s jasně definovaným účelem)
      • Výkon (bez komplikace použitelnosti)
    • I když nemusíte navrhovat své vlastní komponenty nízké úrovně, vaše porozumění vám pomůže vyhodnotit a vybrat dobré komponenty, které se mají použít ve vašich projektech na vysoké úrovni.
  • Nakonec si uvědomte, že komponenty nízké úrovně jsou ve svých implementacích téměř vždy komplikovanější , zdaleka nepochopitelné pouhým pohledem na rozhraní.
    • Nízká úroveň je vždy komplikovaná. Dobrá knihovna skrývá složitost, aniž by snižovala její sílu.
    • Naučte se číst „technické poznámky“ napsané vývojáři komponent, což jsou návrhy pro uživatele komponent vyšší úrovně o tom, jak tyto komponenty nejlépe využít.
15
rwong

pokud chcete pochopit, jak funguje stroj, a nejen virtuální stroj, na kterém závisí váš jazyk na vysoké úrovni, pak vás to shromáždění naučí

pokud nemáte důvod se starat - a většina programátorů to v dnešní době opravdu nemá - pak se o to nestarejte.

zlepší to váš základ, ale pravděpodobně to nezlepší vaše webové aplikace

8
Steven A. Lowe

Každý programovací jazyk se trochu mění o tom, jak si myslíte o programování obecně. Konkrétním příkladem, který vám mohu dát, je, když jsem se začal učit haskell a najednou funkční bity javascriptu, Ruby, a python jen dávaly mnohem větší smysl. Nikdy jsem nepoužil foldl v kterémkoli z mých kódů předtím, ale po haskell to skoro vidím všude, kde vidím pole. Takže šance jsou vysoké, že pokud se naučíš nějaké C, budeš si mnohem více vědom relativních výkonových charakteristik různých konstrukcí ve svém oblíbeném jazyce. před několika minutami jsem poslouchal rozhovor o rychlém a optimalizovaném psaní javascriptu a řečník řekl: „Je-li obtížné to udělat v C, bude to v javascriptu opravdu pomalé.“ Jeho záměrem bylo, že javascript je interpretovaný jazyk a tlumočník je napsán v C nebo C++. Tohle šlo přímo nad hlavu, protože mám velmi málo zkušeností s C a netuším, co je v C.

8
davidk01

Pokud to neuděláte jen pro zábavu, protože geekové opravdu milují plnou kontrolu nad svým hardwarem, měli byste alespoň získat lepší pocit, jak rychlejší se program může stát, když je napsán v jazyce C, namísto řekněme Java. Můžete se také naučit, jak opravdu oceňovat funkce jazyků vyšší úrovně, jako je sběr odpadu.

7
user281377

Hurá na zvědavost!

Je velmi dobré mít představu o tom, co se skutečně děje na nejnižších úrovních složitého systému, i když není třeba logicky vědět o každodenních povinnostech. Zdaleka nejlepší způsob, jak zapálit věci na úrovni bitů, je sestavení vlastního procesoru. Musíte přemýšlet o opcodes na úrovni strojového jazyka, pochopit, proč jsou ortogonální instrukční sady tak dobré, komplikace při přerušení, kompromisy mezi složitými obvody vs. mikrokód (např. V multiplikačních jednotkách) a oh tolik další zábavy!

Ale to samozřejmě vyžaduje know-how elektroniky a je časově náročné, takže další nejlepší věcí je hračka s osmibitovým procesorem ve starožitném stylu. Mikrokontroléry, jako je 8051, se stále běžně používají a jsou k dispozici pro fandy. To stále vyžaduje určité know-how v oblasti pasení elektroniky a vytváření LED svítí bez kouření, a náklady $$, pokud již nejste vybaveni pro elektroniku.

Další nejlepší věc po tom: hračka v simulátoru CPU (emulátoru? Rozumím těmto termínům) - tyto existují pro Z80, 6502, 8086 ... všechny staré 8bitové. To může být nejvíce vzdělávací a zábavné pro aplikační programátora, který neví, který konec páječky má držet (i když se člověk učí, že docela rychle :) Jak se text zapisuje do video paměti, jak triky kódu sestavení pomáhají s výkonem. .. na této úrovni je spousta zábavných věcí.

Nejsem si tak jistý tím, že bych se učil C jen jako další jazyk, aniž bych počínal s pochopením vnitřních procesů CPU. Znalost způsobu odesílání bitů mezi registry CPU a přístupu do paměti pomáhá při získávání ukazatelů a dalších konceptů jazyka C ohromně.

5
DarenW

Jedním slovem, zábava. Když jsem si hrával s assemblerem (když jsem pracoval od VB do C++, C atd.), Bylo prostě úžasné přesouvat data z jedné části procesoru do druhé. Bylo to skvělé pocit vědět přesně co se dělo uvnitř procesoru, bez obav z toho, co se dělo pod kterým jste nevěděli. Plus skvělý pocit svobody - můžete dělat téměř cokoli, protože neexistují zabudovaná omezení, která najdete ve vyšších jazycích.

Rovněž schopnost obrátit se na kohokoli, kdo programoval v jakémkoli jiném jazyce, a jít „dobře, pokud nejste dost tvrdý ...“, byla dětinská, dětinská zábava.

4
Dan O

Existuje nějaký dobrý důvod, proč se učit/procvičovat programování na nízké úrovni. Mám různé odpovědi v závislosti na kontextu.

Nejprve učím programování v C (ale také OCaml a Java), motivovat studenta, aby se naučil programovat z tvrdé stránky, je pravděpodobně nejtěžší součástí úkolu. Nejlepší argument, který jsem doposud našel, je „porozumění“: jazyky vyšší úrovně skrývají mnoho základních mechanismů a někdy ne navždy, také vás tlačí, abyste zůstali na vyšší úrovni, i když by některé triky nízké úrovně mohly být skutečně užitečné ( pro výkon, většinu času.) Porozumění tomu, co používáte, může skutečně pomoci s lepším používáním. Moje zkušenosti s výukou mi ukazují, že studenti, kteří se naučili programování na nižší úrovni (a jiní, než jsou uživatelé, jako kompilátoři), jsou přizpůsobivější a rychleji se učí nové koncepty nebo nástroje na vyšší úrovni.

Za druhé, jak říkáte, výkon je součástí uživatelské zkušenosti. Většinu času je výkon vnímán jako záležitost psaní složitých a v blízkosti strojového kódu. Není tomu tak vždy, výkon je mnohem více záležitostí algoritmů a datových struktur, ale také interakce mezi algem a daty. Používám speciální projekt na toto téma, v podstatě jde o jednoduché nalezení cesty, ale skutečným problémem je velikost dat: graf je nekonečný. Jediným způsobem, jak dosáhnout výkonu sestupu a zapadnout do paměti, je napsat vyhrazený alokátor paměti (ve skutečnosti dva, alokátor fondu a recyklační alokátor.) To je něco, co nemůžete udělat ve většině jazyků vyšší úrovně. Ve skutečnosti bude většina jazyků sebraných s odpady mít problémy s výkonem a pamětí.

Pravděpodobně existuje mnohem více argumentů, jako je stabilita (ve smyslu historie a dlouhověkosti) jazyků nižší úrovně proti „hype“ (skutečnost, že jazyk považovaný za budoucí reference pro programování může za několik let zmizet, je dlouhý) příběh, člověk nemůže předvídat životnost nových věcí, ale tento argument platí i pro starší jazyky ...), samozřejmě je tu také otázka vkusu nebo skutečnost, že to, co lze ve většině jazyků na vysoké úrovni, může být také provádí se v jazycích nižší úrovně, ale ne naopak (ale vzhledem k tomu bychom měli všichni kódovat pouze v Shromáždění ...)

Jsem sám pasti v obou světech (docela jinak), několik let trávím prací na teoretické koncepci programování, navrhování a ověřování typů systémů, a přitom používám a studuji pouze jazyky na vysoké úrovni (většinou funkční, ale také čisté) objektově orientovaný.) Nedávno se vracím na druhou stranu (většinou programování systému a jádra) a ocitl jsem se v této oblasti docela v pohodě, mám spoustu zábavy! Pro mě je dalším krokem nalezení společného bodu: jazykové funkce vyšší úrovně pro programování na nižší úrovni! Zatím pro to neexistuje žádný jazyk (možná Google jde o programování systému uživatelských systémů) a uvažuji o vytvoření vlastního jazyka, ale tohle je jiný příběh.

2
Marwan Burelle

Řekl bych, že ve vaší doméně není mnoho důvodů, ale pokud byste měli provádět vysoce výkonné výpočty (např. Hraní her, věda atd.), Bylo by to odůvodněné.

1
Darknight

Myslím, že v dnešní době lze programování na nízké a vysoké úrovni docela oddělit. V podstatě to znamená, že byste mohli žít celý svůj profesní život, aniž byste věděli, že máte C a montéra, bez problémů. To znamená, že programovací jazyk C vás nemůže hodně naučit z hlediska programování a designu.

Jen ze zvědavosti se můžete naučit, jak věci fungují na nižší úrovni. Když jsem byl například na univerzitě, rád jsem používal gcc ke generování kódu assembleru z C++. Bylo užitečné pochopit, jak se provádí polymorfismus a výjimka. Ale kromě toho jediné, co byste se dnes mohli naučit od C, jsou:

1) špinavé paměťové triky. C je nejlepší způsob, jak pochopit, že v programátorském šílenství není zdola :)

2) GOTO se ve skutečnosti používají (a jsou užitečné) k odstraňování chyb

3) lépe se naučit, jak funguje přidělování paměti (rozdíl mezi haldy a komíny?).

Moje diplomová práce je tedy taková, že pokud už jste ukončili univerzitu a stále nepotřebujete C, než se to nenaučíte :)

1
Emiliano

Nemusíte rozumět nízkoúrovňovým jazykům, ale měli byste rozumět tomu, co se děje pod obálkami zvoleného jazyka vysoké úrovně. Používání jazyka nízké úrovně vás to naučí, ale není to jediný způsob.

Zde je několik příkladů konceptů na nízké úrovni, které mohou ovlivnit jazyky na vysoké úrovni.

Ukazatele:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Řetězce:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

Seznamy:

Kdy používáte seznam vs propojený seznam? (Téměř nemožné to vědět bez pochopení na velmi nízké úrovni toho, jak seznam funguje)

-

Je nutné všechny tyto věci znát? Ne, ale může to mít dopad a pokud chcete být mistrem jazyka na vysoké úrovni, musíte mít docela dobrou představu o vnitřním fungování.

1
Alistair

Co mě může naučit nízkoúrovňové programování, jaké další jazyky by mě neučily?

Hlavně vás naučí, jak počítače skutečně fungují. Neexistuje žádný jiný způsob, jak se to naučit, než prostřednictvím nízkoúrovňového programování. Bez ohledu na to, jaké aplikace naprogramujete, vždy to pomůže. Ve skutečnosti pochopíte, co se děje hluboko pod všemi těmi webovými věcmi. A pokud pracujete s Windows, celé API je napsáno v C, takže s vědomím, že jazyk vám umožní komunikovat přímo s OS, kdykoli budete potřebovat použít funkci, kterou vaše současné jazyky a jejich knihovny chybí.

Nízkoúrovňové programování vám samozřejmě umožní pracovat se zcela odlišnými věcmi, jako je vestavěné programování a programování v reálném čase, kde je nutný asm/C/C++. Pokud o tyto aplikace nemáte zájem, opravdu není potřeba se učit asm/C/C++.

Také se naučíte kousky a bajty. Bitové manipulace, hexadecimální atd. S těmito věcmi se můžete občas setkat i při programování webu/desktopu. Jedním z takových příkladů, kde se používají, jsou šifrovací algoritmy.

1
user29079