日本語版
最新ニュース
科学&テクノロジー

Luon/Readme.md at master · rochus-keller/Luon · GitHub

Luon プログラミング言語へようこそ Luon は、次のような構文を持つ高級プログラミング言語です。 オベロン+、Oberon-07 および Oberon-2、Lua の概念を統合し、LuaJIT VM をターゲットとしています。 Luon は、Lua の静的に型付けされたバージョンとみなすことができます。したがって、名前は「Lua」と「Oberon」を組み合わせたものです。 Luon プロシージャは「外部」として宣言し、Lua で実装できます。これにより、Lua で書かれたライブラリの再利用が可能になり、LuaJIT 外部関数インターフェイスを介した C ライブラリの再利用も可能になります。 言語仕様は次の場所にあります。 仕様サブディレクトリ。以下のコード例も参照してください。 このプロジェクトは、著者の経験の結果です。 Smalltalk-80 そして トイレのように 実装と構築の見通し LuaJIT ベースの Interlisp VM。 Oberon+ とは対照的に、Luon にはポインターがありませんが、代わりにすべての構造化データ型が参照セマンティクスを持ち、動的に作成されます。 ARRAY 型に加えて、Lua との互換性を考慮して HASHMAP…

Luon/Readme.md at master · rochus-keller/Luon · GitHub

1734151782
2024-12-13 23:37:00

Luon プログラミング言語へようこそ

Luon は、次のような構文を持つ高級プログラミング言語です。 オベロン+、Oberon-07 および Oberon-2、Lua の概念を統合し、LuaJIT VM をターゲットとしています。 Luon は、Lua の静的に型付けされたバージョンとみなすことができます。したがって、名前は「Lua」と「Oberon」を組み合わせたものです。

Luon プロシージャは「外部」として宣言し、Lua で実装できます。これにより、Lua で書かれたライブラリの再利用が可能になり、LuaJIT 外部関数インターフェイスを介した C ライブラリの再利用も可能になります。

言語仕様は次の場所にあります。 仕様サブディレクトリ。以下のコード例も参照してください。

このプロジェクトは、著者の経験の結果です。 Smalltalk-80 そして トイレのように 実装と構築の見通し LuaJIT ベースの Interlisp VM

Oberon+ とは対照的に、Luon にはポインターがありませんが、代わりにすべての構造化データ型が参照セマンティクスを持ち、動的に作成されます。 ARRAY 型に加えて、Lua との互換性を考慮して HASHMAP 型もあります。 Lua と同様に、不変で値のセマンティクスに従う STRING データ型もあります。

特に、Luon は、前述のプロジェクト中に認識された次の Lua の欠点を解決します。

  • デバッグのみに使用されるステートメントを有効または無効にし、計算時間の無駄を避けるための条件付きコンパイル
  • ローカルスロットやハッシュ要素へのアクセスを必要としない定数
  • 明示的なインライン宣言により、追加のコンテキスト スイッチやスロットの消費なしでコードをより適切に構造化できます。
  • 暗黙的なグローバル宣言はなく、コンパイル時にできるだけ多くのエラーを検出するためのその他の手段
  • ローカル変数は宣言前に使用できなくなりました
  • switch/case 制御ステートメントを使用して、関係式を再度記述することを回避します。

このプロジェクトは、Luon プログラミング言語のコンパイラーと IDE を実装します。言語と IDE の機能を示す代表的なサンプル プロジェクトは、次の場所にあります。 テストケースサブディレクトリ

IDE のスクリーンショットは次のとおりです。

IDE スクリーンショット 1

そして、これが IDE のソースレベルのデバッガーです。

IDE スクリーンショット 2

module Fibonacci proc calc*(n : integer): integer var a, b, i, next: integer // comma is optional begin if n > 1 then a := calc(n - 1) b := calc(n - 2) return a + b elsif n = 0 then return 0 else return 1 end b := 1 for i := 0 to n-1 do next := a + b a := b b := next end return a end calc var res: integer begin res := calc(21) assert(res = 10946) print("Fibonaccy result: ") println(res) end Fibonacci

module Collections(T) 
  type Deque* = record data: array of T
                      size: integer end
                      
  proc createDeque*(): Deque 
    const initial_len = 1_000 // separators
    var this: Deque  // this is initialized to nil
  begin 
    new(this); 
    new(this.data,initial_len) 
    return this 
    // this and data will be garbage collected
  end createDeque
  
  proc (this: Deque) append*(element: T)
  begin 
    if this.size = len(this.data) then assert(false) end
    this.data[this.size] := element inc(this.size) 
  end append
  
  type Iterator* = record end
  proc (this: Iterator) apply*(element: T) end
  
  proc (this: Deque) forEach*(iter: Iterator)
    var i: integer; val: T
  begin 
    for i := 0 to this.size-1 do 
      iter.apply(this.data[i]) 
    end
  end forEach
end Collections
オブジェクト指向プログラミング

