BearLibTerminal - псевдоконсольное окно для рогалика

Форум библиотеки BeaRLib

Модератор: Apromix

Аватара пользователя
thefish
Сообщения: 29
Зарегистрирован: 18 июн 2012, 22:37

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение thefish » 13 ноя 2019, 20:44

Cfyz писал(а):
13 ноя 2019, 18:39
Думаю я это даже в официальную версию включу, только разве что вместо "." наверное стоит использовать "./lib
Только большая просьба - написать о той папке, куда надо положить blt, чтобы Go её увидел - большими буквами в документации. Будет это lib или ./ - неважно. Я почти неделю доискивался до причин потери видимости либы гошным бинарником =)
Cfyz писал(а):
13 ноя 2019, 18:39
Вообще жаль, что с бинарниками в Go так плохо. Ситуация патовая: в языке нет ни бинарных пакетов (фактически, пакетов вообще нет)
Уже есть. Пакет[1] с фиксированной версией[2] называется теперь модуль, работа с ними командой Появился этот способ с версии 1.12. Вообще существовали и другие (glide, go dep), но с выходом официального инструмента для модулей от разработчиков языка поддержка всего остального прекращена.

Для модулей можно сделать вендоринг - go mod vendor. Более того, заявленные зависимости сразу же выкачиваются, собираются и ждут своего часа.

Вместо Pinvoke тут все-таки CGO с его сообенностями. Но если почитать доки, то не так всё страшно. Скажем приведение в чувство кросс-компиляции (при которой CGO принудительно отключается) под Windows у меня заняло пару часов от силы, и потом все тикает как часики. Если интересно - могу написать про это.
---
[1] Ну да, это по факту снепшот git-репозитория
[2] А это указатель на коммит (ранее) или тег (сейчас)
Но работает прекрасно! =)

Аватара пользователя
Cfyz
Сообщения: 773
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Cfyz » 15 ноя 2019, 16:49

thefish писал(а):Уже есть. Пакет[1] с фиксированной версией[2] называется теперь модуль, работа с ними командой
Ну это не совсем то, это даже не пакет по факту. Ключевой в нашем случае момент, что нет возможности управлять артефактами. Вот например в Python: pip install bearlibterminal -- и о нюансах где там какая dll голова не болит. В Go же подразумевается статическая компиляция, то есть сборка должна давать ровно один артефакт в заранее зафиксированном месте. Собрать бинарник, но "проинсталлировать" и его, и ряд зависимостей -- похоже возможности нет.

Кстати, а с не-бинарными артефактами как в Go дела обстоят? Задача компоновки вместе бинарника, конфигов, документации и т. д. выходит за пределы инструментария языка?
thefish писал(а):Вместо Pinvoke тут все-таки CGO с его сообенностями.
И тут тоже не то =), потому что CGO это не invoke, это честная линковка. И добро пожаловать в мир разных ОС, нюансов и версий компиляторов и их флагов. Хотя в огромном количестве случаев все, что нужно -- это в рантайме найти в библиотеке символ с указанным именем и вызвать его с указанными скалярными аргументами. У них это даже немного есть, но только для Windows и какой-то огрызок. Что мешало сделать это нормально для всех ОС (благо везде плюс-минус одно и то же), как в куче других языков -- мне неведомо.

Кстати поэтому я не понял про кросс-компиляцию и отключение CGO -- линковаться-то все равно надо, а сделать это может только платформо-зависимый инструмент, то есть CGO.
Пытается раскуклиться

Аватара пользователя
thefish
Сообщения: 29
Зарегистрирован: 18 июн 2012, 22:37

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение thefish » 15 ноя 2019, 18:54

