Skocz do zawartości

Co w Arduino piszczy? cz.3


Pomocna odpowiedź

Napisano

Co w Arduino piszczy? cz.3

Poznaliśmy już schemat Arduino, wiemy jak działa bootloader oraz jak wgrać program do naszego modułu. Czas zobaczyć co kryje się pod Arduino IDE. Opis dotyczy wersji 1.6.10, ale starsze oraz nowsze wydania raczej nie będą różniły się zbyt drastycznie. Na początek musimy pobrać i zainstalować środowisko programistyczne. Ja wybrałem domyślną lokalizację: C:\Program Files (x86)\Arduino

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Co ciekawe plik test1.ino.hex to gotowy obraz dla avrdude – znowu standardowy, bez magii niestety.

Ale dlaczego "niestety"? Osobiście jestem bardzo wielkim fanem standardów, a za to nie przepadam za tym, co jest często nazywane "magią", a co zazwyczaj jest po prostu ukrytym zachowaniem. Tutaj mamy wszystko otwarte i widoczne jak na tacy, dzięki czemu nie tylko możemy swobodnie włączać do naszych programów elementy bardziej zaawansowane, nie pochodzące ze środowiska Arduino, w miarę jak je poznajemy, a w pewnym momencie nawet całkowicie porzucić to środowisko i robić wszystko samemu, jeśli akurat taką chęć lub potrzebę mamy.

Napisałem "niestety", bo trochę liczyłem że jednak Arduino daje coś więcej niż tylko niezbyt wygodny edytor - Sketch. Oczywiście masz rację, że lepiej używać standardowego C, niż jakiegoś nowego, dziwnego języka, ale w bardzo wielu miejscach można przeczytać, że Arduino wykorzystuje coś "podobnego" do C, więc spodziewałem się odrobiny magii, może chociaż pre-kompilatora - podobnie jak w przypadku Qt.

Magia się pojawia kiedy masz więcej niż jeden plik z kodem. Wtedy Arduino robi rzecz kretyńską, a mianowicie łączy wszystkie twoje pliki w jeden, w kolejności alfabetycznej.

Pisząc artykuł chciałem przekazać, że nie ma czegoś takiego jak "język Arduino", to tylko zwykłe C++. Ale chyba jednak mi się nie udało 🙁

Wiesz, C++ też się początkowo "kompilował" do C jakimiś makrami i dodawał swoje pliki nagłówkowe. Jeśli tak bardzo przeszkadza ci nazywanie tego "językiem", to może powinienem mówić "standard Arduino"?

Chodziło mi o język, nie o kompilator. Kompilator może generować kod maszynowy, ale również inny język - np. większość kompilatorów C/C++ możne generować kod w asemblerze. Nie byłoby jednak problemu napisać kompilator, który na wyjściu tworzy program np. w Pythonie.

To jak działa kompilator to raczej temat na oddzielny artykuł, pewnie sporo obszerniejszy.

Nie chcę się spierać o nazewnictwo, po prostu dla mnie było to ciekawe odkrycie, że Arduino wykorzystuje język C++.

Pod względem języka programowania nie ma między C++, a "językiem Arduino" żadnej różnicy, to te same języki formalne. Wymyślanie więc nowych nazw to raczej wprowadzanie niepotrzebnego zamieszania.

Ale właśnie jest różnica. Różnica jest w tym jakie biblioteki "standardowe" masz dostępne. Różnica jest w tym ile rzeczy jest doklejanych do twojego programu na początku, różnica jest w tym jak traktowane są twoje pliki z kodem. Te wszystkie rzeczy są dość dobrze opisane w standardzie C++ i zapewniam cię, że to, co robi Arduino standardu tego nie spełnia -- wniosek, nie jest to już C++, choć na C++ jest w 99.99% oparte i pozawala ci nawet w C++ pisać, jeśli odpowiednio nazwiesz swój plik z kodem (i nikt tego nigdy nie ukrywał, jest to informacja ogólnie dostępna i chyba każde wprowadzenie do Arduino od tego zaczyna).

Można się jeszcze spierać, że biblioteki, makra i ten main() to w zasadzie wykorzystują normalne mechanizmy języka C++ i tylko stanowią swoisty framework, ale dla mnie ostatnią kroplą, która przepełniła czarę jest właśnie to łączenie wszystkiego w jeden plik z kodem źródłowym -- to już nie używa mechanizmów zdefiniowanych w C++, tylko osobnego, dodatkowego preprocesora, który jest kompletnie z czapy. Zatem nie jest to już standardowy C++. Poprawne programy w C++ potraktowane w ten sposób nie będą działać.

Wydaje mi się, że trochę za duży offtopic z tej dyskusji wychodzi. Moim zdaniem konkatenacja kilku plików nie jest wystarczającym powodem do nazywania tego nowym językiem (preprocesor C też coś takiego potrafi).

Natomiast co do biblioteki C++ to mnie zaskoczyłeś - nie sprawdziłem, ale mogę się upewnić jak wrócę do domu. Dlaczego nie miałoby być standardowej biblioteki C++ w Arduino? O ile pamiętam g++ zainstalowany jest tak samo jak np. w WinAVR, więc jest to 100% kompilator C++ i biblioteki też powinny być na miejscu.

Nie o to mi chodziło. Standardowa biblioteka C++ w Arduino jest (no, dobra, te kawałki, które są w gcc-avr, czyli nie cała). Ale w Arduino jest też dużo więcej bibliotek "w standardzie". Powstaje z tego nowy język (chyba, że wolisz to nazywać frameworkiem, albo po polsku, ramówką) -- osoby nauczone jednego nie będą potrafiły korzystać z drugiego bez dodatkowej nauki i vice versa.

Ok, wreszcie doszliśmy do wspólnych wniosków - Arduino używa C++ (faktycznie nie ma wszystkich bibliotek, standard jest na poziomie C++98).

Natomiast Arduino dostarcza własne biblioteki, co napisałem w artykule i w pełni się z tym zgadzam. Nie uważam, żeby dodanie bibliotek zmieniało sam język, chociaż faktycznie ma wpływ na sposób programowania. Propobuję na tym zamknąć temat, bo chyba dużo więcej o tym piszemy niż warto.

  • 4 tygodnie później...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...