Project Oberon 2013

ここにいる私の同僚は私に1぀の有甚な負荷を䞎えたした。 遞択的倱明の危険性に぀いお簡単に話をしたす。圌女ず䞀緒にいるず、私たちの業界は完党に安党ではないからです。 それでは、たず、私たちの共通の敵である忌たわしい倱明ず戊う前に、コミュニティが実際にどうあるべきかを確実に知るために、コミュニティが芋ないものの䟋を議論し、研究したしょう。



物語



だから、1986-89。 ニクラりス・ワヌスず圌の同僚は、グラフィカルナヌザヌむンタヌフェむス、むンタヌフェむスでテキストを䜿甚するための高床な抂念、そしお党䜓ずしおN.ワヌスの抂念の適甚性の重芁な蚌拠である、Oberonシステムの最初のバヌゞョン、マシン、Oberon蚀語コンパむラ、およびSystem Oberonオペレヌティングシステムを開発したした。 このオペレヌティングシステムは、補品ず蚀語の進化的分岐の始たりを困難な運呜でマヌクしたした。それぞれが個別の蚘事に倀したす。







ほが30幎埌、ITにおける補品の制埡䞍胜な合䜵症の状況を芳察したN. Wirthは、小型で匷力か぀信頌性の高いシステムを構築する方法に぀いおのビゞョンをもう䞀床発衚するこずにしたした。 著者の仕事そのものが、そのようなシステムが存圚しお機胜しおいる蚌拠ずしお圹立ちたす。



すべおが流れ、すべおが倉化する



刀明したように、元のシステムで䜿甚されおいたプロセッサモデルはすでに垂堎から姿を消しおいたす。 建築物のように。 N. Wirthは、既補の商甚゜リュヌションを䜿甚する代わりに、システムを別のコンポヌネントであるLolaずいうFPGAプログラミング蚀語のバヌゞョンで補完するこずにしたした。 したがっお、新しいマシンのプロセッサは、RISCに基づいおWirth自身が開発したした。 これに぀いおは、蚘事の別のセクションで怜蚎したす。 システム党䜓は、1 MBのメモリず25 MHzのプロセッサを備えたザむリンクスSpartan-3開発ボヌドで動䜜したした。



぀たり、れロからコンピュヌティングコンプレックスの開発のフルサむクルが実装され、゚ンゞニア/プログラマヌが利甚できるこのプロゞェクトのすべおの段階が実装されるプロゞェクトがありたす。



CPU



RISCアヌキテクチャは、デヌタを䜿甚したプロセッサ操䜜の特別なシヌケンスによっお区別されたす。 すべおのプロセッサプロセッサ呜什はレゞスタにあるデヌタで動䜜し、デヌタは特別なプロセッサ呜什SAVEおよびLOADによっおメモリずの間で転送されたす。 したがっお、呜什ごずのクロックサむクル数が予枬可胜な堎合に䜜業の単調性が達成され、倚くの堎合、ほずんどの呜什が1クロックサむクルに収たりたす。 Wirthプロセッサの機胜は、デヌタをメモリに曞き蟌むためのパむプラむンの䞊列動䜜でもありたすが、このため、結果のプロセッサの呚波数を50〜25 MHzから半分に枛らす必芁がありたした。



コマンドシステムは32ビットワヌドに基づいおおり、コマンドの圢匏を決定するために最䞊䜍4ビットが䞎えられたす。 コマンドの圢匏によっお、操䜜のクラス、オペランドの数、およびそれらの堎所が決たりたす。

ALUコマンドは、3぀のレゞスタヌたたは2぀のレゞスタヌず定数を䜿甚しお、算術および論理挔算のセットを定矩したす。 ALUチヌムは、特別なシングルビットレゞスタに結果の笊号に远加の倀を残したす。

メモリコマンドは、メモリにロヌドしお、レゞスタの1ワヌドたたは1バむトをメモリから読み取る呜什を定矩したす。

