vak: (Аристипп)
[personal profile] vak
Проект на Гитхабе: tsoding/good_training_language

Классический пример Hello World:
про главная() нч
печать(«Привет, Мир!\н»);
кц
Компилируем, запускаем.
$ хуяк комп примеры/01-привет.хуя
$ ./примеры/01-привет
Привет, Мир!
vak: (Знайка)
[personal profile] vak
Полезные примитивы управления путём PATH. Вставляются в ~/.bashrc. Правятся по вкусу.
append_path() {
    local dir="$1"
    if [[ -d "$dir" ]]; then
        if [[ -d "$dir" && ":$PATH:" != *":$dir:"* ]]; then
            export PATH="$PATH:$dir"
        fi
    fi
}
prepend_path() {
    local dir="$1"
    if [[ -d "$dir" ]]; then
        if [[ -d "$dir" && ":$PATH:" != *":$dir:"* ]]; then
            export PATH="$dir:$PATH"
        fi
    fi
}
remove_path() {
    local dir="$1"
    if [[ ":$PATH:" == *":$dir:"* ]]; then
        local new_path=":$PATH:"
        new_path="${new_path//:$dir:/:}"
        new_path="${new_path#:}"
        export PATH="${new_path%:}"
    fi
}
remove_path /usr/games
remove_path /usr/local/games
remove_path .
append_path /usr/sbin
append_path /usr/bin
append_path /snap/bin
prepend_path /usr/local/bin
prepend_path /usr/local/sbin
prepend_path $HOME/.local/bin

Про нас пишут

Apr. 22nd, 2025 02:38 pm
vak: (Робот 1)
[personal profile] vak
https://www.automotiveworld.com/articles/software-centric-chips-anticipate-the-ai-defined-vehicle/

"SiMa.ai is positioning its unique MLSoC platform as the gateway for unlocking next-generation ADAS/AV performance. Importantly, it has been conceived specifically for automotive applications."

"SiMa.ai’s MLSoC has an ML performance of 50 TOPS and a ResNet-50 (an image classifying architecture) performance of more than 300 FPS per watt. The company claims latency can be reduced by a factor of ten, with all compute in Level 2/3 systems achieved at less than 25W, or less than 100W at Level 4."

"SiMa.ai designed the chip according to three foundation pillars: to be compatible with any computer vision and generative AI application using ML at the edge, regardless of vehicle type; to offer best-in-class performance per watt; and to provide an interface usable by anyone instead of a small demographic of hardware experts."

"In December 2024, SiMa.ai combined its AI/ML capabilities with silicon design and verification firm Synopsys to maximise customisation for automotive-centric IP, subsystems, chiplets, and SoCs."

Настольные игрушки

Apr. 22nd, 2025 12:35 pm
green_fr: (Default)
[personal profile] green_fr
С сентября у меня очень сильно изменился ритм жизни — и работу поменял, и Анюта учиться начала, и уроки французского стали существенно регулярнее (если в прошлом году у меня было 3-4 часа в месяц, то с нового года это скорее 10, в январе вообще был геройский 21 час). На игрушки времени не осталось совершенно — с начала сезона (сентябрь) я всего дважды сходил в свою ассоциацию, и не факт, что в ближайшее время вернусь туда. Так что, надо, наверное, подобрать хвосты и закрыть тему.

Goetia (3.06) — наверное, хорошая игра, но тема настолько не моя (мы пытаемся вызвать разных демонов), что мне сложно следовать какой-то естественной логике, а играть совсем абстрактно «как в шахматы» мне не так интересно.

Brass Birmingham (3.87) — совсем другое дело, тут мы строим железную дорогу и варим пиво :-) Это одна из популярных игр у нас в клубе, но у меня всё никак не получалось вписаться за стол с ней. Отличная игра, там несколько вариантов в серии, я играл именно в Бирмингем. Но это типичная игра, в которой надо сначала с треском проиграть несколько раз, чтобы понять, куда вообще там надо смотреть, какие вещи необходимые, а какие можно будет догнать и потом. Меня это не смущает, но знаю людей, которым сложно так играть: «давай ты сначала 5 раз проиграешь, а потом поговорим».

