Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,16 @@
*.out
vendor/

# core/out-go НЕ игнорируется, и это выбор: напечатанный Go коммитится, чтобы
# сборка из чистого клона требовала только Go (AGENTS.md, «core/out-go
# печатается, а не пишется»). Игнорируется лишь временный каталог сверки
# печати — тот, с которым сравнивают дерево.
# core/out-go и ui-flang/out-go НЕ игнорируются, и это выбор: напечатанный Go
# коммитится, потому что его читает выпуск. `scripts/build-release.sh` собирает
# с `-tags flangcore` и компилятор flang не зовёт ни разу; без печати в дереве
# каждый выпуск начинался бы со сборки семени — 1 мин 54 с при `-j4` и 1,7 ГиБ
# памяти. Числа и разбор по каталогам — в core/README.md.
#
# core/out-c ИГНОРИРУЕТСЯ (core/.gitignore): его не читает ни один прогон,
# которому хватает Go, а тот, кто его зовёт, печатает его сам.
#
# Здесь же — временный каталог сверки печати, тот, с которым сравнивают дерево.
/core/out-go.check/
/core/out-c.check/

Expand Down
25 changes: 16 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,19 +117,26 @@ SPDX-License-Identifier: BSD-2-Clause
flang emit core/<модуль>.flang --target go --out core/out-go
```

Он коммитится напечатанным (сборка из чистого клона тогда требует только Go), и
правка руками в нём — дефект, а не правка: следующая печать её сотрет молча.
Меняется поведение ядра — меняется спецификация в `core/`, затем печать, затем
коммит обоих изменений вместе. Сверка при сомнении: перепечатать во временный
каталог и сравнить с деревом; расхождение значит, что кто-то правил вывод.
Он коммитится напечатанным — потому что его читает выпуск: `build-release.sh`
собирает с `-tags flangcore` и компилятор не зовёт ни разу, а собрать семя
стоит 1 мин 54 с при `-j4` и 1,7 ГиБ. Печать в C (`core/out-c`) этим доводом не
покрыта ничем и в git НЕ лежит: её не читает ни один прогон, которому хватает
Go. Разбор по каталогам числами — [`core/README.md`](core/README.md).

Правка руками в напечатанном — дефект, а не правка: следующая печать её сотрет
молча. Меняется поведение ядра — меняется спецификация в `core/`, затем печать,
затем коммит обоих изменений вместе. Сверка при сомнении: перепечатать во
временный каталог и сравнить с деревом; расхождение значит, что кто-то правил
вывод.

Поэтому же напечатанное освобождено от требования заголовка в
`tools/licensing.flang` (функция «Напечатанное») — но не от проверки на GPL.

Что здесь исходник, а что вывод компилятора — таблицей и без жаргона:
[`core/README.md`](core/README.md). Внутри самих `out-go/` и `out-c/`
пояснения нет намеренно: `make -C core печать` начинается с `rm -rf`, и любой
файл, положенный туда руками, исчезнет при первой же перепечатке.
Что здесь исходник, что вывод компилятора и что из вывода лежит в git —
таблицей и без жаргона: [`core/README.md`](core/README.md). Внутри самих
`out-go/` и `out-c/` пояснения нет намеренно: `make -C core печать` начинается
с `rm -rf`, и любой файл, положенный туда руками, исчезнет при первой же
перепечатке.

То же правило слово в слово держит `ui-flang/out-go` — печать библиотеки
раскладки экрана [flang-tui](https://github.com/digitable-lol/flang-tui). Разница
Expand Down
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,11 @@ formula, so the two ways install the same bytes.

### From source

A Go toolchain is enough from a clean checkout, because the printed Go is
committed. The build runs inside `host/`: that is where the module lives, and
there is no module at the root.
A Go toolchain is enough from a clean checkout — not for `go build` in general,
but for the `flangcore` tag below: the print that tag links in is committed
(`core/out-go`, 6,304 lines; why that one and not every print, see
[`core/README.md`](core/README.md)). The build runs inside `host/`: that is
where the module lives, and there is no module at the root.

```bash
cd host && go build -tags flangcore -o ../digitdisk .
Expand Down Expand Up @@ -1008,8 +1010,9 @@ dictionary, and 29 names of the договор translated as words.

The licensing guard and the emission cross-check are written in flang, not in
Python or JavaScript: neither is present in this tree. The flang compiler is a
single binary that needs only a C compiler (`brew install flang`, `asdf`, or
`make -C bootstrap` in a clone of the language); it does not require Node.
single binary that needs only a C compiler (`brew install
digitable-lol/tap/flang`, `asdf`, or `make -C bootstrap` in a clone of the
language — 1 min 54 s at `-j4`); it does not require Node.

## State

