Programowanie niskiego poziomu - co to dla mnie jest? [Zamknięte]

32

Przez lata rozważałem zagłębianie się w języki, które uważam za „niskiego poziomu”. Dla mnie oznacza to C i montaż. Jednak nie miałem jeszcze na to czasu i NIGDY nie było to konieczne.

Teraz, ponieważ nie widzę żadnej konieczności, czuję, że powinienem albo zaplanować jakiś moment w czasie, kiedy będę studiował ten temat, albo porzucić plan na zawsze.

Moja pozycja

Przez ostatnie 4 lata koncentrowałem się na „technologiach internetowych”, które mogą ulec zmianie, i jestem programistą aplikacji, który raczej się nie zmieni.

Przy opracowywaniu aplikacji najważniejsza jest użyteczność. Piszesz aplikacje, które mają być „konsumowane” przez użytkowników. Im bardziej użyteczne są te aplikacje, tym większa jest twoja wartość.

Aby osiągnąć dobrą użyteczność, uważam, że następujące rzeczy są wykonalne

  • Dobry projekt : Przemyślane funkcje dostępne poprzez przemyślany interfejs użytkownika.
  • Prawidłowość : najlepszy projekt nie jest nic wart, jeśli nie zostanie poprawnie zaimplementowany.
  • Elastyczność : aplikacja A powinna stale ewoluować, aby jej użytkownicy nie musieli przełączać się na inną aplikację B, która ma nowe funkcje, które A mogłaby wdrożyć. Aplikacje rozwiązujące ten sam problem nie powinny różnić się funkcjami, ale filozofią.
  • Wydajność : Wydajność przyczynia się do poprawy komfortu użytkowania. Aplikacja idealnie zawsze reaguje i wykonuje swoje zadania dość szybko (na podstawie ich częstotliwości). Wartość optymalizacji wydajności wykraczająca poza punkt, w którym jest zauważalna przez użytkownika, jest wątpliwa.

Myślę, że programowanie niskiego poziomu nie pomoże mi w tym, oprócz wydajności. Ale napisanie całej aplikacji w języku niskiego poziomu ze względu na wydajność jest dla mnie przedwczesną optymalizacją.

Moje pytanie

Czego może nauczyć mnie programowanie na niskim poziomie, czego inne języki by mnie nie nauczyły? Czy coś mi brakuje, czy to tylko umiejętność, która jest bardzo mało przydatna w tworzeniu aplikacji? Proszę zrozumieć, że nie kwestionuję wartości C i montażu. Po prostu w moim codziennym życiu cieszę się, że wszystkie zawiłości tego świata są dla mnie abstrakcyjne i zarządzane (głównie przez warstwy napisane w C / C ++ i same asemblery). Po prostu nie widzę żadnych pomysłów, które mogłyby być dla mnie nowe, tylko szczegóły, którymi musiałbym się napchać. Co w tym jest dla mnie?

Mój wniosek

Dziękujemy wszystkim za odpowiedzi. Muszę powiedzieć, że nikt mnie tak naprawdę nie zaskoczył, ale przynajmniej teraz jestem całkiem pewien, że porzucę ten obszar zainteresowania, dopóki nie zajdzie taka potrzeba.
O ile mi wiadomo, pisanie asemblera w dzisiejszych procesorach, ponieważ są one używane w dzisiejszych procesorach, jest nie tylko niepotrzebnie skomplikowane, ale wiąże się z ryzykiem pogorszenia wydajności środowiska wykonawczego w porównaniu z odpowiednikiem w języku C. Ręczna optymalizacja jest prawie niemożliwa ze względu na OOE, podczas gdy nie otrzymujesz różnego rodzaju optymalizacji, które kompilator może wykonać automatycznie. Ponadto kod jest przenośny, ponieważ wykorzystuje niewielki podzbiór dostępnych poleceń lub jest zoptymalizowany, ale prawdopodobnie działa tylko na jednej architekturze.
Pisanie C nie jest już tak potrzebne, jak kiedyś. Gdybym miał napisać aplikację w C, równie dobrze wykorzystałbym przetestowane i ustanowione biblioteki i frameworki, które oszczędzałyby mi wdrażania procedur kopiowania ciągów, algorytmów sortowania i innych rzeczy służących jako ćwiczenia na uniwersytecie. Mój własny kod działałby szybciej kosztem bezpieczeństwa typu. Nie chcę ponownie odkrywać koła w trakcie normalnego tworzenia aplikacji, ani próbować debugować, przeglądając podstawowe zrzuty: D
Obecnie eksperymentuję z językami i tłumaczami, więc jeśli jest coś, co chciałbym opublikować, przypuszczam, że przeniesie działającą koncepcję do C, chociaż C ++ równie dobrze może załatwić sprawę.
Jeszcze raz dziękuję wszystkim za odpowiedzi i wgląd.

