eXec.plMAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA
MAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA

niedziela, 17. października, 2021, 22:02

Amiga forum / C/C++ / Wstęp do programowania pod AmigaOS 4 - tłumaczenie "Migration Guide"

Czytasz wątek: Wstęp do programowania pod AmigaOS 4 - tłumaczenie "Migration Guide"

hextreme
Nieaktywny użytkownik starego forum

Wstęp do programowania pod AmigaOS 4 - tłumacze... wysłany: 2011-05-22 16:07

Tłumaczenie rozdziału 1 i 2 z dokumentu "Migration Guide" załączonego do SDK do systemu AmigaOS 4.

Wstęp do pisania pod systemy operacyjne AmigaOS4.x.

1. Wprowadzenie
Żeby być w pełni kompatybilnym z klasycznym API istnieje kilka zasad, które programista powinien przestrzegać portując programy z komputerów z procesorami 68k i AmigaOS3.x na nowe z procesorami PowerPC i AmigaOS4.x. Ten dokument zawiera zarys procesu jak również wskazuje na kilka potencjalnych pułapek i problemów.

2. Poziom Kodu Źródłowego

2.1. Pliki Nagłówkowe

Pliki nagłówkowe były rzeczą problematyczną pod OS3.x ponieważ było wiele różnych kompilatorów i większość z nich miała tendencję do używania własnego schematu nazewnictwa i była "przyklejona" do systemu operacyjnego. Dobrze znane kompilatory SAS/C oraz StormC używały #pragmas podczas gdy GCC używał funkcji inline lub dyrektyw #define. AmigaOS 4 obecnie używa dwóch systemów kompilatorów (GNU GCC oraz pakiet VBCC) i oba używają tego samego schematu dla plików nagłówkowych.

By użyć biblioteki pod AmigaOS 4 po prostu załączasz jego plik proto, jako dodatek do każdego pliku który może być potrzebny. Na przykład, żeby użyć Okienek i Ekranów Intuition mógłbyś zastosować następujący program:


#include 
#include
#include

Plik proto załącza niezbędne nagłówki, które mogą zależeć od kompilatora, który używasz. Po prostu załączając plik proto zapewniasz maksymalną kompatybilność pomiędzy różnymi kompilatorami.

Kilka symbolów preprocesora określa sposób w jaki załączane są systemowe przypisania. Tabela 1 podsumowuje te symbole. Zwykle definuje się je w pliku Makefile, jednakże mogą tez być zawarte w dyrektywach #define. Nie przejmuj się jeśli nie rozumiesz wszystkiego w treści tabeli; zostanie to wyklarowane w dalszej części dokumentu.


__USE_INLINE__

Ten symbol powoduje, że załączony zostaje również plik inline4. Plik inline4 zawiera makra preprocesora do funkcji, które w klasyczny sposób definują wywoływanie systemowych funkcji (tzn. funkcji, a nie metod). Pierwotną intencją jest kompatybilność ze starymi kodami źródłowymi, jak również ogólna kompatybilność.


__NOLIBBASE__

Zapobiega definicji bazy biblioteki (library base) załączonej do pliku proto. Zwykle plik proto deklaruje zewnętrzny symbol dla bazy biblioteki.


__USE_BASETYPE__

Jeśli __NOLIBBASE__ nie jest zdefiniowany, ten symbol określa czy baza biblioteki jest określona swoim realnym type, czy bazowym typem abstrakcyjnym klasy zasobu (struktura Library bądź Device). Tyle implementory bibliotek powinny używać tego symbolu; zwykle, wszystkie struktury baz bibliotek są prywatne i nie powinny być czytane. Zwyczajowo zalecane jest deklarowanie wszystkich baz bibliotek jako struktury Library, a wszystkie bazy urządzeń jako struktury Device.


__NOGLOBALIFACE__