Expand Down
12 changes: 8 additions & 4 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,11 @@ sudo install -m 0755 digitdisk-$V-linux-$A/digitdisk /usr/local/bin/digitdisk

### Сборка из исходников

Для сборки из чистого клона хватает Go: напечатанный Go лежит в дереве.
Собирается изнутри `host/` — модуль там, в корне дерева модуля нет.
Из чистого клона хватает Go — и это не про `go build` вообще, а про признак
`flangcore` ниже: печать, которую он кладёт внутрь, лежит в дереве
(`core/out-go`, 6 304 строки; почему именно она, а не всё напечатанное, —
[`core/README.md`](core/README.md)). Собирается изнутри `host/` — модуль там, в
корне дерева модуля нет.

```bash
cd host && go build -tags flangcore -o ../digitdisk .
Expand Down Expand Up @@ -974,8 +977,9 @@ cd host && go test ./internal/lang/ -v -run 'Пары|Заполнители|Д

Сторож лицензий и сверка печати написаны на flang, а не на Python и JavaScript:
в дереве нет ни того, ни другого. Компилятор flang — один двоичный файл,
которому нужен только `cc` (`brew install flang`, `asdf`, либо
`make -C bootstrap` в клоне языка); Node он не требует.
которому нужен только `cc` (`brew install digitable-lol/tap/flang`, `asdf`,
либо `make -C bootstrap` в клоне языка — 1 мин 54 с при `-j4`); Node он не
требует.

## Состояние

Expand Down
16 changes: 10 additions & 6 deletions core/.gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
# Собранное из напечатанного. Сам напечатанный Go и C коммитятся (AGENTS.md,
# «core/out-go печатается, а не пишется»), их сборка — нет: бинарь молча
# разойдётся с исходником, а восстанавливается он одной командой
# Собранное из напечатанного. Напечатанный Go коммитится (AGENTS.md,
# «core/out-go печатается, а не пишется»), его сборка — нет: бинарь молча
# разошёлся бы с исходником, а восстанавливается он одной командой
# `make -C core печать`.
out-go/flang_cli
out-c/flang_cli
out-c/*.o
out-c/*.a

# Напечатанный C НЕ коммитится, и это отдельное решение с отдельным доводом:
# его не читает ни один прогон, которому хватает Go. `host/` и `scripts/` на
# него не ссылаются, а `make -C core сверка` начинается с `rm -rf out-c` и
# печатает его заново — то есть закоммиченные 12 130 строк ни разу не были
# прочитаны. Числа и весь довод — в core/README.md.
out-c/
10 changes: 8 additions & 2 deletions core/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,16 @@
# ни JavaScript тут больше нет. Взять его можно тремя дорогами, и все три дают
# один и тот же файл под одним именем:
#
# brew install flang asdf plugin add flang make -C bootstrap
# brew install digitable-lol/tap/flang asdf plugin add flang
# make -C bootstrap
#
# «Один двоичный из одного cc» не значит «даром»: последняя дорога — 38 МБ C,
# 5 мин 12 с одним вызовом и 1 мин 54 с при `-j4`, пик 1,7 ГиБ (AMD EPYC 7742,
# v0.7.10). Ради этих двух минут out-go/ и лежит в git; см. core/README.md.
#
# Каталоги out-go/ и out-c/ ПЕЧАТАЮТСЯ, а не правятся руками: `make -C core`
# восстанавливает их целиком.
# восстанавливает их целиком. В git при этом лежит ТОЛЬКО out-go/ — out-c/ не
# читает ни один прогон, которому хватает Go, и он игнорируется.

# Команда flang. По умолчанию — та, что стоит в системе; FLANG=путь/к/flang
# переопределяет её, а FLANG_HOME указывает на клон flang с собранным семенем.
Expand Down
69 changes: 58 additions & 11 deletions core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@

## Что здесь исходник, а что вывод компилятора

| Путь | Что это | Правится руками? |
|---|---|---|
| `disk-inventory.flang` | **исходник.** Правила, пороги, примеры, постусловия | **да, только он** |
| `differential.flang` | **исходник.** Сверка двух печатей между собой | да |
| `out-go/` | вывод компилятора: тот же модуль, напечатанный в Go | **НЕТ** |
| `out-c/` | вывод компилятора: тот же модуль, напечатанный в C | **НЕТ** |
| Путь | Что это | Лежит в git? | Правится руками? |
|---|---|---|---|
| `disk-inventory.flang` | **исходник.** Правила, пороги, примеры, постусловия | да | **да, только он** |
| `differential.flang` | **исходник.** Сверка двух печатей между собой | да | да |
| `out-go/` | вывод компилятора: тот же модуль, напечатанный в Go | **да**, 6 304 строки | **НЕТ** |
| `out-c/` | вывод компилятора: тот же модуль, напечатанный в C | **нет**, печатается на месте | **НЕТ** |

### `out-go/` и `out-c/` — это НЕ исходники

Expand All @@ -22,9 +22,55 @@ flang emit --target go disk-inventory.flang --out out-go
flang emit --target c disk-inventory.flang --out out-c
```

