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.
Odpowiedzi:
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
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.
źródło
Sugeruję, aby bawić się z C jako intelektualną ciekawością. Nie inwestuj ciężko, ponieważ nie jest tego warte.
Sugerowane cele:
źródło
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
źródło
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 ++.
źródło
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.
źródło
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.
źródło
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ą.
źródło
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.
źródło
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.
źródło
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ę :)
źródło
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:
Smyczki:
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.
źródło
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