Skymines (3.88) — тоже классная игра, смесь deck-building с placement des ouvriers, на этот раз мы обустраиваем Луну. Как обычно, несколько ресурсов, несколько направлений, по которым ты можешь развиваться, постоянно смотришь на соперников и завидуешь им, потому что где-то они да и опередили тебя :-)

The castle of Burgundy (2.91) — ещё одна игра, про которую я слышал, в которую давно хотел сыграть. Достаточно низкая сложность объясняется, наверное, наличием в игре кубиков. Речь не столько о случае, сколько об ограничении вариантов — как минимум часть твоего хода предопределяется кубиками, оставшиеся варианты просчитывать проще. А самое главное — не надо заниматься этим заранее: бросил кубики — и после этого можно думать о доступных вариантах. Хорошая игра.

Concordia (2.99) — очень приятно было видеть игрушку от Ystari Games, я на их играх в какой-то момент понял, что да, бывают совсем «другие» игры, чем те, к которым мы привыкли. Ну и видно, что за прошедшие 10 лет стиль игр очень сильно изменился. Игрушка про Римскую империю, ты рассылаешь свои фишки по дорогам, пытаясь получить влияние в разных краях империи (читай: выполнить определённые миссии). Видно, что игра старая, потому что в нашей партии один из игроков тупо заблокировал себя, и ему нужно было просто ждать, когда игра закончится — сейчас такого, конечно же, авторы игрушек не позволяют.


12 chip trick (1.50) — короткая игра на случай, если первая игра закончилась слишком быстро. Я в неё в клубе не играл, но увидел за соседним столом и впечатлился настолько, что купил домой. Но дома она как-то фурора не произвела. Игрушка кажется примитивной — что-то вроде покера, где всего 12 жетонов, количество ходов достаточно ограничено, и результат каждого раунда, казалось бы, должен просчитываться. Но нет, очень азартная игра :-)

Harmonies (2.00) — в качестве короткой игры мне попалась эта. Очень милая: у тебя есть поле, есть разноцветные фишки и есть миссии, как эти фишки уложить на твоём поле. Можно играть с детьми — для них это как домино. Можно пытаться комбинировать миссии, чтобы одной фишкой построить сразу несколько.

Пытался купить на прошлый день рождения Анюте описанную выше Harmonies, в магазине её не оказалось, посоветовали Faraway (1.88) — интересная схема игры, когда ты выкладываешь карты в порядке обратном тому, в котором они потом будут «играть». Первые несколько партий (они очень короткие!) выворачивают мозг, потом привыкаешь. Как это ни странно, за год игрушка не надоела, достаём время от времени, играем!


Drop it (1.09) — это нам в Австрии показали. В кои-то веки у меня игрушка «на ловкость» :-)

Quacks (1.94) — оттуда же, достаточно детская игра — ты тянешь какие-то карточки из мешка до тех пор, пока не остановишься, либо не вытащишь определённое количество «штрафных» карт. Можно докупать карточки в свой мешок, у них разные свойства, так или иначе меняющие правила. Приятная игрушка.

Tranquility (1.34) — ещё одна детская игра из лагеря: в ограниченных рамках выкладываем карты так, чтобы они в конце оказались по порядку. Есть пара оживляющих игру правил, но игра всё равно остаётся детской.

Magic Maze (1.75) — наверное, лет в 10-12 душу бы за такую игру отдал, но сейчас, конечно, совсем не моё :-) Лабиринт, в котором есть несколько персонажей, мы можем их двигать по определённым правилам (у каждого своё), но не можем разговаривать (ой!), да ещё и всё это под таймер (ой-ой!)


