Czy rozsądnym jest, aby programista wysokiego poziomu spędzał czas na studiowaniu montażu? [Zamknięte]

33

Oczywiste jest, że znajomość rzeczy niskiego poziomu jest bardzo ważna w naszej pracy.

Ale w sytuacji, gdy już tworzysz komercyjne oprogramowanie na wysokim poziomie, a kiedy już wybierasz kierunek, ale nie masz umiejętności montażowych, czy nie jest rozsądniej skoncentrować się na studiowaniu rzeczy związanych z twoim kierunkiem? Czy jest powód, dla którego powinieneś poświęcić trochę czasu na naukę podstaw niskiego poziomu?

Kiedy jest za późno, a kiedy nie? A jeśli to nie zbyt późno, to w jaki sposób można by pójść o nauce optymalnie (w sensie nie wydając nadmiernego czasu dostać jakąś głębię i zrozumienia)?

zkaje
źródło
Wiele pytań w jednym poście :)
Shamim Hafiz,
Krok po kroku podobało mi się asembler. Na początku dużo programowania, ale autor jest bardzo zabawny. Odkryłem, że ogólny pomysł jest pomocny i przede wszystkim piszę JavaScript.
Erik Reppen
Moim pierwszym (nauczanym) językiem był dialekt asemblacyjny. Widzę, jak byłoby to użyteczne (na wiele sposobów, na które wskazywali inni), i pomaga zapewnić inny wkład reszcie zespołu.
Jamie Taylor

Odpowiedzi:

43

Nie mogę uwierzyć, że nikt nie wspominał o debugowaniu ...

Od wielu lat nie napisałem linii kodu asemblera. Ale czytam to dość często. Debugowanie na wysokim poziomie jest świetne, gdy masz informacje o źródle i symbolach, ale gdy Twoja wymyślna biblioteka zgłasza nieobsługiwany wyjątek na komputerach klientów, jest już za późno, aby wymagać włączenia go do licencji ...

Ale nadal mogę otworzyć dezasembler i zobaczyć, co logika wysokiego poziomu ostatecznie skończyło się robi , ślad złe dane z powrotem do jego pochodzenia, dowiedzieć się, kto zmienił rejestr sterujący FPU ...

To uratowało mi boczek częściej niż o tym myślę. I nigdy nie jest za późno na naukę - w sieci jest mnóstwo świetnych referencji i samouczków , a prawie każdy program uruchomiony na twoim komputerze może zapewnić praktyczne środowisko.

Shog9
źródło
10
+1 i głosowałbym więcej, gdybym mógł. Każdy poważny programista musi być w stanie odczytać ASM w tym celu, jeśli nie ma innego powodu.
Mason Wheeler,
3
Następstwem tego jest optymalizacja. Wiedza na temat tego, w jaki sposób kompilator przekształca kod w asembler, może pomóc ci znacznie przyspieszyć!
lambacck,
3
Montaż +1 jest jednym z niewielu języków, które zmuszają cię do zrozumienia, jak działa procesor. Pomaga ci w rozwoju z językiem wysokiego poziomu. Musisz przeczytać: blogs.msdn.com/b/ericlippert/archive/2010/09/30/…
Znajomość komputera bazowego jest NAPRAWDĘ pomocna, zarówno w przypadku debugowania, optymalizacji, jak i czystej ciekawości. Poważnie, naucz się czytać co najmniej jedną lub dwie rodziny języka asemblera. Nawet jeśli nigdy go nie przeczytasz ani nie napiszesz po nauce, wpłynie to na sposób rozumienia rzeczy w przyszłości. Teraz, jeśli wolisz pisać w innym języku, może to być trochę za dużo ...
Michael Trausch
1
@Mason: Nie wiem, czy „każdy poważny programista” musi umieć czytać ASM. Jeśli piszesz JavaScript lub używasz języka programowania zbudowanego na grubym frameworku (takim jak .NET lub Java), nie uważam, że umiejętność czytania ASM jest niezbędna do bycia poważnym programistą. Biorąc to pod uwagę, zrozumienie, w jaki sposób komputer wykonuje instrukcje na bardzo niskim poziomie, może być bardzo pomocne, nawet w wyższych językach programowania i środowiskach.
Scott Mitchell,
15

Nie musisz uczyć się języka asemblera, musisz tylko zrozumieć, jak to działa. Musisz wiedzieć, czym jest XOR i liczyć binarnie podczas snu itp. Ale nigdy w mojej pracy nie potrzebowałem kodu asemblera.

Jak więc mówisz, znajomość rzeczy niskiego poziomu jest ważna, ale praktyczna wiedza w zakresie montażu nie jest.

