Bejelentkezés

Keresés a fórumban

Kulcsszó
Telepítés (rendszer, szoftver)

TÉMA: Az UPU programozási nyelv

Az UPU programozási nyelv 2017 szept. 25 05:46 #2258

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Drága gyermekeim az Úrban s az Űrben, látom ám a rosettacode webszájton hogy kifejezetten javasolt hogy a programnyelvünkön írjunk brainfuck interpretert... Juhhé! Hiszen nálam az rég készen van mint a stringosztályom alapszolgáltatása! Más se kellett ezek után, mint egy pici körítést tenni hozzá hogy parancssori paraméterként megkapja a brainfuck file nevét, beolvassa és végrehajtsa, s voilá:
@k [<|>]
heap 2
#s
@n mem 100 argv 2 error? §memhibavan
@s mem 500000 error? §memhibavan
textfile @n ??
brainfuck
@s off error? §offhibavan
@n off error? §offhibavan
#g @K [<|>] -= @k "Running time = " ? " tick" NL
end
„memhibavan” ¤"Something wrong has happened in the \"mem\"!" NL end
„offhibavan” ¤"Something wrong has happened in the \"off\"!" NL end

Amiatt ilyen szófosó, mert még benne van a benchmarkolás is - anélkül 2 sorral rövidebb lenne. Amúgy 45-ször gyorsabb mint a Python verzió, hehehe... annak ellenére, hogy becsületes voltam és azt is belemértem az időszükségletébe hogy a stringjeimnek lefoglalja a kellő helyet a heap-ban, majd a végén fel is szabadítsa. A stringtámogatásom olyan perfekt hogy álmodni alig lehetne jobbat, egy hátulütője viszont van: Kivétel nélkül mindegyik példánynak manuálisan kell memóriát allokálni... De ez kifejezetten nem bug hanem feature, szükséges rossz egyéb dolgok érdekében.

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Az UPU programozási nyelv 2017 okt. 01 13:46 #2259

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Na, csak hogy ne érje szó a ház elejét hogy csalok... Íme egy brainfuck interpreter UPU nyelven megírva, a nyelv elemi eszközeit használva. Azaz, ez most nem olyan hogy maga a tényleges interpreter C nyelven van megírva. Mindenesetre, ezzel be van bizonyítva alaposan hogy a nyelvem Turing-teljes. Szerintem az alábbi kód ráadásul SZÉP is a maga egzotikus módján! Az is látszik a kódból, hogy az UPU nyelv képes ugrótáblákat is kezelni, mely ugrótáblák fordítási időben generálódnak:
@t [<|>]
if argc < 3 { "Usage : upu brainfuck01 brainfuckpgm.brainfuck" NL end }
heap 2
#s
@n mem 100 error? §memerror argv 2
@s mem 500000 error? §memerror
textfile @n
?!? #s @n ~ §endofthepgm
#g @l = #s @s ~~-~ ?!? @@ §endofthepgm
#g @p 0 @k 0
{{ {{>>>}}? @k >= #s @s ~
[==>] §jumpingtable (#s @s [ @k ]) [0]
}}
„endofthepgm”
@s off error? §offerror
@n off error? §offerror
NL
#g @K [<|>] -= @t "Running time = " ? " tick" NL
end
„memerror” ¤"Something wrong has happened in the \"mem\"!" NL end
„offerror” ¤"Something wrong has happened in the \"off\"!" NL end

„jumpingtable”
//         00    01    02    03    04    05    06    07    08    09    0a    0b    0c    0d    0e    0f
/* 00 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 01 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 02 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §_2b_ §_2c_ §_2d_ §_2e_ §____
/* 03 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §_3c_ §____ §_3e_ §____
/* 04 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 05 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §_5b_ §____ §_5d_ §____ §____
/* 06 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 07 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 08 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 09 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0a */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0b */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0c */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0d */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0e */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____
/* 0f */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____

„_2b_” @s [ @p ] [>++<]
„____” @k ++ =====
„_3c_” ?!? @p §endofthepgm @p -- @k ++ =====
„_3e_” ??? @p >= @l §endofthepgm @p ++ @k ++ =====
„_2d_” @s [ @p ] [>--<] @k ++ =====
„_2e_” @c = (#s @s [> @p <]) [0] ?! @k ++ =====
„_2c_” @s [ @p ] [>=<] getchar @k ++ =====
„_5b_” if (#s @s [> @p <]) [0] { @k ++ ===== } @d 0 @i= @k+1 „5bloop”
@s [ @i ]
if #s @@ [] == '[ { @d ++ } !{
if #s @@ [] == '] { !if @d { @k= @i+1 ===== } @d -- }
} ??? ++@i < #s @s ~ §5bloop
=====
„_5d_” @d 0 @i 1
„5dloop”
@s [ @k - @i ]
if #s @@ [] == '] { @d ++ } !{
if #s @@ [] == '[ { !if @d { @k-= @i ===== } @d -- } }
??? ++@i < @k §5dloop
=====

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Az UPU programozási nyelv 2017 okt. 10 22:57 #2261

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Csak hogy irigykedjék a jónép: Íme, statusbarkezelő program a DWM ablakkezelőhöz (de sok más ablakkezelő is támogatja e ficsőrt, ha nem is mindegyik):

Ez a program mondhatni „full-extra-de-luxe”. Efféle stílusban jelzi ki az adatokat:
100% _0 K ^0 K 0.02 ( 96) [ 38] 2017.10.10 16:38:10 K 88; 84
Vagy:
POWER OFF! 100% _0 K ^0 K 0.02 ( 96) [ 38] 2017.10.10 16:38:10 K 88; 84
A második sor abban különbözik az elsőtől hogy van az elején egy "POWER OFF!" is. Ez természetesen akkor jelenik meg, ha a számítógép nincs a hálózatra csatlakoztatva, vagy be van dugva ugyan a konnektorba, de abban nincs áram.
Amúgy, az első adat - a példa szerint 100% - a akkumulátor feltöltöttségének szintjét mutatja. A második adat, a _0 K az internet aktuális letöltési sebességét, a harmadik ami a ^0 K az internet feltöltési sebességét, azon az interfészen amit megadtunk a programban, s ami a példaprogramban az "eth0", de ezt átírhatjuk. A 0.02 rész a processzor leterheltségéről tájékoztat, erről bővebben lásd itt: void loadaverage(void);  Ezután jön a ( 96) ami azt mutatja hány százaléka szabad a számítógép memóriájának, a [ 38] azt mutatja hány százaléka szabad a lemezterületnek, pontosabban a „csatolási pontnak”, ami a példaprogramban a "/" de ezt is átírhatjuk. Ezután jön a rendszerdátum és -idő, a legvégén a hét napjára utaló karakterrel (K), majd a Master- és PCM hangerő százalékban kifejezve. Amennyiben a Master el van némítva s így nem jön ki hang a gépünkből, a sor kijelzése így néz ki:
100% _0 K ^0 K 0.02 ( 96) [ 38] 2017.10.10 16:38:10 K ( 88; 84)
Maga a program pedig:
heap 10
#s
@s mem 100
@f mem 10 = "eth0" // InterFace
@L mem  2 = "_"    // le
@F mem  3 = " ^"   // fel
@M mem  3 = "/"    // mountpoint
@b mem  6          // battery
@e mem 30          // netusage
@A mem 20          // loadaverage
@m mem 20          // memusage

if argc < 3  #s @f { = "eth0" } !{ = argv 2 }

{{
@b #=c battery
if AC @s { = @b } !{ = "POWER OFF! " += @b } += "% "
@e netusage @f @L @F @s += @e
@A loadaverage [[ (#s ~)  - 5 (#s ~) - 1 ]] [[=]] @@
@s += @A
@m #=c memusage @s += " (" @s += @m += ") ["
@m #=c freespace @M @s += @m += "] "
@e sysdatetime @s += @e
@b #=c volume "Master"
@s if mute { += "(" }
+= @b += ";"
@b #=c volume "PCM" @s += @b
{ += ")" }
@s statusbar
}}

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Az UPU programozási nyelv 2017 okt. 13 04:07 #2262

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Na a stringosztályom szokásos „közönséges” funkcióit úgy tűnik sikeresen implementáltam. Kész vagyok ha minden igaz ezek dokumentálásával is. Most ki kell találnom miféle interfészt tervezzek az alprogramjaimnak. Az már megy hogy csak úgy simán indítgassam őket, de most fel akarom ruházni őket potenciálisan OOP képességekkel is. Technikailag ez nem igazán nehéz (most már...), de valamiféle emberbarát szintaktikát kéne kitalálnom neki, ráadásul olyat ami elég gyors is. Konkrétan, a metódusnevek runtime feloldásának kell gyorsnak lenni. És nem, nem lehet a tokenizálóra/fordítóra bízni. Az UPU alapvetően dinamikusan típusos nyelv, még ha ez nem is látszik rajta úgy első pillantásra.

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Az UPU programozási nyelv 2017 okt. 15 04:27 #2263

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Hát, azért ilyesmit összehozni elég szopatós feladat. Végeredményben nem egy nagyon trükkös valami, de eléggé „gályarabság”, mert rengeteg apróságot kell összepasszintani okéságosan. Úgy tűnik végre képes vagyok már interfészt definiálni alprogram számára, ez kissé olyasmi mint a public metódusok a C++ nyelvben. Hát egypárszor rendesen a hajamat téptem közben... Illetve téptem volna ha lett volna mit tépni, mert ahol nem vagyok kopasz ott a hajam semmi esetre se nagyobb mint 1 milliméter, mert röviden szeretem. Na de ez off.
Szóval, mint minden normális programnyelv, az UPU is feloldja tokenizáláskor a címkehivatkozásokat, de ugye ha olyasmit akarok hogy név szerint lehessen hivatkozni egy metódusra runtime, akkor ezeket mégse lehet a tokenizáláskor feloldani, hanem külön kell kezelni. És hát ez eléggé macerás. Mert akkor a címkék neveit le kell tárolni valahol, táblázatokat kezelni, stb... Persze megkérdezhetitek ti Néma Leventék, mi az ördögnek is név szerinti metódushívással kínlódnom?
Eccörű. Mert így könnyen lehet majd afféle librarykat is kezelnem. Mert ha UPU nyelven írok egy oprendszert, így meg lehet tenni hogy futásidőben az oprendszer egyszerűen kirántja a libet valamelyik futó program alól, csak hogy bedugjon a helyére egy tök más libet, nos ezesetben semmi baj se történik, ha az új libben is szerepel a megfelelő metódus ugyanazon néven, mert akkor a futó progi szépen megtalálja azt és kb semmit se vesz észre a cseréből.

Na aztán hogy ezzel meglettem, kiderült hogy én zseni, anyukám egyetlen legszebb fiacskája, gondolt arra mi van ha egy címke amire hivatkozunk, nem létezik (Missing label error); arra is gondoltam volt hogy mi van ha a címke létezik de nem hivatkozunk rá egyszer se (Unused label error); de azt bezzeg nem csekkoltam le, mi van ha több helyen is megadjuk ugyanazt a címkét egy névtérben! Na ezt is bele kellett pakolnom, szóval van már duplicate label error is.

Mindazonáltal úgy vélem érdemes volt ezekkel kínlasztanom szentséges önmagamat, mert tök jól néz ki hogy ha betölt egy progit, a tényleges használata előtt lecsekkolhatja a főprogram hogy létezik-e olyan metódusa egyáltalán, amit használni óhajt.

Az alábbi pici progranyrészlet kilistázza a @p programváltozóba (gyakorlatilag közönséges string) betöltött programban szereplő összes publikus metódus nevét:
#s {| #s @p interfaces
@f interface @p (#s @p interfaces) - {}
@f ??
|}

A fenti kódban nincs tévedés: van olyan kulcsszó is hogy interfaces, ami a publikus metódusok darabszámát adja meg, és olyan is hogy interface, ami egy bizonyos valahányadik metódus nevét adja vissza (stringként). Pontosabban, a stringre mutató pointerként, gyakorlatilag a referenciáját.

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.

Az UPU programozási nyelv 2017 okt. 17 15:16 #2264

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 209
  • Köszönetek: 6
  • Karma: 0
Na, megoldottam azt is hogy stringkonstansokból álló tömbjeim is lehessenek. Ezek természetesen fordítási időben generálódnak. Eddig erre nem volt lehetőség. Megfeledkeztem róla, mert nem volt rá szükségem... Eddig. Igazából most sincs rá szükségem, de eszembe jutott, s így gyorsan „lefejlesztettem”. Ciki volna ha nem tudna ilyesmit a nyelvem, ugyebár. Adós vagyok azonban még az interfészekről megirandó dokumentációval... Talán ma délután sikerül időt szakítanom rá.

Programming is like using toilets; you can't say you are done until paperwork's finished!
Nyilvános megtekintési jogosultság letiltva.
Oldalmegjelenítési idő: 0.049 másodperc