NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Do čeho kompilovat?

Aktivity
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 18:21

Zdravím,
do čeho je nejlepší kompilovat, dělám-li vlastní kompiler? Jako první mě napadá C. Což mi ale nepřijde moc originální. Dále se nabízí object file, ASM atp. Kde bude nejharmoničtější rovina mezi schopnostmi výsledku, náročností na vytvoření zdrojů (v ASM bych si hodně věcí musel udělat sám, i když bych mohl využívat C/... knihovny atd.), přenositelností výsledku a složitostí kompileru?
Děkuji.

 
Odpovědět
12.10.2013 18:21
Avatar
vitamin
Člen
Avatar
vitamin:12.10.2013 19:10

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, ...

Editováno 12.10.2013 19:15
 
Nahoru Odpovědět
12.10.2013 19:10
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 19:25

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.

Nahoru Odpovědět
12.10.2013 19:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 19:34

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...

 
Nahoru Odpovědět
12.10.2013 19:34
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 19:40

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.

Nahoru Odpovědět
12.10.2013 19:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 19:41

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 - ~...

 
Nahoru Odpovědět
12.10.2013 19:41
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:12.10.2013 19:43

Ale to pak ta nadstavba ztratí smysl. Interpretovaný jazyk se nikdy nedorovná Cčku...

 
Nahoru Odpovědět
12.10.2013 19:43
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 19:44

Ak ta nezaujima rychlost prekladu tak to kludne prekladaj do C.
Das sem zopar prikladov tych vylepseni?

 
Nahoru Odpovědět
12.10.2013 19:44
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 19:44

A co třeba D? Ten jazyk umí všechno co C a je objektový.

Nahoru Odpovědět
12.10.2013 19:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 19:44
  • a - v ` bloku značí viditelnost - + od současného/uve­deného bloku, anebo -. +- je pak public a -- je internal...
 
Nahoru Odpovědět
12.10.2013 19:44
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:12.10.2013 19:46

V D dělám. Já vím - jen si hraji. Kdo si hraje nezlobí... :D 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...

 
Nahoru Odpovědět
12.10.2013 19:46
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 19:46

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.

Nahoru Odpovědět
12.10.2013 19:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 19:48

Ten, kdo potřebuje dynamický linker, použije Javu nebo C#.

Nahoru Odpovědět
12.10.2013 19:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 19:48

Dynamicky linker ma byt v dmd 2.064 +- za mesiac.

 
Nahoru Odpovědět
12.10.2013 19:48
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:12.10.2013 19:50

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.

 
Nahoru Odpovědět
12.10.2013 19:50
Avatar
Kit
Tvůrce
Avatar
Odpovídá na vitamin
Kit:12.10.2013 19:50

To jsi neměl psát. Teď budou všichni chtít programovat v D :)

Nahoru Odpovědět
12.10.2013 19:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:12.10.2013 19:54

A proč ne? Je to dokonalý jazyk. Jen mě štve, že tam kde chtějí C++ mi jej většinou nedovolí... :D

 
Nahoru Odpovědět
12.10.2013 19:54
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 19:55

Na D mě zaujalo víc věcí:

  • má přímou podporu pro odlišné zpracování programu pro různé architektury a operační systémy
  • má vestavěnu podporu TDD. Jiné jazyky ji nemají a dohánějí to frameworky. Je to unikátní vlastnost
  • má přímou podporu pro contract programming. Další unikátní vlastnost vhodná pro TDD
  • předchozí dvě vlastnosti se pro release dají vypnout parametrem při kompilaci a tím se produkční kód zrychlí
  • umí automaticky zavřít otevřený soubor ihned po opuštění bloku, kde byl soubor otevřen
  • hojně se v něm využívají immutable objekty, což zvyšuje spolehlivost programu
  • má fungující destruktory
  • má přetěžování operátorů
  • je cool :)
Nahoru Odpovědět
12.10.2013 19:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vitamin
Člen
Avatar
Odpovídá na Kit
vitamin:12.10.2013 19:55

Tak ja dufam ze D casom nahradi c++. Z pohladu navrhu jazyka je to genialny jazyk.

 
Nahoru Odpovědět
12.10.2013 19:55
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 19:59

Jak jsem psal... :D 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? :D Že bych sice interpretoval, ale už zkompilovaný kód...

 
Nahoru Odpovědět
12.10.2013 19:59
Avatar
vitamin
Člen
Avatar
Odpovídá na Kit
vitamin:12.10.2013 20:01

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...

 
Nahoru Odpovědět
12.10.2013 20:01
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 20:02

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...

 
Nahoru Odpovědět
12.10.2013 20:02
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 20:03

Určitě bych šel do toho virtuálního stroje. Pomalé to nebude.

Nahoru Odpovědět
12.10.2013 20:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 20:06

CIL bude asi uzavřený - co?

 
Nahoru Odpovědět
12.10.2013 20:06
Avatar
vitamin
Člen
Avatar
vitamin:12.10.2013 20:11

Existuje mono takze je asi otvoreny. Z bezneho pohladu na tvoj jazyk sa ale bojim ze CLI je Vyzsi jazyk ako ten tvoj :D

Editováno 12.10.2013 20:11
 
Nahoru Odpovědět
12.10.2013 20:11
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 20:13

Je to takový nízko-vysoký jazyk... :D Prozatím jej interpretuji právě v D...

 
Nahoru Odpovědět
12.10.2013 20:13
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 20:21

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..."
 
Nahoru Odpovědět
12.10.2013 20:21
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 20:22

Pod nadstavbou C som si predstavoval nieco ine :)

 
Nahoru Odpovědět
12.10.2013 20:22
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 20:23

Jo dědění:

inherit ExistujícíBlok, NovýBlok

Vše co jsem zde poslal zkratkovitě má i plnou verzi - aby si nikdo nestěžoval na obtížnost orientace a zapamatování si...

 
Nahoru Odpovědět
12.10.2013 20:23
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 20:24

Je to hodně špatné? :D

 
Nahoru Odpovědět
12.10.2013 20:24
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 20:27

Ano :), uz chapem ako si mohol spravyt kompilator na necelych 400 riadkov. (U mna ma len obycajny lexer cez 2K )

Editováno 12.10.2013 20:27
 
Nahoru Odpovědět
12.10.2013 20:27
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 20:30

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...

 
Nahoru Odpovědět
12.10.2013 20:30
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 20:33

Ako deklarujes premenne a funkcie?
Ako vytvaras podmienky?
Ako zapises a + b * c; ?

 
Nahoru Odpovědět
12.10.2013 20:33
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 20:40

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 cokolivmajitel 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?

 
Nahoru Odpovědět
12.10.2013 20:40
Avatar

Neregistrovaný
Avatar
:12.10.2013 20:42

To divné cokoliv má být mezi `... Mezi ` a ' lze dát jakýkoliv demiliter. U ` je to pak pro funkčnost structu - lze to používat jako struct - pojmenovaný blok definic proměnných... U stringu je to na demiliter... (oddělovač)

 
Nahoru Odpovědět
12.10.2013 20:42
Avatar