module Drawing
  import F := Fibonacci
         C := Collections(Figure)
  
  type Figure* = record position: record 
                     x,y: integer end end  
  proc (this: Figure) draw*() end
    
  type
    Circle* = record (Figure) diameter: integer end
    Square* = record (Figure) width: integer end 
    proc (this: Circle) draw*() end
    proc (this: Square) draw*() end
        
  var figures: C.Deque
      circle: Circle
      square: Square
    
  proc drawAll()
    type I = record(C.Iterator) count: integer end
    proc (this: I) apply( figure: Figure ) 
    begin 
      figure.draw(); inc(this.count) 
    end apply
    var i: I // count is initialized to zero
  begin
    new(i)
    figures.forEach(i)
    assert(i.count = 2)
    println("drawing done")
  end drawAll
  
begin 
  figures := C.createDeque()
  // use constructors instead of new:
  circle := { { F.calc(3), F.calc(4) }, diameter: 3 }
  figures.append(circle)
  square := { { x: F.calc(5), y: F.calc(6) }, 4 }
  figures.append(square)
  drawAll()
end Drawing  
2024年10月14日の状況

Oberon+ と Micron から構文を派生し、次を使用してパーサーを生成しました。 文法 からレクサーを採用しました マイクロンプロジェクト。パーサーは、進行中の Luon 移行を正常に読み取ることができます。
Are-we-fast-yet ベンチマーク スイート (まだコミットされていません)。

2024年10月15日の状況

Micron の AST インフラストラクチャを採用し、プログラムを完全にカバーできるように AST を拡張しました。再帰降下パーサーを実装しました (によって生成されたパーサーを変更しました) Ebnfスタジオ) AST を生成します。

2024年10月16日の状況

言語の改善: コンストラクターがオブジェクトを生成し、配列とハッシュマップ用に拡張されました。追加のセット コンストラクターは不要になりました。メモリリークなしで進行中の AWFY の AST を生成できます。

2024年10月25日の状況

セマンティックバリデーターは完成し、テストされています。と並行して開発しました Are-we-fast-yet ベンチマーク スイートの Luon バージョン。いくつかのリファクタリングと言語の変更が必要でした。 Oberon-07 と同様、現在 INTEGER 型と REAL 型は 1 つだけあり、前者は 53 ビットの精度です。バリデーターの機能は 10 月 22 日に完成したため、開発には 6 日、テストとデバッグには 3 暦日かかりました。

2024年10月27日の状況

IDE はテストとデバッグの準備ができています。これは Oberon IDE の LuaJIT バージョンから派生しましたが、AST とコード モデルが完全に異なるため、多くの変更が必要でした。これには、バリデータと統合されたオプションの相互参照インフラストラクチャが含まれていました。また、プロジェクト ファイルの概念との互換性を保つためにインポート ロジックを拡張する必要があり、AST、パーサー、バリデーターのリファクタリングが必要でした。

2024年11月5日の状況

ほとんどの組み込みプロシージャを含む LuaJIT バイトコード ジェネレーターは完成しており、テストとデバッグの準備ができています。 C への依存関係を回避するために、LuonFfi.c ファイルのすべての関数が LUON.lua に移行されました。 Lua に Oakwood 実装を追加しました (Files は Oakwood と互換性がなくなりました)。

2024年11月9日の状況

多くのテスト、デバッグ、修正を行った結果、生成されたコードは現時点では他の作業を続けるのに十分正しいようです。 Oberon+ (「features」サブフォルダー) から移行した all.lnpro プロジェクト内のテストケースは機能し、言語のほとんどの側面をカバーしています。また、デリゲートと copy() ビルトインも実装し、その他の言語変更をいくつか加えました (たとえば、:= は char 配列を値でコピーしなくなりました)。次の目標は、Luon Awfy スイートを実行することです。

2024年11月13日時点の状況

Luon Are-we-fast-yet スイートは Json まで機能します。すべてのクラス オブジェクトを事前に適切に初期化するには、コード ジェネレーターの大幅なリファクタリングが必要でした。現時点ではパフォーマンスは Lua よりわずか (1%) 優れており、改善の余地があります。プロジェクトで 1 か月が経過した今、コンパイラーと IDE は Smalltalk VM を実装する準備ができているようです。それでは、早速実行してみましょう。

2024年11月26日時点の状況

Luon Are-we-fast-yet スイートのすべてのベンチマークが動作し、Lua JIT バージョンのベンチマークと同等のパフォーマンスを示します。デバッガが大幅に改善されました。 BYTE 型と TOSTRING ビルトインが言語に追加されました。 Project Oberon システムは Luon に移行されました。これまでのところ、コードは機能しますが、正しく表示出力するには、多くの変更が必要になります (おそらく将来)。 Smalltalk VM は現在開発中で、1 週間以内に完成する予定です。 Smalltalk VM の実装にはコンパイラと IDE の両方が使用されており、これまでのところ有用であることが証明されています。

2024年12月1日現在の状況