フロヌ制埡コマンドを䜿甚するず、PCレゞスタの倀を制埡しお、レゞスタたたは定数の倀に基づいお条件付きおよび無条件の遷移を蚘述するこずができたす。



システムには16個のレゞスタがありたすが、いく぀かの䞊䜍レゞスタはオペレヌティングシステムずコンパむラによっおサヌビスずしお予玄され、スタックぞのポむンタ、モゞュヌルテヌブルのアドレスなどを栌玍したす。



次のようになりたす。







䞀連の指瀺に぀いおの詳现は、 䞀般化されたドキュメントず特定のドキュメントに蚘茉されおいたす。 Verilog蚀語でプロセッサず呚蟺機噚の図を提䟛したすが、その埌の゚ディションでは、远加のデバッグず怜蚌の埌、Wirthは蚀語の説明ずずもにLola回路を提䟛したした。



Wirthは、RS232などのいく぀かの暙準むンタヌフェむスを䜿甚した䜜業のスキヌムず実装に぀いおも説明し、デヌタストレヌゞずしおSDカヌドを接続する方法に぀いおも説明したす。 呚蟺機噚の実装方法はプロゞェクトのドキュメントに蚘茉されおいたす。私は䞻にプログラマであり、電子技術者ではないため、非垞に幌皚な間違いを防ぐために詳现を説明したせん。 おそらく、経隓豊富な同志がこのギャップを埋めるのに圹立぀でしょう。



システム



OSの䞻な目暙は、ナヌザヌずプログラマヌに䞀定レベルの抜象化を提䟛するこずです。 I / Oデバむス、ストレヌゞデバむス、およびこれらのデバむスずやり取りするためのむンタヌフェむス、およびハヌドりェアの制限。 Oberonシステムで遞択された抜象化の柔軟性により、さたざたな゜フトりェアプラットフォヌム/ OSで独立したプログラムずしおシヌムレスに実行でき、プロセッサレベルたたは抜象化の゜フトりェア実装のレベルを゚ミュレヌトできたす。



蚀語



もちろん、Oberonは将来のOSを䜜成するためのプログラミング蚀語ずしお遞ばれたした。 ゜ヌス蚀語は2007幎に改蚂され、このプロゞェクトの枠組みの䞭で、Wirthは蚀語をさらに簡玠化し、有効性の点で疑わしい機胜を取り陀きたした。 最小限の機胜セットにより、動䜜するコンパむラの実装が簡玠化され、コヌドの制埡が改善されたす。 システムをれロから䜜成するため、これは重芁です。



Oberon OSを構築するために重芁な䞻な機胜は、モゞュヌル性、基本的なメタ情報、モゞュヌルの動的ロヌド、およびガベヌゞコレクタヌが必芁なメモリモデルです。

それぞれに぀いお簡単に説明したす。



モゞュヌル性



Oberonでは、モゞュヌルはアルゎリズムずデヌタ構造を構造化する手段であるだけでなく、コンパむル、ロヌド、および配垃の単䜍でもありたす。 ぀たり、モゞュヌルは、コンパむラヌがコンパむルできる最小の゚ンティティヌです。 他のモゞュヌルに察する1぀のモゞュヌルの䟝存関係は自動的に蚈算されたすが、あるモゞュヌルから別のモゞュヌルぞのコヌドの組み蟌みには぀ながりたせん。 コヌドのバヌゞョンを制埡するために、むンポヌトされた゚ンティティの識別子ず䟝存関係のハッシュコヌドのみが含たれたす。



モゞュヌルはロヌド単䜍です。぀たり、特別な堎合を陀き、モゞュヌルコヌドぱントリポむントがあり、無制限の時間実行できる完党なプログラムです。 ぀たり、完党なプログラムです。 OSカヌネルでさえ、メモリにロヌドされる最初のモゞュヌルにすぎたせん。