При этом время от времени дома во что-то играем из знакомого. В основном Ark Nova, Wingspan, Unlock. Нашёл было solo mode для Anno 1800 — но нет, пасьянсы раскладывать всё-таки достаточно скучно, это не моё.

Не уверен

Apr. 21st, 2025 07:55 pm
aka_human: (Default)
[personal profile] aka_human
- Настоящие принцессы не пукают!
- Не правда! Настоящие принцессы пукают фиалками. 

(no subject)

Apr. 21st, 2025 06:37 pm
aka_human: (Default)
[personal profile] aka_human
 Все-таки хорошо, что недавно почивший Папа так и не стал мамой. Во всех смыслах.
vak: (Робот 1)
[personal profile] vak
...Фирма делает чипы. Целенаправленно для искусственного интеллекта и машинного обучения. Но какие нейронные сетки на наших чипах можно гонять, и с какой эффективностью? А вот вам рисунок. По горизонтали количество обрабатываемых изображений в секунду. По вертикали точность распознавания. Точность получается повыше, если модель работает в плавающей точке FP32, и пониже, если она квантована в целые числа INT8.

Подробнее на сайте: https://sima.ai/model-browser/

vak: (бэсм-6)
[personal profile] vak
(Я послал этот текст в список рассылки БЭСМ-6, но сохраню и здесь для памяти.)

Раз уж у нас тут постепенно актуализировалась тема написания компиляторов, я тоже увлёкся и реализовал давнишнюю мечту: портонул Би с PDP-7 на БЭСМ-6.

Исходник компилятора: b-besm.b

Проект на Гитхабе: besm6/b-compiler

История вопроса следующая. В 1969 году Кен Томпсон создал язык Би для машины PDP-7. Компилятор порождал так называемый шитый код, который интерпретировался во время выполнения. Позже в 1971-м Деннис Ритчи портонул Би на машину Honeywell GE 645, но без всякого шитого кода, а уже с нормальной генерацией бинарного кода целевого процессора. А когда Ритчи взялся тащить Би на PDP-11, оказалось, что наличие байтовой адресации существенно меняет дело. Пришлось добавить в Би типы, и он быстро превратился в знакомый нам Си.

Исходники компилятора Би считались потерянными. Но девять лет назад Robert Swierczek чудесным образом сумел восстановить тексты Би из обрывков распечаток в рамках проекта pdp7-unix.

Я взял эти исходники и вместо выдачи шитого кода для PDP-7 вставил генерацию машинных команд БЭСМ-6 для ассемблера Madlen. Добавил минимальную рантайм библиотеку и запихнул в мониторную систему Дубна. Компилятор пишет ассемблерный текст на барабан и, если не случилось ошибок, выполняет как бы команду *READ:1. Дальше обычным образом стартует Мадлен и формирует объектные модули. Компилятор Би и рантайм библиотеку я поместил на отдельную ленту, её можно подключать командой *TAPE:7/B. Покажу пример на симуляторе dubna.