Pliki proto dla bibliotek, które deklarują statyczny globalny interfejs (jak wszystkie "klasyczne" biblioteki) zwykle również deklarują wskaźnik do interfejsu wewnatrz pliku proto, chyba że ten symbol zostanie zdefiniowany. Zwykle użyjesz tego symbolu tylko w przypadku gdy chcesz przechowywać wskaźnik do interfejsu gdzieś indziej, na przykład w bazie biblioteki.

Mówiąc o symbolach preprocesora warto wspomnieć, że kompilator definiuje symbol preprocesora kiedy platformą docelową jest AmigaOS 4.x __amigaos4__ i możesz używać tego symbolu do kompilacji warunkowej.

2.2 Bazy Bibliotek i Wskaźniki do Interfejsu

Bazy bibliotek powinny być normalnie zadeklarowane wewnątrz kodu źródłowego. Plik proto zwykle deklaruje wymaganą bazę biblioteki samodzielnie. Jeśli chcesz mimo wszystko sam zadeklarować bazę, powinieneś zdefiniować symbol preprocesora __NOLIBBASE__ by plik proto nie deklarował tej bazy.

W przeciwieństwie do starego systemu, AmigaOS 4 ma trochę inny sposób na wywoływanie funkcji bibliotecznych. Stary system używał do wywoływania funkcji bibliotecznej relatywny skok do tabeli skoków położonej bezpośrednio przed bazą biblioteki. AmigaOS 4 zachowuje te tablice skoków tylko do kompatybilności wstecz - tylko funkcje 68k są wywoływane nadal w ten sposób. Nowy OS przechowuje tablice skoków w oddzielnym wskaźniku nazywanym "Wskaźnikiem do Interfejsu", lub w skrócie "interfejsem". Zasadniczo interfejs jest strukturą z informacjami administracyjnymi oraz mnóstwem wskaźników inline do funkcji. Biblioteka może wyeksportować więcej niż jeden wskaźnik do interfejsu (zwykle eksportuje co najmniej dwa). Prawie wszystkie biblioteki eksportują swój interfejs o nazwie "main". Dokładny typ tego interfejsu zależy od biblioteki. Na przykład exec.library eksportuje główny interfejs typu "struct ExecIFace *" (Zauważ, że teoretycznie byłoby możliwe wyeksportowanie interfejsu typu "struct ExecIFace *" przez inną bibliotekę).

Tak jak bazy bibliotek wcześniej były używane do wywoływania funkcji bibliotecznych, tak konwencją jest, że globalna zmienna jest używana by uczynić wskaźnik do ExecIFace dostępny we wszystkich funkcjach Twojego programu. Nazwa zmiennej jest tworzona poprzez poprzedzenie nazwy bazy biblioteki ("Exec" w tym przykładzie) przez duże I. Toteż, globalny wskaźnik do ExecIFace (struct ExecIFace *) może być nazywany IExec. Zauważ, że to jest po prostu konwencja wprowadzona w plikach proto. Nie musisz w ogóle używać globalnych wskaźników do interfejsów, jak również nie musisz używać globalnych wskaźników do bibliotek (ani teraz w AmigaOS 4, ani w AmigaOS 3.9 czy wcześniejszych wersjach).

2.3 Konsystencja Typów

Podrecznik do architektury PowerPC zwykle używa słowa "word" do określenia wartości 32-bitowej. Jednakże klasyczny AmigaOS jako typ WORD oraz UWORD uważał wartość 16-bitową ze znakiem bądź bez znaku. Podobnie, 8-bitowa wartość zwykle była określana jako BYTE lub UBYTE, a 32-bitowe "słowa" były nazywane LONG oraz ULONG. Nie istniały wartości 64-bitowe. By wyklarować nazewnictwo typów bazowych, te typy zostały unieważnione w AmigaOS 4. Nowe typy są konsekwentnie nazywane int or uint po czym następuje liczba bitów, np. uint32 oznacza 32-bitową wartość bez znaku. Podobnie, typy zostały rozszerzone by zawierać wartości 64-bitowe. Tabela 2 przedstawia nowe typy oraz "klasyczne" typy, które zastępują. Zauważ, że stare typy są nadal dostępne poprzez definicje preprocesora, ale nie powinny być już używane w nowym kodzie.