**Зачем они закоммичены, если это вывод.** Чтобы сборка из чистого клона
требовала только Go: кто клонировал digitdisk и хочет собрать двоичный файл, не
обязан ставить компилятор flang — решающий слой уже напечатан и лежит в дереве.
### Почему `out-go/` закоммичен, а `out-c/` — нет

Довод «чтобы сборка из чистого клона требовала только Go» стоял здесь с первого
дня и был **шире правды**: он не называл ни признака сборки, за которым
напечатанное вообще нужно, ни каталога, которому он не подходит вовсе. Ниже —
тот же довод, но по каталогам и числами. Все числа сняты в чистом клоне на
`AMD EPYC 7742` — на той же машине, что и замеры раскладки в
[`../ui-flang/README.md`](../ui-flang/README.md).

**Обычная сборка не читает напечатанное вообще.** Удалите `core/out-go`,
`core/out-c` и `ui-flang/out-go` целиком — и `go build ./...`, `go vet ./...`,
`go test ./...` в `host/` останутся зелёными: решающий слой стоит за признаком
`flangcore` (`host/decider_flang.go`, `host/internal/coreflang/bridge.go`), а
без признака собирается заглушка. Значит «только Go» — это НЕ про `go build`.

**Про что оно на самом деле — про выпуск.** `scripts/build-release.sh` собирает
все четыре цели с `-tags flangcore` (строка 119) и падает на самопроверке, если
ядра на flang в двоичном файле не оказалось (строка 234). Компилятор flang он
не зовёт ни разу. То же и у того, кто собирает себе: `cd host && go build -tags
flangcore`. Уберите `out-go/` из дерева — и этот путь отвечает

```
flangprogram@v0.0.0: replacement directory ../core/out-go does not exist
```

то есть выпуск начинает требовать компилятор.

**Чего это стоило бы, замерено.** Компилятор — действительно один двоичный из
одного `cc`, и это не значит «дёшево»: `make -C bootstrap` на v0.7.10 — это
38 МБ C в четырёх единицах трансляции, **5 мин 12 с** одним вызовом, **1 мин
54 с** при `-j4` и **1 мин 48 с** при `-j8` (единиц четыре, больше ядер занять
нечем), пик памяти **1,7 ГиБ**. Готовый двоичный — 21 МБ, зависимости `libm` и
`libc`. Число это не падает, а растёт: язык обещает `make -C bootstrap -j8`
«около минуты», здесь вышло почти вдвое больше. Именно поэтому довод не
отменён — 6 304 строки в git против двух минут и полутора гигабайт на каждой
машине, которая собирает выпуск.

**А `out-c/` этим доводом не покрыт ничем, и потому из git убран.** Его не
читает ни `host/`, ни `scripts/`; единственный, кто его зовёт, —
`differential.flang` через `out-c/flang_cli`, а цель `сверка` зависит от
`печать`, которая начинается с `rm -rf out-go out-c`. То есть закоммиченные
12 130 строк C не читал никто и никогда: любой прогон, которому они нужны,
печатает их заново, и у него уже есть компилятор. Теперь они печатаются на
месте и игнорируются (`core/.gitignore`).

Напечатанного в git было 36 487 строк из 78 376 — **46,6 %** дерева, больше,
чем весь рукописный хозяин (33 467 строк `host/*.go`). Стало 24 357 из 66 296,
**36,7 %**: `core/out-go` (6 304) и `ui-flang/out-go` (18 053), и у каждого —
свой признак сборки и свой прогон, который без него краснеет.

**Цена этого решения.** Вывод обязан оставаться в согласии с исходником.
Поэтому правка руками внутри `out-go/` или `out-c/` — **дефект, а не правка:**
Expand All @@ -47,8 +93,9 @@ make -C core сверка # 240 входов через оба напеча
```

Компилятор flang — один двоичный файл, которому нужен только `cc`:
`brew install flang`, `asdf`, либо `make -C bootstrap` в клоне языка. Node он не
требует, и в этом дереве нет ни JavaScript, ни Python.
`brew install digitable-lol/tap/flang`, `asdf`, либо `make -C bootstrap` в клоне
языка (что это стоит — числами выше). Node он не требует, и в этом дереве нет ни
JavaScript, ни Python.

## Почему ядро не ходит в файловую систему само

Expand Down
27 changes: 0 additions & 27 deletions core/out-c/Makefile

This file was deleted.

Loading
Loading