Cfyz писал(а):
15 ноя 2019, 16:49
Ну это не совсем то, это даже не пакет по факту. Ключевой в нашем случае момент, что нет возможности управлять артефактами.
go mod как раз и собирает артефакты и кладет их в $GOPATH/pkg/mod/...
Правда в терминах Go артефакт - всего лишь исходники с зависимостями, т.к. длительность компиляции просто мизерная, и можно себе позволить собирать всё с нуля.
Кстати, а с не-бинарными артефактами как в Go дела обстоят? Задача компоновки вместе бинарника, конфигов, документации и т. д. выходит за пределы инструментария языка?
Не очень понял вопроса. Godoc можно писать руками, можно генерировать по исходникам/комментариям/аннотациям (go doc). Почти всё что публикуется на github / bitbucket / google code можно найти здесь.
Бинарники обычно ставятся в $GOPATH/bin прямо командой go get.
С конфигами какой-то общей практики нет, обычно каждый пакет конфигурируется отдельно.
CGO это не invoke, это честная линковка ... Кстати поэтому я не понял про кросс-компиляцию и отключение CGO -- линковаться-то все равно надо, а сделать это может только платформо-зависимый инструмент, то есть CGO.
CGO считается костылём специально для сишных паралитиков вроде меня, и жив еще только потому что есть множество востребованных сишных библиотек. Если сишные зависимости отсутствуют - CGO не нужен. А чистый Go кросс-компилируется легко и непринуждённо, установкой одной переменной окружения для целевой ОС и еще одной - для архитектуры. GOOS=windows GOARCH=amd64 go build - и всё готово.

PS На мое понимание устройства этой эмм.. экосистемы сильно повлияло знание того факта, что язык изначально писался Гуглом и для Гугла. Авторами Plan9 и Oberon, что наложило свой особенный отпечаток.
Тем не менее, даже в сегодняшнем состоянии Go мне очень нравится.

Аватара пользователя
Cfyz
Сообщения: 773
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Cfyz » 15 ноя 2019, 20:21

thefish писал(а):Правда в терминах Go артефакт - всего лишь исходники с зависимостями
Тут конечно нет какого-то точного определения, но "артефакт" -- это кем-то что-то сделанное или результат чего-то (например, человеческой деятельности). В контексте ПО мне чаще приходилось слышать этот термин в смысле "результат сборки" или похожем, потому что исходники у нас уже как бы есть, соответственно результат работы с ними -- это артефакт.

Ну так вот, максимум что позволяет Go касаемо результатов сборки -- это положить единственный бинарник в единственную директорию. А, как я уже писал, хотелось бы как у людей: собрать бинарник, его зависимости и проинсталлировать так, чтобы этим потом можно было пользоваться.
thefish писал(а):Не очень понял вопроса.
Я про конечный результат сборки как целого приложения. Приложение -- это ведь не только статический бинарник, это часто какие-то дефолтные конфиги, всякие файлы локализации, документация и пр. В экосистемах многих языков (даже С++) можно в рамках штатных инструментов разом собрать практически полный комплект, пригодный для дальнейшей дистрибуции. В Go же постоянно поминается аскетичная идея "просто собрать exe из исходников", а остального как будто нет. Хотя очевидно есть, и мне любопытно как этот момент решается на практике -- возможно через него можно выкрутиться и со сторонними либами.
thefish писал(а):Если сишные зависимости отсутствуют - CGO не нужен.
Но вот тут он, увы, нужен. Если уж на чем терминал мог быть переписан, так максимум это Rust, никак не Go =) (на самом деле с высокой долей вероятности он будет переписан на С). И я бы не сказал, что интероп с С -- это только для особо упертых. Кода с интерфейсом на С много и будет только больше, и невозможность с ним работать лишает язык многого. Переписать на новом языке вообще все -- это утопия, и все они рано или поздно лезут в С за тем, чего нельзя сделать или нерационально переизобретать.
Пытается раскуклиться

Mosha
Сообщения: 1
Зарегистрирован: 08 дек 2019, 10:32

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Mosha » 12 дек 2019, 16:51

Есть ли в планах портирование этой библиотеки под android?

Аватара пользователя
Cfyz
Сообщения: 773
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Cfyz » 13 дек 2019, 19:20

Вот именно "портировать" (допилить имеющееся) -- это вряд ли. Очень много сложностей: код работы с оконной системой сильно заточен на обычный десктоп, вывод производится средствами legacy API OpenGL, ну и на тему тач-интерфейсов вообще ничего не было заложено.

