Obecnie studiuję inżynierię w telekomunikacji i elektronice i przeprowadziliśmy migrację z asemblera do C w programowaniu mikroprocesorowym. Mam wątpliwości, czy to dobry pomysł. Jakie są zalety i wady C w porównaniu do montażu?
Widzę zalety / wady:
Zalety:
- Mogę powiedzieć, że składnia C jest o wiele łatwiejsza do nauczenia się niż składnia asemblera.
- C jest łatwiejszy w użyciu do tworzenia bardziej złożonych programów.
- Nauka języka C jest w jakiś sposób bardziej produktywna niż nauka asemblera, ponieważ wokół C jest więcej rzeczy do rozwijania niż asembler.
Niedogodności:
- Asembler jest językiem programowania niższego poziomu niż C, dzięki czemu nadaje się do programowania bezpośrednio na sprzęcie.
- Jest o wiele bardziej elastyczny, nawiązując do pracy z pamięcią, przerwaniami, mikro-rejestrami itp.
Odpowiedzi:
Oto kilka odpowiedzi na przepełnienie stosu, które mogą ci pomóc (są to najlepsze odpowiedzi, zaakceptowane odpowiedzi):
Zalety
/programming/143561/is-there-a-need-to-use-assembly-these-days (tylko dla użytkowników 10 000) lub Archiwum
Niedogodności
/programming/2684364/why-arent-programs-written-in-assembly-more-often
Przykład
Ostatni post poniżej jest przepełnieniem stosu opisującym scenariusz, który pokaże przykład złożenia, który jest szybszy niż C (podczas wykonywania tej samej funkcji).
/programming/577554/when-is-assembler-faster-than-c
źródło
C jest łatwiejszy do zaprogramowania niż w asemblerze. Istnieją oczywiste powody, dla których nie warto przerabiać.
Będąc łatwiejszym w użyciu, C pozwala szybciej pisać programy. Zasadniczo programy te są również łatwiejsze do debugowania i łatwiejsze w utrzymaniu. Ponadto łatwiej jest zarządzać dużymi, złożonymi programami w C.
Często kod generowany przez kompilator jest równie dobry (pod względem szybkości i wydajności) jak asembler napisany ręcznie - jeśli nie lepszy.
C jest dość cholernie niski i rzadko zdarza się, że chcesz zejść znacznie niżej. Posiadanie dodatkowej warstwy abstrakcji rzadko jest złą rzeczą.
Kiedy musisz zejść niżej, możesz użyć Asemblera, w przeciwnym razie możesz użyć C.
Możesz napisać Asembler w kodzie C, ale nie C w kodzie Asemblera.
źródło
Program AC można skompilować do różnych architektur mikroprocesorów.
źródło
Nie obawiaj się, nikt już nie tworzy nowych programów w 100% asemblerze. W dzisiejszych czasach C może być używany nawet w najmniejszych, najbardziej cholernych architekturach 8-bitowych. Jednak znajomość jakiegoś asemblera sprawia, że jesteś znacznie lepszym programistą C. Ponadto w programie zawsze są jakieś małe lub dwa detale, które należy napisać w asemblerze.
Tak, z pewnością składnia jest łatwiejsza. Jednak nauka całego języka C ze wszystkimi irytującymi szczegółami jest o wiele bardziej złożona niż nauka wszystkich szczegółów konkretnego asemblera. C to znacznie większy i szerszy język. Ale z drugiej strony może nie być konieczne poznanie wszystkich szczegółów.
Rzeczywiście, C zapewnia mechanizmy modułowego projektowania programów, takie jak enkapsulacja i lokalne zakresy / zmienne lokalne. A C ma standardową bibliotekę oraz ogromną ilość zasobów napisanych w ciągu ostatnich 30 lat. A co najważniejsze, C jest przenośny.
C ma wiele gotowych funkcji, bibliotek i zasobów, więc będzie mniej ponownego wymyślania koła. Ale poza tym twoje stwierdzenie jest subiektywne. Uważam, że jest to kwestia osobistych preferencji.
Na przykład jestem doświadczonym programistą C, od czasu do czasu programując w C ++. Uważam, że jestem znacznie mniej produktywny w C ++, ponieważ nie znam tego języka tak dobrze, jak znam C. Ale tylko dlatego, że tak uważam, niekoniecznie oznacza to, że programowanie w C jest bardziej produktywne niż programowanie w C ++. Doświadczony programista C ++ z pewnością miałby przeciwną opinię.
Istnieje wiele aspektów „produktywności”. Bardzo ważnym aspektem jest czas konserwacji, a zwłaszcza czas potrzebny na usunięcie błędów wywołanych przez konserwację. C jest znacznie łatwiejszy w utrzymaniu niż asembler.
Programowanie sprzętowe można wykonać bezpośrednio w dowolnym języku. Jedyne, czego nie możesz zrobić w C, to dostęp do wskaźników stosu i rejestrów stanu itp. Samego rdzenia procesora. Więc jeśli przez programowanie sprzętowe masz na myśli rozmowę z własnym procesorem, to tak, asembler pozwala nieco więcej niż C. Jeśli masz na myśli dostęp do zewnętrznego sprzętu, to asembler nie ma przewagi nad C. Ale być może wady, ponieważ często trudniej jest pisać ogólny kod asemblera dla konkretnego urządzenia zewnętrznego, niż ogólny kod C.
To nie jest poprawne. C pozwala ci to wszystko zrobić, chociaż być może będziesz musiał polegać na kodzie C specyficznym dla kompilatora, takim jak słowo kluczowe interrupt.
Na koniec musisz znać oba języki, aby programować MCU, z naciskiem na C.
źródło
a = b[i] + c;
jest o wiele mniej skomplikowane niż instrukcje ładowaniab[i]
(które wymaga obliczeń) ic
rejestrów (które muszą być dostępne), dodawania i przechowywania.W zależności od tego, jak osadzone musisz przejść, C będzie produkować duże, wolne programy. Co znacznie zwiększy koszt tej części produktu. Może to być kropla w oceanie dla całego produktu lub radykalnie zmienić produkt. Tak, niektórzy mogą powiedzieć, że wysiłki związane z tworzeniem oprogramowania i konserwacją są tańsze, co może być prawdą lub fałszem, jeśli jest ono głęboko osadzone i dąży do części o tak małej mocy, małej i niedrogiej, że nie mówimy o dużej ilości kodu. Ten kod jest głównie specyficzny dla tego dostawcy lub tego konkretnego układu, więc będąc w C nie ma żadnych korzyści w zakresie przenoszenia, musisz przepisać przed każdym celem. Dzięki serii cortex-m firmy ARM dopiero teraz zaczynamy być w stanie konkurować z C asmem, nie dlatego, że ludzie nie używali C lub innych języków wyższego poziomu w swoich wbudowanych produktach,
Debata C vs ASM, profesjonalnie, zawsze sprowadza się do napisania jej w C i użycia ASM tam, gdzie można to uzasadnić. I możesz to uzasadnić. W świecie osadzonym występuje wydajność i rozmiar.
Musisz uwzględnić cel w tej dyskusji. Chociaż wiele osób używało C z Microchipem (starsze zdjęcia, nie pic32, który jest mips) za ogromną cenę, jest to straszny zestaw instrukcji dla kompilatorów, bardzo edukacyjny i interesujący zestaw instrukcji, ale kompilator nieprzyjazny. msp430, avr, arm, thumb, mips, wszystko dobre dla kompilatorów. 8051 też źle.
Nawet więcej niż język narzędzi. Zwłaszcza w przypadkach, gdy kłopoty związane z tworzeniem kodu i zarządzaniem są argumentem, potrzebujesz narzędzi, aby być tam dziś i jutro. Posiadanie narzędzia z pojedynczym źródłem, w tym nawet jednego mod gcc, zarządzanego przez jedną grupę, jest ryzykowne z perspektywy biznesowej. Prawdopodobnie znajdziesz więcej niż jednego asemblera, a każdy godny bycia w tym zespole może podnieść asemblera w weekend (o ile zestaw, który piszesz, nie jest zgodny z dyrektywą ghee i jest szczęśliwy makro). Zarówno w przypadku asm, jak i C chciałbyś użyć narzędzi open source (lub własnych narzędzi domowych), gdzie masz większą szansę, nawet jeśli oznacza to użycie maszyny wirtualnej do uruchomienia 10-letniej dystrybucji Linuksa, posiadania narzędzi dostępnych dla żywotność produktu.
Podsumowując, ponownie użyj / naucz / naucz zarówno C, jak i asm, zacznij od C i użyj asm tam, gdzie możesz to uzasadnić.
źródło
W przypadku montażu istnieje nieunikniony kompromis między utrzymywalnością kodu a wydajnością. Możesz napisać łatwy do odczytu / konserwacji zestaw lub możesz napisać wysoce zoptymalizowany kod; ale nie możesz zrobić obu.
W przypadku C kompromis nie całkiem znika, ale jest znacznie mniej zauważalny - możesz napisać łatwe do odczytania / utrzymania C, które jest dość dobrze zoptymalizowane.
Doskonały programista w asemblerze będzie w stanie przezwyciężyć kompilator prawie cały czas, ale przez większość czasu celowo zdecyduje się na napisanie łatwego do odczytania / utrzymania kodu; dlatego też znakomity programista w asemblerze będzie przez większość czasu bity przez kompilator.
Sprytnym sposobem jest użycie zarówno asemblera, jak i C (zamiast tylko asemblera lub tylko C) - np. Użyj C do części kodu, w których znakomity programista w asemblerze wybrałby pisanie kodu możliwego do utrzymania / powolnego i użycie asemblera do reszta (gdzie „wysoce zoptymalizowany i trudny w utrzymaniu” jest faktycznie uzasadniony).
źródło
źródło