Czy zgromadzenie jest nadal aktualne? [Zamknięte]

18

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?


źródło
Dlaczego ktoś miałby dzisiaj pisać kompletny projekt wyłącznie w języku asemblera? A może pytasz o środowisko mieszanego języka, w jaki sposób obecnie używa się asemblera?
Martin Vilcans
6
Zauważ, że istnieją obszary 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.
Mchl,
1
@Mchl: Czy te projekty nie są wykonane w C (a nawet w C ++) i być może w asemblerze? Domyślałbym się, że bardzo rzadko używa się wyłącznie asemblera.
Martin Vilcans,
1
W rzeczywistości w automatyce przemysłowej można spotkać całą gałąź języków, które po prostu nie istnieją poza tym obszarem. Częściowo wynika to z różnic w sprzęcie (architektura Harvarda w przeciwieństwie do architektury von Neumanna, do której jesteśmy przyzwyczajeni). a także z historii udostępniania tych sterowników elektrykom, którzy byli przyzwyczajeni do pracy z przełącznikami i przekaźnikami. W ten sposób powstaje LD ( en.wikipedia.org/wiki/Ladder_logic ), co w rzeczywistości jest graficzną interpretacją asemblera. Zobacz powiązany artykuł, aby zapoznać się z kilkoma innymi językami stosowanymi w automatyce.
Mchl,
2
Mam małego instalatora, który obsługuję teraz, który jest w trakcie montażu. Pisanie w asemblerze (z Windows API) było tak łatwe, jak cokolwiek innego, więc dlaczego nie? Mam również interfejs czytnika kart kredytowych napisany w asemblerze. Zaczynałem w językach wysokiego poziomu, ale miałem tak wiele trudności z uruchomieniem go, że przepisałem w asemblerze, aby uzyskać lepszą kontrolę nad wszystkimi przepływającymi bitami ...
Brian Knoblauch

Odpowiedzi:

25

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:

  • Aby przeczytać zrzuty z demontażu podczas debugowania, co czasami robię nawet dzisiaj.
  • Radzenie sobie z niestandardowymi funkcjami procesora, takimi jak ten funky tryb graficzny.
  • Pisanie kompilatora - zapewnia pośredni, czytelny dla człowieka format do tłumaczenia języków wyższego poziomu.
Bob Murphy
źródło
1
Nawet twój powód nr 3 zaczyna znikać, gdy kompilatory atakują albo wysokopoziomowe frameworki kompilatora, takie jak LLVM, nanojit lub libjit, lub coś w rodzaju kodu bajtowego JVM, CIL, Parrot, Rubinius lub Neko.
Jörg W Mittag
Nadal czasami konieczne jest wykonanie trochę SSE2 w pracy nad grafiką / wideo. Chociaż najpierw porównuje się z TBB / OMP!
Martin Beckett,
@ Martin: OMP jest ortogonalny do SSE2. (przy założeniu dobrych praktyk w zakresie układu danych)
rwong
@rwong - ale proces jest nadal 1, odkryj, że jest zbyt wolny. 2, mam nadzieję, że OMP / TBB przyspieszy to wystarczająco. 3, uciekaj się do ręcznego pisania wersji SSE2! (w kolejności bólu)
Martin Beckett
2
Na przykład całość Roller Coaster Tycoon została napisana w asemblerze (bez grafiki wykonanej w c) i była niesamowicie mocna jak na swój czas. Setki pojedynczych AI działających niezależnie, prawie bezproblemowo, gdy większość gier ma kilka duszków 16 x 16 pikseli wykonujących określone ruchy. Zawsze lubię to wykorzystywać, aby pokazać moc montażu.
Ampt
19

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.

SF.
źródło
3
dobra odpowiedź. Ilu ludzi wolałoby płacić dwa razy tyle za coś, co baterie trwają o połowę dłużej tylko dlatego, że Java lub coś zostało użyte jako platforma programistyczna? Spójrz na groupon i wszystkie inne sposoby, w jakie ludzie szukają oszczędności, patrz zielony ruch oszczędzający zasoby. Po co zwiększać koszty i zwiększać moc wszystkich wbudowanych produktów, aby uniknąć montażu?
old_timer
1
Zapomniałeś dodać, że teraz komputery obsługują Javascript (Chromebooki). Dla mnie ten postęp jest dość smutny, ale prawdziwy.
Hawken,
Od 2017 r. CIA dostaje się do telewizora z systemem Linux, sygnały z Javy uruchomionej na kluczykach samochodowych mogą być sfałszowane, każdy może podłączyć się przez WIFI do oprogramowania C ++ kamery dildo , szczoteczka do zębów została zdalnie wykorzystana w 2013 r., Ale na szczęście nadal słuchawki z eliminacja hałasu powstająca podczas prac montażowych. Mimo że zespół traci pozycję jako najwyższy kontroler czegokolwiek , zamiast tego przechodzi do podkomponentów. Twoje rolety już działają w Javie, ale ta płyta kontrolna Java komunikuje się z kontrolerem silnika rolety działającym z asemblerem.
SF.
8

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).

Jerry Coffin
źródło
Mam miłe wspomnienia o asemblerach TASM i Orca / M =)
Patrick Hughes
0

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.

marc-andre benoit
źródło
0

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?”).

periket2000
źródło
-3

Jeśli naprawdę chcesz wiedzieć, dlaczego nauka montażu jest najlepszym wyborem. Oto powody.

  1. Nie musisz uczyć się asemblera, jeśli zamierzasz programować w języku Visual Basic i tym podobne.
  2. Nie musisz uczyć się montażu, jeśli nie musisz robić poważnych gadżetów z mikrokontrolerem.
  3. Nie musisz uczyć się montażu, jeśli masz do dyspozycji nieruchomość pamięci podczas pracy nad mikrokontrolerem (bóg pomaga ci w połączeniu pamięci z mikrokontrolerem)
  4. Nie musisz uczyć się montażu, jeśli nie chcesz boskiej władzy nad swoim mikrokontrolerem / mikroprocesorem.
  5. Niewiedza o zgromadzeniu jest jak znajomość góry lodowej. Możesz zobaczyć 25% swoich możliwości i możliwości mikroskopy, a 75% nigdy nie poznasz ani nie zrozumiesz
  6. Spróbuj uruchomić system operacyjny Kolibris całkowicie napisany w asemblerze !!! Czy widziałeś system operacyjny, który uruchamia się w mniej niż 5 sekund, a aplikacja zaczyna działać w ciągu 1 sekundy po kliknięciu myszą.
  7. Nowoczesne kompilatory mają funkcje ogólnego przeznaczenia w backendu, a zatem wygenerowany kod końcowy byłby ciężki w porównaniu z asemblerem.

Zgromadzenie jest jak Natasha Romanoff z Avengers. To urok i magia. Najpierw cię ugryzie, ale zaufaj mi, że nigdy nie zapomnisz smaku.

cyberspider789
źródło
1
wydaje się, że nie oferuje to nic istotnego w porównaniu z punktami poczynionymi i wyjaśnionymi w poprzednich 5 odpowiedziach
gnat