たた、モゞュヌルは、゜ヌスの圢だけでなく、バ​​むナリヌの圢でも、むンタヌフェヌス郚分の圢でも配垃されるこずを想定しおおり、その起動には特定のプラットフォヌムたたは耇数のプラットフォヌムのみが必芁です。 䞀般に、これらの抂念はOberonのモゞュヌル性の抂念に含たれおおり、モゞュヌル指向プログラミングを構成したす。



基本的なメタ情報



モゞュヌル性の抂念は、任意の数のモゞュヌルが同時にメモリ内に存圚できるこずを前提ずしおいたすが、すべおのモゞュヌルが互いに぀いお䜕かを知るこずができるずは想定されおいたせん。 この堎合、ナヌザヌたたはプログラマヌは、そのようなモゞュヌル内の゚ンティティヌにアクセスする必芁がありたす。 このため、メタ情報の存圚の芁件がOberon蚀語実行環境の芁件に導入されおいたす。 モゞュラヌシステム内の特定の゚ンティティも䞍明である可胜性があるため、このプロゞェクトでは、メタ情報はフルネヌムでモゞュヌルの゚クスポヌトされたプロシヌゞャに制埡を移すこずができるこずのみが必芁です。



動的なモゞュヌル性



OSがむンフラストラクチャ補品であり、それ自䜓ではナヌザヌ向けの特定のアプリケヌションを持たないため、ナヌザヌはプログラムのプロセスで必芁なモゞュヌルをロヌドできる必芁がありたす。 。 同時に、モゞュヌルにぱントリポむントず1回実行される本䜓がありたすが、重芁なポむントは、モゞュヌルがメモリにロヌドされたたたであり、他のモゞュヌルのさらなる䜜業のためにそのタむプず手順を提䟛できるずいう事実です。 そのため、OSが既にロヌドされおいるモゞュヌルに制埡を移し、同時にモゞュヌルをロヌドしおそのプロシヌゞャを実行できるようにするには、名前でプロシヌゞャを実行できる必芁がありたした。 もちろん、この機胜には䞻流の想像を絶するほど耇雑な類䌌物がありたすが、珟時点ではこの機胜で十分です。 ずにかく、それはラむブラリに実装されおいたすが、蚀語に䜕も远加する必芁はありたせん。



ごみ収集



Oberonオペレヌティングシステムでは、ヒヌプ䞊の動的オブゞェクトの配眮を制埡するガベヌゞコレクションがOSカヌネルレベルで実行されたす。 コンポヌネント環境の堎合、クラむアントに動的オブゞェクトを提䟛するコンポヌネントはメモリからそれらをい぀削陀するかを決定できないため、ガベヌゞコレクタヌは明らかに必芁です。

このテヌマに関するWirth自身からの匕甚を以䞋に瀺したす。

Oberonシステムは、倉数が参照されなくなるこずをプログラマが通知できるようにする明瀺的な割り圓お解陀手順を提䟛したせん。 この省略の最初の理由は、通垞、プログラマヌが割り圓お解陀をい぀呌び出すかわからないこずです。 そしお第二に、この「ヒント」は

信頌できるずみなされない。 誀った割り圓お解陀、぀たり問題のオブゞェクトぞの参照がただ存圚するずきに発生する割り圓お解陀は、同じスペヌスの耇数の割り圓おをもたらし、悲惚な結果を招く可胜性がありたす。 したがっお、ストアのどの領域が本圓に再利甚可胜かを刀断するために、システム管理に完党に䟝存するこずが賢明ず思われたす。




したがっお、蚀語ずその実行環境OS、ランタむムの芁件が定矩されたら、コヌドの蚘述を開始できたす。 実際、䞀連の機胜のOSはほんの数個のモゞュヌルで蚘述できたす。 他の機胜は、サヌドパヌティのコンポヌネントに匕き継ぐこずができたす。 コンパむラはOSの䞀郚である必芁はありたせんが、それなしではプロセッサ甚の単䞀のコマンドを䜜成できないため、最初に怜蚎したす。



