Opět zdravím všechny programátory, minisoutěž na tento týden o placku
bude obzvláště zajímavá. Naprogramujeme si totiž vlastní interpreter
(vlastní programovací jazyk). Nebojte, není to tak složité, jak si
myslíte, vlastně to jde udělat i poměrně jednoduše
Úkolem soutěže je vytvořit jednoduchý skriptovací jazyk, ve kterém
půjde naprogramovat výpočet faktoriálu. Měl by tedy umět psát a číst z
proměnných, zpracovat jednoduchou podmínku a umět přeskočit na jiné
místo v programu pomocí GOTO. Tyto 3 věci by měly stačit k tomu, aby se dal
program na faktoriál napsat.
Aplikace zpracuje vstupní zdrojový kód ve vašem jazyce, který si
můžete navrhnout jak chcete. A ne, opravdu tam nemůže být napsáno
faktorial(x) Zdrojový kód
by mohl vypadat např. takto:
prom x = 5;
prom vysledek = 1
prom i = 2
sekce 1
pokud i <= x
vysledek = vysledek * i;
jdi 1
konecpokud
vypis vysledek
Výše uvedený jazyk jsem si vymyslel a kód v něm zapsaný by měl
spočítat faktoriál z proměnné x. Váš program načte z textového souboru
zdrojový kód podobný tomuto a bude ho interpretovat (vykonávat). Na konci by
se měl vypsat výsledný faktoriál. Samozřejmě můžete místo GOTO použít
např. příkaz opakuj pocet, kde pocet bude x - 1.
Jazyk nemusí umět pracovat se složitými matematickými výrazy, stačí
ho naučit jen a * b, a > b a podobně. Nemusí umět 2+8*4a/52. Kdyby se
někdo rozvášnil, může poslat kromě faktoriálu i nějaký pokročileší
program ve svém jazyce, který např. používá funkce.
Určitě si to zkuste, takovéhle skripty se používají často ve hrách,
sám jsem je používal u své adventury. Můžete použít libovolný
programovací jazyk. Čas si dejme jako vždy do neděle 27.10. do 18:00
hodin.
Hodnotit budu co jazyk umí a také jak je to napsané. Jako vždy platí,
raději naprogramujte méně a dejte si záležet, aby byl kód hezký a
jednoduchý. Podrobnější pravidla soutěží naleznete zde: http://www.itnetwork.cz/…outezi-machr
Vytvořit svůj jazyk byl vždycky můj sen. Už jsem na tom dokonce začal
pracovat (objektově orientovaný jazyk překládaný do assembleru) . Rozhodně se zúčastním,
pak to využiju při ladění ve svém editoru kódu.
Mne sa to osobne paci, myslim si ze je to krok jedine k lepsiemu, len tak
dalej.
//Ospravedlnujem sa, mal som otvorenych viac okien v prehliadaci a splietol som
si diskusiu.
Trochu jsem přemýšlel, jestli se zúčastnit. Na vlastním jazyce dělám
chvíli, přesto si myslím, že už něco umí. Ale nikdy jsem nebyl fanda
zveřejňování ZK, tak nevím, nevím no......
Příkaz GOTO je docela složitý na implementaci u novějších jazyků.
Pokud použiješ podmínky a cykly, tak ho vůbec nebudeš potřebovat.
Zřejmě se předpokládá, že navrhneme a implementujeme něco jako Basic,
ale jazyk a implementace interpretru je na nás. Je jedno, jestli to uděláš
ve stylu Lisp, Forth nebo Bash. Osobně mě láká ten Lisp, ale Forth je mnohem
jednodušší a Basic je také na pár řádek. Že bych zkusil Waduzitdo?
Tak.. zadání mám splněné
Na obrázku je jako příklad výpočet faktoriálu pro čtyřku a osmičku.
Teď se asi pokusím to trochu zpřehlednit a případně přidat nějaké
další možnosti.
Hm tak boužel tuto soutěž vzdávám... Nemůžu nějak najít rešení co
je praktické a proto jsem narazil u podmínky, takže snad příště. Přeju
všem hodně štěstí.
Pokud se na to nejde opravdu nízkoúrovňově, tak to poměrně lehké je.
Stačí se nad tím zamyslet. Zkoušel jsem to jen tak s jednodušším parserem
a bylo to hnedka. Kdyžtak napiš. Klidně poradím.
Já sem to dělal asi složitější než to je potřeba, ale počkám si co
vytvoří ostatní a zkusím si to dodělat. Mám to prakticky hotové, ale
podmínka mě tam nejde a chtělo by to celkově zjednodušit.
Tady je můj výtvor. V tomto případě jsem se řídil heslem "Proč to
dělat jednoduše, když to jde udělat složitě" Nicméně faktoriál to
vypočítá, tak se v tom prozatím už nebudu hrabat http://leteckaposta.cz/815124883
Musím uznat, že to funguje fakt skvěle, ale podle mě to má naprosto
neefektivní kód. Nechápu tvůj způsob myšlení , zřejmě jsi na mě až moc
geniální, protože já se v tom ne a ne vyznat Je to opravdu síla. Samá
statika, podmínky, metody. Za kód bych ti nedal ani bod, ale za ten zbytek
teda poklona.
Je to jednoduché
Máš tam 3 statické třídy, které to celé řídí:
Scanner: akorát čte jednotlivé tokeny ze zdrojového programu.
Parser: kontroluje syntaxi a když to jde, tak i sémantiku
Interpret: Provádí instrukce, které získal od parseru, zbytek sémantické
analýzy.
Ale uznávám, že je ten kód docela přehnaný.
Je to co udělal Theodor Johnson povolené(udělal pouze parser a pak použil
vestavěnou třídu)? Protože pokud ano, tak to naprosto znehodnotí smysl
soutěže ...
Já to psal v C++. Při prvním volání mi funkce strtok vrátila první
"slovo", ale při dalších voláních vrací prázdné řetězce. Parametry
mám určitě správně.
Kompilator na D je tu: http://dlang.org/download.html
Ak mas Visual Studio tak je tam aj plugin ktory integruje podporu D pre VS.
Ak chcete kompilovat cez prikazovy riadok tak staci dat do parametrov dmd zoznam
vsetkych suborov, samotny kompilator to rovno aj zlinkuje a vyslednu binarku
staci spustit.
Ten moj program ma mensi bug (ako main funkcia sa pouzie posledna funkcia v
globalnom namespace, opravenu verziu poslem neskor).
Pre ostatnych:
Preco vobec pouzivate funkcie ako strtok, pripadne regexy? Nie je jednoduhsie si
spravyt stavovy automat ktory bude generovat tokeny?
Filozofickou otázkou je, co si představuješ pod pojmem "spustitelná
podoba". Z určitého pohledu je to nejen ELF, ale i program napsaný v PHP či
Pythonu. Z jiného úhlu pohledu to není ani EXE, protože ten přímo
spustitelný není. Všechny jsou závislé na konfiguraci operačního systému
a jeho virtuálních prostředí.
Obsahuje opravene chyby a binarku pre linux aj windows.
Cesta k scriptu sa da predat programu cez parameter, ak nie je zadana cesta tak
sa otvori subor "script.txt"
Už jsem našel chybu, při volání funkce strtok jsem nezadal jako
oddělovač konec řádku a ona pak vracela prázdné řetězce na konci
každého řádku (soubor jsem načítal po řádkách).
Výtvory jsou opravdu skvělé. Každý si zde určitě něco najde a budu
moc rád, když je publikujete. Něco je opravdu jednoduché, něco je naopak
velmi blízko reálným programovacím jazykům. Rozhodl jsem se opět udělit
více placek.
Posix (100 bodů) - Tohle je zajímavé, komentáře, větev
else, cykly, ten manuál se fakt povedl, skoro bych si ho zarámoval Koukám, že vyrábíš
binární mezikód, skvělé. Zdroják je teda fakt hustý, asi by chvíli
trvalo, než bych to celé pochopil. Hlavní je, že používáš tokenizer a
serializuješ do binárky. Je tam nějak moc statiky, ale to asi tak nevadí.
Jsem zvědavý, jestli tohle někdo překoná. Silvinious (100 bodů) - Ví se o mně, že jsem objektový
člověk a tenhle zdroják se mi opravdu líbí. Vypadá to jako návrhový vzor
interpreter, každopádně v tomhle se člověk vyzná, třídy jsou
jednoduché, sice jich je více, ale to řeší jmenné prostory. vitamin (100 bodů) - Další zajímavý kousek, datové typy a
definice funkcí, dokonce struktury a lambda. Jazyk D jsem ještě neviděl, ale
naštěstí je poměrně čitelný. Obávám se, že jsi zde opravdu vytvořil
plnohodnotný jazyk, ani jsem nečekal, že tohle někdo udělá loapmail (80 bodů) - Šel jsi na to zajímavě, aneb proč to
dělat složitě, když to jde jednoduše. Projekt ale asi nesplňuje zadání,
jelikož nejde o interpreter, ale překladač. Nicméně dobrý, používáš
tam zajímavé věci. nuz (80 bodů) - Jazyk obsahuje některé zajímavé funkce a
přípravu pro datové typy. Co se mi příliš nezdá jsou ty goto skoky
uvnitř hlavní smyčky, možná by to chtělo trochu refaktorovat, aby bylo
možné syntaxi jazyka dále rozšiřovat. jenkings (75 bodů) - Krásně jednoduché, o výkonu se nedá
moc hovořit, ale je to krátké a funguje to dobře. Podobně bych to asi
dělal, jen objektově.
Gratuluji vítězům, své výtvory publikujte a adresu pošlete do zpráv
x. Všem děkuji za účast, jsem hrozně rád, že se v
soutěžích objevují i věci, které převyšují mé dosavadní znalosti
Nebyl čas Měl jsem v
plánu něco mnohem lepšího (základ svého plánovaného jazyka) ale čtení
ze souboru jsem zprovoznil včera odpoledne. Musel jsem čtení přepsat z C++
do C. A čekal jsem, že mi zkritizuješ tu dlouhou funkci interpret
A samozřejmě gratuluji všem vítězům.
Gratuluji vítězům. btw. chtěl jsem to udělat jako recesi, že místo
několika tříd to jde napsat na pár řádků, ale jaksi mi nedošlo že v
mém případě používám kompiler namísto interpretu
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.