Učíme se psát kompilátor

hlasů
699

Preferované jazyky : C / C ++, Java a Ruby.

Já jsem hledal nějaké užitečné knihy / tutoriály o tom, jak napsat svůj vlastní kompilátor pouze pro vzdělávací účely. Jsem obeznámen s C / C ++, Java, Ruby, a tak jsem raději prostředky, které zahrnují jeden z těch tří, ale každý dobrý zdroj je přijatelné.

Položena 04/08/2008 v 23:46
zdroj uživatelem
V jiných jazycích...                            


40 odpovědí

hlasů
1k

Big Seznam zdrojů:

Legenda:

  • ¶ Odkaz na soubor PDF
  • $ Odkaz na tištěnou knihu
Odpovězeno 04/08/2008 v 23:52
zdroj uživatelem

hlasů
69

Jedná se o poměrně vágní otázku, myslím; jen proto, že hloubky tématu podílí. Kompilátor lze rozložit na dvě samostatné části, nicméně; horní polovina a spodní-one. Horní polovina obvykle trvá zdrojového jazyka a převádí jej do mezilehlé reprezentace, a spodní polovina se stará o plošiny specifické generování kódu.

Nicméně, jeden nápad pro snadný způsob, jak přistupovat k tomuto tématu (ten jsme použili ve své třídě kompilátorem, přinejmenším) je vybudovat kompilátoru ve dvou kusech popsaných výše. Konkrétně budete mít dobrou představu o celém procesu jen o budování horní polovinu.

Dělám jen horní polovinu vám umožní získat zkušenosti z psaní lexikální analyzátor a parser a přejít k vytváření nějaké „kód“ (které zprostředkovávají zastoupení jsem se zmínil). Takže to bude trvat váš zdrojový program a převést ji na jinou reprezentaci a udělat nějaké optimalizace (chcete-li), který je srdcem překladače. Spodní polovina pak bude mít ten prostřední zastoupení a generování bytů potřebné ke spuštění programu na konkrétní architektuře. Například, bude spodní polovina vzít si střední reprezentace a generovat PE spustitelný soubor.

Některé knihy na toto téma, které jsem našel užitečné zejména byl kompilátory principů a technik (nebo Dragon Book, vzhledem k roztomilé draka na obálce). Má to nějaké velké teorii a určitě se týká gramatik skutečně přístupným způsobem. Také pro budování lexikální analyzátor a parser, budete pravděpodobně používat * nix nástrojů lex a yacc. A dost uninterestingly, kniha s názvem „ lex a yacc “ zvedl, kde Dragon Book přestali pro tuto část.

Odpovězeno 21/07/2009 v 00:01
zdroj uživatelem

hlasů
54

Myslím, že Modern Compiler Implementace v ML je nejlepší úvodní kompilátor psaní textu. K dispozici je verze Java a verze C taky, z nichž každá může být přístupnější uveden váš jazyk pozadí. Kniha skrývá mnoho užitečných základního materiálu (skenování a rozebrat, sémantická analýza, aktivační záznamy, výběr návodem, RISC a x86 nativní generování kódu) a různé „vyspělých“ témat (sestavení OO a funkcionálních jazyků, polymorfismus, sběr odpadků, optimalizaci a jediný statický tvar přiřazení) do relativně malého prostoru (~ 500 stran).

Raději Moderní kompilátoru Implementace do Dragon knihy, protože průzkumy Modern kompilátoru realizace méně pole - místo toho to má opravdu solidní pokrytí všech témat, budete muset psát seriózní a slušný kompilátor. Po práci prostřednictvím této knihy budete připraveni řešit výzkumné práce přímo pro větší hloubky, pokud ji budete potřebovat.

Musím přiznat, že mám vážné slabost pro Niklaus Wirth v konstrukci překladačů. Je k dispozici on-line ve formátu PDF. Zjistil jsem programování estetický Wirthova prostě krásné, ale někteří lidé najít svůj styl příliš minimální (například Wirth podporuje rekurzivní generační analyzátory, ale většina kurzů CS zaměřit na nástroje generátor analyzátoru,. Jazykové konstrukce Wirth jsou poměrně konzervativní) Výstavba překladačů je velmi stručná destilace ze základních myšlenek Wirth, takže jestli se vám líbí jeho styl, nebo ne, nebo ne, vřele doporučuji přečtení této knihy.

Odpovězeno 10/08/2008 v 08:54
zdroj uživatelem

hlasů
45

Souhlasím s odvoláním na Dragon Book; IMO, je to definitivní průvodce pro konstrukci překladačů. Připravte se na nějakou teorii hardcore, ačkoli.

