Bejelentkezés

Keresés a fórumban

Kulcsszó
Szoftver trükkök

TÉMA: Programnyelvem lényegében készen van!

Programnyelvem lényegében készen van! 2019 jan. 06 05:05 #2307

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 206
  • Köszönetek: 6
  • Karma: 0
Hi, rég jártam itt. (Mert nem volt visszajelzés...) Csak gondoltam ha korábban annyit írkáltam ide, azt még leírom, hogy programnyelvem VÉGRE lényegében készen van! Persze, igazán sose lesz készen, ilyesmit nem lehet befejezni csak abbahagyni...
Mindegy, a lényeg hogy nemcsak Turing-teljes (ami önmagában véve még nem volna egy nagy szám) de remekül alkalmazható és a satöbbi meg a minden, hehehe.
Még bele kell raknom pár eddig mellőzött ficsőrt a stringkezeléssel kapcsolatban (no ne ijedjetek meg, tud már stringeket kezelni, csak pár ritkább funkcióhoz még nem gyártottam kulcsszót), aztán még berakom a directorykezelést is. Mindezekhez már megvannak a megfelelő függvények, megírtam és kipróbáltam őket, csak most valamiféle API-szerűséget kell definiálnom nekik, bár lehet hogy nem az API a legmegfelelőbb szó. Lényegében csak arról van szó, melyik kulcsszót találjam ki a nyelvembe az adott funkcióhoz, és milyen paramétersorrendet óhajtok meg ilyesmi. Ezt már könnyen és hamar megoldom, akár 40 fokos lázban fetrengve is.

A lényeg a lényeg: végülis sok kísérlet és korábbi nyelvek után ami mellett elköteleztem magamat, az egy RPN szintaxisú/logikájú nyelv lett, bár akad benne pár (nem sok) kivétel. Szemre azaz vizuálisan kb úgy néz ki egy avatatlannak, mintha a Forth nyelvet ötvözték volna a régi Ti-59 programozható zsebszámológép nyelvével. Ellenben iszonyatosan gyors! Általában csak hatszor...tizenkétszer lassabb mint a natív kód, ami egy interpretertől egyszerűen ELKÉPESZTŐ sebesség!

Oké, elismerem, tanulni kell, nem a lusta Kóder Trógereknek készült, meg nem is a kezdő padawanoknak akik évekig azon meditálnak melyik nyelvet kezdjék tanulniu, ahelyett hogy nekiállnának végre a tanulásnak... Ja, ez a nyelvem teljes egészében tiszta C nyelven íródott, nincs benne semmi C++. Ebből már remélem tudjátok, ha nem bannoltak volna a HUP-on akkor a mostani szavazáson melyikre szavaztam volna mint „Kedvenc fordított programozássi nyelvre”.