back2dos
źródło
6
@TheLQ: moje pytanie nie brzmi, dlaczego go używać , ale czego mogę się z niego nauczyć .
back2dos
1
Przykład: Powrót do podstaw .
rwong

Odpowiedzi:

9

Programowanie niskopoziomowe jest przeznaczone dla przypadków narożnych, w których nie ma wymogu natychmiastowego pojawienia się na zwykłych komputerach stacjonarnych. Może to być wąskie gardło prędkości, wąskie gardło pamięci lub coś zupełnie innego i bardzo często bardzo interesujące jest zobaczyć, co można zrobić, biorąc pod uwagę te wymagania.

Pomyśl o tym jak o Haikus lub Limericks, gdzie ograniczenia sprawiają, że jest interesujący.

Aby dać ci wyobrażenie o tym, co jest możliwe w tym, co dziś wydaje się niemożliwe, oto jeden z największych hacków w historii. Szachy w 1 Kb RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/


źródło
1
Myślę, że naprawdę pójdę na „ograniczenia sprawiają, że jest to interesujące”. Ze wszystkich wymienionych tutaj rzeczy jest to prawdopodobnie najlepsza. W szkole programowałem gry na moim kalkulatorze z pamięcią 32kB i procesorem 8MHz. Było fajnie, ale nie nauczyłem się wiele, z czego mogę teraz skorzystać.
back2dos
Downvoter, proszę wymienić dlaczego?
29

Właśnie o tym myślałem. Obecnie uważam się za programistę C # - co jest w porządku dla mojej kariery.

Jednak co jakiś czas brakuje mi rzeczy naprawdę niskiego poziomu (zasadniczo „brudzenie rąk” przez wykonanie asemblera lub sterowników urządzeń w C). Po prostu tęsknię za programowaniem. Nie oczekuję, że pomoże mi to w karierze. Jeśli zależy Ci na sterownikach urządzeń lub systemach wbudowanych, może to bardzo pomóc.

Im więcej programuję w abstrakcyjnych językach, tym bardziej tęsknię za tym, co mnie wciągnęło w komputery: grzebię w komputerze i widzę, co drży. Asembler i C są bardzo odpowiednie do szturchania :)

Używając starszych języków, myślę, że jesteś zmuszony zrobić prawie wszystko sam. W C # mogę zrobić coś takiego myArray.SortBy(x=>x.Name). Nie ma mowy, żebym był w stanie to zrobić w C. Akceptuję, że język najlepiej dla mnie sortuje. Gdybym miał to zrobić w C, mógłbym wrócić do czasów modułów uniwersyteckich i zrewidować swoje różne algorytmy sortowania i wyszukiwania.

Myślę więc, że języki niższego poziomu pomogłyby ci zrewidować każdy z dawno zapomnianych fragmentów, które zostały wyabstrahowane. Bardziej osobiste wyzwanie niż kariera.

