Czy istnieją znaczne różnice między językiem asemblera i językami wyższego poziomu, jeśli chodzi o kodowanie i / lub zarządzanie projektami? Oczywiście, aby wykonać określoną operację, potrzeba więcej instrukcji w języku asemblera niż w większości innych języków, ale czy istnieją różnice, które wpływają na to, jak projekt musi (lub powinien) być uruchamiany w oparciu o docelowy język asemblera (w szczególności asembler a86 / x64) ?
W zakresie, w jakim istnieją różnice między językiem asemblera i innymi językami, rozsądne wydaje się odgadnięcie, że przynajmniej niektóre z nich są zaletami dla innych języków. Czy ktoś może wskazać konkretne wady języka asemblera i sposoby jego złagodzenia?
Jednym konkretnym przykładem może być dostępność personelu. Czy ktoś miał problem ze znalezieniem doświadczonych programistów w asemblerze, a jeśli tak, jakie kroki można podjąć, aby złagodzić ten problem?
non-[PC|web|enterprise]
programowania, w których asembler jest dominujący lub bardzo popularny. Mówię o mikrokontrolerach, automatyce przemysłowej lub robotyce. Oczywiście, w tych obszarach są również języki wysokiego poziomu, ale bardzo często widuje się Zgromadzenie.Odpowiedzi:
Tak - ale nie często.
W pewnym sensie asembler to tak naprawdę tylko proxy dla języka maszynowego, więc oczywiście możesz zrobić w asemblerze wszystko, co możesz, używając języka wyższego poziomu.
Nie zawsze jest odwrotnie. Na przykład kilka lat temu pracowałem nad procesorem ARM, który miał kilka funkcyjnych kodów do zmiany stanów graficznych, z których można było korzystać tylko z trybu jądra. Nie mieliby bezpośredniego odpowiednika w języku wyższego poziomu i jestem pewien, że funkcja sterownika jądra Linuksa do zmiany tych stanów zawierała pewne asemblery.
Na mikroprocesorach w latach 80. i na początku połowy lat 90., gdybyś miał jakiś kod, który musiał działać bardzo szybko, często zapisywałbyś go w asemblerze, ponieważ wykwalifikowany człowiek mógłby łatwo napisać bardziej zoptymalizowany zestaw niż większość C kompilatory mogą generować. Niektóre wczesne programy dla komputerów Mac zostały napisane całkowicie w asemblerze i były zadziwiająco szybkie jak na era. Nawet bez pisania całego programu w asemblerze z pewnością zrobiłem udział w optymalizacji wewnętrznych pętli w C za pomocą wbudowanego zestawu.
Ale wszystko zaczęło się zmieniać w połowie lat 90. Procesory zaczęły zawierać funkcje takie jak potokowanie i przewidywanie rozgałęzień, więc najbardziej wydajne porządkowanie instrukcji nie zawsze było oczywiste dla człowieka. Co gorsza, najbardziej wydajne porządkowanie różniło się między procesorami w tej samej rodzinie; na przykład kompilatory PowerPC zwykle oferowały przełączniki docelowe dla serii G3, G4 i G5. Ten sam kod obiektowy działałby na wszystkich z nich, ale działałby na jednej z tych serii bardziej wydajnie.
Od tego czasu kolejność instrukcji staje się coraz bardziej skomplikowana, szczególnie na bardziej skomplikowanych architektonicznie procesorach, takich jak x86, PowerPC i SPARC. (Uważam, że ARM jest nadal dość prosty.) Dużym dodatkowym czynnikiem jest rozmiar kodu - kod, który wykorzystuje więcej cykli procesora, ale może pozostać w pamięci podręcznej procesora, często działa znacznie szybciej niż kod, który wykorzystuje mniej cykli procesora, ale powoduje powolne pobieranie pamięci . Główne współczesne kompilatory potrafią znacznie lepiej zoptymalizować kod na tych procesorach niż ludzie w rozsądny sposób.
Nie znalazłem dobrego powodu, aby pisać asemblery od co najmniej 15 lat. Myślę, że w 2011 r. Głównymi zastosowaniami do montażu byłyby:
źródło
Spróbuj zaprogramować mikrokontroler dla „małego urządzenia wbudowanego” - zdalnego alarmu samochodowego, monitora baterii telefonu, kontrolera klawiatury, regulatora prędkości wentylatora, bez użycia zestawu.
Podczas przesuwania się granicy zawsze jest miejsce na montaż.
15 lat temu licznik rowerowy był mechaniczny, kuchenka mikrofalowa była w obwodzie analogowym, pilot telewizora był w obwodzie cyfrowym, tuner telewizji satelitarnej został napisany w zestawie, oprogramowanie telefonu było w C, a aplet komputerowy w Javie.
7 lat temu kuchenka mikrofalowa była w obwodzie cyfrowym, pilot telewizora został napisany w asemblerze, dekoder telewizyjny napisany był w C, twój telefon działał w oparciu o interfejs Java.
Obecnie licznik rowerowy jest w obwodzie cyfrowym, kuchenka mikrofalowa pobiera oprogramowanie układowe, pilot telewizora ma oprogramowanie układowe w C, dekoder telewizyjny obsługuje Javę, telefon ma system Linux.
Chcesz postawić zakład na następne 7 lat? W miarę, jak coraz więcej technologii staje się coraz bardziej zaawansowanych języków sterowania, asembler zyskuje nowe podstawy i będzie je nadal otrzymywać. Zobacz, co dzieje się dzisiaj z obwodami mechanicznymi lub analogowymi. Za kilka lat możesz tam postawić na montaż. Twój włącznik światła? Twój kran? Twój czajnik? Twoja szczoteczka do zębów?
Zawsze będzie nowe urządzenie, urządzenie, zabawka, przedmiot o wspólnym życiu, który będzie programowany podczas montażu.
źródło
Opieram to przede wszystkim na asemblerze, z którego korzystałem - przede wszystkim na MASM, NASM i (w mniejszym stopniu) TASM. Niektóre z późniejszych wersji TASM miały (mają?) Pewne funkcje do obsługi OO, ale nie używałem ich zbyt często i nie próbuję ich komentować.
Po pierwsze: większość języków przesunęła się w kierunku struktury, która przynajmniej przypomina drzewo. Niezależnie od tego, czy jest obiektowa, czy obiektowa, czy dokładnie to, co jest dość zdefiniowane w relacjach między różnymi częściami systemu. Jest też sporo do „ochrony” jednej części systemu przed przypadkowym „wtrąceniem się”, ale innych części (nawet jeśli ochrona może być zwykle ominięta, jeśli chcesz). Natomiast język asemblera jest stosunkowo „płaski” - większość relacji między kodem (i danymi) w różnych częściach systemu jest ustalana przede wszystkim na podstawie dokumentacji oraz, w mniejszym stopniu, konwencji nazewnictwa.
Powoduje to, że często łatwiej jest połączyć kod znacznie ściślej niż byłoby to idealne. Wymagania, które doprowadziły do wyboru języka asemblera na początek (wyższa wydajność, mniejszy rozmiar itp.) Często również to wynagradzają - omijając zatwierdzone interfejsy i często można uzyskać kod, który jest mniejszy i szybszy (choć zwykle nie za dużo lepiej w dowolnym wymiarze). Język i narzędzia same w sobie robią znacznie mniej, aby ograniczyć to, co robisz (dobre lub złe), co znacznie obciąża menedżerów, aby zapobiegali problemom. Nie powiedziałbym, że jest jakościowo różny, ale pod względem ilościowym jest - tzn. Zarząd musi pracować, aby zapobiec problemom w obu kierunkach, ale w przypadku języka asemblera zwykle przyjmuje więcej (i często ściślejsze) wytyczne na temat tego, co jest lub nie jest dopuszczalne.
Łagodzenie tego jest w dużej mierze kwestią bardziej uważnych wytycznych, więcej wskazówek od bardziej doświadczonego personelu oraz bardziej szczegółowych, dokładnie egzekwowanych konwencji nazewnictwa.
Personel stanowi problem. Problemy, które napotkałem, nie były jednak tymi, których się spodziewałem. Znalezienie facetów z odrobiną „wojownika”, którzy chętnie wskoczyli do kodu języka asemblera, było dość łatwe. Większość wykonała całkiem rozsądną robotę, pomimo prawie całkowitego braku wcześniejszego doświadczenia w posługiwaniu się językiem asemblera.
Trudność, jaką napotkałem, polegała na znalezieniu większej liczby pracowników wyższego szczebla - ludzi, którzy mogliby utrzymać projekt przynajmniej pod pozorem kontroli i nie byli w pełni przyzwyczajeni do języków, które zapewniałyby (i w dużej mierze egzekwowały) wytyczne niezbędne do racjonalnego utrzymania kodu łatwe do utrzymania i zrozumiałe.
Patrząc wstecz, mogłem / spowodowałem jakiś największy problem w tym zakresie. Z mojej strony widzę dwa źródła problemów. Po pierwsze, do czasu projektu, o którym myślę, pisałem głównie w językach wyższego poziomu i używałem tylko języka asembleraw ostateczności. Jako taki, kiedy go użyłem, prawie każda możliwa sztuczka w celu zwiększenia wydajności była nie tylko uczciwą grą, ale się spodziewała. Po drugie, kiedy pracowałem nad niektórymi systemami napisanymi w całości (lub przede wszystkim) w języku asemblera, było to pod kierownictwem niektórych kierowników projektów o żelaznych rękach. W tym czasie byłem stosunkowo młody i szczerze nie podobało mi się to, że prowadzili różne rzeczy, więc zwykle robiłem coś przeciwnego. Z perspektywy czasu to, co robili, było naprawdę ważne, a nie zrobione tylko dlatego, że były stare i nieelastyczne (co, jestem prawie pewien, jak to wtedy widziałem).
źródło
moim zdaniem montaż jako platforma programistyczna może nie być odpowiedni do codziennego użytku. głównym powodem tej opinii może być to, że ilość mocy obliczeniowej, która jest usuwana z danego procesu, w porównaniu do ilości czasu potrzebnego do optymalizacji tego samego procesu zwykle nie jest warta czasu i energii (istnieje na to specyficzny termin .. to brzmi jak człowiek / godzina lub coś ... proszę o edycję, jeśli wiesz, o czym mówię ..) istnieją oczywiste wyjątki wspomniane powyżej, ale jeśli chodzi o programowanie głównego nurtu, montaż nie jest często używany.
powiedziano to ... montaż jest nadal aktualny podczas nauki programowania w kontekście badań inżynierii oprogramowania, uczy, jak wygląda i zachowuje się język programowania niskiego poziomu. pójdę dalej i podam przykład tego, czego używamy obecnie w klasie. używamy zestawu pep / 8 opracowanego przez Stanleya Warforda (Pepperdine University USA) i podanego tutaj oprogramowania typu open source . używane głównie, ponieważ wirtualizuje procesor i pokazuje zawartość pamięci podczas przechodzenia przez kod podczas jego działania (całkiem przydatne do nauki, debugowania).
Tak więc, w zależności od twojego zastosowania, montaż może, ale nie musi być, moim zdaniem, istotny.
źródło
Myślę, że pytasz „czy ciężarówki są nadal aktualne, jeśli mamy samochody?”. Mam na myśli, że montaż ma bardzo szeroki zakres zastosowań, ale nie tak szeroki, jak programowanie na wysokim poziomie, w taki sam sposób, że jest o wiele mniej ciężarówek niż samochodów.
W takich dziedzinach, jak optymalizacja algorytmów, można użyć rejestrów procesora bezpośrednio do poprawy algorytmów przetwarzania obrazów / wideo.
W dziedzinach takich jak kryptografia możesz używać tego w ten sam sposób.
W nowych procesorach z nowymi architekturami (pamiętajcie, kiedy wypuszczono mikroprocesor Cell), na pewno musieli pisać moduły ładujące i tak dalej w zespole (a także ze starymi procesorami, ale długo używane procesory mają bardzo stabilną masę i trudno je poprawić to).
Można podać wiele innych przykładów, więc zależy to od dziedziny, w której koncentruje się Twoja firma, jeśli Twoja firma zajmuje się tworzeniem stron internetowych / urządzeń mobilnych, istnieje duże prawdopodobieństwo, że jej nie potrzebujesz, ale jeśli Twoja firma koncentruje się na mikrokontrolerach, systemy wbudowane itp. są bardzo prawdopodobne, że są potrzebne.
A dostępność personelu zależy od tego, jak sądzę, jeśli zapytasz w Intelie, Qualcomm,… muszą mieć dużą listę programistów montażu (to tak, jakbyś zapytał w miejscu pracy „ilu kierowców ciężarówek jest tutaj?” nie myśl dużo, ale to nie znaczy, że nie ma ich w innych miejscach. Co się stanie, jeśli zapytasz „ilu kierowców jest tutaj?”).
źródło
Jeśli naprawdę chcesz wiedzieć, dlaczego nauka montażu jest najlepszym wyborem. Oto powody.
Zgromadzenie jest jak Natasha Romanoff z Avengers. To urok i magia. Najpierw cię ugryzie, ale zaufaj mi, że nigdy nie zapomnisz smaku.
źródło