LINUX.ORG.RU

Создание sharde object с помощью gccgo

 ,


0

1

В общем хотел бы накидать на go небольшой игровой движок и хотелось бы его вынести отдельную либу с помощью gccgo.

Какие проблемы сулит создание и использование таких библиотек?
Есть ли способ сгенерировать на ее основе «header» для go по ее исходникам?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 2)

Какие проблемы сулит создание и использование таких библиотек?

Хороший вопрос. В лучшем случае проблем не будет, но использовать его можно будет только из gccgo. Что может быть в худшем случае, я даже не знаю.

Есть ли способ сгенерировать на ее основе «header» для go по ее исходникам?

gccgo вписывает информацию об экспорте прямо в объектный файл, никаких заголовочных файлов, как в C, не требуется. Но если надо, например, компилировать на машине, где самих библиотек нет, можно сделать файл .gox.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от proud_anon

Да уж, а когда у низ намечается поддержка динамически загружаемых библиотек? С переездом на github я потерял их роадмап (и то, он был кривой какой-то).

А как вообще обстоят дела с gccgo? Я слышал, что он по оптимизациям обгоняет родной компилятор.

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Да уж, а когда у низ намечается поддержка динамически загружаемых библиотек?

У оригинального gc? Авторы принципиально считают, что динамические библиотеки не нужны.

А как вообще обстоят дела с gccgo? Я слышал, что он по оптимизациям обгоняет родной компилятор.

Да, это правда, он же фронтенд к gcc. Хорошо обстоят дела, но поддерживается только Go 1.2, поддержка Go 1.4 запланирована в GCC 5.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

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

Это глупо пытаться сломать устоявшиеся положения...

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

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

https://groups.google.com/forum/#!forum/golang-nuts

Только ты будешь не первый.

Это глупо пытаться сломать устоявшиеся положения

Это в ваших Линуксах, может быть, устоявшееся положение. Вам бы ещё их переименовать из .so в .dll, чтобы более соответствовать популярным трендам. В православной Plan 9 никаких разделяемых библиотек нет.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от anonymous

4.2 же. Даже proposal был от Ian Lance Taylor

Ну и что же? Главный разработчик gccgo предложил разработчикам gc разупориться и даже план разупарывания написал. Но только чем кончилось, я не знаю.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Держи те меня в курсе пожалуйста. Именно этот момент меня отпугивает от Go сейчас.

Кстати, есть какой-нибудь транслятор C++ заголовочников либ в Go?

deterok ★★★★★
() автор топика
Ответ на: комментарий от robot12

Зачем? В чем суть если я хочу предоставить именно скомпилированный объект.

Т.е. исходники одно, а готовая для использования либа - другое.

deterok ★★★★★
() автор топика
Ответ на: комментарий от proud_anon

В общем пока эта штука не научиться в либы мне е не особо хочется...

deterok ★★★★★
() автор топика
Ответ на: комментарий от robot12

Ну я так и делаю, зачем говорить очевидное. Однако мне нравиться revel и его я юзаю. Т.е. я не юзаю его там где мне нужны ибы, а хотелось бы...

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Я непонял. Оно там решается тем, что все проги сами себе либы?

Эээ... Нет, если нужно просто как-то выделить общий код, он выделяется в библиотеку, которая потом связывается с программами статически. Если нужно выделить общий «сервис», то пишется 9P-сервер.

korvin_ ★★★★★
()
Ответ на: комментарий от deterok

Зачем? В чем суть если я хочу предоставить именно скомпилированный объект.

Т.е. исходники одно, а готовая для использования либа - другое.

Логика здесь такова, что твоя библиотека по определению не может быть готовым для использования скомпилированным объектом. Готовый объект — это программа. А у тебя только компонент программы.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Ну я бы хотел предоставить в результате не только исходники, но и скомпилированную либу. Которую смогут юзать не только go'ленгисты, но и плюсовики и все те, кто может дергать сишные либы.

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Которую смогут юзать не только go'ленгисты, но и плюсовики и все те, кто может дергать сишные либы.

Вот это вообще отдельная тема, которая, насколько я знаю, вообще не работает.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Ну как бы ты понимаешь, что это жопа?

Получается, что как язык оно неплохо, даже очень, но реализация сильно хромает в плане совместимости с другими языками да и вообще в целом. Странно, что Роб Пайк так мало уделяет внимание этом вопросу...

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Странно, что Роб Пайк так мало уделяет внимание этом вопросу...

Насколько я знаю, Роб Пайк считает динамические библиотеки злом, и что взаимодействие между разными инфраструктурами лучше делать более универсальными, платформонезависимыми протоколами.

korvin_ ★★★★★
()
Ответ на: комментарий от deterok

Ну если бы он придумал адекватную альтернативу

Дык этих альтернатив понапридумано море, зачем еще одну?

korvin_ ★★★★★
()
Ответ на: комментарий от proud_anon

Господи, чё-то лор совсем скатывается...
http://stackoverflow.com/questions/6125683/call-go-functions-from-c

package foo

// extern int goCallbackHandler(int, int);
//
// static int doAdd(int a, int b) {
//     return goCallbackHandler(a, b);
// }
import "C"

