Oberon奧伯龍是一種通用編程語言,也是一種同名操做系統(由Oberon語言開發,且參考過貝爾實驗室的新一代網絡操做系統Plan9),是由原Pascal程序設計語言的發明者Niklaus Wirth創造並實現,由Pascal發展而來,其語法優雅簡潔,高效易用,適用於ARM等多種處理器應用。而且Oberon可用於開發系統程序和應用程序,而通常常見的程序語言較偏系統或應用的某一方面。程序員
**1,設計**
編程
從維基百科處可知,Oberon設計有一個座右銘是艾伯特愛因斯坦的想法:「把事情變得儘量的簡單,而不是更簡單。」的方針是將注意力集中在那些基本的和必要的,忽略短暫的問題特徵。另外一個因素是在如C/C++和Ada語言複雜性的增加識別:相對於這些,奧伯倫強調擴展語言的圖書館概念的使用。枚舉、子界類型,這是目前在Modula-2,已被刪除;一樣,設置類型一直侷限於小的整數,和底層設施的數量已大幅減小(最特別的是,型傳遞函數已被淘汰)。剩餘的潛在的不安全設施消除的結論對得到真正的高級語言的最重要的一步。很是接近甚至跨模塊的類型檢查,在運行時檢查嚴格的指標,空指針檢查,和安全類型擴展的概念在很大程度上容許程序員依靠語言規則。設計模式
這一思想理念的目的是產生一種更容易學習的語言,容易實現,並且很是有效,而且它的理念產生的結果是可用於研究和工程兩方面。奧伯龍編譯器一直被認爲是緊湊和速度很快的,同時相比商業編譯器能提供或許更好的代碼質量。安全
但Oberon沒有流傳於世並發展起來,最主要的緣由是UNIXT/C的這對黃金組合奠基了現代開放計算機技術的基石,如今沒有任何技術能夠撼動(不要說Windows,現代操做系統在發展上都是相互相成的)。IBM的AS400是個例外,Oberon是個例外。雖然它是個理想式的編程語言工具,但它卻沒有函數式編程語言Lisp那麼的純粹。現代編程語言朝着兩個方向在繼續發展。網絡
**2,特色**併發
1,方法與關鍵字大寫敏感的句法編程語言
2,試驗型和擴展型函數式編程
3,分離和混合模函數
4,字符串操做工具
5,垃圾收集器
6,代碼分離
7,支持系統編程
**3,面向對象**
該支持爲抽象和異質結構的施工記錄類型的擴展,但沒有一個調度機制做爲語言的特性而是編程技術或設計模式。這給予了極大的靈活性,在面向對象的世界。在該操做系統的兩個編程技術已被用於鏈接的調度通訊:方法和消息處理方法。
**4,方法套件**
示例的程序變量的定義和該類型的一個全局變量在擴展模塊聲明和分配在通用模塊:
MODULE Figures; (* Abstract module *) TYPE Figure* = POINTER TO FigureDesc; Interface* = POINTER TO InterfaceDesc; InterfaceDesc* = RECORD draw* : PROCEDURE (f : Figure); clear* : PROCEDURE (f : Figure); mark* : PROCEDURE (f : Figure); move* : PROCEDURE (f : Figure; dx, dy : INTEGER); END; FigureDesc* = RECORD if : Interface; END; PROCEDURE Init* (f : Figure; if : Interface); BEGIN f.if := if; END Init; PROCEDURE Draw* (f : Figure); BEGIN f.if.draw(f); END Draw; (* Other procedures here *) END Figures.
由上述示例,擴展了通用型圖形到一個特定的形狀:
MODULE Rectangles; IMPORT Figures; TYPE Rectangle* = POINTER TO RectangleDesc; RectangleDesc* = RECORD (Figures.FigureDesc) x, y, w, h : INTEGER; END; VAR if : Figures.Interface; PROCEDURE New* (VAR r : Rectangle); BEGIN NEW(r); Figures.Init(r, if); END New; PROCEDURE Draw* (f : Figure); VAR r : Rectangle; BEGIN r := f(Rectangle); (* f AS Rectangle *) (* ... *) END Draw; (* Other procedures here *) BEGIN (* Module initialisation *) NEW(if); if.draw := Draw; if.clear := Clear; if.mark := Mark; if.move := Move; END Rectangles.
動態調度是經過程序的數據模塊,通用模塊。
**5,消息處理程序**
該技術包括更換一個程序的設置方法,各類方法之間的區別:
MODULE Figures; (* Abstract module *) TYPE Figure* = POINTER TO FigureDesc; Message* = RECORD END; DrawMsg* = RECORD (Message) END; ClearMsg* = RECORD (Message) END; MarkMsg* = RECORD (Message) END; MoveMsg* = RECORD (Message) dx*, dy* : INTEGER END; Handler* = PROCEDURE (f : Figure; VAR msg : Message); FigureDesc* = RECORD (* Abstract *) handle : Handler; END; PROCEDURE Handle* (f : Figure; VAR msg : Message); BEGIN f.handle(f, msg); END Handle; PROCEDURE Init* (f : Figure; handle : Handler); BEGIN f.handle := handle; END Init; END Figures.
擴展了通用型圖到一個特定的形狀:
MODULE Rectangles; IMPORT Figures; TYPE Rectangle* = POINTER TO RectangleDesc; RectangleDesc* = RECORD (Figures.FigureDesc) x, y, w, h : INTEGER; END; PROCEDURE Draw* (r : Rectangle); BEGIN (* ... *) END Draw; (* Other procedures here *) PROCEDURE Handle* (f: Figure; VAR msg: Figures.Message); VAR r : Rectangle; BEGIN r := f(Rectangle); IF msg IS Figures.DrawMsg THEN Draw(r) ELSIF msg IS Figures.MarkMsg THEN Mark(r) ELSIF msg IS Figures.MoveMsg THEN Move(r, msg(Figures.MoveMsg).dx, msg(Figures.MoveMsg).dy) ELSE (* ignore *) END END Handle; PROCEDURE New* (VAR r : Rectangle); BEGIN NEW(r); Figures.Init(r, Handle); END New; END Rectangles.