Itt egy példa, ez kiírja az összes parancssori paraméterét az stdout-ra:
suggestedmem 1
20 mem sto! @0
"Commandline parameters:\n"
@0 argc {| {} #g print ". = " argv #s printnl |} drop
rcl @0 inv mem
end

Ez meg kirajzolja a konzolra a Mandelbrot-fraktált karakteresen (sőt, még benchmarkolja is):
suggestedmem 100
goto §kezd
idő: "Time: "
ticktext: " tick.\n"
kezd:
tick sto! @0
#d
-39. sto! @1
78 {|
nl
-39. sto! @2
78 {|
rcl @2 40. / sto! @3
rcl @1 40. / sto! @4
sbr §mandelbrot
#g
dup !{ drop
7 !/ 4 >= { '*  goto §kiírja }
goto §spckiír }
$28 + dup 127 > { drop
spckiír:
32 } kiírja: #k print!
#d
1. sum! @2
|}
1. sum! @1
|}
nl
#g
tick rcl @0 -
§idő strprint print drop §ticktext strprint
end

mandelbrot:
rcl @4 0.5 - sto! @15
mov @16 @3
0. sto @17 sto! @18
0. sto  @32
   sto! @33
{... // begin the infinite loop
rcl @18 rcl @17 * sto @20
rcl @18 inv sqr sto @21
rcl @17 inv sqr sto @33
- rcl @15 + sto! @18
dup rcl @16 !+ sto! @17
rcl @33 rcl @21 + 16. > { {...} rts }
{...} #g 1000 > { rcl @33 (#g) rcl @21 (#g) #g + 0 rts }
#d
...} // end of the infinite loop

Ja, a nyelvem neve még mindig: UPU. Az UPU programnyelv neve egy rövidítés, azt jelenti (sok mást is de elsősorban azt) hogy:

Ubiquitous Programming Utility

Persze ha tudjuk is hogy ezt jelenti, felmerül a kérdés, miért épp ezt választottam? Nos amiatt mert regényíró vagyok, sci-fi szerző, egy több mint 50 regényt tartalmazó sorozat van már a hátam mögött (bár nem mindegyik tagja jelent már meg), de még tervezek újakat is írni. S abban a műben amit épp most írok, szerepel egy csillagbirodalom UPU néven. Ott az UPU annak a rövidítése, hogy „United Planets of Universe”, a lakói természetesen angolul beszélnek, tekintve hogy birodalmuk neve se véletlen: ők a jelenkori USA jogutódai…
Művemben ők ezt a programnyelvet használják - interpreterként legalábbis - az egész birodalomban, mint afféle „hivatalos”, „állami” programnyelvet. Tudomásom szerint én vagyok az egész Világon az EGYETLEN olyan regényíró, aki egy kész, működőképes PROGRAMnyelvet is elkészített a sorozatához!
Tehát, irodalmi/esztétikai céllal készült emberi nyelvek akadnak szépszámmal. De irodalmi céllal készült programnyelvről nem tudok.

A nyelvem természetesen rengetegféle elemi típust támogat alapból, nemcsak a lebegőpontos számokat és a stringeket. Ami a fenti példákat illeti, a forráskód tördelése (ha úgy tetszik indentálása) gyakorlatilag éppoly szabad mint a C/C++ esetében, szóval nem kötött mint a Python esetében. A Pythontól rángógörcsbe kerül minden agytekervényem ha csak rágondolok... Nem az én esetem. Ha én programozni akarok, akkor a kódot óhajtom írni, és nem valamiféle táblázatszerkesztéshez vagy szövegszerkesztéshez hasonló dolgot csinálni hogy formázgassam holmi tabulátorokkal meg szóközökkel, mintha nem is programozó lennék hanem kiadványszerkesztő!

Megjegyzem, eddig minden tesztben gyorsabb a nyelvem mint a Python, néha igazán nem kevéssel!

A nyelvemnek kb semmi függősége nincs a gcc és a standard libek kivételével, illetve ehhez még hozzájöhet az alsalib és az xlib is, bizonyos speciális feladatokhoz, de ezek nélkül is lefordítható. Nem tartom lehetetlennek hogy a későbbi fejlesztések során ezekhez még a libpng is hozzájön, de az is csak így opcionálisan.

Hogy miért RPN? Mert gyors. Sokkal gyorsabb mint azok a nyelveim amelyekben infix jelölésrendszert alkalmaztam, pláne ha még az operátor-precedenciára is kellett ügyelnem. Továbbá, rájöttem hogy az RPN még logikusabb és természetesebb is bizonyos értelemben...

Ha a fenti kódok alapján valami rém primitív vacakságra gondolnátok, elárulom, ez legfeljebb részben igaz. Például ami a stringeket illeti, az efféle bonyolult struktúrákkal rendelkező objektumszerűségeknél (nálam ugyanis a string nem egy záróbájtos karakterlánc hanem egy hossztárolós objektum lényegében) ezeknél tehát csak az inicializáló memóriaalokációt és a megszüntetéskor a deallokációt kell „kézzel” elvégezni, használat közben az esetleg szükségessé váló reallokációt már maga az interpreter végzi automatikusan, beleértve a szükséges másolgatásokat s egyebeket is. Azaz, ilyen szempontból a nyelvem sokkal kényelmesebb mint a C a pointereivel (bár az én nyelvem is alapvetően pointer-orientált), bár nem annyira kényelmes mint a C++. Valahol a kettő közt lehet. Annyit azért magam is elismerek, hogy én se merném igazán magas szintűnek nevezni, de ez nem is volt a célom.

Na ennyi elég is lesz, úgyis kérdéses elolvassa-e valaki...

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

Programnyelvem lényegében készen van! 2019 jan. 11 01:41 #2308

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 206
  • Köszönetek: 6
  • Karma: 0
Íme egy csinos kis Brainfuck interpreter, a Drágaszág nyelvén (azaz UPU nyelven) írva, mert "Egy nyelv mind fölött, egy nyelv kegyetlen...". Ez bemutatja azt is hogy lehet benne akár tömböket is használni, címkéket, mindent:
suggestedmem 20 #g
20 mem sto! @0 100000 mem sto! @1
argc 3 < { "Usage: upu brainfuck08.upu brainfuckpgm.brainfuck\n" sbr §invmem fail }
@0 2 argv #s
// "The name of the brainfuckfile for execute: " printnl
'f istrue !{ "The file is not exists!\n" sbr §invmem fail }
// Load the file into @1 :
@1 @0 fileinput
tick sto! @2 // starting tick
sbr §brainfukk // The stringvariable of the brainfukk pgm being executed should be in the stack for the subrutine.
nl
#g tick rcl @2 - §idő strprint print! §ticktext strprint sbr §invmem
end
invmem: rcl @0 inv mem rcl @1 inv mem rts
idő: "Time: "
ticktext: " tick.\n"
// ========================================
brainfukk:
sto @9 // save the brainfukkpgm-variable as copy
#g ~ !{ rts }       // If the length of the brainfukk pgm is zero, then nothing to do.
rcl @9 ~~~ sto! @4  // Length of the working memory in sizeof #g
zero @6 zero @7
rcl @9
mainloop:
rcl @6 rcl @9 ~ >= then §droprts
rcl @6 []
$ff & §jumpingtable [goto]

____: inc @6 goto §mainloop
_3c_: rcl @7 !{ rts } dec @7 inc @6 goto §mainloop
_3e_: rcl @7 rcl @9 ~ >= then §droprts inc @7 inc @6 goto §mainloop
_2b_: rcl @9 rcl @7 [:] c++ goto §minusba
_2d_: rcl @9 rcl @7 [:] c-- minusba: rcl @7 swap <:> drop goto §____
_2e_: rcl @9 rcl @7 [:] #a print! #g drop goto §____
_2c_: rcl @9 rcl @7 getchar <:> drop goto §____
// ...............
_5b_: rcl @9 rcl @7 [:] swap drop then §____
          zero @11
          rcl @9 rcl @6 ++ rcl @9 ~ {||
          [{}] '[ == { inc @11 {<} }
          [{}] '] == { rcl @11 !{ {+} sto! @6 {>} }
          dec @11
          }
|} drop goto §mainloop
// ...............
_5d_: zero @11 rcl @9 1 rcl @6 {|| [{-}] '] == { inc @11 {<} }
          [{-}] '[ == {
          rcl @11 !{ {} inv sum! @6 {>} } dec @11
          }
|} drop goto §mainloop
// ...............
droprts: drop rts
// ...............

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 */ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____ §____