コンパむラ



プログラミング蚀語ずは、構文を構成する限られた匏のセットによっおリンクされたキヌワヌドのセットからの文字の無限のセットです。 各匏は、それを蚘述するための芏則を備えた構文構造です。 蚘述内容の意味は、各構成に関連付けられた䞀連のセマンティックルヌルによっお決たりたす。



オベロン



初版のOberonは、構成に䜙分なものがない蚀語ずしお考えられおいたした。 蚀語のミニマリズムに関連する明らかな問題を解決するために、モゞュヌル性の抂念が提案されたした。 したがっお、異なる機胜のモゞュヌルのセットは、蚀語自䜓の機胜の拡匵的な成長を効果的に眮き換えるこずができるず想定されおいたした。 蚀語の説明は20ペヌゞ未満で、コンパむラは非垞に迅速に実装されたす。䞀般的に、Wirthは孊習に優れた蚀語であるこずが刀明したこずを匷調したしたPascalよりも優れおいたす。 もちろん、邪悪な舌はすぐにこのフレヌズを拟い䞊げ、それを急いで、オベロンは孊習にのみ適しおいるず䞻匵したした。 たあ、䞭傷は根絶するよりも播皮する方が簡単です。



このプロゞェクトでわかるように、Oberonずその抂念は、あらゆるレベル、䜎レベル、ミドルりェア、高レベルの回路゚ディタヌ、メヌラヌなどでコヌドを実装するのに適しおいたす。 Wirthは、これらすべおのアプリケヌションを圌のOSの抂念実蚌ずしお実装したした。



Oberon蚀語の䜎レベルコヌドの䟋。
カヌネルモゞュヌル、ガベヌゞコレクタヌ。 github.com/ilovb/ProjectOberon2013/blob/master/Sources/Kernel.Mod#L82

(* ---------- Garbage collector ----------*)

  PROCEDURE Mark*(pref: LONGINT);
    VAR pvadr, offadr, offset, tag, p, q, r: LONGINT;
  BEGIN SYSTEM.GET(pref, pvadr); (*pointers < heapOrg considered NIL*)
    WHILE pvadr # 0 DO
      SYSTEM.GET(pvadr, p); SYSTEM.GET(p-4, offadr);
      IF (p >= heapOrg) & (offadr = 0) THEN q := p;   (*mark elements in data structure with root p*)
        REPEAT SYSTEM.GET(p-4, offadr);
          IF offadr = 0 THEN SYSTEM.GET(p-8, tag); offadr := tag + 16 ELSE INC(offadr, 4) END ;
          SYSTEM.PUT(p-4, offadr); SYSTEM.GET(offadr, offset);
          IF offset # -1 THEN (*down*)
            SYSTEM.GET(p+offset, r); SYSTEM.GET(r-4, offadr);
            IF (r >= heapOrg) & (offadr = 0) THEN SYSTEM.PUT(p+offset, q); q := p; p := r END
          ELSE (*up*) SYSTEM.GET(q-4, offadr); SYSTEM.GET(offadr, offset);
            IF p # q THEN SYSTEM.GET(q+offset, r); SYSTEM.PUT(q+offset, p); p := q; q := r END
          END
        UNTIL (p = q) & (offset = -1)
      END ;
      INC(pref, 4); SYSTEM.GET(pref, pvadr)
    END
  END Mark;

  PROCEDURE Scan*;
    VAR p, q, mark, tag, size: LONGINT;
  BEGIN p := heapOrg;
    REPEAT SYSTEM.GET(p+4, mark); q := p;
      WHILE mark = 0 DO
        SYSTEM.GET(p, tag); SYSTEM.GET(tag, size); INC(p, size); SYSTEM.GET(p+4, mark)
      END ;
      size := p - q; DEC(allocated, size);  (*size of free block*)
      IF size > 0 THEN
        IF size MOD 64 # 0 THEN
          SYSTEM.PUT(q, 32); SYSTEM.PUT(q+4, -1); SYSTEM.PUT(q+8, list3); list3 := q; INC(q, 32); DEC(size, 32)
        END ;
        IF size MOD 128 # 0 THEN
          SYSTEM.PUT(q, 64); SYSTEM.PUT(q+4, -1); SYSTEM.PUT(q+8, list2); list2 := q; INC(q, 64); DEC(size, 64)
        END ;
        IF size MOD 256 # 0 THEN
          SYSTEM.PUT(q, 128); SYSTEM.PUT(q+4, -1); SYSTEM.PUT(q+8,  list1); list1 := q; INC(q, 128); DEC(size, 128)
        END ;
        IF size > 0 THEN
          SYSTEM.PUT(q, size); SYSTEM.PUT(q+4, -1); SYSTEM.PUT(q+8, list0); list0 := q; INC(q, size)
        END
      END ;
      IF mark > 0 THEN SYSTEM.GET(p, tag); SYSTEM.GET(tag, size); SYSTEM.PUT(p+4, 0); INC(p, size)
      ELSE (*free*) SYSTEM.GET(p, size); INC(p, size)
      END
    UNTIL p >= heapLim
  END Scan;
      
      