Pokud si chcete knihu, která je lehčí na teorii, Game Mastery Scripting může být lepší kniha pro vás. Pokud jste úplný nováček na teorii překladačů poskytuje jemnější úvod. To se nevztahuje na více praktické metody rozebrat (rozhodly pro non-prediktivní rekurzivní sestup bez projednání LL nebo LR analýze), a pokud si dobře vzpomínám, to není ani diskutovat jakoukoli teorii optimalizace. Navíc, namísto sestavování do strojového kódu, sestavuje k bytecode, který by měl běžet na VM, který také psát.

Je to stále slušný čtení, a to zejména v případě, můžete si ji vyzvednout levně na Amazonu. Pokud chcete pouze jednoduchý úvod do překladače, Game Mastery Scripting není špatný způsob, jak jít. Chcete-li jít hardcore dopředu, pak byste se měli spokojit s ničím menším, než Dragon Book.

Odpovězeno 05/08/2008 v 00:08
zdroj uživatelem

hlasů
28

„Postavme Compiler“ je úžasné, ale je to trochu zastaralé. (Neříkám, že je to ještě trochu menší hodnotu.)

Nebo vyzkoušet slangu . Je to podobné jako „Postavme Compiler“, ale je mnohem lepší zdroj, zejména pro začátečníky. To přichází s PDF tutorial, který bere v 7 krocích přístup při výuce vám kompilátor. Přidání odkazu Quora protože mají vazby na všech různých přístavech slangu v C ++, Java a JS, i tlumočníky v Pythonu a Java, původně napsané pomocí C # a .NET platformu.

Odpovězeno 04/08/2008 v 23:56
zdroj uživatelem

hlasů
24

Máte-li zájem používat výkonné a vyšší nástroje úrovně, spíše než budování všechno sami, prochází projektů a čtení pro tento předmět je docela dobrá volba. Je to jazyk kurs autorovi parser motoru ANTLR Java. Můžete získat knihu kurzu jako PDF z pragmatického programátorů .

Kurz vede přes standardní kompilátor kompilátor věcí, které byste vidět na jiném místě: rozebrat, typů a typové kontroly, polymorfismus, tabulek symbolů a generování kódu. Skoro jediná věc, na kterou se nevztahuje je optimalizace. Závěrečný projekt je program, který překládá podmnožinu C . Vzhledem k tomu použít nástroje jako ANTLR a LLVM, je možné napsat celý kompilátor za jediný den (mám existenční důkaz toho, když mám na mysli ~ 24 hodin). Je to těžké na praktickém inženýrství za použití moderních nástrojů, trochu lehčí na teorii.

LLVM, mimochodem, je prostě fantastické. Mnoho situací, kdy byste normálně kompilace dolů až po montáž, měli byste být mnohem lépe kompilace LLVM je Intermediate zastoupení místo. To je vyšší úroveň, multiplatformní a LLVM je docela dobře generování optimalizované sestavy z něj.

Odpovězeno 05/08/2008 v 00:13
zdroj uživatelem

hlasů
20

Pokud máte málo času, doporučuji Niklaus Wirth je „Výstavba překladačů“ (Addison-Wesley. 1996) , maličký brožuru, které si můžete přečíst v den, ale to vysvětluje základy (včetně toho, jak implementovat lexers, rekurzivní generační analyzátory, a vaše vlastní zásobník na bázi virtuálních strojů). Po tom, chcete-li hluboký ponor, neexistuje způsob, jak kolem Dragon knihy a další komentátoři naznačují.

Odpovězeno 29/08/2010 v 00:14
zdroj uživatelem

hlasů
17

Možná budete chtít podívat do Lex / Yacc (nebo Flex / Bison, cokoliv chcete nazývat). Flex je lexikální analyzátor, který bude analyzovat a identifikovat sémantické komponenty ( „tokeny“) svého jazyka, a Bison budou použity k definování toho, co se stane, když se každý žeton analyzován. To by mohlo být, ale rozhodně není omezen na, tisk C kód pro kompilátor, který by sestavit až C, nebo dynamicky běží podle pokynů.

Tento FAQ vám měl pomoci, a tato výuka vypadá docela užitečné.

Odpovězeno 20/07/2009 v 23:47
zdroj uživatelem

hlasů
16

Obecně řečeno, není pět minut tutorial pro kompilátory, protože je to složité téma a psát kompilátor může trvat měsíce. Budete muset udělat svůj vlastní vyhledávání.

Python a Ruby jsou obvykle vykládána. Možná budete chtít začít s tlumočníkem stejně. To je obecně snazší.

Prvním krokem je napsat formální popis jazyka, gramatiky vašeho programovacího jazyka. Pak budete muset transformovat zdrojový kód, který chcete kompilovat nebo vykládat podle gramatiky do syntaktický strom, vnitřní forma zdrojového kódu, že počítač rozumí, může pracovat dál. Tento krok se obvykle nazývá rozebrat a software, který analyzuje zdrojový kód se nazývá parser. Často parser je generován generátor analyzátoru, který transformovat formální gramatiku do source oder strojového kódu. Pro dobrý, ne-matematické vysvětlení rozebrat doporučuji parsování techniky - praktický průvodce. Wikipedia má srovnání analyzátoru generátorů, ze kterých si můžete vybrat, že ten, který je vhodný pro vás. V závislosti na parser generátor, který jste zvolili, najdete návody na internetu a opravdu populární parser generátorů (jako GNU bizon) existují i ​​knihy.

Psaní parser pro svůj jazyk může být opravdu těžké, ale to závisí na vaší gramatiky. Takže navrhuji, aby se vaše gramatiku jednoduchý (na rozdíl od C ++); Dobrým příkladem toho je LISP.

Ve druhém kroku se syntaktický strom mění ze stromové struktury do lineárního mezilehlé reprezentaci. Jako dobrý příklad pro tento Lua je bytecode je často citován. Ale meziprodukt reprezentace opravdu záleží na vašem jazyce.

Pokud vytváříte tlumočníka, budete prostě muset interpretovat prostřední reprezentaci. Dalo by se také just-in-time-kompilaci. Doporučuji LLVM a libjit pro just-in-time-kompilace. Chcete-li jazyk použitelný budete mít také zahrnout některé vstupní a výstupní funkce a možná malý standardní knihovny.

Pokud se chystáte k sestavení jazyk, bude to složitější. Budete muset psát backends pro různé počítačové architektury a generování strojového kódu z prostředního zastoupení v těchto backendy. Doporučuji LLVM k tomuto zadání.

Existuje několik knih na toto téma, ale mohu doporučit žádný z nich pro všeobecné použití. Většina z nich jsou příliš akademické nebo příliš praktické. Neexistuje žádná „Teach yourself kompilátoru psát za 21 dní“, a tak budete muset koupit několik knih získat dobré pochopení celého tohoto tématu. Máte-li hledat na internetu, narazíte na nějaký některé online knih a skript. Možná je tu univerzitní knihovna v okolí vás, kde si můžete půjčit knihy o překladačů.

Doporučuji také dobrou odbornou průpravu v teoretické informatiky a teorie grafů, pokud se chystáte, aby se váš projekt vážně. V oboru výpočetní techniky bude také užitečné.

Odpovězeno 21/07/2009 v 11:37
zdroj uživatelem

Odpovězeno 18/05/2010 v 00:38
zdroj uživatelem

hlasů
11

Jedna kniha dosud navrhl, ale velmi důležitá je „Linkers a nakladače“ John Levine. Pokud nepoužíváte externí assembler, budete potřebovat způsob, jak výstup soubor objektů, které mohou být propojené do konečného programu. I v případě, že používáte externí assembler, pravděpodobně budete muset pochopit, přemisťování a jak celý program nakládání proces funguje, aby se pracovní nástroj. Tato kniha shromažďuje velké množství náhodných tradice kolem tohoto procesu pro různé systémy, včetně Win32 a Linux.

Odpovězeno 18/08/2008 v 21:18
zdroj uživatelem

hlasů
10

Zjistil jsem, dračí knihu příliš těžké číst příliš mnoho zaměřením na teorii jazyka, který není opravdu nutné psát kompilátor v praxi.

Chtěl bych přidat Oberon knihu, která obsahuje úplný zdroj překvapivě rychlou a jednoduchou Oberon překladačů projekt Oberon .

alt text

Odpovězeno 09/08/2010 v 19:33
zdroj uživatelem

hlasů
10

Pokud jste ochotni používat LLVM, podívejte se na to: http://llvm.org/docs/tutorial/ . To vás naučí, jak napsat překladač od nuly pomocí rámce LLVM je, a nepřebírá máte nějaké znalosti o tématu.

Tutoriál doporučuji napsat svůj vlastní analyzátor a Lexer atd, ale radím vám podívat do bizonů a ohýbat, jakmile se dostanete nápad. Dělají život tak mnohem jednodušší.

Odpovězeno 20/08/2008 v 11:01
zdroj uživatelem

hlasů
10

The Dragon Book je určitě „stavební překladače“ knihu, ale pokud váš jazyk není tak složité, jak současné generace jazyků, možná budete chtít podívat na interpret vzoru z návrhových vzorů .