Но не все потеряно. Хотя с момента последних активных доработок прошло много времени, идею я не бросил, просто она (точнее, мои собственные хотелки) стала ширше и глубже настолько, что в какой-то момент начинать рефакторить душевных сил не стало. Технический долг плюс смена требований -- так бывает. Думаю где-то в самом начале нового года начну делать 2.0, которая будет больше, еще гибче и работать на гораздо более широком количестве платформ.
Пытается раскуклиться


Аватара пользователя
Adevald
Сообщения: 2
Зарегистрирован: 25 окт 2019, 06:10

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Adevald » 23 фев 2020, 08:42

Здравствуйте. Я тут чисто за ответом на вопрос. Допустим я захочу использовать эту библиотеку в Rust языке, как и насколько сложно будет адаптировать код под него? Нужно будет написать хедеры под раст?

Аватара пользователя
Apromix
Мастер
Сообщения: 1203
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Apromix » 23 фев 2020, 15:10

Adevald писал(а):
23 фев 2020, 08:42
Нужно будет написать хедеры под раст?
Поиск показал, что уже есть - https://github.com/nabijaczleweli

Аватара пользователя
Cfyz
Сообщения: 773
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Cfyz » 05 мар 2020, 13:44

Apromix писал(а):
Adevald писал(а):Нужно будет написать хедеры под раст?
Поиск показал, что уже есть - https://github.com/nabijaczleweli
Кстати, на crates.io даже есть bear-lib-terminal-sys (тонкая обертка над либой) и bear-lib-terminal (с некоторыми дополнениями). Что делать, ежели дойдет до официального пакета? =)

На чуть более отвлеченную тему. Не все один-к-одному на Rust перекладывается. С обычными функциями просто, но вот предположим сущность типа виджета: непонятно ни как обыграть в терминах Rust получение "родительского" и "дочерних" виджетов, ни что делать с вроде как фундаментальными в Rust гарантиями владения. Виджет же живет в библиотеке и параллельный доступ там язык проверить не сможет. Допускаю, что это вообще невозможно, порты UI-фреймворков заметают эти моменты под ковер, а предлагаемое корректное решение через ECS выглядит не менее радикально отличным от привычного, чем сам Rust.

Пусть и меньшие, но все-таки непонятки есть и с другими языками >_<. Например как представить виджет в С++: value-type, shared_ptr, тип с семантикой ссылки? В Go вроде и объект с методами, а по факту больше на С похоже. Вероятно придется взять что-то общее (которое с семантикой ссылки) и приоритет отдать однообразию поведения нежели идиоматичности. Если уж все равно нюансы будут, пусть хоть плюс-минус одни и те же =).
Пытается раскуклиться

Аватара пользователя
Adevald
Сообщения: 2
Зарегистрирован: 25 окт 2019, 06:10

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Adevald » 08 мар 2020, 15:45

Cfyz писал(а):
05 мар 2020, 13:44
Что делать, ежели дойдет до официального пакета? =)
Ух блин, у меня ещё и выбор есть! И что же из этого более работоспособное?
Cfyz писал(а):
05 мар 2020, 13:44
На чуть более отвлеченную тему. Не все один-к-одному на Rust перекладывается. С обычными функциями просто, но вот предположим сущность типа виджета: непонятно ни как обыграть в терминах Rust получение "родительского" и "дочерних" виджетов, ни что делать с вроде как фундаментальными в Rust гарантиями владения. Виджет же живет в библиотеке и параллельный доступ там язык проверить не сможет. Допускаю, что это вообще невозможно, порты UI-фреймворков заметают эти моменты под ковер, а предлагаемое корректное решение через ECS выглядит не менее радикально отличным от привычного, чем сам Rust.
А вот это конечно дело не хорошее. Я тоже думал пришлось бы писать толстые заголовки для проброса и разрешения всяких конфликтов с типами данных и прочим, но чтобы прямо такое... Вообще я сам хотел использовать ECS, что означало бы что пришлось за основу бы брать код крейтов, а потом уже перепиливать его под эту либу. Тяжко конечно.

Аватара пользователя
Apromix
Мастер
Сообщения: 1203
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Apromix » 31 мар 2020, 07:30

Захотелось мне попитонить с помощью берлибтерминал и вот на какую замечательную библиотечку я наткнулся https://github.com/joekane/bltGui. Питонщики - принимайте на заметку :D

Изображение

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость