-
81. Data: 2012-10-09 15:18:41
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: "M.M." <m...@g...com>
W dniu wtorek, 9 października 2012 10:17:56 UTC+2 użytkownik Maciej Sobczak napisał:
> A może nie zapinajmy w samochodzie pasów bezpieczeństwa i w ogóle jeździjmy
> nocą bez świateł - wtedy będziemy bardziej uważać a nie rozleniwiać się
> złudzeniem uzyskanego tanio bezpieczeństwa. Tak?
Nie mozna wszystkiego porowynywac do swiatel i pasow w smochodzie. Czesto w
zyciu tak sie zdarza, ze lepsze narzedzia wlasnie rozleniwiaja. Pracuje nad
aplikacja w ktorej dla wygody az sie roi od qvector, qhash itd. Pamiec sie
defragmentuje i wersja 32bitowa nie chce dzialac. W wielu miejscach moglem
uniknac uzywania tych dynamicznych struktur, ale wygoda wziela gore.
Pozdrawiam
-
82. Data: 2012-10-09 17:11:47
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Baranosiu <r...@w...pl>
Dnia 09.10.2012 Maciej Sobczak <s...@g...com> napisał/a:
> A może nie zapinajmy w samochodzie pasów bezpieczeństwa i w ogóle jeździjmy nocą
bez świateł - wtedy będziemy bardziej uważać a nie rozleniwiać się złudzeniem
uzyskanego tanio bezpieczeństwa. Tak?
Złudne bezpieczeństwo to byłoby gdybym tylko spojrzał na deskę
rozdzielczą i pomyślał "ok, kontrolka przypominająca o pasach nie
miga, kontrolka od świateł świeci na zielono, a więc mam zapięte pasy
i światła świecą, przecież ufam wskazaniom przyżądów" :D
Ok, skoro tak przy samochodzie się upierasz, to wyobraź sobie, że
mechanik naprawiał Ci hamulce w samochodzie i włożył system ABS od
innego modelu samochodu (tam przecież działał, to czemu nie w
Twoim?). Oczywiście sterownik ABS mógłby wykryć, że jest w
"niekompatybilnym" samochodzie, ale projektantom ABS-a nie przyszło do
głowy takie jego użycie, więc zrezygnowali z mechanizmu
weryfikacji. Mechanik myśli "gdyby coś było nie tak, to przecież ABS
ma kontrolkę informującą o nieprawidłowej pracy". Ty wsiadasz do
samochodu i myślisz "mechanik zna się na robocie, czerwona lampka ABS
nie świeci, więc hamulce są ok", być może nawet przetestujesz hamulce
na prędkości powiedzmy 30-40km/h i wszystko zadziała jak należy a
potem się zdziwisz przy 90km/h :D
-
83. Data: 2012-10-09 23:09:51
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Maciej Sobczak <s...@g...com>
W dniu wtorek, 9 października 2012 17:11:52 UTC+2 użytkownik Baranosiu napisał:
> Ok, skoro tak przy samochodzie się upierasz, to wyobraź sobie, że
> mechanik naprawiał Ci hamulce w samochodzie i włożył system ABS od
> innego modelu samochodu (tam przecież działał, to czemu nie w
> Twoim?). Oczywiście sterownik ABS mógłby wykryć, że jest w
> "niekompatybilnym" samochodzie, ale projektantom ABS-a nie przyszło do
> głowy takie jego użycie, więc zrezygnowali z mechanizmu
> weryfikacji. Mechanik myśli "gdyby coś było nie tak, to przecież ABS
> ma kontrolkę informującą o nieprawidłowej pracy". Ty wsiadasz do
> samochodu i myślisz "mechanik zna się na robocie, czerwona lampka ABS
> nie świeci, więc hamulce są ok", być może nawet przetestujesz hamulce
> na prędkości powiedzmy 30-40km/h i wszystko zadziała jak należy a
> potem się zdziwisz przy 90km/h :D
Tak, to dobra analogia. Chyba dosyć blisko odzwierciedla problem z Ariane 5. Poza,
być może, mechanizmem samozniszczenia, którego, mam nadzieję, w samochodzie nie mam.
:-)
--
Maciej Sobczak * http://www.msobczak.com * http://www.inspirel.com
-
84. Data: 2012-10-24 00:32:03
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Marcin Kowalczyk <q...@g...com>
W dniu środa, 26 września 2012 01:04:42 UTC-7 użytkownik Maciej Sobczak napisał:
>
> "Efficiency considerations had led to the disabling of the software handler (in Ada
code) for this error trap [...]"
>
>
>
> Jeszcze raz: *disabling*.
>
>
>
> Jeszcze raz: *D*I*S*A*B*L*I*N*G*.
>
>
>
> Znaczy się: tak, można w Adzie *wyłączyć* bezpieczniki. To jest język do
programowania "systemowego", więc wszystko musi być tam możliwe, również sytuacja, w
której programista wyraźnie stwierdza, że nie chce pomocy ze strony języka, i że
bierze za to odpowiedzialność. To, co odróżnia Adę od C to fakt, że te bezpieczniki
tam w ogóle są (w C w ogóle nie ma) i że te bezpieczniki są domyślnie włączone. To
właśnie sprawia, że ten język jest bezpieczniejszy.
"Bezpiecznikiem" był if w kodzie, który sprawdzał, czy wartość mieści się w zakresie
int16, i jeśli nie, to podstawiał skrajne wartości z zakresu. "Disabling" polegało na
tym, że tego ifa w ogóle nie było, choć był w analogicznej sekcji kodu obok. Nie był
więc wcale "domyślnie włączony", a w C można było napisać takiego ifa tak samo jak w
Adzie.
-
85. Data: 2012-10-24 09:59:52
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Maciej Sobczak <s...@g...com>
W dniu środa, 24 października 2012 00:32:07 UTC+2 użytkownik Marcin Kowalczyk
napisał:
> "Bezpiecznikiem" był if w kodzie, który sprawdzał, czy wartość mieści się w
zakresie int16, i jeśli nie, to podstawiał skrajne wartości z zakresu.
Oprócz tego jawnego ifa w kodzie Ada wstawia własne ify (albo realizuje to w
jakikolwiek inny sposób) przy każdej konwersji między dwoma typami liczbowymi.
To znaczy, że nawet bez tego jawnego ifa w kodzie Ada ma mechanizm sprawdzający,
który powoduje reakcję na poziomie software'u (wyjatek Constraint_Error, który da się
obsłużyć programowo).
W razie potrzeby służę odpowiednim paragrafem.
> "Disabling" polegało na tym, że tego ifa w ogóle nie było,
"Disabling" musiało też polegać na wyłączeniu tego mechanizmu języka, którego nie
widać, ale który normalnie jest włączony. Dlatego konwersja nie spowodowała rekacji
na poziomie software'u, tylko na poziomie hardware'u, gdzie software nie miał już nic
do powiedzenia.
> Nie był więc wcale "domyślnie włączony",
Był. To wynika z definicji języka.
> a w C można było napisać takiego ifa tak samo jak w Adzie.
Można go też było nie napisać tak jak w Adzie. Różnica polega na tym, że Ada ma
jeszcze pod spodem mechanizm zdefiniowany na poziomie języka, którego C nie ma.
Ten mechanizm jest normalnie włączony, ale można go wyłączyć.
--
Maciej Sobczak * http://www.msobczak.com * http://www.inspirel.com
-
86. Data: 2012-10-24 18:38:29
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Baranosiu <r...@w...pl>
Dnia 24.10.2012 Maciej Sobczak <s...@g...com> napisał/a:
>> a w C można było napisać takiego ifa tak samo jak w Adzie.
>
> Można go też było nie napisać tak jak w Adzie. Różnica polega na tym, że Ada ma
jeszcze pod spodem mechanizm zdefiniowany na poziomie języka, którego C nie ma.
> Ten mechanizm jest normalnie włączony, ale można go wyłączyć.
>
Nie jest wcale tak "zawsze i wszędzie", przykład (liczenie silni metodą
rekurencyjną):
with Ada.Text_Io; use Ada.Text_Io;
with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
procedure Tabelka_silnia is
function Silnia (N:Integer) return Integer is
begin
if (N=0) then
return 1;
else
return N*Silnia(N-1);
end if;
end Silnia;
begin
for I in 1..50 loop
Put(I); Put(Silnia(I));
New_Line;
end loop;
end Tabelka_silnia;
I... dupa, typ wbudowany okazuje się "za mały" na pomieszczenie wyniku
a kontroli zakresów (i generowania wyjątków) nie ma. To że na przykład
GNAT ma opcję -gnato to już inna bajka (mógłby nie mieć i też by
przeszedł testy na zgodność). Żaden język nie zwalnia od myślenia :D
-
87. Data: 2012-10-25 09:45:57
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Maciej Sobczak <s...@g...com>
W dniu środa, 24 października 2012 18:38:35 UTC+2 użytkownik Baranosiu napisał:
> Nie jest wcale tak "zawsze i wszędzie",
Tak jest "zawsze i wszędzie" w Adzie, bo tak mówi standard.
> przykład (liczenie silni metodą
> rekurencyjną):
[...]
> I... dupa,
Nie dupa, tylko wyjątek leci, zgodnie ze standardem.
> GNAT ma opcję -gnato to już inna bajka
To nie jest inna bajka:
http://coding.derkeiler.com/Archive/Ada/comp.lang.ad
a/2006-08/msg00623.html
"GNAT without -gnato is _not_ a standard Ada compiler!"
Użyj kompilatora zgodnego ze standardem, to będziesz miał standardowe zachowanie.
> Żaden język nie zwalnia od myślenia :D
Przecież nikt nigdzie tak nie twierdzi.
--
Maciej Sobczak * http://www.msobczak.com * http://www.inspirel.com
-
88. Data: 2012-10-25 18:21:38
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Baranosiu <r...@w...pl>
Dnia 25.10.2012 Maciej Sobczak <s...@g...com> napisał/a:
>> Nie jest wcale tak "zawsze i wszędzie",
>
> Tak jest "zawsze i wszędzie" w Adzie, bo tak mówi standard.
>
>> przykład (liczenie silni metodą
>> rekurencyjną):
> [...]
>> I... dupa,
>
> Nie dupa, tylko wyjątek leci, zgodnie ze standardem.
>
>> GNAT ma opcję -gnato to już inna bajka
>
> To nie jest inna bajka:
>
> http://coding.derkeiler.com/Archive/Ada/comp.lang.ad
a/2006-08/msg00623.html
>
> "GNAT without -gnato is _not_ a standard Ada compiler!"
>
> Użyj kompilatora zgodnego ze standardem, to będziesz miał
> standardowe zachowanie.
To że ktoś gdzieś na forum tak pisze dorabiając swoje wytłumaczenie to jego
sprawa. W AdaRM wyraźnie jest napisane (odnośnie Ada95):
All parameter and result subtypes of the predefined integer operators
are of such unconstrained subtypes, allowing extended-length registers
to be used as operands or for the result. In an earlier version of Ada
95, Integer was unconstrained.
Co innego jak się dodało jawnie 'range', ale bez tego Ada95 nie była
zobligowana do wygenerowania wyjątku (a że kompilatory dodawały to
jako opcję, to się wcale nie dziwię, bo to była luka w
standardzie), to samo zresztą dotyczyło typów rzeczywistych (mogły
zwrócić "nieskończoność" bez generowania wyjątku jeśli się nie ustawiło
odpowiednio zakresu).
-
89. Data: 2012-10-27 09:05:45
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Maciej Sobczak <s...@g...com>
W dniu czwartek, 25 października 2012 18:21:45 UTC+2 użytkownik Baranosiu napisał:
> To �e kto� gdzie� na forum tak pisze dorabiaj�c swoje wyt�umaczenie to
jego
> sprawa.
To samo jest napisane w dokumentacji do GNATa, tylko bardziej rozwlekle. To, że ktoś
gdzieś na forum usilnie próbuje rozkręcić flejma wokół czegoś, co nie jest problemem,
to jego sprawa.
Rekurencyjnie liczona silnia na Integerach to najbardziej oderwany od rzeczywistości
przykład jaki może być i to na dwóch poziomach. Nie dość, że sama silnia liczona w
ten sposób to najbardziej nadużywany przykład w historii, to jeszcze posłużyłeś się
gołym typem Integer. Nikt tak nie robi (w szczególności: nikt tak nie zrobił w
Ariane). Definiuje się nowy typ (albo chociaż podtyp) odpowiednio do dziedziny
problemu - nie mam pojęcia z jakiej dziedziny pochodził Twój przykład z silnią, ale
poprawiając ten sztuczny przykład przez użycie adekwatnie sztucznego typu wyszłoby
coś takiego:
with Ada.Text_IO;
use Ada.Text_IO;
procedure Test is
type My_Int is range 0 .. 1000;
function Silnia (N : in My_Int) return My_Int is
begin
if N = 0 then
return 1;
else
return N * Silnia (N-1);
end if;
end Silnia;
begin
for I in My_Int range 1 .. 50 loop
Put (My_Int'Image (I) & " " &
My_Int'Image(Silnia (I)));
New_Line;
end loop;
end Test;
I teraz masz bardziej realistyczny wyjątek z powodu testu "range check" a nie
"overflow check". Co więcej, łatwo swierdzić (statycznie), że użyte w kodzie operacje
na My_Int nie mają prawa przekręcić typu bazowego, więc "overflow check" nie jest
potrzebny - i to niezależnie od opcji -gnato ani od jej domyślnych ustawień.
Czyli Twój przykład z silnią opisuje problem, którego nie ma.
Nie ma go nawet w... przykłdzie z silnią.
> W AdaRM wyra�nie jest napisane (odno�nie Ada95):
Wyraźnie mamy rok 2012, więc od Twoich rozważań dzielą nas dwie edycje standardu.
Twoje rozważania nie dotyczą też kodu z Ariane (ani żadnego realnie napisanego kodu),
więc... o co chodzi?
--
Maciej Sobczak * http://www.msobczak.com * http://www.inspirel.com
-
90. Data: 2012-10-27 16:53:32
Temat: Re: Dlaczego software to F35 jest pisany w C++ a nie w Ada
Od: Baranosiu <r...@w...pl>
Dnia 27.10.2012 Maciej Sobczak <s...@g...com> napisał/a:
> with Ada.Text_IO;
> use Ada.Text_IO;
>
> procedure Test is
>
> type My_Int is range 0 .. 1000;
No jak tak obetniesz, to Ci wyskoczy wyjątek, bo wystarczy że wynik
trafi powiedzmy w 1001, ale daj range Integer'First+1 .. Integer'Last-1;
i już wyjątek "fartem" nie wyskoczy pomimo przepełnienia. Po prostu
był błąd w specyfikacji Ada95 (a taka obowiązywała w momencie lotu
Ariane 5 :D) wg której 'range' było sprawdzane w momencie przypisania
i jeśli pomimo "przekręcenia się licznika" wynik "fartem" siedział w
zakresie zdefiniowanym przez 'range' to było ok.
Załóżmy, że sprzętowo Integer jest powiedzmy 8-bitowy (wartości od
-128 do 127, tak wiem, według specyfikacji musi być co najmniej
16-bitowy ze znakiem, ale chodzi o prostotę przykładu), wtedy jeśli
zrobisz
subtype MyType is Integer range -100 .. 100;
To wynik działania 2*100 nie wygeneruje wyjątku, bo to daje -56 (w
arytmetyce 8-bitowej ze znakiem) a więc mieści się w zakresie
-100..100. Ada95 niestety nie była odporna na takie rzeczy i tyle
(niedoprecyzowana specyfikacja).
Nie twierdzę, że podany przykład liczenia silni jest wzorem dobrego
programowania, czy super optymalną metodą numeryczną, chodziło mi o
podanie prostego przykładu, gdzie Ada95 nie ratowała "automagicznie"
(przez na przykład wygenerowanie wyjątku) gdy obliczenia wyskakiwały
poza zakres. Przy tego typu przepełnieniach bezpieczniki nie miały
znaczenia (chyba, że kompilator miał dodatkowe mechanizmy ich
wykrywania, ale to nie było wymagane przez specyfikację).