//export goCallbackHandler
func goCallbackHandler(a, b C.int) C.int {
    return a + b
}

// This is the public function, callable from outside this package.
// It forwards the parameters to C.doAdd(), which in turn forwards
// them back to goCallbackHandler(). This one performs the addition
// and yields the result.
func MyAdd(a, b int) int {
   return int( C.doAdd( C.int(a), C.int(b)) )
}

menangen ★★★★★
()
Ответ на: комментарий от deterok

Можно подробнее про альтернативы?

Банально 9P, например. Любой протокол межпроцессного взаимодействия, TCP/IP и т.д. и т.п.

korvin_ ★★★★★
()
Ответ на: комментарий от deterok

Разве оно не даст просадки по скорости?

Не такие большие. Зато можно, например, расшарить код по сети, запустить его на другой машине с другой архитектурой.

Как быть например в играх?

А сколько библиотеки DirectX весят? Я че-т не смог найти в винде, где они лежат, нашел только какие-то DirectX for Managed Code, там всего 2МБ, так что наверное не то. Да и игроделы когда-то и DX не принимали, в т.ч. и из-за того, что он снижал производительность, но в итоге «фичи» и избавление от необходимости собственноручно поддерживать драйвера для всё быстрее растущего и усложняющегося зоопарка железа превозобладали.

korvin_ ★★★★★
()
Ответ на: комментарий от menangen

Господи, чё-то лор совсем скатывается...

Автору надо, чтобы библиотеку на Go можно было вызывать из программы на C. То есть программа не будет ничего знать о рантайме Go.

proud_anon ★★★★★
()
Ответ на: комментарий от deterok

Ну как бы ты понимаешь, что это жопа?

А сколько ты знаешь современных языков, которые можно вот так просто вызывать из Си? Кроме Си, C++ (и то с правильными заголовками) и ассемблера (и то может быть несогласование конвенций вызовов)? Ну, может быть, ещё Rust, но я его не щупал. Особенно со сборкой мусора и собственным управлением потоками.

Можешь ли ты, например, написать библиотеку на Java, которую можно дёргать из Си? Или на Python? Или на Haskell?

Некоторые языки — в том числе Go — позволяют дёргать код на Си и организовывать коллбэки, при условии, что main() написан на этом языке, а вызываемая функция «ведёт себя хорошо» и не лезет, например, менять память в непредсказуемых (с точки зрения рантайма и компилятора) местах или манипулировать потоками. Насколько я знаю, некоторые реализации Haskell позволяют писать main() на Си при условии, что оно будет компилироваться специальным компилятором.

Но возможность писать библиотеки, которые можно безо всяких костылей и оговорок дёргать из любого языка, — это отнюдь не тривиальная вещь. Она накладывает сильные ограничения на свободу в дизайне языка. Поэтому её отсутствие — это вовсе не такая «жопа», как кажется на первый взгляд. Во многих областях без неё можно прекрасно обойтись. Но не во всех. Это одна из причин популярности Си и Си++.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 3)
Ответ на: комментарий от proud_anon

Ты кстати не знаешь более вменяемого для Go ide, чем liteide? Atom у меня так и не собрался последний, а плагин go-plus к нему в прошлом году не умел gocode.

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

У нас в отделе один использует Sublime Text, я использую emacs, остальные - vim. Везде работает gocode и другие плюшки.

feofan ★★★★★
()
Ответ на: комментарий от deterok

Дело хозяйское. А вообще, советую осилить вим. Распечатай себе шпаргалку ( она гуглится). За неделю освоишься. Когда допилят neovim, скорее всего буду на него переползать.

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от feofan

Мне emacs ближе. Т.е. я на elispe пишу если надо и все такое. Слушай, а может подскажешь адекватное решение для go. Хочу с xlib работать, есть что на примете? Или в ручную дергать сишные функции?

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Сомневаюсь, что тут что-то готовое есть. Поищи, но скорее всего придется тебе писать обвязку самому. У меня несколько иная предметная область.

feofan ★★★★★
()
Ответ на: комментарий от proud_anon

Ну я помню он там кривой был... Что-то импорты не подтягивал

deterok ★★★★★
() автор топика
Ответ на: комментарий от feofan

Ладно, уговорили. Уж очень соблазнителен тот факт, что по умолчанию есть кроссплатформенность (_linux, _windows и т.д.) + потоки делаются легко и понятно(без лишних проблем и мороки), ну и тесты отлично все это дополняют. Придется правда обвязки писать самому...

Кстати, а зачем второй раз вызывается функция?

    // runtime.GOMAXPROCS() returns previous max_procs
    max_procs := runtime.GOMAXPROCS(MAXPROCS) 
    // second call to get real state
    max_procs = runtime.GOMAXPROCS(MAXPROCS)
    fmt.Println("MaxProcs = ", max_procs)

И да, ребят, у вас есть контакты feofan proud_anon?

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Этот код откуда?

http://golang.org/pkg/runtime/#GOMAXPROCS - читай описание и комментарии, всё прозрачно.

Про контакты: самый надежный способ связи со мной - кастануть тут. Но если хочешь, оставь почту или джаббер, я тебе напишу.

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от deterok

И да, ребят, у вас есть контакты proud_anon

Не, у меня нет контактов :)

proud_anon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.