Texts, . github.com/ilovb/ProjectOberon2013/blob/master/Sources/Texts.Mod#L127

  PROCEDURE Store* (VAR W: Files.Rider; T: Text);
    VAR p, q: Piece;
      R: Files.Rider;
      off, rlen, pos: LONGINT;
      N, n: INTEGER;
      ch: CHAR;
      Dict: ARRAY 32, 32 OF CHAR;
  BEGIN pos := Files.Pos(W); Files.WriteInt(W, 0); (*place holder*)
    N := 1; p := T.trailer.next;
    WHILE p # T.trailer DO
      rlen := p.len; q := p.next;
      WHILE (q # T.trailer) & (q.fnt = p.fnt) & (q.col = p.col) & (q.voff = p.voff) DO
        rlen := rlen + q.len; q := q.next
      END;
      Dict[N] := p.fnt.name;
      n := 1;
      WHILE Dict[n] # p.fnt.name DO INC(n) END;
      Files.WriteByte(W, n);
      IF n = N THEN Files.WriteString(W, p.fnt.name); INC(N) END;
      Files.WriteByte(W, p.col); Files.WriteByte(W, p.voff); Files.WriteInt(W, rlen);
      p := q
    END;
    Files.WriteByte(W, 0); Files.WriteInt(W, T.len);
    off := Files.Pos(W); p := T.trailer.next;
    WHILE p # T.trailer DO
      rlen := p.len; Files.Set(R, p.f, p.off);
      WHILE rlen > 0 DO Files.Read(R, ch); Files.Write(W, ch); DEC(rlen) END ;
      p := p.next
    END ;
    Files.Set(W, Files.Base(W), pos); Files.WriteInt(W, off); (*fixup*)
    T.changed := FALSE;
    IF T.notify # NIL THEN T.notify(T, unmark, 0, 0) END
  END Store;

      
      







(Active Oberon), (Component Pascal, Zonnon), (JVM, CLR, JS), Java. Microsoft Singularity. , , , .





. , , , .



:







symbol character, , .



. . , RISC. .



, .





, , , . . .



, , , - . — -, ROM .



, , , .



, - FPGA .





. , , , . . , . .



, , .





, , , . , SD SPI. , - .



Modules. ( ) , . , , . .



Files, SD-. Files . , , .



, . , , . .



image



:







, . , , .



, . . , . BlackBox Windows, .



, , .





, , , — . , .



, , ( ), , . , , . .



, , , . , .







, , , .



.





, , , , , .



, , . , , , .



, . ? — , , , , .



, , , , , , , , - , . , , , .



, , , GNU/Linux , ( , ).



, , , , , -, . , , , . — , , , . , .



. , – . . 
( ), – , , . , . 
 , . 









All Articles