1734151782
2024-12-13 23:37:00
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 のソースレベルのデバッガーです。
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
Oberon+ と Micron から構文を派生し、次を使用してパーサーを生成しました。 文法 からレクサーを採用しました マイクロンプロジェクト。パーサーは、進行中の Luon 移行を正常に読み取ることができます。
Are-we-fast-yet ベンチマーク スイート (まだコミットされていません)。
Micron の AST インフラストラクチャを採用し、プログラムを完全にカバーできるように AST を拡張しました。再帰降下パーサーを実装しました (によって生成されたパーサーを変更しました) Ebnfスタジオ) AST を生成します。
言語の改善: コンストラクターがオブジェクトを生成し、配列とハッシュマップ用に拡張されました。追加のセット コンストラクターは不要になりました。メモリリークなしで進行中の AWFY の AST を生成できます。
セマンティックバリデーターは完成し、テストされています。と並行して開発しました Are-we-fast-yet ベンチマーク スイートの Luon バージョン。いくつかのリファクタリングと言語の変更が必要でした。 Oberon-07 と同様、現在 INTEGER 型と REAL 型は 1 つだけあり、前者は 53 ビットの精度です。バリデーターの機能は 10 月 22 日に完成したため、開発には 6 日、テストとデバッグには 3 暦日かかりました。
IDE はテストとデバッグの準備ができています。これは Oberon IDE の LuaJIT バージョンから派生しましたが、AST とコード モデルが完全に異なるため、多くの変更が必要でした。これには、バリデータと統合されたオプションの相互参照インフラストラクチャが含まれていました。また、プロジェクト ファイルの概念との互換性を保つためにインポート ロジックを拡張する必要があり、AST、パーサー、バリデーターのリファクタリングが必要でした。
ほとんどの組み込みプロシージャを含む LuaJIT バイトコード ジェネレーターは完成しており、テストとデバッグの準備ができています。 C への依存関係を回避するために、LuonFfi.c ファイルのすべての関数が LUON.lua に移行されました。 Lua に Oakwood 実装を追加しました (Files は Oakwood と互換性がなくなりました)。
多くのテスト、デバッグ、修正を行った結果、生成されたコードは現時点では他の作業を続けるのに十分正しいようです。 Oberon+ (「features」サブフォルダー) から移行した all.lnpro プロジェクト内のテストケースは機能し、言語のほとんどの側面をカバーしています。また、デリゲートと copy() ビルトインも実装し、その他の言語変更をいくつか加えました (たとえば、:= は char 配列を値でコピーしなくなりました)。次の目標は、Luon Awfy スイートを実行することです。
Luon Are-we-fast-yet スイートは Json まで機能します。すべてのクラス オブジェクトを事前に適切に初期化するには、コード ジェネレーターの大幅なリファクタリングが必要でした。現時点ではパフォーマンスは Lua よりわずか (1%) 優れており、改善の余地があります。プロジェクトで 1 か月が経過した今、コンパイラーと IDE は Smalltalk VM を実装する準備ができているようです。それでは、早速実行してみましょう。
Luon Are-we-fast-yet スイートのすべてのベンチマークが動作し、Lua JIT バージョンのベンチマークと同等のパフォーマンスを示します。デバッガが大幅に改善されました。 BYTE 型と TOSTRING ビルトインが言語に追加されました。 Project Oberon システムは Luon に移行されました。これまでのところ、コードは機能しますが、正しく表示出力するには、多くの変更が必要になります (おそらく将来)。 Smalltalk VM は現在開発中で、1 週間以内に完成する予定です。 Smalltalk VM の実装にはコンパイラと IDE の両方が使用されており、これまでのところ有用であることが証明されています。
の移行 Smalltalk VM の Luon 実装 (*.luon および *.lnpro を参照) が完了しました。アーキテクチャをいくつか変更して C++ バージョンを移行しました。 Qt を使用する C++ バージョンとは対照的に、このバージョンは LuaJIT FFI 経由で SDL2 を使用します。これは、EXTERN キーワードがどのように機能するか、つまり外部実装がどのように提供されるかという例でもあります。これでデバッグが開始されます。幸運を祈ります;-)
一方でまた ルオン仕様 が利用可能ですが、すべての機能がまだ実装されているわけではありません。
ST-80 の表示表現は機能しますが、これまでのところ BitBlt の C バージョンでのみ機能します。デバッグを容易にするために、PAL の Qt バージョンも追加されました。言語を拡張(KEYS 関数)し、その他の hasmap を修正しました。 ST VM にはさらにデバッグが必要です。
Luon に実装された Smalltalk-80 VM は、SDL2 ベースと Qt ベースの PAL の両方で動作します (いくつかの問題はありますが、WIP)。 VM のソース コードをローカル テストケースおよびデモンストレーションとして Luon リポジトリに追加しました (Smalltalk リポジトリ内の対応するファイルのコピーとして)。同じことが Are-we-fast-yet の実装にも当てはまります。このプロジェクトは MVP リリースに近づいています。
いくつかの変更を加えるだけで、IDE およびデモ プロジェクトは Windows でも動作します。いくつかのプラットフォーム用にプリコンパイルされたパッケージを提供しました。 LuaJIT はすべてのプラットフォームに静的にリンクされます。 MVPのリリース。
現時点では、次のプリコンパイル済みバージョンが利用可能です。
圧縮ファイルをダウンロードしてディレクトリに解凍するだけです。 LuonIDE 実行可能ファイルをダブルクリックして IDE を起動します。仕様といくつかのデモプロジェクトが含まれています。
Luon IDE を自分で構築する場合は、次の手順に従ってください。ビルドには LeanQt と BUSY ビルド システムが使用されています。 Linux でコンパイルするには、ビルド必須パッケージである xcb、libxcb1-dev、および libx11-dev パッケージが必要であることに注意してください。 Mac と Windows では、ツールチェーン以外に追加の要件はありません。
- 新しいディレクトリを作成します。ここではそれをルートディレクトリと呼びます
- ダウンロード https://github.com/rochus-keller/Luon/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「Oberon」に変更します。
- ダウンロード https://github.com/rochus-keller/LuaJIT/archive/refs/heads/LjTools.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「LuaJIT」に変更します。
- ダウンロード https://github.com/rochus-keller/LjTools/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「MonoTools」に変更します。
- ダウンロード https://github.com/rochus-keller/GuiTools/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「GuiTools」に変更します。
- ダウンロード https://github.com/rochus-keller/LeanQt/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「LeanQt」に変更します。
- ダウンロード https://github.com/rochus-keller/BUSY/archive/refs/heads/master.zip それをルート ディレクトリに解凍します。結果のディレクトリの名前を「build」に変更します。
- 「LuaJIT」ディレクトリでコマンド ラインを開き、そこにある指示に従ってプラットフォーム用の LuaJIT を構築します。
- 「build」ディレクトリでコマンドラインを開き、次のように入力します。
cc *.c -O2 -lm -o luaまたはcl /O2 /MD /Fe:lua.exe *.cUnix マシンを使用しているか Windows マシンを使用しているかによって異なります。 Lua 実行可能ファイルがビルドされるまで数秒待ちます。 - 今すぐ入力してください
./lua build.lua ../Luon(またはlua build.lua ../LuonWindows の場合); LuonIDE 実行可能ファイルがビルドされるまで待ちます。これは出力サブディレクトリにあります。
コマンドラインの代わりに、次を使用してビルドを実行できます。 リーンクリエイター 複数のコアを使用するため、ビルドが高速になります。
Qt 5 と qmake を使用して IDE をビルドすることは引き続き可能です。この目的には LnIde.pro を使用し、Qt でビルドするときは通常どおりに進めます。
サポートが必要な場合、または問題や機能リクエストを投稿したい場合は、次の Github 問題リストを使用してください。 https://github.com/rochus-keller/Luon/issues または著者に電子メールを送信してください。
Luon は、GPL 2 または 3 で利用できます。さらに、ランタイム サブフォルダー内のランタイム ライブラリは、MPL または LGPL で利用できます。
#LuonReadme.md #master #rochuskellerLuon #GitHub