Jonathon
źródło
15
+1 za wyrażanie miłości do grzebania w sprzęcie i zobaczenia, co drga - prawdziwy maniak
Gary Rowe
2
Jeśli chcesz, możesz napisać funkcję sortowania w C #. Równie dobrze możesz użyć funkcji biblioteki do sortowania w C, jeśli chcesz: gnu.org/s/libc/manual/html_node/Array-Sort-Function.html. Powiedziałbym nawet, że używając starszych języków sam musisz robić mniej rzeczy. Ponieważ większość problemów została już rozwiązana. To i tak nie przeszkadza ludziom w ponownym wsiadaniu do koła:
back2dos
15

Sugeruję, aby bawić się z C jako intelektualną ciekawością. Nie inwestuj ciężko, ponieważ nie jest tego warte.

Sugerowane cele:

  • Odśwież swoją pamięć na temat podstawowych struktur danych i algorytmów.
    • Warto wiedzieć, jak algebra i geometria.
    • Spróbuj wykonać kilka ćwiczeń z podręcznika lub łamigłówek programowych w C.
  • Lepsze zrozumienie hierarchii pamięci (przepustowości) , od pamięci podręcznej procesora do opóźnień sieci transoceanicznej. Pomoże to w rozwijaniu umiejętności programowania aplikacji na wszystkich poziomach.
    • Co najważniejsze, dobrze jest dowiedzieć się o sytuacjach, w których mały niepozorny przegrupowanie kodu wysokiego poziomu może doprowadzić do dramatycznej poprawy szybkości .
      • Czasami przyczynę można zrozumieć tylko w implementacji niskiego poziomu w kontekście hierarchii pamięci.
      • Niezrozumienie naturalnej przyczyny tej możliwości prowadzi do ignorancji , strachu , a ostatecznie do zaprzeczenia , myśląc, że programiści wysokiego szczebla nie są skłonni do korzystania z tego rodzaju optymalizacji. W rzeczywistości nie ma w tym nic złego.
  • Doceń estetykę opartych na komponentach systemów oprogramowania , które umożliwiają stosowanie komponentów niskiego poziomu opracowanych w C / C ++ / Assembly w systemach wysokiego poziomu.
    • Estetyka jest dokładnie taka sama jak użyteczność oprogramowania:
      • Dobry projekt (mocny, łatwy w użyciu, dobrze przemyślany)
      • Poprawność
      • Elastyczność (rozszerzenia i nowe zachowania poprzez kompozycję istniejących części, z których każda ma jasno określony cel)
      • Wydajność (bez komplikowania użyteczności)
    • Chociaż możesz nie projektować własnych komponentów niskiego poziomu, Twoja wiedza pomoże ci ocenić i wybrać dobre komponenty do wykorzystania w projektach wysokiego poziomu.
  • Wreszcie, doceń, że komponenty niskiego poziomu są prawie zawsze bardziej skomplikowane w swoich implementacjach , dalekie od zrozumienia, wystarczy spojrzeć na interfejs.
    • Niski poziom jest zawsze skomplikowany. Dobra biblioteka ukrywa złożoność bez zmniejszania jej mocy.
    • Naucz się czytać „uwagi techniczne” napisane przez twórców komponentów, które są sugestiami dla użytkowników komponentów wyższego poziomu, w jaki sposób najlepiej wykorzystać komponenty.
rwong
źródło
8

jeśli chcesz zrozumieć, jak działa maszyna , a nie tylko maszyna wirtualna, od której zależy Twój język wysokiego poziomu, asembler nauczy Cię tego

jeśli nie masz powodu, aby się tym przejmować - a większość programistów naprawdę tego nie robi - nie przejmuj się.

poprawi twoje podstawy, ale prawdopodobnie nie poprawi twoich aplikacji internetowych

