Diskuze: Do čeho kompilovat?

Neregistrovaný

Zobrazeno 50 zpráv z 72.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Kompiler sa vecsinou sklada z 2 cast: Frontend a Backend.
Frontend sa sklada vecsinou z:
1. Lexikalnej analyzy - stavovy automat co rozlozi text na tokeny.
2. Syntaktickej analyzy - z tokenov vytvori abstraktny syntakticky strom(AST),
najjednoduhsie je pouzit rekruivny zostupny parser
3. Sematickej analyzy - tu sa hlavne kontroluju symboly, testuju typy,
deklaracie funkcii a premennych pripadne aj dake transformacie a
optimalizacie.
Z ast mozes potom generovat kod v inom jazyku ako napr C, mozes kod
spustit(treba si naprogramovat interpreter). Alebo ho prelozit do bytecodu. Ja
som zatial naprogramoval len frontendy a jednoduchy neoptimalizovany
interpreter, takze v backendoch sa nevyznam. Momentlne mam rozrobeny jeden
scriptovaci jazyk ktory prekladam do llvm bytecodu. Je to skvely projekt a tiez
ti ho doporucujem, robi sa s nim skvelo. Vyuziva ho napr nvidia na preladac
shaderov, je na nom postaveny Clang co preklada c, c++, Obj-C. Pouziva ho LDC
pre D...
Samozrejme mozes pouzit aj napr Java bytecod alebo CLI...
Interpretery su pomale.
Compilery do hygh level jazykov sa blbo linkuju z inymi jazykmi a preklad je
pomaly.
Najlepsie je pouit Daky bytecod: llvm ir, c--, cli, java bc, ...
Záleží na účelu. Pokud by to měl být univerzální jazyk, tak bych se do toho asi vůbec nepouštěl a vybral bych si některý ze stovek jazyků. Pokud bych chtěl něco speciálního k nějakému účelu, tak bych si z nějakého hotového jazyka vytvořil interpretr svého jazyka. Vytvářením kompilátoru bych se v dnešní době nezatěžoval.
Díky - ale na to jsem se neptal. Já nejsem začátečník. Parser mám. Mám už prostě vše v polích atd. Teď už to jen potřebuji uložit. Nemá to být přímo vlastní jazyk. Chtěl jsem jen udělat nadstabu C. Tedy přidat do základního setu typ string, dynamické pole a další drobnosti, co dnes a denně lidi otravují. Navíc jsem ten syntaqx udělal dosti volný. Když nebude lepší návrh, tak půjdu buď do C, anebo do object file...
Na tyto záležitosti by mohl být dobrý Python. Pokud by se jednalo o drcení čísel a záleželo na výkonu, tak Fortran. Na operaci s maticemi Matlab, resp. Octave.
Ten tvůj sáhodlouhý výpis jsem sfouknul bez regexu a vůbec - jen 3x projedu soubor znak po znaku. (Má to 324 řádků.) Syntax není hotov, ale ukázka:
define ``
+main wet - = 0 -. ki; . op;
. ot = 25 . a256 = 256
. ahh = ":)"
+- oop = ''Ahoj! :D'' . iikl = '''' . dhc;
. dfd = '':D
OoO...''
``
block main
print 'end'Toto je testovací program.
Díky '' můžu psát cokoliv, dokud nebude nalezen protipól...''
Atd...'end'
into dhc
call some, 0x2AH, 32 ~ (2 * PI)
<
block start
call main
sub a256, 6
mult a256, 4
div a256, 10
print a256
block some
set op, wet + ot
add wet, op
into ki
call next, a256/3*9
return ki
block next
define ``uh = 5``
branch ahh
return uh
<
Mezi ` a ' lze dát cokoliv bez whitespaců - uzavírací část musí být stejná. Mezi `` je definice proměnných, mezi '' stringy a mezi "" komentáře. Čím více " je komentář uveden, tím více " v něm lze použít... """ "" """... < ukončuje blok. Pokud pod blokem bez < je otevřen další blok, stává se podblokem... (OOP) set je =, add, +=, div /= atd. Jinak to podporuje operátory &, |, +, -, *, /, ^ a odmocninu - ~...
Ale to pak ta nadstavba ztratí smysl. Interpretovaný jazyk se nikdy nedorovná Cčku...
Ak ta nezaujima rychlost prekladu tak to kludne prekladaj do C.
Das sem zopar prikladov tych vylepseni?
V D dělám. Já vím - jen si hraji. Kdo si hraje nezlobí... Ale i D má své mouchy. Proč
si někdo dá takovou práci s nadstavbou C++ a neudělá dynamický linker? Ale
jo - já D miluji...
Zkusil jsem si v Octave násobit matice. Bylo to výrazně rychlejší, než v C, protože tam byl použit lepší algoritmus. Přitom Octave je interpretr.
Ale D je už vpodstatě C#... K vylepšením - jak jsem psal - díky podblokům z toho lze udělat krásně OOP. Má to totiž i příkaz namespace:
namespace ddd
block ddd
block subblock
<
Dále pak automatická správa paměti => dynamická pole bez alokace paměti atd.
A proč ne? Je to dokonalý jazyk. Jen mě štve, že tam kde chtějí C++ mi
jej většinou nedovolí...
Na D mě zaujalo víc věcí:
Tak ja dufam ze D casom nahradi c++. Z pohladu navrhu jazyka je to genialny jazyk.
Jak jsem psal... Hlavně
je geniální, že má přímý kontakt s vyššími i nižšími úrovněmi.
Hrabat se v pointerech a mít přitom automatickou správu atd... Tak si
říkám - měl by se vydat směrem virtuálního stroje?
K mému problému - nemám já jít do virtuálního stroje? Že bych sice interpretoval, ale
už zkompilovaný kód...
Mna najviac zaujali tranzitivne kvalifikatory immutable, const.
Potom implementacia pure funkcii ktora ma volnejsie pravidla oproti
funkcionalnym jazykom a vdaka tomu sa skvele kombinuje funkcionalne a
impreativne programovanie.
Velmi zaujimave su moduly a to ze neexistuje globalny namespace a sposob ako
funguju importy. Vdaka tomu ze v D neexistuju namespace sa dobre pouziva
UFCS...
Ak pozies LLVM, tak tvoj kod prelozis do bytecodu ktory mozes interpretovat, mozes pouzit vstavany JIT compiler, mozes ho prelozit do .o suborov alebo rovno do binarky...
Je to takový nízko-vysoký jazyk... Prozatím jej interpretuji
právě v D...
Praktičtější kód:
namespace System.Console
define ``Start+ volume = 25`` "Vytvoří proměnnou v bloku Start, která bude viditelná i pro jeho potomky..."
block Start
define `definice`string = '':D''`definice` ". v definicích hoře říká, ať se použije minulý blok, pro který je proměnná definována a viditelnost - tu lze upravit"
call WriteLine, string + "..." + volume
into volume "into nastaví pointer budoucího return na tuto proměnnou"
call PromennaSVystupem, param1,2, 3, 4,...
< "ukončení bloku..."
Ano , uz chapem ako si mohol
spravyt kompilator na necelych 400 riadkov. (U mna ma len obycajny lexer cez 2K
)
A tak - co se ti nezdá? Mezi ' a ` můžeš dát cokoliv - i nic. Můžeš používat zkratky i plné příkazy,... Pošlu normální kód ještě:
define ``
string = ''Dobrý den...''
``
block Start
...
Nezáleží na whitespacech - na ničem...
Ako deklarujes premenne a funkcie?
Ako vytvaras podmienky?
Ako zapises a + b * c; ?
Funkce to nemá. Jen bloky příkazů. S libovolnými parametry - jsou chtány za běhu - stejné nevýhody jako u interpretovaného jazyka.
definice proměnných:
define cokoliv
majitel viditelnost název = hodnota (anebo ; a
bez hodnoty)
. opakuje majitele a viditelnost
Bez zadání majitele se použije místo, kde je definováno
viditelnost je +, - a -- - +- je public... majitel+ - viditelnost i pro potomky
definice bloku:
block název
block vnořenýBlok
< "ukončení"
block Blok
<
block NevnořenýBlok
<
Dědění:
inherit ExistujícíBlok, NovýBlok
A s operátory mám normálně +, -, *, /, |, &, ^ a odmocnina je ~.
define ``ddd = 25 Start- eee = 258 . iii = 416 + 256 . k;``
block Start
set k, ddd ~ (eee / iii)
<
Takže?
Mohl bych se zeptat na účel toho jazyka? Pokud potřebuji jen zpracovat nějaká vstupní data, tak na to si dělám jednořádkové filtry, které jsou schopny zpracovat data rychleji, než jakou rychlostí je schopen disk dodávat.
Je to nadstavba C - to je účel. Má to funkčnost C + dynamyckou správu paměti, automatické typování atd...
Mam taky dojem ze nevies ako vytvarat vnorene bloky preto mas vsetko na
jednej urovni (premenne deklarujes na globalnej urovni a nastavujes viditelnost
pre konkretne bloky). Dalej mas zrejme problem vytvorit priority operatorov a
asi nemas implementovane podmienky, cykly...
Miesto ` ... `
mozes pouzit { ... } alebo ( ... )
Doprucujem ti precitat si toto:
http://www.amazon.com/…=as_li_ss_tl?…
(Je aj pdf na TPB)
Ale houby - je to jen možnost - můžeš je deklarovat přímo v daném
bloku. Takto může vypadat deklarace: `a=6
`
Slavné úrovně tedy:
namespace ddd
block eee
block iii
<
Lepší? Cykly a větvení vedu.
bloky...
switch promenna
case value, blok, možný break - ne nutný
...
Cykly vše mám. Tvl. Já programuji už nějaký ten pátek - a dobře...
Mozes napisat neco taketo?
block A
define ``a = 1``
block B
define ``b = 2``
set b, b+a*2 //operator * ma vecsiu prioritu ako +
<
set a, b+2 //chyba, b nie je deklarovane v bloku A
<
Zobrazeno 50 zpráv z 72.