Příklad v knize navrhuje regulární výraz podobný jazyk a je dobře promyšlená, ale jak se říká v knize, je to dobré pro myšlení prostřednictvím procesu, ale je účinný opravdu jen na malých jazyků. Nicméně, to je mnohem rychlejší psát interpret za malý jazyk s tímto vzorem, než by se museli učit o všech různých typů analyzátorů, yacc a lex, et cetera ...

Odpovězeno 05/08/2008 v 17:16
zdroj uživatelem

hlasů
9

Vzpomínám si, že touto otázkou před sedmi lety, když jsem byl s programováním poměrně nová. Byl jsem velmi opatrný, když jsem se ptal a překvapivě jsem nedostal tolik kritiky, jak jste získali zde. Oni mě však ukazují ve směru k „ Dragon Book “, což je podle mého názoru, opravdu skvělou knihu, která vysvětluje vše, co potřebujete vědět, abyste mohli napsat kompilátor (budete samozřejmě muset zvládnout jazyk nebo dva. Čím jazyky víte, tím lépe.).

A ano, mnoho lidí říká, četl tu knihu, je blázen a nebudete učit nic z toho, ale naprosto nesouhlasím s tím.

Mnoho lidí také tvrdí, že psaní překladače je hloupé a zbytečné. No, existuje řada důvodů, proč vývoj kompilátoru jsou použitelné: - Protože je to zábava. - Je to vzdělávací, když se učí, jak psát kompilátory se naučíte hodně o výpočetní techniky a další techniky, které jsou užitečné při psaní dalších aplikací. - Pokud nikdo napsal kompilátory stávající jazyky by nemůže být lepší.

Nechtěl jsem psát své vlastní překladač ihned, ale poté, co žádají jsem věděl, kde začít. A teď, po učení mnoha různými jazyky a čtení Dragon Book psaní není tak velký problém. (Jsem také studoval výpočetní technika atm, ale většina z toho, co vím o programování je samouk.)

Na závěr: - The Dragon Book je velký "tutorial". Ale strávit nějaký čas zvládnutí jazyka nebo dva před pokusem o napsání kompilátor. Neočekávejte, že je kompilátor guru v průběhu příštího desetiletí nebo tak ačkoli.

Kniha je také dobré, pokud se chcete dozvědět, jak psát analyzátory / tlumočníky.

Odpovězeno 06/08/2009 v 23:37
zdroj uživatelem

hlasů
9

Dívám se do stejného konceptu, a našel tento slibný článek Joel Pobar,

Vytvořte kompilátor jazyka pro rozhraní .NET Framework

probírá vysoké úrovni konceptu překladače a pokračuje vymyslet svůj vlastní langauge pro NET Framework. Ačkoli jeho zaměřené na NET Framework, mnoho z pojmů by měl být schopen reprodukovat. Tento článek se vztahuje na:

  1. definice langauge
  2. Skener
  3. Analyzátor (bit im hlavně zájem o)
  4. Cílení na .NET Framework
  5. Generátor kódů

existují další témata, ale dostanete jen.

Jeho cílem bylo lidí začíná, napsaný v jazyce C # (ne zcela Java)

HTH

ostatky

Odpovězeno 31/12/2008 v 00:01
zdroj uživatelem

hlasů
9

„... Postavme překladače ...“

Já bych druhou http://compilers.iecc.com/crenshaw/ by @sasb . Zapomeňte na koupi více knih pro tuto chvíli.

Proč? Nástroje a jazyk.

Jazyk zapotřebí, je Pascal, a pokud se nepletu je založen na Turbo Pascal. To jen tak se stane, když jdete do http://www.freepascal.org/ a stáhnout Pascal kompilátor všechny příklady pracovat přímo ze stránky ~ http://www.freepascal.org/download.var The krasavice věc asi zdarma Pascal je jej můžete použít téměř jakýkoliv procesor nebo OS můžete pečovat.

Poté, co jste zvládli lekce zkuste pokročilejší Dragon Book ~ http://en.wikipedia.org/wiki/Dragon_book

Odpovězeno 20/08/2008 v 12:28
zdroj uživatelem

hlasů
8

Z comp.compilers FAQ :

"Programování osobního počítače" Per Hansen Brinch Prentice Hall 1982 ISBN 0-13-730283-5

To bohužel-book s názvem vysvětluje návrh a vytvoření programovacího prostředí jednoho uživatele na miliontin, pomocí Pascal-jako jazyk zvaný Edison. Autor uvádí všechny zdrojové kódy a vysvětlení k provádění krok za krokem s Edison kompilátoru a jednoduché podpůrné operační systém, to vše napsané v samotném (s výjimkou malého nosné jádro psané v symbolickém assembleru pro PDP 11/23 Edison, přičemž kompletní zdroj lze také objednat pro IBM PC).