Nowy Typ Stary Typ Znaczenie
int8/uint8 BYTE/UBYTE 8 bitowa liczba całkowita ze znakiem/bez znaku
int16/uint16 WORD/UWORD 16 bitowa liczba całkowita ze znakiem/bez znaku
int32/uint32 LONG/ULONG 32 bitowa liczba całkowita ze znakiem/bez znaku
int64/uint64 Nie istniał 64 bitowa liczba całkowita ze znakiem/bez znaku
float32 FLOAT 32 bitowa liczba zmiennopozycyjna pojedyńczej przecyzji
float64 DOUBLE 64 bitowa liczba zmiennopozycyjna podwójnej precyzji



Odpowiedz

konrad
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-22 19:01



#include 
#include



Jaka jest różnica pomiędzy tymi liniami?

Odpowiedz

hextreme
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-22 19:11

@konrad


#include 
#include



Jaka jest różnica pomiędzy tymi liniami?




Są to kompletnie różne pliki nagłówkowe. Pierwszy załącza m.in. definicje struktur i stałych używanych przez intuition.library, drugi m.in. prototypy funkcji intuition.library. Jeśli korzystasz z funkcji intuition.library w programie to konieczne jest załączenie tego drugiego pliku nagłówkowego, jeśli korzystasz ze struktur i stałych to tego pierwszego.

Odpowiedz

eee111
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-22 21:05

@hextreme
@konrad


#include 
#include



Jaka jest różnica pomiędzy tymi liniami?




Są to kompletnie różne pliki nagłówkowe. Pierwszy załącza m.in. definicje struktur i stałych używanych przez intuition.library, drugi m.in. prototypy funkcji intuition.library. Jeśli korzystasz z funkcji intuition.library w programie to konieczne jest załączenie tego drugiego pliku nagłówkowego, jeśli korzystasz ze struktur i stałych to tego pierwszego.




Brawo, w końcu jakiś rzeczowy wątek został poruszony na forum, zamiast bicia piany nad wyższością Świąt Bożego Narodzenia nad Świętami Wielkiej Nocy Widzę, że zatwardziali Amigowcy są trochę na bakier z programowaniem

Proponuję rozszerzenie wątku o jakieś proste przykłady, czekam na więcej.

Odpowiedz

konrad
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-22 21:54

@hextreme
Pierwszy załącza m.in. definicje struktur i stałych używanych przez intuition.library




Co jest w definicjach struktur i co opisują te stałe?



Odpowiedz

hextreme
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-22 22:20

@konrad
@hextreme
Pierwszy załącza m.in. definicje struktur i stałych używanych przez intuition.library




Co jest w definicjach struktur i co opisują te stałe?




Po takie detale odsyłam do ROM Kernel Reference Manual oraz Intuition.doc w katalogu Autodocs. Generalnie w definicjach struktur zawarte są publiczne pola struktur Intuition takich jak Window (okno), Screen (ekran), IntuiMessage (wiadomość Intuition), Gadget (gadget) itp. Jednakże ze względu na to, że istnieją prywatne pola, jeśli odnosimy się do struktur Intuition w AmigaOS 4 warto używać pewnych wyspecjalizowanych do tego funkcji np. IIntuition->GetWindowAttr(), który pobiera dany atrybut okienka (czyli struktury Window). W AmigaOS 3.x większość z tych pól była publiczna, ale w AmigaOS 4 te struktury musiały się naturalnie rozszerzyć i zawierają nowe pola, do których odnosimy się właśnie dzięki tym funkcjom (tzw. akcesorom).

Stałe zaś to są pewne stałe symboliczne używane przez Intuition, np. tagi używane przez funkcję IIntuition->OpenWindowTagList() opisujące cechy i atrybuty otwieranego okienka itp.