Neregistrovaný
Avatar
:12.10.2013 20:45

Přehlednost zajistí nové řádky... Jak jsem psal - bílé znaky musí být jen mezi slovy...

define ``

ddd = 25
Start- eee = 258
. iii = 416 + 256
. k;
       ``
 
Nahoru Odpovědět
12.10.2013 20:45
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 20:46

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.

Nahoru Odpovědět
12.10.2013 20:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na Kit
Kdosi:12.10.2013 20:50

Je to nadstavba C - to je účel. Má to funkčnost C + dynamyckou správu paměti, automatické typování atd...

 
Nahoru Odpovědět
12.10.2013 20:50
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 20:53

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 ( ... )

 
Nahoru Odpovědět
12.10.2013 20:53
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 20:57

Doprucujem ti precitat si toto:
http://www.amazon.com/…=as_li_ss_tl?…
(Je aj pdf na TPB)

 
Nahoru Odpovědět
12.10.2013 20:57
Avatar
Kdosi
Neregistrovaný
Avatar
Odpovídá na vitamin
Kdosi:12.10.2013 21:00

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...

 
Nahoru Odpovědět
12.10.2013 21:00
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 21:03

Ty ` musí být 2 na začátku a nakonci - ale zde je mi to schramsnuto...

Jsou tam i podmíněné skoky atd.

block ddd

<

block eee

set iii, ooo
add ooo, 25 + 6 "ooo += 25 + 6"

    block ggg

    ...

<
 
Nahoru Odpovědět
12.10.2013 21:03
Avatar

Neregistrovaný
Avatar
:12.10.2013 21:04
``- a = 6``

A je to pro současný blok + potomky... -- by bylo internal...

 
Nahoru Odpovědět
12.10.2013 21:04
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:12.10.2013 21:06

Nemohu se zbavit dojmu, že vynalézáš ještě lepší kolo, nežli já :)

Nahoru Odpovědět
12.10.2013 21:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar

Neregistrovaný
Avatar
:12.10.2013 21:07

Lokální proměnná:

block ddd

define ``- index = 0``

<

tady už ji neuvidím

inherit ddd, new

set index, 6 "v potomkovi ji vidím díky -..."
 
Nahoru Odpovědět
12.10.2013 21:07
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 21:08

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
<
 
Nahoru Odpovědět
12.10.2013 21:08
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 21:12

Však tak to je... Ale místo set b použiješ add b, ...

 
Nahoru Odpovědět
12.10.2013 21:12
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 21:13

Komenty jsou v ""...

set b, b+a*2

Lze, ale lepší je:

add b, a * 2

 
Nahoru Odpovědět
12.10.2013 21:13
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:12.10.2013 21:14

Daj sem zdrojak ak mozes :)

 
Nahoru Odpovědět
12.10.2013 21:14
Avatar
Kdosi
Neregistrovaný
Avatar
Kdosi:12.10.2013 21:14

+- viditelnost to pak ještě upraví - třeba pro nižší bloky, anebo vyšší, anebo externí...

 
Nahoru Odpovědět
12.10.2013 21:14
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.

Zobrazeno 50 zpráv z 72.