Nejzajímavější věcí o této knize jsou: 1) jeho schopnost ukazují, jak vytvořit kompletní, soběstačný, self-udržovat, užitečné kompilátoru a operačního systému, a 2) zajímavá diskuse o designu a specifikace jazykových problémů a obchodních offs v kapitole 2.

"Brinch Hansen na Pascal kompilátorů" Per Hansen Brinch Prentice Hall 1985 ISBN 0-13-083098-4

Další světlo na teorii heavy-on-pragmatiky Zde je návod-how-to-code-to kniha. Autor uvádí návrh, implementaci a kompletní zdrojový kód pro kompilátor a p-kódu tlumočníka Pascal- (Pascal „minus“), což je Pascal podmnožinu s boolean a celočíselných typů (ale žádné znaky, reálných čísel, subranged nebo výčtový typ) , konstantní a variabilní definice a pole a záznam typy (ale ne balené, varianta, soubor, ukazatel, bezejmenné, přejmenován nebo typy souborů), výrazy, příkazy přiřazení, vnořené definice postup s hodnotou a proměnnými parametry, if, while, a začne-koncové bloky (ale bez definice funkce, procesní parametry, Jdi výkazy a etikety, pouzdro prohlášení, opakovat závěrku, závěrky, a s příkazy).

Kompilátor a interpret jsou psány v Pascalu * (Pascal „hvězda“), Pascal podmnožině rozšířena s některými rysy Edison stylu pro vytváření softwarových vývojových systémů. Pascal * kompilátor pro IBM PC se prodává autorem, ale je to snadné portu knihy Pascal- kompilátor na libovolném vhodném Pascal platformě.

Tato kniha je návrh a implementace překladače vypadat jednoduše. Zejména se mi líbí, jak se autor se zabývá kvalitou, spolehlivostí a testování. Kompilátor a interpret může být snadno použit jako základ pro další zúčastněné jazyk nebo kompilátor projektu, a to zejména pokud jste stisknutí se rychle dostat něco nahoru a běh.

Odpovězeno 26/06/2010 v 21:17
zdroj uživatelem

hlasů
8

Byste měli vyzkoušet Darius Baconových „ ichbins “, který je překladač pro malý Lisp dialektu, cílení C, v něco málo přes 6 stran kódu. Výhodou má na většinu hraček překladačů je, že jazyk je natolik úplná, že překladač je v něm napsáno. (Tarball zahrnuje také tlumočníka bootstrap věc.)

Je tu víc věcí o tom, co jsem našel užitečné naučit se psát kompilátor na mém Ur-schématu webové stránky.

Odpovězeno 05/10/2008 v 17:00
zdroj uživatelem

hlasů
8

Snadný způsob, jak vytvořit překladač je použít bizoni a flex (nebo podobný), vytvořit strom (AST) a generování kódu v C. S generování kódu C jsou nejvýznamnější krok. Generováním C kód, bude váš jazyk automaticky fungovat na všech platformách, které mají C kompilátor.

Generování kódu C je stejně snadné jako generování HTML (stačí použít vytisknout nebo ekvivalent), což je mnohem jednodušší, než psát C parser nebo HTML parser.

Odpovězeno 20/08/2008 v 10:56
zdroj uživatelem

hlasů
7

Je nám líto, to je ve španělštině, ale toto je bibliografie kurzu s názvem „Compiladores e interpretuje“ (překladačů a interpretů) v Argentině.