Jak widzę ta forma szkółki się podoba, myślę, że warto to pociągnąć w taki sposób, przetłumaczę resztę rozdziałów z "Migration Guide" gdzie opisane jest m.in. jak otwierać biblioteki w AmigaOS 4, jak automatycznie zlecić kompilatorowi otwarcie bibliotek itp., także wszystko to co potrzebuje wiedzieć programista AmigaOS 3 by zacząć pracę na AmigaOS 4. Na przykłady przyjdzie czas później. Najpierw nieco teorii i niezbędnych podstaw.

Odpowiedz

eee111
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-23 12:37

@konrad
@hextreme
Pierwszy załącza m.in. definicje struktur i stałych używanych przez intuition.library




Co jest w definicjach struktur i co opisują te stałe?





Konrad zajmujesz się programowaniem ???

Odpowiedz

konrad
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-23 13:21

@eee111
Konrad zajmujesz się programowaniem ???




W C nie programowałem. Znam PHP i JavaScript.

Odpowiedz

konrad
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-23 13:23

@hextreme
Jak widzę ta forma szkółki się podoba, myślę, że warto to pociągnąć w taki sposób, przetłumaczę resztę rozdziałów z "Migration Guide" gdzie opisane jest m.in. jak otwierać biblioteki w AmigaOS 4, jak automatycznie zlecić kompilatorowi otwarcie bibliotek itp., także wszystko to co potrzebuje wiedzieć programista AmigaOS 3 by zacząć pracę na AmigaOS 4. Na przykłady przyjdzie czas później. Najpierw nieco teorii i niezbędnych podstaw.




Dorzucaj proszę kolejne rozdziały jako nowe wątki na forum. Wtedy będzie łatwiej dodawać komentarze do poszczególnych tematów i będzie mniej bałaganu.

Odpowiedz

eee111
Nieaktywny użytkownik starego forum

Wstęp do pisania pod AmigaOS4 - tłumaczenie "Mi... wysłany: 2011-05-23 17:45

@konrad
@eee111
Konrad zajmujesz się programowaniem ???




W C nie programowałem. Znam PHP i JavaScript.




Czyli coś tam popisałeś W każdym razie przydatna inicjatywa i w końcu sensowny wątek na forum ...

Odpowiedz

konrad
Nieaktywny użytkownik starego forum

Re:Wstęp do programowania pod AmigaOS 4 - tłuma... wysłany: 2011-06-08 21:52

Kiedy będą kolejne tłumaczenia?

Odpowiedz

hextreme
Nieaktywny użytkownik starego forum

Re:Wstęp do programowania pod AmigaOS 4 - tłuma... wysłany: 2011-06-18 11:29

@konrad
Kiedy będą kolejne tłumaczenia?




Kiedy skończy się sesja egzaminacyjna na studiach, czyli (o ile wszystko pójdzie po mojej myśli) w lipcu Teraz otwarto forum wielotematyczne w Hyperionie, warto też tam zaglądać i zarejestrować się jeśli ktoś na poważnie myśli o rozwoju oprogramowania dla Amigi.

Warto też zrobić małą ankietę dot. polskiego środowiska programistycznego Będę wtedy wiedział, które tematy podjąć i na jakim poziomie zaawansowania są polscy programiści. Pytanie dotyczyłoby czy jesteś zainteresowany pisaniem oprogramowania dla Amigi oraz na jakim poziomie zaawansowania jesteś.

Odpowiedz

konrad
Nieaktywny użytkownik starego forum

Re:Wstęp do programowania pod AmigaOS 4 - tłuma... wysłany: 2011-06-18 12:56

@hextreme
Warto też zrobić małą ankietę dot. polskiego środowiska programistycznego Będę wtedy wiedział, które tematy podjąć i na jakim poziomie zaawansowania są polscy programiści. Pytanie dotyczyłoby czy jesteś zainteresowany pisaniem oprogramowania dla Amigi oraz na jakim poziomie zaawansowania jesteś.




