Návrh jazyka založeném na Pascalu – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Návrh jazyka založeném na Pascalu – Pascal – Fórum – Programujte.comNávrh jazyka založeném na Pascalu – Pascal – Fórum – Programujte.com

 

Wimby
~ Anonymní uživatel
50 příspěvků
21. 5. 2009   #1
-
0
-

Dobrý den,

chtěl bych si napsat operační systém - s dobře čitelným a především bezpečným kódem, abych měl stoprocentní kontrolu nad věcmi, které bude provádět. Dobře čiltelná je pro mě pascalovská syntaxe, jenže jsem nenašel překladač, ve kterém by to šlo napsat... tak jsem si začal psát svůj, ale časem to přestávalo mít s pascalem tolik společného. Například, aby to bylo jednodušší, nezná to standardní typy (dají se snadněji napsat do zdrojovýho kódu, než zahrnout do překladače). Jedinné typy, které nejdou stoprocentně nadeklarovat jsou typy POINTER a STRING. Typ POINTER mi nevadí, že nebude existovat - alespoň to bude bezpečnější. STRING se dá deklarovat s pevně zadanou délkou polem, takže v tom taky nebude hlavní problém... Jenže když nebude existovat STRING nebo CHAR, tak nevím, jak by překladač přiřadil hodnotu řetězce nebo znaku ('něco',#32).
Na druhou stranu, tohle se vyskytuje jen u přiřazení, a přiřazení je možné přetypovat. A tady bych potřeboval poradit... V mnoha jazycích je možné definovat si vlastní typ. Jsou jazyky, ve kterých je možné si definovat i vlastní hodnotu k tomu typu?

Například:

type

Char = 0..255;

operator := (token) hodnota : Char;
begin
if token = '#' {tady by muselo byt cislo toho znaku, protoze retezec to nezna} then
while token in ['0'..'9' {tady take}] do
hodnota := token; {nejaka uprava, pro prevod z desitkove do binarni podoby}
end;


Jelikož přiřazení je konstatní, překladač by ho podle příkazů v "operator :=" zoptimalizoval už při překladu a v přeloženém kódu by nic z toho nebylo...
Dále by to ovšem chtělo posílit typovou kontrolu. Například:
type

Char = 0..255;
Byte = 0..255;

aby Char i Byte byly mezi sebou nekompatibilní.

Nenapadá vás tedy nějaký způsob, jak by bylo možné nadefinovat si formát vlastní hodnoty?
Například #číslo bude Char, číslo.čísloE-číslo bude pro Real, číslo+čísloI bude pro Complex, čísloM bude pro Metr a jiné... :-)

Nahlásit jako SPAM
IP: 83.208.196.–
Mircosoft+1
Věrný člen
22. 5. 2009   #2
-
0
-

Dost dobre nechapu, co si predstavujes pod pojmem "definovat si hodnotu k vlastnimu typu". Jestli myslis rozpoznavani typu hodnot podle jejich formatu, tak to ze vseho nejvic vypada jako hezka uloha na aplikaci regularnich vyrazu. Ale nic konkretniho ti k nim nereknu, zas tak moc se v nich nevyznam.

A bez nich... no, asi bych zdrojovy radek rozkouskoval na operatory a to mezi nimi a vyhazel bych z toho prebytecne mezery. Pak dostanu nekolik retezcu, o kterych vim, ze to jsou bud konstanty nebo promenne. Promenne zacinaji bud pismenem nebo podtrzitkem, takze je poznam rychle.
Retezce zacinaji bud apostrofem nebo krizkem (#). Projedu je zleva: apostrof? Vsechno az k pristimu apostrofu (s vyjimkou dvojiteho apostrofu, ktery prevedu na jednoduchy) prihodim do vystupniho bufferu. Krizek? Vsechny cislice za nim vezmu, prevedu na byte a pripojim k bufferu jako jeden char. Neco jineho? Syntax error. Na zaver mam v tom bufferu prelozeny retezec.
Cisla zacinaji cislici. Jedu zleva. Kdyz nenarazim na tecku nebo E, je to cele cislo. Kdyz tam tecka je, je to realne cislo a ctu dal. Kdyz tam je E, je to realne cislo a dalsi znak je bud znamenko nebo cislice (nebo chyba), takze ho prectu a pak cely zbytek, dokud to jsou cislice. Jakmile presne vim, kde cislo zacina a konci, postvu na nej Val. Ten sezere vsechno - cela, realna (s teckou i eckem) i hexa ($neco) cisla.

Hmm... jak tak koukam na realna cisla, tak eckovy format trochu komplikuje to rozsekani na operatory a hodnoty. Asi bych to tedy jeste predzvejkal: zdrojak projit zprava doleva, za kazdym + nebo - zkontrolovat pritomnost E, jestli tam je, jet dal doleva po cislicich a zkontrolovat prvni znak za nimi: pismeno nebo podtrzitko => byla to promenna a znamenko za E je operator; mezera nebo operator => bylo to cislo, tak ho nejak zazavorkuju, aby to ta kouskovaci procedura mela jednodussi.


A jen tak mimochodem, pises opravdu operacni system, nebo jenom nejakou nadstavbu, skriptovaci engine nebo tak neco?

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Wimby
~ Anonymní uživatel
50 příspěvků
23. 5. 2009   #3
-
0
-

Jj, přesně takhle to řeším... do regulárních výrazů jsem se nepouštěl, ale ta lexikální analýza kompilovaného kódu vypadá v principu takto:

type

Tokeny = (tPlus,tMinus,tKrat,tDeleno,tStrednik,tTecka,tIdentifikator,tBegin,tEnd,tFunction{,...});

Soubor = object
Zdroj : text;
procedure Otevri(Cesta : String);
procedure DalsiZnak;
function AktualniZnak : Char;
end;

Tokenizer = object(TSoubor)
Token : Tokeny;
Buffer : String;
procedure DalsiToken;
end;

procedure Tokenizer.DalsiToken;
begin
while AktualniZnak = #32 do
DalsiZnak;
case AktualniZnak of
'{' : PrectiKomentare;
'A'..'Z','_' : PrectiIdentifikator;
'0'..'9' : PrectiCislo;
'+' : Token := tPlus;
'-' : Token := tMinus;
'*' : Token := tKrat;
'/' : Token := tDeleno;
{...}
else
Write('Syntakticka (lexikalni) chyba - neplatny znak');
end;
end;

S těmi realnými čísly to také není nijak složité... problém nastává, když mi do syntaktické a sémantické analýzy přijde token typu tRetezec nebo tZnak, protože v kompilátoru neimplementuji tyto typy ani jiné typy. Kompilátor prostě nezná typ String ani typ Char, a tak neví, respektive já nevim, jak s tímto tokenem naložit.
A tak mě napadlo, že by mu to mohl říct programátor až v kódu - jen nevím jak (a to je ten hlavní problém) :-)

Představu mám asi takovou:
type

Byte : 0..255; {úplně nejdřív deklaruju typ Byte, který použiju u předefinování přiřazení}
Char : 0..255; {pak deklaruju typ Char - stejně jako Byte}

{teď už překladač typ Char zná, ale ještě nerozumí formátu #číslo - musím "definovat formát hodnoty k tomu typu"}

{teď přetížím operátor přiřazení, protože se ten křížek s číslem (#číslo) používá jen u přiřazení}
{tady bych zavedl nové klíčové slovo, třeba TOKEN, které by mi proměnnou naplňovalo postupně tím, co je v kódu}
operator := (token Znak : Byte) Vysledek : Char;
var
Aktualni : Byte;
begin
{každé přečtení hodnoty Znak by způsobilo posunutí pozice v překládaném kódu na následující Byte}
{a tady by to už zůstalo na programátorovi}
if Znak = 38 {nevim, jaké číslo má křížek (#) v ASCII} then
begin
Aktualni := Znak; {prvni Byte za #}
if Aktualni = {ASCII hodnota pro dolar '$'} then
begin
Vysledek := Char(Aktualni);
Aktualni := Znak;
while Aktualni in [{ASCII hodnota pro nulu}..{ASCII hodnota pro devítku},{pro 'A'}..{a pro 'F'}] do
begin
Vysledek := Vysledek + Char(Aktualni)
Aktualni := Znak;
end;
end
else if Aktualni = {cislo procenta '%'} then
begin
Vysledek := Char(Aktualni);
Aktualni := DalsiZnak;
while Aktualni in [{'0'},{'1'}] do
begin
Vysledek := Vysledek + Char(Aktualni);
Aktualni := Znak
end
end
else
begin
while Aktualni in [{'0'}..{'9'}] do
begin
Vysledek := Vysledek + Char(Aktualni);
Aktualni := Znak;
end;
{ a tady přijde na řadu to VAL }
end
end
end;

Tak takhle by to mohlo například vypadat pro Char... pro ten řetězec by to bylo podobné. Tak by mě zajímalo, co vy si o tom myslíte.

Jinak ten operační systém má být opravdu systémem a bude psán v pascalu. Jen pro něj dopíšu ten překladač :-).

Nahlásit jako SPAM
IP: 83.208.196.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
23. 5. 2009   #4
-
0
-

To Wimby : Pokud chceš psát OS zapomeň na Pascal či Object Pascal. Pokud chceš tvořit překladač, podle toho co tu předvádíš, bude pro tebe nejschůdnější cestou napsat PARSER (že by z Pascalu do C), který převede Pascal do jazyka se kterým lze tvořit OS, což lze nejlépe s C (ne, že by to s jinými jazyky nešlo, ale u C je nejvíce dokumentace, která se pro začátek hodí a zároveň jazyk s poměrně jednoduchou syntaxí, pozn. parsování VB.NET či C# by bylo o poznání horší, a především překladač C si poradí s instrukcemi ASM, co .NET sám od sebe neumí, resp. byla by tu možnost využít poznatků z http://research.microsoft.com/os/singularity), pokud ten základ rovnou nehodláš komplet udělat v ASM, kterému se při tvorbě zavaděče stejně nevyhneš. Na překladač do ASM (nebo dokonce do strojového kódu) bych prozatím na tvém místě na "pár dní zapomněl".

Ujasni si, co vlastně hodláš dělat, jestli OS neměl bys mít problém udělat parser a znát základní datové struktury pro něj (zásobník /binární strom-y). Na druhou stranu parsovat Pascal do C, proč? By bylo lepší se naučit C, ne?
Nemluvě o spoustě základních věcí, které OS dělají OS - zavaděč, správa paměti, souborový systém a ještě mnoho jiných vč. prostudování si dokumentace tvého CPU, opravdu pěkný román:).

Pokud chceš jen PARSER, můžeš si vymyslet cokoli html, kalkulačky, z prog. jazyka do jazyka..., ale ikdyž je to jen tak, mohl by si myslet alespoň na nějaou užitečnost.

Nahlásit jako SPAM
IP: 85.160.36.–
Wimby
~ Anonymní uživatel
50 příspěvků
23. 5. 2009   #5
-
0
-

To Anonymní uživatel : Zatím jsem se k psaní OS jako takového nedostal, jen k psaní překladače pro OS. Nechci to psát ve standardním Pascalu ani Object Pascalu, ale ani to nebude C, bude to něco mezi Pascalem a Adou, ale většina kódu bude víceměně Pascal. Vím, že "operačních systémů" v C už bylo napsáno víc než hodně, a tudíš nejsnazší cesta zřejmě povede tam, ale tudy já jít nechci hned z několika důvodů. A už vůbec nechci jít přes parsování Pascalu do C, protože C jakžtakž umim.

Co se týče toho systému, tak to nebude jenom systém na desktopy, ale prakticky na cokoliv. A proto ho chci napsat celý v "Pascalu". V ASM budou jen některý části jako třeba některý ovladače a zavaděč, který připraví především to nejnutnější, jako přepnutí do chráněného režimu a časovač. Jádro už by mělo být celé v abstraktním kódu. Většina ovladačů (včetně filesystému) lze taky celkem obstojně napsat ve vyšším jazyce.

Ještě k tomu co jsem napsal o příspěvek výš: kdybych ze standardního Pascalu oddělil jednotku "System", mohl bych ji pro různé systémy pouze přepsat, bez zásahu do kódu překladače. A vše by bylo mnohem jednodušší. (Navíc na některých strojích nemusí být například Byte = 8 bitů, může být třeba 12, takže tady taky jen upravím System :-)) Akorát to přináší ten Hlavní problém, že potom pro překladač neexistuje typ String spolu se zápisem uvozovka-text-uvozovka, a tak bych musel nějakým způsobem umožnit to všchno napsat "zvenčí". Napsat String pomocí pole nahradí standardní String snadno, ale neexistuje způsob, jak vytvořit zápis uvozovka-text-uvozovka. A to je právě to, s čím bych potřeboval poradit. Navrhnout způsob zapsání uvozovka-text-uvozovka :-)

On ten zápis pak bude zřejmě jen v jednotce System a třeba v jednotce FPU, která pak nejspíš bude sama zahrnována do kompilace, takže by to pak ve výsledku mělo být téměř jako standatdní Pascal :-)

Nahlásit jako SPAM
IP: 83.208.196.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
24. 5. 2009   #6
-
0
-

To Wimby : Proto snad píšeš ten parser, který zpracuje kód před posláním na překladač, tedy i ten tvůj text v uvozovkách převede na nějakou konstantu typu String, samotnou realizaci typu provedeš přes uživatelský typ a pointery (dynamické pole). Otázkou je, co si od toho slibuješ?
Mohl bys vysvětlit jak ten tvůj překladač má fungovat? Čeho hodláš docílit oddělením asi knihoven/jmeného prostoru(nebo jak se tomu nadává v Packalu) System?
Pro všechno(to jako od PC po mobil) a konkrétně ??? Asi máš hodně času a 100-ky spolupracovníků, pokud již výrobci HW podporují nějaký lepší jazyk, než stroják pak ASM a C, tak to aby sis napsal ovladače pro kde jakou myš, klávesnici a spusty MB, karet grafických, modemů, síťovek aj., prostudovat si architektury procesorů...
Studoval si už něco s unixem? Prostudoval si zdroják alespoň nějakého malého OS? Jaké typy programů už máš za sebou? A jaké knihy s teorií OS si pročetl?
No, jsem zvědav na tvůj OS, ale bojím se, že pořádně nevíš, co to je. Neumět si definovat si vlastní datový typ, nemít představu, jak se parsuje kód a s tím chtít napsat OS? Být na tvém místě začnu něčím jednoduším, třeba řádné barvení zdrojáku v editoru tvého kódu, což mě vede k otázce, v čem bude ten tvůj kód(jazyk mezi pascalem a adou) lepší oproti těm které máme, v čem bude přínosný?

Nahlásit jako SPAM
IP: 85.160.4.–
Wimby
~ Anonymní uživatel
50 příspěvků
24. 5. 2009   #7
-
0
-

Mám pocit, že stále dochází k nepochopení.

Proto snad píšeš ten parser, který zpracuje kód před posláním na překladač, tedy i ten tvůj text v uvozovkách převede na nějakou konstantu typu String

Ovšem, ale typ String z pohledu parseru neexistuje. Neexistuje žádný typ. Jen konstrukce jako je interval, množina, ukazatel na typ, pole, záznam a třída.

Mohl bys vysvětlit jak ten tvůj překladač má fungovat?

Jistě, nejdříve se nad textem provede lexikální analýza, která rozdělí text na lexémy, se kterými se dál provede v parseru rozbor. Vytvoří se syntaktické stromy (AST), které se dál optimalizují a pokračují do druhé fáze "back-endu", kde dojde k přeložení z AST do ASM/strojového kódu. Parser není závislý na platformě a počtu bitů. Zároveň však neimplementuje žádný typ.

Čeho hodláš docílit oddělením asi knihoven/jmeného prostoru(nebo jak se tomu nadává v Packalu) System?

Tím, že nebudu muset programovat typy jako integer, real, string vnitřně v parseru, ale jako konstrukce. Zjednoduší se jednak překladač, kterej má teď přibližně 10000 řádků kódu "front-endu", a jednak bude snazší editovat knihovnu než celý překladač při změně platformy.

Systém ale teď nemá cenu řešit, dokud nemám nástroj na jeho vytvoření.

Neumět si definovat si vlastní datový typ, nemít představu, jak se parsuje kód a s tím chtít napsat OS?

Myslím, že právě tady došlo k nepochopení. Není to o neumět si definovat vlastní datový typ, ale o nemožnosti přiřadit lexém řetězce, znaku, reálného čísla konstrukci, která neexistuje - Stringu, Charu, Realu...
Freepascal i GNU pascal, implementují typy vnitřně, ba implementují celou jednotku System. Snažím se od tohoto osvobodit a odstranit pár vad (v mých očích), které se mi na pascalu nelíbí. Například procedura Write z jednotky System nelze v jazyce Pascal napsat, protože jazyk Pascal neumožňuje libovolný počet argumentů, stejně tak nezná ani dvojtečku a číslo za argumentem. Kompilátor tedy musí tuto funkci mít integrovanou v sobě - což není zrovna to, co si představuji pod slovem ideální.

Jazyk to bude stále jako standardní Pascal, ale bez procedur Write, Read, Assign, Inc, Dec..., typů Integer, LongInt, Real, String, Byte, Char..., proměnných Input, Output, a konstant, až na Nil, kterou implementuji, protože je to klíčové slovo. String je také klíčové slovo, ale kdybych to zahrnul ho parseru, tak to sice vyřeší celý problém kolem Stringu, ale stejný problém zůstane u typu Char i Real... a po zahrnutí těchto typů sice už nebudu mít problém žádný, ale pak už bude zbytečný mít oddělenou jednotku System, a při změně systému budu muset přepisovat téměř celý překladač a nebude to "ideální" řešení.

Ještě mě napadlo zavést něco jako makra s regulárním výrazem pro řešení uvozovka-text-uvozovka nebo číslo-tečka-číslo-e-číslo, ale stejně nevím, jak to přiřadit k typu a jak to udělat Pascalovsky, aby to nebylo jen "lepení".

A co si od toho slibuji? například zápisy jako:

RealneCislo := 3.14;

KomplexniCislo := 14 + 4i;
PocetJablek := 15j;
PocetMetru := 90 m;
Prodleva := 1000 ms;
Retezec := 'ahoj svete';
Pripadne := "retezec na
nekolik
radku";
A díky silné typové kontrole mi to zahlásí chybu, když se budu snažit přiřadit do proměnné PocetMetru číslo v desítkové soustavě. Mimochodem, třeba zrovna ta desítková soustava. Co když budu chtít stopy nebo dvanáctkovou soustavu? Je mnohem přehlednější, napsat ji ve formátu, ve kterém ji píšu i tužkou na papír.

Nahlásit jako SPAM
IP: 83.208.196.–
Spectator0
Věrný člen
24. 5. 2009   #8
-
0
-

To Wimby :

RealneCislo := 3.14;
KomplexniCislo := 14 + 4i;
PocetJablek := 15j;
PocetMetru := 90 m;
Prodleva := 1000 ms;
Retezec := 'ahoj svete';
Pripadne := "retezec na
nekolik
radku";


Trochu mi to pripomina python

Nahlásit jako SPAM
IP: 89.176.18.–
. . .
janik3660
Návštěvník
24. 5. 2009   #9
-
0
-

Wimby, hod tu prosim tovje ICQ

Nahlásit jako SPAM
IP: 78.99.51.–
HTML, CSS, PHP, MySQL, JAVASCRIPT, PASCAL, C/C++
Wimby
~ Anonymní uživatel
50 příspěvků
24. 5. 2009   #10
-
0
-

To janik366 : 255397306

Nahlásit jako SPAM
IP: 83.208.196.–
Mircosoft+1
Věrný člen
25. 5. 2009   #11
-
0
-

Pokud jde o multiplatformnost stringu, tak si ji predstavuju jako ze jeden znak muze mit na ruznych platformach ruzny pocet bitu. Ve zdrojaku to ovsem musi vypadat stejne - napisu 'ahoj svete' a az prekladac urci, jestli to vyjde na 10 (ASCII, EBCDIC) nebo 20 (UTF16) bytu. Lexikalni analyza bude fungovat uplne stejne.
Nechapu ale, proc se snazis resit stringy v parseru, z jehoz pohledu neexistuji. Nebylo by jednodussi do nej podporu stringu proste pridat?

Mimochodem, mozna by te mohl zajimat jazyk ST (structured text language), ktery se pouziva pro programovani PLC (programovatelnych automatu). Tam se jednotky (a zaroven i pretypovani) resi celkem elegantne:
1234 - normalni desitkove cislo
16#1234 - hexa cislo
2#1010 - binarni cislo
T#100ms - cas (100 ms), dale treba T#50s i jine jednotky
TOD#...a tady uz si presne nepamatuju syntaxi... - cas a datum (prekladac prelozi na prislusny timestamp)
Obecne [typ#]hodnota[jednotka]
Pak se tam taky docela zajimave resi parametry funkci.
Jazyk sam o sobe je vice nebo mene prenositelny mezi automaty od ruznych vyrobcu, ktere se mezi sebou muzou naprosto diametralne lisit (vykonem, architekturou i moznostmi). Neprenosne jsou jenom ruzne specialni funkce, napr. rizeni a synchronizace servomotoru, ovladani specialnich cidel a tak. Ale zdrojak programu, ktery pracuje jenom s daty v pameti (vcetne stringu), muzu prislusnym prekladacem prelozit a spustit na jakemkoli PLC, kteremu se vejde do pameti.
Google toho moc nenajde, patrej primo u Siemense: http://www.automation.siemens.com, najdes tam tohle PDF: http://support.automation.siemens.com/WW/llisapi.dll/csfetch/27002409/ST_Programming_en-US.pdf?func=cslib.csFetch&nodeid=27002416&forcedownload=true.
No nic, to jenom tak pro inspiraci, treba ti to nejak pomuze...

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý