Diskuze: Jak fungují dnešní jazyky?
Tvůrce
Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Úplně první programy byly ve strojovém kódu. Bylo to zdlouhavé a pracné. Proto v tomto strojovém kódu vývojáři napsali první Assembler, který ze symbolického zápisu udělal potřebný strojový kód. V Assembleru pak napsali kousek vyššího jazyka, např. Fortranu. V něm dopsali další kus Fortranu. Podobně to bylo i s C. No a v C byly už napsány další jazyky.
Pro psaní parserů se často používá nějaká nadstavba C, např. Flex nebo Bison, ale můžeš si ho napsat klidně v C#. Není to obtížné a troufám si tvrdit, že jsi to už někdy dělal. Jenom sis to neuvědomil. Vlastně už ve chvíli, kdy použiješ switch na vstupní data a podle nich se rozhoduješ, jak budeš dál pokračovat.
"Dobrý den,
snažím se pochopit, jak fungují vyšší jazyky. Tedy teorie je jasná a
snadná. Je jedno, co bude tam "nahoře" - prostě si vytvořím klíčová
slova a pravidla. Jenže jak ta pravidla aplikovat? Jak generovat strojový kód
- nemohu přeci přiřadit tomu a tomu uskupení ten a ten příkaz/y ve
strojovém kódu - nebo ano? "
Tohle je docela slozite tema, hodne zjednodusena a nepresna verze, jak to muze
vypadat: rozparsujes kod na symboly reprezentujici ten kod, pak si to podle
pravidel rozdelis na mensi casti, ktery umis prevest - treba prirazeni do
promenny, provedeni aritmeticke operace, volani funkce atd. a z nich pak
vygenerujes spustitelnej soubor - symboly nahradis strojovym kodem.
"Pokud ano, tak mne zaráží, jak může mít jazyk vlastní kompilátor -
nezaložený na existujícím jazyku... Tedy v čem vůbec bude parser - ten
přeci musí být v existujícím jazyku - a jeho parser vznikl jak?"
Prvni byl napsan v strojovem kodu - strojovy kod parser ani kompilator
nepotreboval, rovnou provadel instrukce zadane v podobe, ktera pro nej je
citelna - stejne tak muzes dneska na pc programovat tim, ze si v poznamkovym
bloku otevres novy soubor, pojmenujes ho jako .exe, a zacnes v hex modu psat
bajty odpovidajici prislusnemu opkodu strojoveho kodu (ale je to pekne naprd
).
"Byl bych moc rád, kdyby mi to někdo odhalil... Docela si to dovedu
představit - jen nevím, jak bych napsal ta pravidla - a v čem psát parser -
jinak to už je celkem dominový efekt... Děkuji."
Parser muzes napsat v cemkoliv, klidne muzes napsat kompilator pro assembler v
c#, v tom ti nic nebrani, ty jen z textu delas strojovy instrukce, tedy
posloupnost nejakych bajtu.
Já jsem kdysi ve strojáku programoval a přestože to není složité,
už bych se k tomu nevracel. Na každou blbost je totiž potřeba mračna
kódu a jenom vykreslit na obrazovce zarovnané znaky tě zpotí i na zadku.
Svým způsobem máš pravdu, že určitému příkazu ve vyšších
jazycích odpovídá
určité množství strojového kódu, jenže toho kódu je prostě moc.
Proto taky vyšší jazyky vznikly. Když musíš udělat hodně práce,
začneš tak,
že si na to napíšeš program. A psát program je hodně práce..
Takže skutečně přiřazuji strojový kód - to je to co mně přišlo divné - když je strojový kód tak specifický - výsledek nepřenositelný jinam...
Nuže mám tedy výstup - strojový kód - nebo ještě interpret a z něj strojový kód - viz. C# a Java - a ten spustím jak?
Jo a vlastně si to parsování mohu usnadnit Regex - ne?
Teď si říkám, že bude blbost psát parser v C# - bude lepší multiplatformní jazyk ne? Jinak bych musel psát tisíce parserů...
Dnešní překladače už strojový kód moc nedělají. Program většinou zkompilují do kódu nějakého virtuálního procesoru - bajtkód. Pro každou platformu se pak napíše interpretr tohoto bajtkódu nebo JIT kompilátor. Takový program je pak přenositelný.
Než se do toho pustím, chtěl bych se zeptat, zda by se Vám to vůbec líbilo. Jmenoval by se SAM. Zrušil bych dělení na namespace, třídy, struktury,... Bral bych vše jako souhrn příkazů - commands - zkratka cmd:
add // přidání externích souborů
{
System;
System.Windows;
}
internal cmd Name : System.Web // dědění - navíc použit modifikátor
{
var // blok definování proměnných
{
int i = 6;
}
private var // proměnné s modifikátorem...
{
}
private cmd Name
{
} => 6; // návrat
private cmd Name : System.Net
{
cns(parametry) //konstruktor
{
var
{
int // blok proměnných stejného typu
{
files = 5;
names = 8;
}
}
}
}
edt cmd Who NewName // úprava existujícího bloku - Who -> upravovaný
{
prp // vlastnosti
{
int Folders : <= hodnota { } => hodnota // set, možný blok, get
float Points : modifikátor <= hodnota 0 modifikátor => hodnota // bez bloku s modifikátory
Point // blok vlastností stejného typu
{
Name; // abstraktní
Name : <= value 0 => value // standart - bez bloku
}
}
}
}
Kde za Name si pochopitelně dáte jméno bloku...
Nejsem si jist, jestli má smysl zakázat možnost editace - ale kdyžtak bych udělal něco jako uned (uneditable). Také si pohraji s maximálním počtem vnoření...
Cyklus by byl jediný - cycle - bral by možnosti:
příkaz; bool; příkaz
bool; příkaz
bool
ddd in xxx
Kompilátor se pokusím udělat formou virtuálního stroje - viz. C#, Java...
Raději bych se držel už zavedených klíčových slov import, function, construct, ... Zkracování na 3 znaky ničemu neprospěje. Vím, jak mnozí nadávají na pythonský "def".
Na můj vkus tam máš příliš mnoho složených závorek. Zkus je všechny vypustit.
Začínat obecným programovacím jazykem nepovažuji za nejvhodnější. Zkus něco speciálnějšího, například generátor tiskových sestav nebo naopak zpracování dat z GPS či meteostanice. Můžeš pak zkusit napsat Forth nebo Lisp.
Zobrazeno 13 zpráv z 13.