A jakie poziomy zaawansowania powinny trafić do odpowiedzi w takiej ankiecie?

Odpowiedz

ppascal
Nieaktywny użytkownik starego forum

Wstęp do programowania pod AmigaOS 4 - tłumacze... wysłany: 2011-06-18 16:22

@hextreme


__USE_BASETYPE__

Jeśli __NOLIBBASE__ nie jest zdefiniowany, ten symbol określa czy baza biblioteki jest określona swoim realnym type, czy bazowym typem abstrakcyjnym klasy zasobu (struktura Library bądź Device). Tyle implementory bibliotek powinny używać tego symbolu; zwykle, wszystkie struktury baz bibliotek są prywatne i nie powinny być czytane. Zwyczajowo zalecane jest deklarowanie wszystkich baz bibliotek jako struktury Library, a wszystkie bazy urządzeń jako struktury Device.
(...)
Tak jak bazy bibliotek wcześniej były używane do wywoływania funkcji bibliotecznych, tak konwencją jest, że globalna zmienna jest używana by uczynić wskaźnik do ExecIFace dostępny we wszystkich funkcjach Twojego programu.
(...)




hextreme, długo się zastanawiałem czy się odezwać... Nie chcę Cię demotywować, ale mam pewne zastrzeżenia co do sensu tej pracy którą włożyłeś w tłumaczenie.
Po pierwsze wydaje mi się, że programista zdolny do tworzenia oprogramowania w C/C++ dla AOS będzie też zdolny do lektury oryginalnej dokumentacji. A po drugie dlatego, że jeśli faktycznie ktoś miałby mieć problem ze zrozumieniem tekstu angielskiego, to Twoje tłumaczenie raczej mu nie pomoże. Duże bloki tekstu stanowią wyraźną "kalkę" tekstu: tłumaczenie mechaniczne, niemal maszynowe. Miejscami zostawiasz oryginalną składnię i szyk zdania angielskiego tak, jakbyś nie był w stanie napisać równoważnego zdania po polsku -- to znaczy, jakbyś danego zdania po prostu nie zrozumiał. Nie mówię że tak jest: ale jeśli nie rozumiesz tekstu, nie tłumacz go, bo odbiorcy przekładu tym bardziej nie mają szans zrozumieć. A jeśli rozumiesz, włóż troszkę więcej pracy w napisanie tego co zrozumiałeś, bez mechanicznego wstawiania polskich słów w angielskie zdanie, bo uzyskujesz szyk odwrotny...

Żeby nie było, że tylko krytykuję: bardzo chętnie pomogę przeredagować ten przekład (jeśli się na to zgodzisz, w końcu to Twoje tłumaczenie); Mogę też się zobowiązać do przetłumaczenia kolejnych rozdziałów (przy wątpliwościach merytorycznych chętnie się z Tobą skonsultuję) -- nie wiem tylko jak wygląda sprawa zgody na ew. tłumaczenie.

Odpowiedz

hextreme
Nieaktywny użytkownik starego forum

Wstęp do programowania pod AmigaOS 4 - tłumacze... wysłany: 2011-06-19 01:50

@ppascal

hextreme, długo się zastanawiałem czy się odezwać... Nie chcę Cię demotywować, ale mam pewne zastrzeżenia co do sensu tej pracy którą włożyłeś w tłumaczenie.
Po pierwsze wydaje mi się, że programista zdolny do tworzenia oprogramowania w C/C++ dla AOS będzie też zdolny do lektury oryginalnej dokumentacji. A po drugie dlatego, że jeśli faktycznie ktoś miałby mieć problem ze zrozumieniem tekstu angielskiego, to Twoje tłumaczenie raczej mu nie pomoże. Duże bloki tekstu stanowią wyraźną "kalkę" tekstu: tłumaczenie mechaniczne, niemal maszynowe. Miejscami zostawiasz oryginalną składnię i szyk zdania angielskiego tak, jakbyś nie był w stanie napisać równoważnego zdania po polsku -- to znaczy, jakbyś danego zdania po prostu nie zrozumiał. Nie mówię że tak jest: ale jeśli nie rozumiesz tekstu, nie tłumacz go, bo odbiorcy przekładu tym bardziej nie mają szans zrozumieć. A jeśli rozumiesz, włóż troszkę więcej pracy w napisanie tego co zrozumiałeś, bez mechanicznego wstawiania polskich słów w angielskie zdanie, bo uzyskujesz szyk odwrotny...