Kurz byl z teorie formálních jazyků na konstrukci překladačů, a to jsou témata, budete muset vybudovat alespoň jednoduchý překladač:

  • Překladače design v C.
    Allen I. Holub

    Prentice Hall. 1990.

  • Compiladores. Teoria y Construcción.
    Sanchis Llorca, FJ, Galán Pascual, C. Editorial Paraninfo. 1988.

  • Výstavba překladačů.
    Niklaus Wirth

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y Automaty. Un enfoque Práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana (España). 1997.

  • Umění kompilátoru design. Teorie a praxe.
    Thomas Pittman, James Peters.

    Prentice Hall. 1992.

  • Objektově orientované Výstavba překladačů.
    Jim Holmes.
    Prentice Hall, Englewood Cliffs, NJ 1995

  • Compiladores. Conceptos Fundamentales.
    B. Teufel, S. Schmidt, T. Teufel.

    Addison-Wesley Iberoamericana. 1995.

  • Úvod do teorie automatů, jazyků a počítání.

    John E. Hopcroft. Jeffref D. Ullman.
    Addison-Wesley. 1979.

  • Úvod do formálních jazyků.
    György E. Révész.

    Mc Graw Hill. 1983.

  • Parsování techniky. A Practical Guide.
    Dick Grune, Ceriel Jacobs.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: Yet Another Compiler Compiler,.
    Stephen C. Johnson
    Computing Science Technical Report Nº 32, 1975. Bell Laboratories. Murray Hill, New
    Jersey.

  • Lex: lexikální analyzátor generátor.
    ME Lesk, E. Schmidt. Computing Science Technical Report Nº 39, 1975. Bell Laboratories. Murray Hill, New Jersey.

  • lex a yacc.
    John R. Levine, Tony Mason, Doug Brown.
    O'Reilly & Associates. 1995.

  • Prvky teorii počítání.
    Harry R. Lewis, Christos Papadimitriou. Segunda Edicion. Prentice Hall. 1998.

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Salvador V. Cavadini.
    Trabajo Final de Grado para el obtener Título de Ingeniero en Computacion.
    Facultad de Matemática Aplicada. UCSE 2001.

Odpovězeno 25/04/2009 v 18:23
zdroj uživatelem

hlasů
7

Kompilátor LCC ( wikipedia ) ( projekt homepage ) Fraser a Hanson popisuje ve své knize „A Retargetable C kompilátoru: návrh a implementace“. Je zcela čitelný a vysvětluje celý kompilátor, až na generování kódu.

Odpovězeno 16/09/2008 v 17:21
zdroj uživatelem

hlasů
7

Python je dodáván s python kompilátorem napsaný v Pythonu. Můžete vidět zdrojový kód, a to zahrnuje všechny fáze od rozebrat, syntaktický strom, který vyzařuje kód atd Hack ji.

Odpovězeno 12/08/2008 v 12:25
zdroj uživatelem

hlasů
6

Není to kniha, ale technický papír a nesmírně zábavná vzdělávací zkušenost, pokud se chcete dozvědět více o překladačů (a metacompilers) ... Tato stránka vás provede vybudování zcela soběstačný kompilátoru systém, který dokáže sestavit sebe a další jazyky:

Cvičení: Metacompilers Part 1

To vše je založeno na úžasný malý 10-stránkový katalogový list:

Val Schorre META II: syntax-Oriented Language Compiler Psaní

od čestný k bohu 1964 jsem se naučil, jak vybudovat kompilátory od tohoto zpět v roce 1970. K dispozici je ohromující okamžik, kdy se konečně Grok jak kompilátor může regenerovat sama ....

Znám autora webové stránky z mých dnů vysoké školy, ale nemám nic společného s webovými stránkami.

Odpovězeno 28/08/2009 v 01:01
zdroj uživatelem

hlasů
5
  1. To je obrovské téma. Nepodceňujte tento bod. A nepodceňujte můj názor na nepodceňujte ji.
  2. Slyšel jsem, že Dragon Book je (dále jen?) Místo, kde začít, spolu s hledáním. :) Získat lepší vyhledávání, nakonec to bude váš život.
  3. Budování vlastní programovací jazyk je naprosto dobré cvičení! Ale vím, že to nebude nikdy být použity k žádnému praktickému účelu na konci. Výjimkou z tohoto pravidla je málo a velmi daleko od sebe.
Odpovězeno 20/07/2009 v 23:44
zdroj uživatelem

hlasů
5

Máte-li zájem o psaní kompilátor pro funkčního jazyka (nikoli procesní jeden) Simon Peyton-Jones a David Lester je „ Implementace funkční jazyky: návod “ je výborný průvodce.

Koncepční základy toho, jak funkčních hodnotící práce je vedena příkladů jednoduchý, ale mocný funkční jazyk s názvem „jádro“. Navíc, každá část základního jazyka překladač je vysvětleno s příklady kódu v Miranda (čistě funkční jazyk velmi podobné Haskell).

Několik různých druhů překladačů jsou popsány, ale i když si jen následovat tzv šablony kompilátor pro jádro budete mít vynikající pochopení toho, co dělá funkční programovací klíště.

Odpovězeno 01/10/2008 v 10:30
zdroj uživatelem

hlasů
5

Je tu spousta dobrých odpovědí tady, tak jsem myslel, že bych jen přidat ještě jeden na seznam:

Mám knihu s názvem Project Oberon více než před deseti lety, který má nějakou velmi dobře napsaný text na kompilátoru. Kniha opravdu vyniká v tom smyslu, že zdroj a vysvětlení je velmi ruce na a čitelný. byl zpřístupněn v pdf úplný text (vydání 2005), takže si můžete stáhnout právě teď. Překladač je popsána v kapitole 12:

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