Вот скрипт с исходным текстом классического примера Hello World. Компилятор запускается с ленты командой *TRANS.
*name B compiler
*tape:7/b,40
*library:40
*trans-main:40020
main() {
printf("Hello, B!*n");
}
*execute
*end file
Запускаем. Я не стал убирать таблицу загрузки, чтобы вам было видно размер кода:
$ dubna hello.dub
...
*NAME B COMPILER
*TAPE:7/*,40
*LIBRARY:40
*TRANS-MAIN:40020
OVERLAY OT 20/04/25
B COMPILER FOR BESM-6, VERSION 04/2025
COMPILED 3 LINES OF CODE, FOUND 0 ERRORS

*NO LIST
*CALL BLOCKERR
*MADLEN
MAIN CP 0.0, ST 0.0, RT 1.0*
*READ OLD
*EXECUTE
*LIBRA:40 = B/DIV B/EQ B/GT B/LT B/MUL B/NE B/RET B/SAVE0 B/SAVE
B/TOUT B/TRUE CHAR PRINTD PRINTO PRINTF WRITE WRITEB OUT*CNT OUT*SHFT
OUT*BUFF FLUSH FOUT

MAIN 01000 PRINTD 01413 B/MUL 01757 ISOTCOSY 06002
PROGRAM E 01000 PRINTO 01466 B/GT 01766 ISOTCOS1 E 06053
B/SAVE0 01011 WRITE 01517 FOUT 01771 DRUMTAP* 06073
B/RET 01016 B/TRUE 01622 WRCARD 01772 CHKWORD* C 06124
PRINTF 01023 OUT*CNT 01623 WRWORD E 02014 PRINT8 06125
B/SAVE 01256 OUT*SHFT 01624 WBEGIN E 02033 STOP* 06306
CHAR 01263 OUT*BUFF 01625 WRIEND E 02042 EXIT E 06307
B/NE 01301 FLUSH 01654 B/TOUT 02075 CBOБOДHO 06335
B/EQ 01304 B/LT 01744 WRWORD/ C 04000
WRITEB 01307 B/DIV 01747 XWRITE/ C 06000

HELLO, B!
Вот ещё несколько примеров для Би из разных мест. Все они работают под Дубной:Мандельброт выглядит забавно: mandelbrot.txt

Выводы из всей этой затеи:
  • Би вполне был возможен на БЭСМ-6 уже тогда, в середине 70-х. Увы, никто из аксакалов-бэсмачей про него не знал.
  • Если бы Би тогда состоялся, он мог бы стать важным средством системной разработки. Не судьба. Позже язык ЯРМО пытался занять нишу.
  • Результат примерно соответствует мечте Игоря Григорьевича Пасынкова, когда в 1986 году он позвал меня в курчатник заниматься Си для Эльбруса-Б. Ему хотелось видеть Си не только под юниксом, но и в мониторке.

Time 895. New Vasiuki.

Apr. 21st, 2025 03:52 pm
vak: (Default)
[personal profile] vak
Вот такая програмулина:
main() {
auto cx, cy, x, y, x2, y2;
auto iter;
auto xmin, xmax, ymin, ymax, maxiter, dx, dy;

xmin = -8601;
xmax = 2867;
ymin = -4915;
ymax = 4915;

maxiter = 32;

dx = (xmax - xmin) / 79;
dy = (ymax - ymin) / 24;

cy = ymin;
while (cy <= ymax) {
cx = xmin;
while (cx <= xmax) {
x = 0;
y = 0;
x2 = 0;
y2 = 0;
iter = 0;
while (iter < maxiter) {
if (x2 + y2 > 16384)
goto next;

y = ((x * y) / 2048) + cy;
x = x2 - y2 + cx;
x2 = (x * x) / 4096;
y2 = (y * y) / 4096;
iter++;
}
next:
write(' ' + iter);
cx = cx + dx;
}
write('*n');
cy = cy + dy;
}
return(0);
}
Запускаем mandelbrot.dub, получаем mandelbrot.txt:
$ dubna mandelbrot.dub
...
!!!!!!!!!!!!!!!"""""""""""""####################################""""""""""""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$$%'+)%%%$$$$$#####"""""""""""
!!!!!!!!!!!"""""""#######################$$$$$$$$%%%&&(+,)++&%$$$$$$######""""""
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*5:/+('&%%$$$$$$#######"""
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''),@@@@@@@,'&%%%%%$$$$########
!!!!!!!"""####################$$$$$$$$%%%&'())((())*,@@@@@@/+))('&&&&)'%$$######
!!!!!!""###################$$$$$%%%%%%&&&'+.@@=/<@@@@@@@@@@@@@@@/++@..93%%$#####
!!!!!"################$$$%%%%%%%%%%&&&&'),+2@@@@@@@@@@@@@@@@@@@@@@@@@1(&&%$$####
!!!!"##########$$$$$%%&(-(''''''''''''(*,5@@@@@@@@@@@@@@@@@@@@@@@@@@@@+)-&%$$###
!!!!####$$$$$$$$%%%%%&'(*-@1.+.@-4+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4-(&%$$$##
!!!!#$$$$$$$$$%%%%%%'''++.6@@@@@@@@@8/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3(%%$$$$#
!!!#$$$$$$$%&&&&''()/-5.5@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?'&%%$$$$#
!!!(**+/+<523/80/46@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+)'&&%%$$$$#
!!!#$$$$$$$%&&&&''().-2.@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'&%%$$$$#
!!!!#$$$$$$$$$%%%%%&'''/,.7@@@@@@@@@;/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0'%%$$$$#
!!!!####$$$$$$$$%%%%%&'(*-:2.,/?-5+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+(&%$$$##
!!!!"##########$$$$$%%&(-(''''(''''''((*,4@@@@@@@@@@@@@@@@@@@@@@@@@@@4+).&%$$###
!!!!!"################$$$%%%%%%%%%%&&&&')<,4@@@@@@@@@@@@@@@@@@@@@@@@@/('&%%$####
!!!!!!""##################$$$$$$%%%%%%&&&'*.@@@0@@@@@@@@@@@@@@@@1,,@//9)%%$#####
!!!!!!!"""####################$$$$$$$$%%%&(())((()**-@@@@@@/+)))'&&&')'%$$######
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''(,@@@@@@@+'&&%%%%%$$$########
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*7@0+('&%%%$$$$$#######"""
!!!!!!!!!!!"""""""######################$$$$$$$$$%%%&&(+-).*&%$$$$$$######""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$%%'3(%%%$$$$$######""""""""""
!!!!!!!!!!!!!!!""""""""""""#####################################""""""""""""""""

Young Sheldon says

Apr. 21st, 2025 09:27 am
juan_gandhi: (Default)
[personal profile] juan_gandhi
 "In fact, I'd like to meet fewer people, not more."

(S7E5)

Is not it brilliant!

Angelo Papenhoff

Apr. 21st, 2025 12:01 am
vak: (Default)
[personal profile] vak
Много интересных подробностей про исторический компилятор Би для PDP-7 и про первый юникс.

NANOWAR OF STEEL

Apr. 20th, 2025 03:45 pm
aka_human: (Default)
[personal profile] aka_human
 По рекомендации cybernatic_cat узнал о NANOWAR OF STEEL  cybernatic-cat.dreamwidth.org/1670067.html
Проникся! 

vak: (Default)
[personal profile] vak
Я затащил компилятор Би под мониторную систему Дубна. Сделал отдельную ленточку 7/b, на которой лежит бинарник компилятора и рантайм библиотека. Вот классический пример Hello World:
*name B compiler
*tape:7/b,40
*library:40
*trans-main:40020
main() {
printf("Hello, B!*n");
}
*execute
*end file
Запускаем:
$ dubna b.dub
...
*NAME B COMPILER
*TAPE:7/*,40
*LIBRARY:40
*TRANS-MAIN:40020
OVERLAY OT 20/04/25
B COMPILER FOR BESM-6, VERSION 04/2025
COMPILED 3 LINES OF CODE, FOUND 0 ERRORS

*NO LIST
*CALL BLOCKERR
*MADLEN
MAIN CP 0.0, ST 0.0, RT 1.0*
*READ OLD
*EXECUTE
*LIBRA:40 = B/DIV B/EQ B/GT B/LT B/MUL B/NE B/RET B/SAVE0 B/SAVE
B/TOUT B/TRUE CHAR PRINTD PRINTO PRINTF WRITE WRITEB OUT*CNT OUT*SHFT
OUT*BUFF FLUSH FOUT

MAIN 01000 PRINTD 01413 B/MUL 01757 ISOTCOSY 06002
PROGRAM E 01000 PRINTO 01466 B/GT 01766 ISOTCOS1 E 06053
B/SAVE0 01011 WRITE 01517 FOUT 01771 DRUMTAP* 06073
B/RET 01016 B/TRUE 01622 WRCARD 01772 CHKWORD* C 06124
PRINTF 01023 OUT*CNT 01623 WRWORD E 02014 PRINT8 06125
B/SAVE 01256 OUT*SHFT 01624 WBEGIN E 02033 STOP* 06306
CHAR 01263 OUT*BUFF 01625 WRIEND E 02042 EXIT E 06307
B/NE 01301 FLUSH 01654 B/TOUT 02075 CBOБOДHO 06335
B/EQ 01304 B/LT 01744 WRWORD/ C 04000
WRITEB 01307 B/DIV 01747 XWRITE/ C 06000

HELLO, B!
Компилятор генерит ассемблерный код и пишет его на барабан, то есть временный файл фактически. И переключает мониторку на чтение этого барабана, как бы командой *READ:1. Вызывается Мадлен и превращает ассемблерный код в бинарные объектные модули.
vak: (Знайка)
[personal profile] vak
Here is a more detailed elaboration.
  1. Make it work.
  2. Make it right (the code is readable [uses intention revealing names] and every idea is expressed once and only once).
  3. Make everything work.
  4. Make everything right.
  5. Use the system and find performance bottlenecks.
  6. Use a profiler in those bottlenecks to determine what needs to be optimized. See Profile Before Optimizing.
  7. Make it fast. You maintained unit tests, right? Then you can refactor the code mercilessly in order to improve the performance.
-- Guillermo Schwarz

Переходим на Би

Apr. 18th, 2025 10:57 am
vak: (бэсм-6)
[personal profile] vak
Переписал некоторые функции рантайм библиотеки с ассемблера на Би. К примеру, было:
    writeb: ,name,
         12 ,base,*
c
c Append one byte to output buffer.
c
 b/output:lc,block, w_count, b_shift, buffer(22)
c
    flush:  ,subp,
            ,aax, =377
            ,aex, =12       . compare to linefeed
            ,uza, flush
            ,aex, =12
c
            ,utc, w_count
            ,xts,
            ,aex, =26       . 22 words
            ,u1a, putchar
            ,ita, 13
            ,its,
            ,call, flush
            ,sti,
            ,ati, 13
c
 putchar:   ,bss,           . append byte to buffer
            ,sti,
         11 ,vtm, b/output
         11 ,wtc, 1         . b_shift
            ,asn, 64-40     . shift left
         11 ,wtc, 0         . w_count
         11 ,aox, 2         . read word from buffer
         11 ,wtc, 0         . w_count
         11 ,atx, 2         . write word to buffer
c
         11 ,xta, 1         . b_shift
            ,aex, =50
            ,uza, next_w
            ,aex, =50
            ,arx, =10       . increase shift
         11 ,atx, 1         . b_shift
         13 ,uj,
c
 next_w:    ,bss,           . advance to next word
         11 ,atx, 1         . clear b_shift
         11 ,xta, 0         . w_count
            ,arx, =1        . increment word count
         11 ,atx, 0         . w_count
         13 ,uj,
            ,end,
Стало:
/*
 * Append one byte to output buffer.
 */
writeb(b) {
    extrn out_cnt, out_shft, out_buff;
    auto p;

    b = b & 0377;
    if (b == '*n') {
        flush();
        return;
    }

    if (out_cnt == 22) {
        flush();
    }

    p = &out_buff[out_cnt];
    *p = *p | (b << (40 - out_shft));

    if (out_shft == 40) {
        /* next word */
        out_shft = 0;
        ++out_cnt;
    } else {
        /* next byte */
        out_shft = out_shft + 8;
    }
}

out_cnt;
out_shft;
out_buff[22];
Так ведь понятнее выходит, правда?