Żeby nie było, że tylko krytykuję: bardzo chętnie pomogę przeredagować ten przekład (jeśli się na to zgodzisz, w końcu to Twoje tłumaczenie); Mogę też się zobowiązać do przetłumaczenia kolejnych rozdziałów (przy wątpliwościach merytorycznych chętnie się z Tobą skonsultuję) -- nie wiem tylko jak wygląda sprawa zgody na ew. tłumaczenie.



Masz po części rację, tłumaczenie było przede wszystkim na szybko, zatem było dość mechaniczne. Starałem się jednakże zrozumieć wszystkie zdania po angielsku, ale przyznam się, że niektórych szczegółów technicznych nie do końca zrozumiałem (choćby przytoczony fragment), ale to jest w zasadzie jedyny przykład. Tego symbolu nigdy nie używałem, więc nie wiedziałem za bardzo jakie on ma zastosowanie. Poza tym to jest już wyższa szkoła jazdy i przeznaczona raczej dla bardziej zaawansowanych programistów piszących pod AmigaOS. Tłumaczenie z grubsza rzecz biorąc jest poprawne, starałem się zrobić je dobrze. Myślę, że kolejne tłumaczenia będą już lepsze, o ile nie zdecyduję się zrobić szkółki według własnego pomysłu bazując na tych tekstach. Może to lepsze rozwiązanie niż wierne zachowanie treści oryginału? Bardzo dziękuję za chęć pomocy i chętnie skorzystam! Podejrzewam, że jesteś równie zaawansowanym programistą i możemy razem pociągnąć taką szkółkę. Bardzo dziękuję za krytyczne uwagi, pozwoli to uczynić teksty jeszcze lepszymi!

Ten tekst przeznaczony jest dla kogoś, kto jest już obcykany z symbolami preprocesora, opisuje ono jakie podstawowe symbole preprocesora pojawiają się w AmigaOS4.x oraz jakie podstawowe typy danych pojawiają się przy architekturze PowerPC.

Jeśli chodzi o to, czy amigowi programiści powinni znać angielski na takim poziomie to w się gruncie rzeczy zgodzę. Miałem problemy ze zrozumieniem niektórych fragmentów ponieważ użyta jest bardzo fachowa terminologia. Myślę jednak, że wywiązałem się z zadania wystarczająco dobrze.

Co do pozwolenia na tłumaczenie kolejnych fragmentów można by zapytać się w tej sprawie na nowo-utworzonym forum firmy Hyperion Entertainment.

@konrad
A jakie poziomy zaawansowania powinny trafić do odpowiedzi w takiej ankiecie?



Szczerze mówiąc nie wiem, załóżmy, że osoby znają już język C albo C++ oraz powiedzmy
- Początkujący (nie zna AmigaOS)
- Początkujący (zna AmigaOS)
- Średnio-zaawansowany (zna kompilator GCC, czytał ROM Kernel Reference Manual i inne źródła wiedzy)
- Zaawansowany (Amiga nie ma przed nim nic do ukrycia, napisał już programy dla AmigaOS)

Ja mógłbym sklasyfikować się jako średnio-zaawansowany. Ale z pewnym żalem muszę stwierdzić, że sporo osób które programują dla AmigaOS4.1 nie znają AmigaOS API i taki pozostaje im obcy. Skupianie się tylko na portowaniu programów niestety nie uczy API AmigaOS. Cóż, takie czasy.

Odpowiedz

1 2 następna »

AmigaOS.pl