Steven A. Lowe
źródło
6
C działa prawie równie dobrze. Większość koncepcji języka C można łatwo przetłumaczyć na język maszynowy. Naucz się C i rzuć okiem na asembler, a będziesz w dobrej formie.
David Thornley,
Już miałem opublikować podobną odpowiedź. Twierdziłbym, że C docenia również sposób działania maszyny, szczególnie jeśli chodzi o zarządzanie pamięcią. Ponadto wiele języków, w których abstrakcyjna złożoność maszyny jest napisanych w C. Przynajmniej osoba naprawdę zrozumie, jak bardzo są rozpieszczeni :)
Tim Post
1
@Jorg: ciekawe. i ile z tych procesorów jest w użyciu komercyjnym, w porównaniu do, powiedzmy, Intel x86 lub 6502?
Steven A. Lowe,
1
@ Jörg, gdzie znajdziesz te procesory?
1
@Thor: prędkość nie jest tutaj pytaniem, edukacja jest.
Steven A. Lowe,
8

Każdy język programowania zmienia się nieco w stosunku do ogólnego myślenia o programowaniu. Konkretny przykład, jaki mogę ci podać, to kiedy zacząłem uczyć się haskell i nagle funkcjonalne fragmenty javascript, ruby ​​i python stały się o wiele bardziej sensowne. Nigdy wcześniej nie używałem foldl w żadnym z moich kodów, ale po haskell widzę go prawie wszędzie, gdzie widzę tablice. Są więc duże szanse, że jeśli nauczysz się trochę C, będziesz znacznie bardziej świadomy względnych charakterystyk wydajności różnych konstrukcji w twoim ulubionym języku. Kilka minut temu słuchałem rozmowy na temat pisania szybkiego i zoptymalizowanego javascript, a mówca powiedział: „Jeśli trudno jest zrobić w C, to będzie bardzo powolny w javascript”. Jego intencją jest, aby javascript był językiem interpretowanym, a tłumacz jest napisany w C lub C ++.

davidk01
źródło
2
+1 za pojęcie, jak każdy język zmienia twój sposób myślenia.
Sean
7

Jeśli nie robisz tego tylko dla zabawy, ponieważ maniacy naprawdę lubią mieć pełną kontrolę nad swoim sprzętem, możesz przynajmniej lepiej poczuć, o ile szybciej program może stać się, gdy jest napisany w C zamiast, powiedzmy, Java. Możesz także nauczyć się naprawdę doceniać funkcje języków wyższego poziomu, takie jak wyrzucanie elementów bezużytecznych.

użytkownik 281377
źródło
1
+1 za zabawę maniaka. Chociaż muszę powiedzieć, nie jestem wielkim maniakiem. I nienawidzę sprzętu :)
back2dos
1
Różnica prędkości jest zwykle nieistotna. Jest to szczególnie prawdziwe w przypadku aplikacji internetowych, w których przetwarzanie po stronie serwera zwykle nie stanowi wąskiego gardła.
David Thornley,
David: Całkowicie zgadzam się na przeciętne aplikacje internetowe typu „chleb z masłem”. W innych domenach różnica może być bardzo istotna.
user281377,
1
@ back2dos, jeśli pomysł programowania blisko sprzętu nie podoba ci się, powiedziałbym, że nie przejmuj się nim. Byłoby to jak zmuszanie się do nauki łaciny tylko dlatego, że była ona podstawą wielu późniejszych języków romańskich.
tcrosley,
2
przy wystarczającej ilości pamięci Java jest tak szybka lub szybsza niż C.
5

Brawo z ciekawości!

Bardzo dobrze jest mieć pojęcie, co tak naprawdę dzieje się na najniższych poziomach złożonego systemu, nawet jeśli nie ma logicznej potrzeby poznania codziennych obowiązków. Zdecydowanie najlepszym sposobem na grokowanie rzeczy na poziomie bitów jest zbudowanie własnego procesora. Musisz pomyśleć o kodach maszynowych na poziomie języka maszynowego, zrozumieć, dlaczego zestawy instrukcji ortogonalnych są tak dobre, komplikacje związane z obsługą przerwań, kompromisy między złożonymi obwodami a mikrokodem (np. W jednostkach mnożenia) i och, tyle zabawy!

Ale to oczywiście wymaga wiedzy elektronicznej i jest czasochłonne, więc kolejną najlepszą rzeczą jest zabawka z 8-bitowym procesorem w stylu antycznym. Mikrokontrolery takie jak 8051 są nadal w powszechnym użyciu i są dostępne dla hobbystów. To wciąż wymaga trochę wiedzy w zakresie gromadzenia elektroniki i sprawiania, że ​​diody LED świecą bez palenia, i kosztuje $$, jeśli nie jesteś jeszcze wyposażony w elektronikę.

Kolejna najlepsza rzecz po tym: baw się w symulatorze procesora (emulator? Mylę te warunki) - istnieją dla Z80, 6502, 8086 ... wszystkich starych 8-gorzkich. To może być najbardziej edukacyjne i zabawne dla programisty aplikacji, który nie wie, który koniec lutownicy należy przytrzymać (choć dość szybko się uczy :) :) Jak tekst jest zapisywany w pamięci wideo, w jaki sposób sztuczki kodu montażowego pomagają w wydajności. .. na tym poziomie jest mnóstwo ciekawych rzeczy do odkrycia.

Nie jestem pewien, czy uczę się języka C jako innego języka bez wstępnego zrozumienia wewnętrznego działania procesora. Wiedza o tym, jak bity są przesyłane między rejestrami procesora i w jaki sposób uzyskiwana jest pamięć, ogromnie pomaga w uzyskaniu wskaźników i innych koncepcji języka C.

DarenW
źródło
+1, ponieważ była to jedyna odpowiedź, która wspomniała o wskaźnikach. Myślałem, że to będzie numer 1 i zaakceptowałem odpowiedź.
Erik,
4

Jednym słowem, zabawa. Kiedy bawiłem się asemblerem (po przejściu z VB na C ++, C itp.), Przeniesienie danych z jednej części procesora do drugiej było po prostu niesamowite. Wspaniale było wiedzieć , co dokładnie dzieje się w procesorze, bez obaw o to, co dzieje się pod spodem, o czym nie wiedziałeś. Plus wspaniałe poczucie wolności - możesz zrobić wszystko, ponieważ nie ma wbudowanych ograniczeń, które można znaleźć w językach wyższego poziomu.

Również możliwość zwracania się do każdego, kto programował w jakimkolwiek innym języku i mówienia „no cóż, jeśli nie jesteś wystarczająco hardkorowy ...” była dziecinną, dziecinną zabawą.

Dan O
źródło
4
Wewnątrz procesora dzieje się wiele rzeczy, których nie widać w asemblerze. Procesor wykonuje automatycznie takie operacje, jak zamówienie poza kolejnością, hyperthreading i buforowanie pamięci. Zawsze możesz zejść o krok niżej, aż dotrzesz do podstawowych cząstek materii. A może materia to tylko energia?
Kevin Panko,
Można uniknąć takiej ukrytej tajemnicy, budując własny procesor z tranzystorów i układów logicznych: D (Jedna z moich ulubionych fantazji technicznych!) W każdym razie +1 za świetną odpowiedź.
DarenW,
Uczciwy punkt! Chociaż kiedy ostatnio używałem asemblera, hiperwątkowanie było prawdopodobnie częściej uważane za odnoszące się do szybkiego szycia, a nie procesorów ...
Dan O
2

Czy jest jakiś dobry powód, aby uczyć się / ćwiczyć programowanie na niskim poziomie. Mam różne odpowiedzi w zależności od kontekstu.

Po pierwsze, uczę programowania w języku C (ale także OCaml i Java), motywowanie studenta do nauki programowania od strony trudnej jest prawdopodobnie najtrudniejszą częścią zadania. Najlepszym argumentem, jaki do tej pory znalazłem, jest „rozumienie”: języki wyższego poziomu ukrywają wiele podstawowych mechanizmów, a czasami nie na dobre, popychają cię również do pozostania na wyższym poziomie, nawet jeśli niektóre sztuczki na niskim poziomie mogą być naprawdę przydatne ( dla wydajności przez większość czasu.) Zrozumienie, czego używasz, może naprawdę pomóc w lepszym użyciu. Moje doświadczenie w nauczaniu udowodniło mi, że uczniowie, którzy nauczyli się programowania niższego poziomu (i innych kompilatorów nie zorientowanych na użytkownika), są bardziej elastyczni i uczą się szybciej nowych koncepcji lub narzędzi wyższego poziomu.