Lennart Regebro
źródło
1
Ja drugi. Możesz zarabiać na dobre programowanie i nigdy nie musisz czytać / pisać ASM. Jest kilka pozycji, które tego wymagają. Czytanie zrzutu po warunku wyścigu w twoim kodzie zabrało ten proces. Lub jeśli piszesz programy o dużej intensywności (takie jak równoległość GPU / OpenCL). Procent zleceń deweloperskich, w których będziesz musiał wykonać te zadania, jest bardzo mały.
yzorg,
11

Jeśli naprawdę nie masz umiejętności programowania na niskim poziomie, zdecydowanie zaleciłbym naukę w wolnym czasie. Nie musisz być w tym ekspertem; po prostu osiągnij pewien poziom biegłości. Musisz samodzielnie wykonać wiele zadań matematycznych, zamiast polegać na kompilatorze lub bibliotekach. Pomoże ci to zrozumieć czytelność w programowaniu, ponieważ większość instrukcji montażu odpowiada jednej instrukcji procesora. Musisz samodzielnie zarządzać złożonością w nieco większych programach, bez korzyści takich jak if...else. Pomoże ci to pisać prostsze programy wysokiego poziomu, ponieważ doświadczenie w montażu nauczyło cię, o ile łatwiej jest czytać.

Pamiętaj też, że to zgromadzenie nie jest językiem! Jest to ogólny termin, który w zasadzie oznacza zestaw instrukcji procesora, który został wyodrębniony do języka symbolicznego. Różne procesory mają różne zestawy instrukcji, a zatem różne języki asemblera. Kiedy uczysz się „montażu”, uczysz się procesu, a nie języka.

Michael K.
źródło
8

Zawsze będziesz czerpać korzyści z zaglądania pod kołdrę i lepszego zrozumienia tego, co kryje się pod abstrakcją, na której stoisz. Jak powiedział kiedyś mój profesor college'u: „Wszyscy dobrzy programiści rozumieją sprzęt” - nie musisz być w stanie tworzyć obwodów i manipulować nimi, ale powinieneś mieć pojęcie o tym, co się tam dzieje - to tylko sprawi, że ty lepiej.

Spróbuj organizacji i projektowania komputera

Watson
źródło
1

Tak - ciągłe uczenie się przez całe życie jest niezbędnym elementem kariery w tworzeniu oprogramowania. Jeśli jesteś zainteresowany dalszą nauką programowania i ulepszania swojego rzemiosła, to tak, w pewnym momencie powinieneś nauczyć się asemblera, ponieważ wystawi cię to na zupełnie nowy język i sposób pisania kodu. Z tego samego powodu zalecam eksperymentowanie z wieloma językami / stylami programowania, w tym Ruby / Python (język dynamiczny), Haskell / F # (czysty język funkcjonalny), Lisp / Scheme (język funkcjonalny) itp.

Powiedziałbym, że jest już za późno, jeśli nie jesteś już zainteresowany zdobywaniem wiedzy na temat programowania. Na przykład, jeśli osiągnąłeś punkt w swojej karierze, w którym możesz wkrótce przejść od programowania do innego obszaru, takiego jak zarządzanie, inżynieria systemów, sprzedaż / marketing itp. Jeśli uważasz, że możesz chcieć przenieść się do nowego obszaru w przez kilka następnych lat skupię się bardziej na umiejętnościach niezbędnych do rozwoju w tej dziedzinie, zamiast na programowaniu.

Justin Ethier
źródło
1

Powinieneś wiedzieć, co to jest i co robi komputer. Nauka czegoś takiego jak Knuth's MIX pomoże ci. Przeważnie jest w stanie ocenić wydajność twojego kodu. Zdobądź sztukę programowania komputerowego i przeczytaj ją. To sprawi, że będziesz mądrzejszym programistą.

Theo Belaire
źródło
1

Czy nie jest rozsądniej skoncentrować się na studiowaniu rzeczy związanych z twoim kierunkiem? Czy jest powód, dla którego powinieneś poświęcić trochę czasu na naukę podstaw niskiego poziomu?

Odpowiedź:

  1. Jeśli nie planujesz zmiany kierunku programowania systemu wbudowanego, nie ma powodu, aby uczyć się assamble. Nawet sądząc, że montaż jest zależny od procesora, możesz nauczyć się podstaw, ale twoja wiedza będzie oparta na architekturze procesora i zestawie instrukcji dla tego procesora.
  2. Powiedzmy, że kodujesz w systemie Windows. Jeśli chcesz nauczyć się języka niższego niż wyższy, który może ci pomóc w obecnym kierunku, poleciłbym nauczenie się Windowsa Deep, Windows API, zarządzania pamięcią Windows itp. Po prostu naucz się kodowanego systemu operacyjnego / platformy.
  3. Popraw swoje umiejętności w swoim obecnym języku wysokiego poziomu, takim jak zarządzanie pamięcią, wyrzucanie elementów bezużytecznych itp. Jeśli chcesz przejść na niski poziom.
