Na uniwersytecie odbyłem obowiązkowy kurs z zakresu architektury komputerów i programowania języków programowania. Zauważyłem, że język asemblerowy jest dość czasochłonny i trudny do uchwycenia. Nadal nie rozumiem powodu, dla którego naucza się języka asemblerowego. Zadałem to samo pytanie mojemu instruktorowi, a on się uśmiechnął i powiedział, że dowiesz się w przyszłości. Ale mam naturę, na którą tak długo nie mogę czekać na odpowiedź, gdy drażni mnie moje pytanie. Pytam więc, dlaczego wciąż wymagamy języka asemblerowego, jeśli istnieją bardzo wydajne, szybkie i wydajne języki programowania, a ponadto takie języki oferują szeroką gamę narzędzi, które ułatwiają programowanie. Więc dlaczego?Dlaczego język asemblerowy jest nadal potrzebny, jeśli dysponujemy wysokopoziomowymi językami oferującymi zaawansowane narzędzia?
Odpowiedz
Kod maszynowy jest nadal potrzebny do wykonywania kluczowych zadań, np. kod specyficzny
- części składowe, takie jak sterowniki urządzeń
- urządzeń wbudowanych, gdzie wielkość kod jest ważny
- Kod niskiego poziomu, gdzie wydajność jest krytyczna itp
Często asemblera można mieszać w języki wyższego poziomu, takie jak C, gdzie montaż można dodać w linii z kodem C.
Mimo to dobrze jest zapoznać się z podstawową architekturą sprzętową, nawet jeśli będziesz programować w języku wysokiego poziomu, ponieważ da ci to wgląd w to, jak działają stosy, hałdy, wskaźniki itp.
Jednym dość dobrym powodem jest to, że wszystkie języki programowania są abstrakcją działania komputera. Teoretycznie dla języków wysokiego poziomu abstrakcja oznacza, że programista nigdy nie musi się martwić szczegółami komputera.
Ale np. abstraction is always leaky, np. większość (jeśli nie wszystkie) języków wysokiego poziomu nie optymalizuje się automatycznie w przypadku pamięci podręcznych procesora (np. pamięci podręcznej i fałszywego współdzielenia), a wydajna wielowątkowość jest zawsze trudna. Oznacza to, że jeśli wydajność jest krytyczna, programista może inaczej napisać swój kod.
Najlepszym sposobem uzyskania wydajności jest zrozumienie działania maszyny, aby programista mógł wykonywać duże przekształcenia architektury, których kompilator nie może łatwo wykonać. Jako przykład, upewnij się, że wątki przetwarzają dane w wielokrotnościach 64 bajtów (w celu zmniejszenia fałszywego współdzielenia na liniach pamięci podręcznej) lub wykonują przekształcenie struktury tablic o strukturze ⇔.
montażu (i C do pewnego stopnia) jest bardzo dobrym sposobem uczenia się tych szczegółów z wydajnością, ponieważ to sprawia, że naprawdę łatwo zrozumieć dokładnie, co komputer robi bo dokładnie kontrolować, co dzieje się na każdym kroku.
(Emisyjna punkt poboru odnosi się również do dostępu specyficzne/niestandardowych komponentów sprzętowych.)
Dziękuję bardzo za odpowiedź. Teraz mój wyjaśnił mi potrzebę języka asemblerowego. –
- 1. funkcjonalny język asemblerowy
- 2. Czy nadal potrzebny jest ActionBarSherlock?
- 3. Czy rmic jest nadal potrzebny?
- 4. Potrzebny jest lepszy język szablonowy
- 5. Dlaczego "gt = C++ 0x" jest nadal potrzebny dla g ++ 4.6.2?
- 6. język bez, jeśli jest?
- 7. Jak utworzyć katalog, jeśli jest potrzebny?
- 8. Dlaczego Java jest bezpieczna w porównaniu z innymi językami programowania?
- 9. Dlaczego atr_accessor jest potrzebny w Railsach?
- 10. Dlaczego potrzebny jest podstawowy obraz z Dockerem?
- 11. Co to jest język kleju?
- 12. jQuery mousemove() jest wywoływana, nawet jeśli mysz nadal jest
- 13. Dlaczego ankieterzy zadają zaawansowane pytania?
- 14. Ukryj pasek przewijania pre, jeśli nie jest potrzebny
- 15. Dlaczego AtomicInteger jest potrzebny, jeśli zapisuje i czyta do zmiennych int są atomowe?
- 16. ASP.NET MVC Dyskretna walidacja - dlaczego kontekst formularza jest potrzebny?
- 17. Dlaczego nowy sygnał dla socket :: readyRead() jest wykonywany, nawet jeśli jego wcześniejsze gniazdo jest nadal przetwarzane?
- 18. Jeśli Python 3 jest najnowszym pythonem, dlaczego python 2 nadal jest w pobliżu?
- 19. Maszynopis, dlaczego i kiedy potrzebny jest program Requjs.
- 20. Dlaczego moja zmienna nadal jest "niezainicjowana"?
- 21. Czy KillTimer jest naprawdę potrzebny?
- 22. atoi() z innymi językami
- 23. Dlaczego potrzebny jest plik obiektowy do wygenerowania pliku wykonywalnego?
- 24. Czy potrzebny jest pas akcji?
- 25. Jaki filtr Kalmana jest potrzebny?
- 26. Czy potrzebny jest mechanizm Class.forName()?
- 27. Jeśli ostateczny obiekt jest przekazywany, powinno być nadal zaznaczone zero?
- 28. Dlaczego sterowanie Spinner nadal wyświetla informacje o pytaniu, nawet jeśli zdarzenie setOnItemSelectedListener jest po sesetSelection?
- 29. Jaki jest potrzebny polimorfizm w OOP?
- 30. Gdzie zaawansowane zasoby w Yii2 są zaawansowane?
języki wysokiego poziomu wiemy prawie nic o sprzęcie i często nie mają możliwości uzyskania dostępu do niego. Tam właśnie przybywa grupa ratownicza. Drugim zastosowaniem jest optymalizacja rozmiaru/prędkości kodu. –
To pytanie brzmi, jakby pasowało lepiej na stronie http://programmers.stackexchange.com. W skrócie: ponieważ wszystkie wysokopoziomowe języki są automatycznie kompilowane do ASM. To nie daje żadnej kontroli nad końcowym wynikiem, nad tym, co komputer faktycznie robi. Podczas gdy kompilatory są dobre, nie mogą znać wszystkich drobnych sztuczek i optymalizować kod do perfekcji.Jeśli chcesz uzyskać maksymalną wydajność, potrzebujesz pełnej kontroli nad tym, co robi komputer w każdym najmniejszym szczególe, czego nie oferuje język wysokiego poziomu. – deceze
Dzięki Alex i deceze –