2013-08-22 57 views
3

我不知道這是否是這個問題的正確SE網站,如果沒有,我會很感激任何人可以指出我在正確的方向。創建一種基本的編程語言 - 資源?

對於我的大學項目(英國大學〜高中)我想設計一門基本的編程語言。它不具備所有必要的功能,但足以在控制檯上編寫一些基本程序。我想讓它解釋,因爲我聽說如何非常複雜的編譯語言;面向對象,因爲我只知道VB.NET,並且最適合OOP;我的目標是創建一個簡單的語言,非程序員可以輕鬆學習。

我一直在環顧四周,但努力尋找有用的資源,解釋有關創建編程語言的任何好的細節。我真的很感激你可以建議的任何在線資源 - 他們必須是免費的 - 如果我錯過了類似的StackOverflow問題,深入的在線文章或教程,從免費的在線教科書中提取......任何你認爲可能有用的東西。

+2

http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools – SLaks

+1

你可以看看這個:www.antlr.org。 Antlr是一個解析器生成器。 – oddparity

+2

從OOP語言開始並不是一個好主意。從概念上來說更簡單一些,也許是一種功能語言或命令式語言 –

回答

5

不用再深入瞭解SICP - 本書將啓發您關於編程和編程語言的原理,在其最後兩章中,它將教您如何爲Scheme編程語言構建解釋器和編譯器 - 在Scheme中。

我可以向你保證,書中的內容將深刻地改變你對計算的思考方式。再加上DrRacket IDE,您將有一個很好的環境來學習如何從最初的原則開始創建自己的編程語言。

另一本推薦的書是Essentials of Programming Languages,雖然其中涵蓋的材料有點高級。它還會告訴你如何在Scheme中實現功能豐富的語言,這次包括鍵入語言和OOP語言。

+1

計劃顯然不是OOP(它是不純的功能),但OOP對於第一個編譯器/解釋器項目來說可能是個壞主意。計劃是一個不錯的選擇。另一個傳統選項是Pascal的一個子集,但這往往意味着使用掃描器和分析器生成器工具(lex和yacc或類似的)。 Scheme語法足夠簡單以避免這個問題。 – Steve314

+0

@ Steve314,爲什麼OOP是第一個項目的壞主意?無論如何,我不習慣使用另一個範例 - 我只編寫了一年的編程,而我仍然試圖陷入OOP。 – Lou

+2

@LeoKing,因爲有更簡單的編程範例,更適合學習。編寫一門編程語言不是一件容易的事情,所以越簡單,它就越容易。 –

1

如果需要解析語言本身的幫助,請查找解析器和詞法分析器生成器。傳統的Linux工具lex和yacc是一個不錯的選擇。 Linux有bison和flex,這是他們的Linux變體。

如果語言足夠簡單,他們可能沒有必要。

我不知道任何好的參考。也許事情該列表中的解釋需要,將幫助:

  • 條件語句(例如,「如果」)
  • 分支語句(如「轉到」)
  • 變量存儲和賦值語句
  • 至少一簡單表達式求值(例如,如果我想設置X = 1 + 1,需要設置X到2)
  • 輸入和輸出(例如讀,寫語句或函數)

請參閱http://dinosaur.compilertools.net/bison/bison_5.html一個簡單的示例程序,使用野牛解析和執行基本計算器的功能。下面是從頁的例子中的一個副本:

input: /* empty */ 
     | input line 
; 

line:  '\n' 
     | exp '\n' { printf ("\t%.10g\n", $1); } 
; 

exp:  NUM    { $$ = $1;   } 
     | exp exp '+'  { $$ = $1 + $2; } 
     | exp exp '-'  { $$ = $1 - $2; } 
     | exp exp '*'  { $$ = $1 * $2; } 
     | exp exp '/'  { $$ = $1/$2; } 
     /* Exponentiation */ 
     | exp exp '^'  { $$ = pow ($1, $2); } 
     /* Unary minus */ 
     | exp 'n'   { $$ = -$1;  } 
; 
%% 
+0

這是我需要做的主要事情,寫出一個語法,然後使用解析器/詞法分析器生成器?我深信,除此之外,還有更多的事情要做。 – Lou

+0

@Leo - 對於一個嚴肅的編譯器來說,還有很多其他的東西,但編譯器/解釋器101課程是關於操縱抽象語法樹(以及技術上不是AST的類似樹,但很多人都稱它爲無用)。然而,傳統的編譯器/解釋器課程主要是關於如何從源文本中獲取(抽象)語法樹 - 在早期,這是一件很困難的事情,如果您想了解掃描和解析如何工作(而不是隻是讓工具做到這一點),它們仍然是不平凡的。 – Steve314

+0

@Leo - 解析器/詞法分析器僅爲解釋器提供解析輸入。然後需要添加代碼來實施這些操作。該代碼可以在解析器本身中進行,例如,在特定語句被成功解析後調用函數。這就是說,對於基本的語言,應該可以用少量的代碼來實現膽量。 – ash

2

阿霍 - Ulman對編譯器的一個很好的(和非常深)一書。 http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886

但是,如果你想快速編寫一個簡單的編譯器,它可能太深了。儘管如此,它可能是很好的參考。

+0

謝謝你的鏈接,但我擔心它可能確實太深 - 我不知道我會知道從哪裏開始使用這些材料!另外,我寧願去解釋,也不願意使用編譯器 - 我認爲解釋型語言稍後會更容易改變。 – Lou

+0

精心設計的解釋器和編譯器在源語言方面應該很容易改變。他們只是在消化源頭後做的不同。 – ibid