Programming is like using toilets; you can't say you are done until paperwork's finished!
Utolsó szerkesztés: 2019 jan. 11 01:52 Írta: FossilCodger.
Nyilvános megtekintési jogosultság letiltva.

Programnyelvem lényegében készen van! ma 03:14 #2309

  • FossilCodger
  • FossilCodger profilkép
  • Nem elérhető
  • Arany fokozatú fórumozó
  • Hozzászólások: 206
  • Köszönetek: 6
  • Karma: 0
Kedves Nonexistent Olvasóim, csak hogy lássátok a nyelvemen igenis lehet írni HASZNOS
programokat, tudatlak benneteket hogy az imént készültem el egy nice tiny
progival, amit máris használok rendszeresen, tudniillik azt csinálja
hogy kilistázza az aktuális könyvtár tartalmát nekem. Vagy nem az
aktuálisét, mert még szép hogy meg lehet neki adni parancssori
paramétert is hogy mit listázzon... Külön színnel jelöli ha a file
végrehajtható, illetve a symlinknél azt ha törött, persze symlinknél
azt is kijelzi hogy mire mutat az a symlink, a fileméretet
helyiértékhelyesen listázza ráadásul külön színekkel a helyiértékek
ezres csoportjait, a végére méretösszesítést is ír, és 3 külön
csoportban listáz: külön az alkönyvtárakat, a reguláris fájlokat és a
symlinkeket! (Nyilván mindegyik csoportot csak akkor, ha van benne
legalább 1 tétel). A csoportokon belül pedig ABC sorrendben! Mindigis
gyűlöltem tudod ha a lista összevissza van, de azt is ha úgy rendezik
hogy a különböző típusok összekeverednek). A jogosultságokat oktálisan
listázza, mert egy Igaz Kocka azt úgy szereti látni. Most bemásolom
ide a szkriptet (nem is hosszú) de ne feledd el ránézni a
csatolmányra is, mert csatolva külkdök egy screenshotot is!