Po drugie, jak twierdzisz, wydajność jest częścią doświadczenia użytkownika. Przez większość czasu wydajność jest postrzegana jako kwestia pisania złożonego kodu w pobliżu kodu maszynowego. Nie zawsze tak jest, wydajność jest bardziej kwestią algorytmów i struktur danych, ale także interakcji między algo i danymi. Używam specjalnego projektu na ten temat, w zasadzie jest to proste znalezienie ścieżki, ale prawdziwym problemem jest rozmiar danych: wykres jest nieskończony. Jedynym sposobem na osiągnięcie wydajności opadania i zmieszczenie się w pamięci jest napisanie dedykowanego alokatora pamięci (w rzeczywistości dwóch, alokatora puli i alokatora recyklingu). Jest to coś, czego nie można zrobić w większości języków wyższego poziomu. W rzeczywistości większość języków, w których gromadzone są śmieci, będą miały problemy z wydajnością i pamięcią.

Prawdopodobnie jest o wiele więcej argumentów, takich jak stabilność (w sensie historii i długowieczności) języków niższego poziomu w stosunku do języków „hype” (fakt, że język uważany za przyszłe odniesienie do programowania może zniknąć za kilka lat, jest długi historia, nie można przewidzieć długowieczności nowych rzeczy, ale ten argument pozostaje prawdziwy w przypadku starszych języków ...), oczywiście jest również kwestia gustu lub fakt, że to, co można zrobić w większości języków wysokiego poziomu, może być również zrobione w językach niższego poziomu, ale nie na odwrót (ale biorąc pod uwagę to, wszyscy powinniśmy kodować tylko w asemblerze ...)

Sam jestem pułapką w obu światach (całkiem inaczej), spędzam kilka lat pracując nad teoretyczną koncepcją programowania, projektowaniem i typowaniem systemów typowych i robiąc to, używam i uczę się tylko języków bardzo wysokiego poziomu (głównie funkcjonalnego, ale także czystego obiektowo.) Niedawno wróciłem na drugą stronę (głównie programowanie systemu i jądra) i czułem się całkiem swobodnie w tej dziedzinie. Mam dużo zabawy! Dla mnie kolejnym krokiem jest znalezienie wspólnego punktu: funkcje języka wyższego poziomu dla programowania niższego poziomu! Do tej pory nie ma na to języka (być może programowanie przez Google w systemie użytkownika) i zastanawiam się nad pomysłem stworzenia własnego języka, ale to już inna historia.

Marwan Burelle
źródło
1

Powiedziałbym, że nie ma zbyt wiele powodów w twojej domenie, jednak jeśli miałbyś wykonywać obliczenia o wysokiej wydajności (np. Gry, nauka itp.), Byłoby to uzasadnione.

Ciemna noc
źródło
1
Nie jestem pewien, czy zostało jeszcze wiele obszarów o wysokiej wydajności. Gry z pewnością nie wymagają języków niskiego poziomu. Do grania zwykle używasz silników lub przynajmniej zaczynasz od OpenGL lub czegoś takiego. A dla nauki paralelizacja jest bardzo ważna i poprawność. Przypuszczam, że lepiej by ci było z OCaml czy coś takiego. Obszary krytyczne pod względem wydajności nie są już obszarami, w których występuje duża liczba, ale są używane bardzo często, takie jak jądra, sterowniki, silniki pamięci masowej i tym podobne. Chyba mniej niż 1% wszystkich programistów naprawdę ich dotyka.
back2dos
4
@ back2dos, silniki gier nie pojawiają się znikąd - ktoś musi je napisać. Jak myślisz, w czym jest napisane OpenGL? Nie c#. Obecnie w większości aplikacji nie trzeba używać języków niskiego poziomu ... ale wiele osób pracuje w innych obszarach, które tego wymagają.
GrandmasterB,
1

