Wpis z mikrobloga

Wrzucona przeze mnie zagadka z #gnudc nie została rozwiązana, więc zacznę od początku i w skrócie opiszę to narzędzie.

GNU DC to kalkulator używający tzw. odwrotnej notacji polskiej (reverse Polish notation). Co to oznacza? Przykładowe wyrażenie matematyczne 2 + 3 * 4 zapisalibyśmy w RPN jako: 2 3 4 * +. Taki zapis pozwala nam wykluczyć posługiwanie się nawiasami do określania kolejności działań, gdyż zawsze jest ona jednoznaczna. Drugi przykład: (2 + 3) * 5 zapisalibyśmy jako 2 3 + 5 *. Jak widać, mimo że nie jesteśmy przyzwyczajeni do takiego zapisu, to od razu rzuca się w oczy łatwość przetwarzania takiego zapisu przez program komputerowy (w odróżnieniu od konieczności parsowania nawiasów i analizowania priorytetów operatorów).

W tym momencie można zadać sobie pytanie. jak takie wyrażenie jest przetwarzane przez program? Od strony technicznej jest to zaimplementowane jako stos. Każda wpisana wartość jest wrzucana na stos (od lewej do prawej), a każdy operator zdejmuje ze stosu odpowiednią liczbę wartości (na ogół dwie) i odkłada na stos wynik operacji. Wyniki pokazują się po wpisaniu wartości p (tak jak pop - podnieś, albo print - napisz) lub f (full - pokazuje cały stos).

Jeśli chcemy skorzystać z dc w celu wykonania prostego obliczenia np. 999 * 1.23 piszemy polecenie:

dc -e '999 1.23 * p'
Jeśli chcemy policzyć sumę liczb od 1 do 10, napiszemy:

dc -e '10 9 8 7 6 5 4 3 2 1 + + + + + + + + + p'
#gnudc posiada też wiele dodatkowych funkcji, takich jak warunkowe wykonywanie kodu, rejestry i dodatkowe stosy, które pozwalają na implementowanie w nim całkiem zaawansowanych funkcji i algorytmów.

#linux #programowanie #unix
  • 20
czytelne - ale dla komputera, dla człowieka to się nie nadaje


@slucham-psa-jak-gra: @Sibuyas: czlowiek to wymyslil bo drugi zapis byl zbyt malo czytelny dla maszyny wlasnie. Jestescie przyzwyczajeni do konkretnego zapisu i dlatego macie takie zdanie. Z punktu widzenia matematyki jedyna roznica jest wywalenie nawiasow i przeniesienie operatora na prawa strone. Czyli zamiast 2 + 3 mamy 2 3 +. Jesli powstawiacie nawiasy w tych przykladach to nagle wyjdzie ze
dokładnie tak samo jak assembler, wyrażenia regularne czy nawet zapis szesnastkowy, z których cały świat z entuzjazmem korzysta.


@mateusza: Tak tak, cały świat pisze programy w assemblerze i używa systemu szesnastkowego ( ͡° ͜ʖ ͡°).

Po to człowiek wymyślił kompilator, żeby mu się łatwiej pracowało. No, ale niektórzy muszą koniecznie odkrywać koło na nowo i na siłę uprzykrzać sobie życie. Hurr durr, parsowanie nawiasów tyle mocy obliczeniowej
odwrotna notacja jest po prostu mniej czytelna dla człowieka


@slucham-psa-jak-gra: nie jest to prawda. Czlowiek nie czyta zapisow matematycznych swiadomie. Mozg czlowieka analizuje w konkretny sposob zapis. Wyszczegolnia argumenty i funkcje. Nie ma znaczenia dla niego kolejnosc funkcji do argumentow. Poziom czytelnosci jest dokladnie TAKI SAM.

Po to człowiek wymyślił kompilator, żeby mu się łatwiej pracowało.


@Sibuyas: oj panie splycasz strasznie. Chodzilo przede wszystkim o wydajnosc. Wygoda nigdy nie napedzala
@karer: Systemy na komputery typu Desktop są robione by były wygodne a nie wydajne (znaczy mają być szybkie, ale nie kosztem wygody)
@Sibuyas: @karer: czy zapiszę w ONP czy nie nie ma różnicy tak długo jak będzie to ewaluowane w czasie kompilacji
I prawda z jakiejś okazji Baaardzo stare kalulatory operowały na ONP
@karer a z tym 1Xem to mówie bo tak wyglądało moje zadanie na zaliczenie. Nie wiem
@wytrzzeszcz: ty mowisz o parsowaniu. A ja odnosze sie do tego ze nasz standardowy system zapisu liczb zostal stworzony do przeksztalcania wzorow. Nie do samego wyliczania i wykonywania obliczen bo jest z natury bledogenny dla czlowieka. Natomiast do przeksztalcania nadaje sie idealnie.

Wiec jesli ma byc latwy do operowania to ONP. Jesli ma byc wygodny do przeksztalcania to klasyczny "podstawowkowy"
policzę ile opracji mnie to kosztowało


@wytrzzeszcz: ale co to udowadnia? Nie twierdze ze ONP jest wydajniejsze czy nie w stosunku do klasycznych metod. Napisalem ze powstalo w innym celu i jest optymalne w pewnych zastosowaniach. Dalej nic to nie udowadnia.