Íme, Voilá, Behold:
suggestedmem 10
12 mem sto! @0
12 mem sto! @2
@0 #g argc 3 >= !{ §defaultdir =§ goto §folyt } 2 argv
folyt:
'd istrue !{ "The given directory doesn't exists!\n" rcl @0 inv mem
rcl @2 inv mem fail }
dir sto! @1
@1 @0 loaddir dup { "Error! Errorcode = " #g printnl fail } drop
drop // (töröltük a @1 -et a stackból)
// ===================================================================================
DIRECTORIES
zero @6
@1 'D amount {_ 35 printcolor 4 printcolor "Subdirectories:"
colorreset space 9 printcolor
#g printnl colorreset
{|
'D {} sbr §octal
// @2 @1 'D {} filesize #g (#s) #s print! // Filesize isn't important
in case of DIRs
10 printcolor 2 {| space |}
@2 @1 'D {} filename 63 stub #s print!
{} 'D sbr §ownersandtime
|}
}{ drop }
// ===================================================================================
REGULAR FILES
@1 'R amount {_ 35 printcolor 4 printcolor "Common files:" colorreset
space 9 printcolor
#g printnl colorreset
{|
@1 'R {} executable sto! @6
'R {} sbr §octal
@2 @1 'R {} filesize #g (#s) 14 15 13 12 coloredsize #s print! colorreset space
6 printcolor rcl @6 { 2 printcolor }
@2 @1 'R {} filename
63 stub  print!
{} 'R sbr §ownersandtime
|}
#g
"--------------------------\n"
@2 @1 'R totalsize "TotalSize = " #g (#s) noleftspc 14 15 13 12
coloredsize #s space printnl!
}{ drop }
// ===================================================================================
SYMLINKS
@1 'L amount {_ 35 printcolor 4 printcolor "Symlinks:" colorreset
space 9 printcolor
#g printnl colorreset
{|
@1 'L {} broken sto! @6
'L {} sbr §octal 2 {| space |}
rcl @6 !{ 8 }{ 13 } printcolor
@2 @1 'L {} filename 20 stub #s print!
rcl @6 !{ 10 printcolor }{ 21 printcolor 10 printcolor }
" ===> " colorreset space
rcl @6 !{ 8 }{ 13 } printcolor
@2 @1 'L {} destination #s print!
colorreset
nl
|}
}{ drop }
rcl @0 inv mem
rcl @1 inv mem
rcl @2 inv mem
nl
end
// ........................................................
defaultdir: "."
// ........................................................
octal: #g sto! @8 sto! @9 @2 @1 rcl @9 rcl @8 octal
colorreset
rcl @6 { 9 }{ 7 } printcolor
#s print! colorreset
rts
// ........................................................
ownersandtime:
colorreset
sto! @9 sto! @8
space 24 printcolor 6 printcolor
@2
@1 rcl @9 rcl @8 ownername 6 stub print ":"
@1 rcl @9 rcl @8 groupname 6 stub print
colorreset space
@1 rcl @9 rcl @8 mtime print
drop nl
rts
// ........................................................

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.169 másodperc