Myślę, że obecnie programowanie na niskim i wysokim poziomie można całkiem oddzielić. Zasadniczo oznacza to, że możesz żyć całe swoje życie zawodowe bez znajomości C i asemblera bez żadnych problemów. To powiedziawszy, język programowania C nie może wiele Cię nauczyć z punktu widzenia programowania i projektowania.

Właśnie z ciekawości można dowiedzieć się, jak rzeczy działają na niższym poziomie. Na przykład, kiedy byłem na uniwersytecie, lubiłem używać gcc do generowania kodu asemblera z C ++. Przydatne było zrozumienie, w jaki sposób wdrażany jest polimorfizm i wyjątek. Ale oprócz tego jedyne, czego można się dziś nauczyć od C, to:

1) brudne sztuczki pamięci. C jest najlepszym sposobem na zrozumienie, że w szaleństwie programistów nie ma dna :)

2) GOTO są faktycznie używane (i przydatne) do usuwania błędów

3) Dowiedz się lepiej, jak działa alokacja pamięci (różnica między stertą a stosem kogokolwiek?).

Więc w zasadzie moja teza brzmi: jeśli już ukończyłeś uniwersytet i nadal nie potrzebujesz C, to nie ucz się :)

Emiliano
źródło
2
Znajomość C, aby wiedzieć, jak rzeczy działają na niskim poziomie, może pomóc zrozumieć, dlaczego coś idzie nie tak, gdy masz nieszczelną abstrakcję.
Michael Shaw,
1

Nie musisz rozumieć języków niskiego poziomu, ale powinieneś zrozumieć, co dzieje się pod okładkami wybranego języka wysokiego poziomu. Używanie języka niskiego poziomu nauczy Cię tego, ale to nie jedyny sposób.

Oto kilka przykładów koncepcji niskiego poziomu, które mogą mieć wpływ na języki wysokiego poziomu.

Wskaźniki:

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?

Smyczki:

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

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

Listy:

Kiedy używasz listy w porównaniu do listy połączonej? (Prawie niemożliwe jest to wiedzieć bez zrozumienia na dość niskim poziomie działania listy)

-

Czy trzeba znać wszystkie te rzeczy? Nie, ale może mieć wpływ i jeśli chcesz być mistrzem języka wysokiego poziomu, musisz mieć całkiem niezłe pojęcie o wewnętrznych działaniach.

Alistair
źródło
1

Czego może nauczyć mnie programowanie na niskim poziomie, czego inne języki by mnie nie nauczyły?

Przede wszystkim nauczy Cię, jak naprawdę działają komputery. Nie ma innego sposobu nauczenia się tego niż programowanie na niskim poziomie. Bez względu na to, jakie aplikacje programujesz, zawsze to pomoże. Zrozumiesz, co dzieje się głęboko pod tymi wszystkimi internetowymi treściami. A jeśli pracujesz z Windows, cały interfejs API jest napisany w C, więc znajomość tego języka umożliwi ci bezpośrednią komunikację z systemem operacyjnym, ilekroć będziesz potrzebować funkcji, której brakuje w obecnych językach i ich bibliotekach.

Oczywiście programowanie na niskim poziomie pozwoli ci pracować z zupełnie innymi rzeczami, takimi jak programowanie osadzone i programowanie w czasie rzeczywistym, gdzie asm / C / C ++ jest koniecznością. Jeśli nie interesujesz się tego rodzaju aplikacjami, naprawdę nie musisz zbytnio uczyć się asm / C / C ++.

Nauczysz się także bitów i bajtów. Manipulacje bitowe, szesnastkowe itp. Te rzeczy możesz napotkać od czasu do czasu, nawet podczas programowania na komputerze / komputerze. Algorytmy szyfrowania są jednym z takich przykładów, w których są używane.


źródło