Czy nadal warto uczyć się ASM ?
Wiem trochę o tym, ale tak naprawdę nie używałem go ani nie nauczyłem się go poprawnie, ponieważ wszystko, czego nauczyłem się w asemblerze, mogę zrobić w 1/10 raz w jakimś języku, takim jak C lub C ++. Czy więc naprawdę powinienem się uczyć i używać ASM? Czy to mi się przyda zawodowo? Czy zwiększy to moją zaradność? Krótko mówiąc, czy uczyniłoby mnie to lepszym programistą?
Uwaga: mówię o montażu niskopoziomowym, takim jak FASM lub NASM, a nie o czymś takim jak HLA (High-Level Assembler).
programming-languages
assembly
nasm
ApprenticeHacker
źródło
źródło
Odpowiedzi:
Nauczyłem się z książki Kipa Irvine'a . Jeśli zignorujesz (uczciwą) krytykę jego (nieistotnych) bibliotek, mogę polecić go jako dobre wprowadzenie do samego języka - chociaż dla naprawdę interesujących rzeczy musisz polować na obsesje w sieci.
Myślę, że warto zrozumieć, co dzieje się na niższych poziomach. Podczas badania asemblera dowiesz się o tworzeniu potoków procesora, przewidywaniu gałęzi, wyrównaniu pamięci podręcznej, SIMD, zmianie kolejności instrukcji i tak dalej. Znajomość tych elementów pomoże Ci napisać lepszy kod wysokiego poziomu.
Ponadto, konwencjonalna opinia jest taka, aby przez większość czasu nie próbować ręcznie optymalizować asemblacji, ale pozwolić kompilatorowi się tym martwić. Kiedy zobaczysz przykłady pokręconych rzeczy, które generują kompilatory, lepiej zrozumiesz, dlaczego konwencjonalna mądrość się utrzymuje.
Przykład: LFSR działa szybko z instrukcją rotate-with-carry, w szczególnych przypadkach, takich jak ten, tak łatwo jest napisać wersję asemblera, jak odkryć, czy kompilator jest wystarczająco inteligentny, aby to rozgryźć. Czasami po prostu wiesz coś , czego nie ma kompilator.
Zwiększa również zrozumienie kwestii bezpieczeństwa - zapisu lub wykonania, przepełnienia stosu itp.
Niektóre problemy ze współbieżnością stają się widoczne tylko wtedy, gdy wiesz, co dzieje się na poziomie instrukcji.
Może to być przydatne czasami podczas debugowania, jeśli nie masz pełnego kodu źródłowego.
Jest wartość ciekawości. W jaki sposób realizowane są funkcje wirtualne? Czy kiedykolwiek próbowałeś pisać programy DirectX lub COM w asemblerze? W jaki sposób zwracane są duże struktury, czy funkcja wywołująca oferuje dla nich miejsce lub odwrotnie?
Są też specjalne języki asemblera dla sprzętu graficznego, chociaż języki shaderów osiągnęły wysoki poziom kilka lat temu, wszystko, co pozwala myśleć o problemie w inny sposób, jest dobre.
źródło
Uważam za interesujące, że tak wielu ludzi podskakuje, by powiedzieć, że tak, potrzebujesz / powinieneś nauczyć się montażu. Dla mnie pytanie, ile montażu potrzebujesz wiedzieć? Myślę, że nie musisz znać asemblera jak języka programowania, to znaczy nie uważam, że każdy powinien umieć napisać program w asemblerze, ale z drugiej strony, będąc w stanie go przeczytać i zrozumieć, co to właściwie jest środki (które mogą wymagać większej wiedzy o architekturze niż asembler) są wystarczające.
Na pewno nie potrafię napisać asemblera (czyli napisać dowolny nietrywialny fragment kodu w asemblerze), ale potrafię go przeczytać i że wraz ze znajomością rzeczywistej architektury sprzętu i stosowanych konwencji wywoływania wystarczy do analizy wydajności, i zidentyfikować, który fragment kodu C ++ był źródłem tego zestawu.
źródło
Tak - głównym powodem uczenia się asemblera dla programistów C i C ++ jest to, że pomaga zrozumieć, co się dzieje pod maską kodu C i C ++. Nie chodzi o to, że faktycznie będziesz pisać kod w asemblerze, ale będziesz mógł przyjrzeć się dezasemblacji kodu, aby ocenić jego wydajność i zrozumiesz, jak różne funkcje C i C ++ działają znacznie lepiej.
źródło
Warto nauczyć się wielu różnych języków, z wielu różnych paradygmatów. Nauka języków Java, C ++, C # i Python się nie liczy, ponieważ wszystkie są instancjami tego samego paradygmatu.
Ponieważ asembler jest u podstaw (no cóż, blisko korzenia) wszystkich języków, z jednej strony twierdzę, że warto się nauczyć asemblera.
Z drugiej strony warto nauczyć się funkcjonalnego języka programowania, programowania logicznego, języków skryptowych, języków opartych na matematyce. Masz tylko tyle czasu, że musisz wybierać.
źródło
Znajomość ASM jest również przydatna podczas debugowania, ponieważ czasami wszystko, co masz, to „zrzut ASM błędu”.
źródło
Czy masz z tego jakiś pożytek w tym, co planujesz zrobić? czy pomoże ci to w jakikolwiek sposób w tym, co obecnie robisz lub planujesz zrobić? to są dwa pytania, które powinieneś sobie zadać, odpowiedź na nie jest odpowiedzią na twoje pytanie.
W bardziej ogólnym sensie, tak, powiedziałbym, że moim zdaniem warto się uczyć asm (coś takiego jak x86 lub arm), jak dobrze ci to służy, zależy od tego, co programujesz i jak go debugujesz.
źródło
W zależności od poziomu programowania, który chcesz osiągnąć. Jeśli potrzebujesz pracować z debuggerami, to TAK. Jeśli chcesz wiedzieć, jak działają kompilatory, to TAK. Każdy asembler / debugger jest zależny od procesora, więc jest dużo pracy, po prostu sprawdź rodzinę x86, jak duża i stara jest.
źródło