(Léčba není tak rozsáhlé jako své knize o kompilátory)

Četl jsem několik knih o kompilátory a můžu druhý drak kniha, čas strávený na této knize, je velmi užitečné.

Odpovězeno 19/09/2008 v 00:31
zdroj uživatelem

hlasů
4

Můžete použít BCEL od Apache Software Foundation. S tímto nástrojem můžete vytvářet assembler podobný kódu, ale je to Java s API BCEL. Můžete se dozvědět, jak můžete vytvářet střední kód jazyka (v tomto případě byte kódu).

jednoduchý příklad

  1. Vytvoření třídy Java s touto funkcí:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Nyní spusťte BCELifier s touto třídou

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Můžete vidět výsledek na konzoli pro celou třídu (Jak se staví byte kódu MyClass.java). Kód pro tuto funkci je následující:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}
Odpovězeno 14/07/2011 v 16:42
zdroj uživatelem

hlasů
4

Líbila se mi ta Crenshaw tutoriál příliš, protože to dělá to naprosto jasné, že kompilátor je jen další program, který čte nějaký vstup a zapisuje některé z put.

Přečtěte si to.

Přijít na to, jestli chceš, ale pak se podíváme na další reference o tom, jak jsou větší a úplnější kompilátory skutečně napsal.

A číst na Důvěřující důvěry , získat ponětí o nejsou zřejmé věci, které lze provést v této oblasti.

Odpovězeno 22/08/2008 v 16:57
zdroj uživatelem

hlasů
3

Které nejsou zahrnuty v seznamu, pokud je tato kniha:

Základy překladačů (Torben Mogensen) (z oddělení. Informatiky, University of Copenhagen)

Jsem také zájem o učení o překladačů a plánují vstoupit do tohoto odvětví v příštích několika letech. Tato kniha je ideální teorie kniha začít učit kompilátory co vidím. Je volně kopírovat a rozmnožovat, čistě a pečlivě napsaný a dává vám to bez jakéhokoliv kódu v jednoduché angličtině, ale stále představuje mechanismus v podobě pokynů a diagramů apod Worth pohled imo.

Odpovězeno 12/03/2014 v 17:05
zdroj uživatelem

hlasů
3

Chybějící ze seznamu: Garbage Collection: Algoritmy pro automatickou Dynamic Memory Management, podle Jonese a Lins.

