Teyru

Third-party notices / 第三方元件聲明

Teyru 專案實際使用與散布的第三方元件,以及各自的授權與散布方式。

本文件列出 Teyru 專案實際使用與散布的第三方元件。專案本身的授權見 LICENSE。

編譯器只用 Go 標準函式庫,go.mod 沒有任何外部模組依賴。產生執行檔會連結到的第三方程式碼 有三處:POSIX 目標上的 OpenSSL(TLS,動態連結)、windows/amd64 目標上的 mingw-w64 執行期 (-static,靜態連結進產物),以及主機自己的 IANA tzdata(由主機散布,本專案不散布、 不內建)。執行期本身(internal/runtime/src)與標準程式庫(lib/*.teyru)都是本專案的原創 程式碼。

這份清單不是靠人記住的:scripts/check-notices.sh(make notices)拿它對照編譯器倉庫—— 執行期的檔案清單、OpenSSL 的版本下限、windows/amd64 的連結旗標、tzdata 的讀取路徑、授權 檔案是否還在、Unicode 資料檔出現時有沒有列名。兩邊不一致時它以非零狀態結束。這一頁是 teyru-lang/Teyru 的 THIRD-PARTY-NOTICES.md 的對應版本。


1. 建置編譯器所需

元件用途授權散布方式
Go 標準函式庫(go1.26 以上)建置 cmd/teyru 與 internal/*BSD-3-Clause(Copyright The Go Authors)不散布,使用者自行安裝

Go 標準函式庫以 BSD 3-Clause 授權釋出,條文見 https://go.dev/LICENSE。本專案未修改標準函式庫,也未將其嵌入產物。


2. 產生執行檔所需(後端)

元件用途授權散布方式
clang / LLVM(預設後端)將產生的 C 編譯成原生執行檔Apache-2.0 with LLVM Exceptions不散布,使用者自行安裝;亦可用 gcc 取代
GCC(替代後端)同上GPL-3.0-or-later(執行期例外)不散布,使用者自行安裝
libc / libm執行期使用的系統函式庫依系統而異(多為 LGPL-2.1+ 或 MIT)動態連結,不散布

產生的執行檔連結這些函式庫,但不包含其原始碼。Teyru 執行期 (internal/runtime/src)本身是本專案的原創程式碼,與上述元件無授權關聯。

執行緒用的是系統的 pthread(glibc 2.34 之後併入 libc),另外連結的是 -lm 與 libc: ldd 一支只有 System.out.println 的程式只看得到 libm.so.6 與 libc.so.6。這是動態 連結,所以那支執行檔不含 libc 的程式碼。


3. 執行檔連結的第三方函式庫

元件用途授權散布方式
OpenSSL(libssl、libcrypto)TLS;實作在 internal/runtime/src/tyrt_tls.c,只有程式的可達程式碼碰得到 TLS 時才編譯與連結1.1.1 是 OpenSSL/SSLeay 雙授權;3.0 以後是 Apache-2.0動態連結(-lssl -lcrypto),不散布
mingw-w64 執行期(crt 與 winpthreads)windows/amd64 目標的 C 執行期與執行緒;那個目標用 x86_64-w64-mingw32-gcc 加上 -static 建置Zope Public License 2.1(mingw64-crt 套件附的 COPYING;同一個套件的 DISCLAIMER.PD 另外標明部分檔案為 public domain,實際檔案另有標成 BSD 或 LGPL 的部分)靜態連結進產物,所以散布執行檔就是散布它
Microsoft C 執行期與 Windows 系統 DLL(msvcrt.dll、KERNEL32.dll、WS2_32.dll)Windows 目標的 C 函式庫與 WinsockWindows 的一部分不散布;產物只有 import,載入時由系統提供
主機的 IANA tzdata(TZif 檔)lib/46_timezone.teyru 讀時區資料庫由散布它的主機決定。本機(Fedora 44)的 tzdata 套件標為 LicenseRef-Fedora-Public-Domain AND (GPL-2.0-only WITH ClassPath-exception-2.0)不散布、不內建;見下面〈tzdata〉

OpenSSL

TLS 是這個專案唯一不自己實作的一層,而它只有碰得到才進執行檔。internal/driver/driver.go 的目標表在 linux/amd64 與 linux/arm64 的 tlsLibs 寫著 -lssl、-lcrypto:兩個都要, 因為 X509 與 EVP 的呼叫是 libcrypto 的,而 -lssl 不是每個平台的連結器都會順帶拉進它。 ldd 一支用到 TLS 的程式(tests/programs/t191_tls_keepalive.teyru)看得到 libssl.so.3 與 libcrypto.so.3——動態連結,所以產物裡沒有 OpenSSL 的程式碼, libssl 的條款不隨我們的執行檔散布。

版本下限是 1.1,而且它是一個前置處理器的 #error,寫在 internal/runtime/src/tyrt_tls.c:

#if OPENSSL_VERSION_NUMBER < 0x10100000L
#error "the TLS layer needs OpenSSL 1.1 or newer (...)"
#endif

SSL_set1_host、BIO_meth_new、TLS_client_method 與 SSL_CTX_set_min_proto_version 都不在 1.0.x 裡。下限寫在編譯期,所以拿 1.0.2 的標頭建置看到的是那句話,而不是一個他沒寫過的 執行期檔案裡成頁的「未宣告的識別字」。scripts/check-notices.sh 從那個 #if 讀出十六進位的 下限,比對的就是本節這一個字串。

mingw-w64 執行期

windows/amd64 的連結旗標是 -lws2_32 -static(Winsock,以及讓產物自足——不加 -static 每個程式都要旁邊放一個 libwinpthread-1.dll)。因此 mingw-w64 的執行期(crt 與 winpthreads) 是靜態連結進去的:實測 x86_64-w64-mingw32-objdump -p 對一支 hello 只看到 KERNEL32.dll、msvcrt.dll、WS2_32.dll 三個 import,而 pthread_create 這類符號定義在 產物裡面、沒有任何 libwinpthread 或 libgcc_s 的 import。散布那支執行檔時,mingw-w64 執行期 的條款(ZPL-2.1,與檔案上另外標明為 public domain、BSD 或 LGPL 的部分)跟著走。

tzdata

時區資料在主機上,不在這個倉庫裡,也不在任何產物裡:lib/46_timezone.teyru 讀主機的 TZif 檔,目錄取自 $TZDIR(有設且非空時)否則 /usr/share/zoneinfo,預設時區取自 TZ 或 /etc/localtime。UTC 與 GMT/+08:00 這種數值 id 是內建的,所以只用到 UTC 的程式不需要 tzdata;其餘的區域在沒有 tzdata 的主機(Windows,或沒裝 tzdata 的容器)上以 ZoneRulesException 指名拒絕,不會答錯。資料的著作權跟著散布它的主機(發行版的 tzdata 套件),本專案不對它主張任何權利,也不重新散布它。


4. 執行期與標準程式庫

元件來源授權
Teyru 執行期(internal/runtime/src/ 整個目錄)本專案原創見 LICENSE
Teyru 標準程式庫(lib/*.teyru)本專案原創,以 Teyru 撰寫見 LICENSE

執行期不再逐檔列名,而是按目錄宣告,清單由 scripts/check-notices.sh 從目錄產生、也由 同一個腳本核對(編譯器倉庫裡執行 make notices)。目前 11 個檔案:

  • tyrt.c
  • tyrt.h
  • tyrt2.c
  • tyrt_net.c
  • tyrt_net.h
  • tyrt_plat.h
  • tyrt_plat_posix.c
  • tyrt_plat_win.c
  • tyrt_reflect.c
  • tyrt_thread.c
  • tyrt_tls.c

垃圾回收器、字串、陣列、例外與 box 類別都是本專案自行實作,沒有 Boehm GC、沒有 libgc、 沒有 mimalloc 之類的配置器。執行期唯一的第三方程式碼是碰得到 TLS 時連結的 OpenSSL(見 §3), 它是動態連結,執行期檔案自己不含它的程式碼。


5. Unicode 資料與產生的查表

Character 的字元分類與大小寫映射需要 Unicode 的資料,而那份資料現在隨編譯器入庫: internal/tools/genunicode/data/ 底下是 Unicode 15.0 的三個標準資料檔——UnicodeData.txt (類別、簡單大小寫映射、數字值)、SpecialCasing.txt(一對多的完整大小寫映射)與 PropList.txt(White_Space、Other_Uppercase/Other_Lowercase/Other_Alphabetic、 Ideographic)——以及由它們產生、一併入庫的兩級查表 internal/runtime/src/tyrt_unicode.c。產生器是 internal/tools/genunicode, make unicode-tables 重跑它,go test ./internal/tools/genunicode 盯著樹裡的檔案與資料一致 (重跑不會改動任何檔案)。同批的 CaseFolding.txt 與 DerivedCoreProperties.txt 沒有入庫: 這個執行期不需要 case folding,也不需要用 DerivedCoreProperties 推導的性質。

這些檔案依 Unicode License v3(UNICODE LICENSE V3,Copyright © 1991-2024 Unicode, Inc., 條文見 https://www.unicode.org/license.txt)散布, 著作權聲明隨檔案保留。版本固定 15.0 是為了與參考實作對齊:JDK 21 用的是 Unicode 15.0,所以 Character.isLetter 與大小寫映射的答案以它為準(Character.isWhitespace 與 Character.digit 不是任何一個檔案的性質,是 JDK 自己的答案,在產生器裡寫明並由 tests/programs/t251_unicode_tables 對 JDK 逐個碼點驗證)。

編譯器倉庫的 scripts/check-notices.sh 會在這些資料檔出現時要求聲明檔已經列名(四個名字逐個查)。

6. 編輯器工具(teyru-lang/editors)

編輯器支援不在編譯器倉庫裡(測試、文件與編輯器支援各自獨立成庫),所以下表描述的是那個倉庫的 內容:

元件來源授權
tree-sitter-teyru/src/tree_sitter/alloc.h、array.h、parser.h從 tree-sitter 複製,供產生的剖析器使用MIT(Copyright (c) 2018 Max Brunsfeld)
tree-sitter-teyru/src/parser.c由 tree-sitter CLI(v0.25.10)從 grammar.js 產生的剖析表與詞法器MIT(同上)
tree-sitter-teyru/grammar.js、queries/、test/本專案原創GPL-2.0-only,見同倉庫的 tree-sitter-teyru/LICENSE
vscode/(TextMate 語法、語言設定、片段)本專案原創見本倉庫的 LICENSE

tree-sitter 的 MIT 條文要求著作權聲明與許可聲明隨所有副本保留,本文件這一節與 上游的 LICENSE 一併滿足。這些檔案只被編輯器用來做語法高亮與剖析,不會進入 編譯器,也不會進入任何產生的執行檔。


7. 測試與工具

元件用途授權
Go 測試框架(testing)go test ./...BSD-3-Clause(Go 標準函式庫的一部分)
OpenJDK / HotSpot只用於 scripts/bench.sh 的對照量測GPL-2.0 with Classpath Exception

scripts/bench.sh 需要 java / javac 才會執行 JVM 那一半;若系統沒有安裝, 腳本只會跳過該部分,不影響 Teyru 的建置與測試。JVM 不是 Teyru 的執行環境, 也不是任何產物的依賴。


8. 授權檔案

檔案說明
LICENSE本專案的主要授權
LICENSE-CLASSPATH-EXCEPTION-2.0Classpath Exception 全文(條文來自 OpenJDK,隨主要授權一併保留)
tree-sitter-teyru/LICENSE(在 teyru-lang/editors)該文法本身的授權(GPL-2.0-only,與本專案主要授權相同)

若發行時修改了上述任何一項(例如把 clang 或 OpenSSL 靜態連結進產物,或把 Go 標準函式庫 嵌入發行包),必須重新產生本文件並附上對應的授權全文;執行期的檔案清單則執行 make notices 重新產生。


9. 需要 owner 確認

本節只記下問題,不自行下結論:

  • 本專案的主要授權是 GPL-2.0 with Classpath Exception(LICENSE 與 LICENSE-CLASSPATH-EXCEPTION-2.0)。OpenSSL 3.0 以後是 Apache-2.0,而 linux/amd64 與 linux/arm64 的產物動態連結它;1.1.1 則是 OpenSSL/SSLeay 雙授權。Classpath Exception 的條文允許連結獨立模組並以自己選擇的條款散布產物,但它與 Apache-2.0 的相容性、以及散布 「靜態連結了 mingw-w64 執行期(ZPL-2.1)」的 windows/amd64 產物時的義務,屬於授權判斷, 由 owner 決定。
  • 在這條有答案之前,本文件只敘述事實:哪個目標連到什麼、怎麼連、各自的條款是什麼。

本頁目錄