の移行 Smalltalk VM の Luon 実装 (*.luon および *.lnpro を参照) が完了しました。アーキテクチャをいくつか変更して C++ バージョンを移行しました。 Qt を使用する C++ バージョンとは対照的に、このバージョンは LuaJIT FFI 経由で SDL2 を使用します。これは、EXTERN キーワードがどのように機能するか、つまり外部実装がどのように提供されるかという例でもあります。これでデバッグが開始されます。幸運を祈ります;-)

一方でまた ルオン仕様 が利用可能ですが、すべての機能がまだ実装されているわけではありません。

2024年12月8日の状況

ST-80 の表示表現は機能しますが、これまでのところ BitBlt の C バージョンでのみ機能します。デバッグを容易にするために、PAL の Qt バージョンも追加されました。言語を拡張(KEYS 関数)し、その他の hasmap を修正しました。 ST VM にはさらにデバッグが必要です。

2024年12月10日の状況

Luon に実装された Smalltalk-80 VM は、SDL2 ベースと Qt ベースの PAL の両方で動作します (いくつかの問題はありますが、WIP)。 VM のソース コードをローカル テストケースおよびデモンストレーションとして Luon リポジトリに追加しました (Smalltalk リポジトリ内の対応するファイルのコピーとして)。同じことが Are-we-fast-yet の実装にも当てはまります。このプロジェクトは MVP リリースに近づいています。

2024年12月12日の状況

いくつかの変更を加えるだけで、IDE およびデモ プロジェクトは Windows でも動作します。いくつかのプラットフォーム用にプリコンパイルされたパッケージを提供しました。 LuaJIT はすべてのプラットフォームに静的にリンクされます。 MVPのリリース。

現時点では、次のプリコンパイル済みバージョンが利用可能です。

圧縮ファイルをダウンロードしてディレクトリに解凍するだけです。 LuonIDE 実行可能ファイルをダブルクリックして IDE を起動します。仕様といくつかのデモプロジェクトが含まれています。

Luon IDE を自分で構築する場合は、次の手順に従ってください。ビルドには LeanQt と BUSY ビルド システムが使用されています。 Linux でコンパイルするには、ビルド必須パッケージである xcb、libxcb1-dev、および libx11-dev パッケージが必要であることに注意してください。 Mac と Windows では、ツールチェーン以外に追加の要件はありません。

  1. 新しいディレクトリを作成します。ここではそれをルートディレクトリと呼びます
  2. ダウンロード https://github.com/rochus-keller/Luon/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「Oberon」に変更します。
  3. ダウンロード https://github.com/rochus-keller/LuaJIT/archive/refs/heads/LjTools.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「LuaJIT」に変更します。
  4. ダウンロード https://github.com/rochus-keller/LjTools/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「MonoTools」に変更します。
  5. ダウンロード https://github.com/rochus-keller/GuiTools/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「GuiTools」に変更します。
  6. ダウンロード https://github.com/rochus-keller/LeanQt/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「LeanQt」に変更します。
  7. ダウンロード https://github.com/rochus-keller/BUSY/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「build」に変更します。
  8. 「LuaJIT」ディレクトリでコマンド ラインを開き、そこにある指示に従ってプラットフォーム用の LuaJIT を構築します。
  9. 「build」ディレクトリでコマンドラインを開き、次のように入力します。 cc *.c -O2 -lm -o lua または cl /O2 /MD /Fe:lua.exe *.c Unix マシンを使用しているか Windows マシンを使用しているかによって異なります。 Lua 実行可能ファイルがビルドされるまで数秒待ちます。
  10. 今すぐ入力してください ./lua build.lua ../Luon (または lua build.lua ../Luon Windows の場合); LuonIDE 実行可能ファイルがビルドされるまで待ちます。これは出力サブディレクトリにあります。

コマンドラインの代わりに、次を使用してビルドを実行できます。 リーンクリエイター 複数のコアを使用するため、ビルドが高速になります。

Qt 5 と qmake を使用して IDE をビルドすることは引き続き可能です。この目的には LnIde.pro を使用し、Qt でビルドするときは通常どおりに進めます。

サポートが必要な場合、または問題や機能リクエストを投稿したい場合は、次の Github 問題リストを使用してください。 https://github.com/rochus-keller/Luon/issues または著者に電子メールを送信してください。

Luon は、GPL 2 または 3 で利用できます。さらに、ランタイム サブフォルダー内のランタイム ライブラリは、MPL または LGPL で利用できます。

  • プレイアドバンス Copyright © 2005-2023 Mike Pall が所有し、MIT オープン ソース ライセンスに基づいてリリースされています。
  • LeanQt Qt に基づいています。著作権 (C) 2016 は The Qt Company Ltd、2008 は Nokia Corporation および/またはその子会社、1992 ~ 2005 は Trolltech AS、および世界中の多くの個人貢献者によって所有されます。

#LuonReadme.md #master #rochuskellerLuon #GitHub

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。