(Za předpokladu, že píšete kompilátor a runtime systému, a že jste se provádí na odpadky shromažďují jazyk.

Odpovězeno 27/06/2010 v 00:43
zdroj uživatelem

hlasů
3

Napsal jsem online návod na překladačů designu s názvem „Budujme skriptovací engine-compiler, stejně jako nativní kód kompilátoru s názvem Bxbasm Online doc to jsou:. Http://geocities.com/blunt_axe_basic/tutor/Bxb- Tutor.doc

Tyto dokumenty, podpůrné soubory a překladač, v zip podobě, jsou: http://geocities.com/blunt_axe_basic

Také: http://tech.groups.yahoo.com/group/QDepartment

Steve A.

Odpovězeno 13/01/2009 v 23:31
zdroj uživatelem

hlasů
3

The Dragon Book je příliš složitý. Tak ignorovat ho jako výchozí bod. Je dobře, a myslíš, že hodně, jakmile již máte výchozí bod, ale pro začátek, možná byste měli prostě zkusit napsat math / logické vyhodnocení výrazu pomocí Rd, LL nebo LR analýze techniky se vším (lexing / parsování) písemné po ruce v možná C / Java. To je zajímavé samo o sobě a dává vám představu o problémech souvisejících překladače. Pak si můžete skočit do svého vlastního DSL pomocí některé skriptovacího jazyka (od zpracování textu je obvykle snazší v nich) a jako kdyby někdo řekl, generování kódu v obou skriptovací jazyk sám o sobě nebo C. Měli byste pravděpodobně používat flex / bizon / ANTLR etc dělat Lexing / parsování, pokud se chystáte dělat to v c / java.

Odpovězeno 01/10/2008 v 21:24
zdroj uživatelem

hlasů
2

Divím se, že to nebylo zmíněno, ale Donald Knuth je Umění programování byl původně napsán jako jakýsi návod, kompilátoru psaní.

Samozřejmě, Dr. Knuthův sklon k jít do hloubky o tématech vedla k kompilátoru psaní tutoriálu rozšiřuje na odhadovaných 9 objemech, pouze tři z nich byly skutečně zveřejněny. Je to poměrně kompletní expozice o programových témat a pokrývá vše, co byste někdy potřebovat vědět o psaní kompilátor, do nejmenších detailů.

Odpovězeno 21/07/2009 v 01:20
zdroj uživatelem

hlasů
2

Jako výchozí bod, bude to dobré pro vytvoření rekurzivní sestup analyzátor (RDP) (řekněme, že chcete vytvořit svůj vlastní chuti BASIC a vybudovat BASIC interpret) pochopit, jak psát kompilátor. Našel jsem nejlepší informace Herberta Schild je C Power Users, kapitola 7. Tato kapitola se vztahuje na další knize H. Schildt „C Kompletní reference“, kde se vysvětluje, jak vytvořit kalkulačku (jednoduchý výraz parser). Zjistil jsem obě knihy na eBay velmi levné. Můžete zkontrolovat kód pro knihu, pokud jdete do www.osborne.com nebo odbavit www.HerbSchildt.com našel jsem stejný kód, ale pro C # ve své poslední knize

Odpovězeno 20/08/2008 v 12:16
zdroj uživatelem

hlasů
1

Pokud není jen hledá knihy, ale také zájem o webové stránky, které mají články na toto téma, jsem blogged o různých aspektech vytvoření programovacího jazyka. Většina pracovních míst lze nalézt v mém blogu v kategorii „Language design“ .

Zejména jsem pokrývají generování Intel strojový kód ručně, automaticky generuje strojně nebo bytecode, vytváří bytecode interpret, psaní objektově orientovaný runtime, vytvoření jednoduchého nakladač a psát jednoduché označit / tažení garbage collector. To vše ve velmi praktickým a pragmatickým způsobem, namísto nudné vás se spoustou teorie.

Ocení svůj názor na tyto.

Odpovězeno 02/04/2014 v 13:39
zdroj uživatelem

hlasů
1

Nejrychlejší přístup je přes dvě knihy:

1990 verze Úvod do sestavování techniky, první chod pomocí ANSI C, Lex a Yacc JP Bennett - dokonalé vyvážení příklad kódu, analýze teorie a Design ji obsahuje kompletní překladač v jazyku C, lex a yacc Aby jednoduchá gramatika

Dragon Book (starší verze) - většinou podrobný odkaz pro funkce nejsou zahrnuty v bývalém knize

Odpovězeno 01/04/2011 v 20:39
zdroj uživatelem

hlasů
1

Kdykoliv chci vyzkoušet nový jazyk představu, jen jsem napsat jednoduchý parser, a mají generovat nějaký jazyk, který je snadno získat dobré kompilátory, jako C.

Jak myslíš, že C ++ bylo provedeno?

Odpovězeno 21/07/2009 v 01:42
zdroj uživatelem

hlasů
1

Pokud jste stejně jako já, který nemá žádnou formální výuky informatiky a má zájem ve stavebnictví / chtějí vědět, jak překladač funguje:

Jsem doporučit „programovací jazyk procesory v jazyce Java: překladačů a interpretů“, úžasná kniha pro samouk počítačového programátora.

Z mého pohledu, pochopení těchto základních teorií jazyka, automatizovat stroj, a teorie množin není velký problém. Problém je v tom, jak se obrátit ty věci do kódu. Výše uvedená kniha vám řekne, jak psát analyzátor, analýza kontext, a generování kódu. Pokud nemůžete pochopit tuto knihu, pak musím říci, vzdát budování kompilátor. Kniha je nejlepší programovací kniha, kterou jsem kdy četl.

Tam je jiná kniha, také dobré, překladačů v jazyce C . Tam je spousta kódu, a to vám řekne vše o tom, jak vybudovat překladače a lexer nástroje.

Budování kompilátor je zábavná programovací praxe a může naučit hromady znalosti programování.

Nebudou kupovat dračí knihu . Byla to ztráta času a peněz, a není pro lékaře.

Odpovězeno 05/02/2009 v 03:55
zdroj uživatelem

hlasů
0
  • Začněte tím, zda můžete odpovědět na většinu otázek označil C ++ tady na přetečení zásobníku.
  • Po tom, měli byste se ujistit, abyste pochopili, jak ostatní kompilátory pracovat a pochopit [části] jeho zdrojový kód.
  • Určitě jste si všimli, co potřebujete assembler a začne se učit assembler, dokud můžete odpovědět na řadu otázek s touto značkou.
  • Pokud jste se dostali tak daleko, zjistíte, že několik let uplynulo a uvědomit si, jak velký takový projekt a možná úsměv na své vlastní otázky z tehdy (pokud tuto stránku stále existuje v té době) ...
Odpovězeno 21/07/2009 v 00:01
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more