Amir Rezaei
źródło
0

Myślę, że wraz z rozwojem kariery osiągasz punkt malejących zysków. Oznacza to, że powinieneś nauczyć się języka asemblera wcześnie, ponieważ prowadzi to do lepszego zrozumienia wszystkiego, co nastąpi później. Jeśli jednak jesteś już zatrudniony i masz kilkuletnie doświadczenie, już wiesz, jak to działa, więc poznanie faktycznych szczegółów może nie dać ci tyle wglądu .

TMN
źródło
0

Nie wiem, ile przydałoby się studiowanie asemblera. Ale przynajmniej wykonanie programowania w języku takim jak C byłoby korzystne. Ostatnio musiałem programować w C i przekonałem się, że jest to raczej pouczające. C usuwa większość abstrakcji, która jest obecna w językach wyższego poziomu. Te abstrakcje nie przychodzą bez kosztów. Musisz zarządzać większą ilością szczegółów niższego poziomu w C, gdzie podobnie jak w języku wyższego poziomu, te dane są dla ciebie zarządzane. Wykonując programowanie w C, będziesz musiał poznać te szczegóły. Więc kiedy wrócisz do swojego codziennego języka, nadal będziesz miał tę świadomość i lepiej docenisz to, co się faktycznie dzieje. To powinno pomóc ci stać się lepszym programistą.

Ross Goddard
źródło
0

W zawodzie nauczyciela, przynajmniej tu, w Wielkiej Brytanii, nauczyciele muszą mieć kwalifikacje znacznie przekraczające to, czego nauczają. Oczekuje się, że nauczyciel w szkole średniej (liceum) będzie miał stopień naukowy z przedmiotu, którego nauczał, a nauczyciele szkoły podstawowej (podstawowej) również mają stopnie naukowe i muszą być biegli we wszystkich głównych przedmiotach do poziomu dobrej klasy GCSE (liceum) egzaminy końcowe ?, brak rzeczywistego odpowiednika w całej USA).

Czemu? Ponieważ aby czegoś dobrze uczyć, a nawet dobrze wykorzystywać, musisz to zrozumieć. Wymaga to zrozumienia podstawowej struktury, łańcucha decyzji przed tą, z którą pracujesz, która do tego doprowadziła. Aby poprawnie zrozumieć kod wysokiego poziomu, musisz zrozumieć warstwę, na której jest zbudowany, jak działa, gdzie leżą jego mocne i słabe strony. Jest to rekurencyjne, aby zrozumieć warstwę poniżej, musisz także zrozumieć warstwę poniżej.

W końcu właśnie dlatego przyzwoite kursy uniwersyteckie w informatyce wymagają dobrych umiejętności matematycznych przed wszystkim innym, ponieważ jest to faktycznie najniższy szczebel.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Jeśli brakuje ci wiedzy w tych obszarach, twoje zrozumienie jest zagrożone. Im bliżej poziomu, na którym operujesz inną warstwą, tym ważniejsze jest, aby mieć w niej uziemienie.

Więc: Czy musisz znać asemblera jako koder wysokiego poziomu?  To pomoże.

Orbling
źródło
0

Było to bardzo ważne w moim poprzednim życiu jako superkomputerowego guru. Wtedy czułem, że nie rozumiesz maszyny, dopóki nie napisałeś co najmniej kilkuset wierszy asemblera i majstrował przy niej, próbując wycisnąć wydajność. Ponieważ bardzo niewielu programistów chciało zajść tak głęboko, uczyniło mnie to naprawdę niezbędnym. Nadal mam wspólny język, rozmawiając z projektantami HW.

Ale tak naprawdę potrzeba / korzyść z tego wynika już kilkadziesiąt lat temu. Pomiędzy postępami kompilatora a zaawansowanym wykonywaniem poza kolejnością HW jest bardzo mało możliwości grania w bohatera poprzez pisanie asemblera. Chociaż uważam, że warto zrozumieć, jak to działa. Planuję uczyć moje dzieci (studentów pierwszego roku kierunków CS) programowania w bardzo uproszczonym asemblerze na prostej maszynie wirtualnej, aby mieli wyczucie tego, co się dzieje. Mamy nadzieję, że będziemy mogli bawić się takimi rzeczami, jak rozwijanie, tworzenie potoków oprogramowania, buforowanie i pobieranie wstępne, ładowanie od dołu itp. Więc przynajmniej będą wiedzieli, że na pewnym poziomie to się dzieje.

Omega Centauri
źródło