LINUX.ORG.RU

Сериализация, десериализация данных и _кода_, с уклоном на кросплатформенность. Какой язык предложите?


0

0

python, Java, .NET - отметаются, моно - может быть, если оно умеет, с C# пока не сталкивался. В общем задача на много времени вперёд(несколько лет как минимум), поэтому языки типо JS, lua и прочего - отметаются. По этой же причине вопрос этот решаться будет неспешно, так как ещё финансирование не созрело. Принимаются только те языки, которые можно назвать зрелыми и универсальными. Не обязательно, чтобы поддержка была такая однозначно простая, как у динамических языков. Можно и с костылями, но всё же тащить с собой скажем gcc - не особо хочется:), хотя и можется. Также жизненно необходима интеграция(человеческая, а не марсианская) с С, так как на нём предполагается ядро и все базовые компоненты и это не обсуждается. Язык же с сериализацией кода будет работать поверх этой созданной платформы. Рассматриваю пока в качестве кандидатов: C(не совсем удобно, но привычно, хотя в некоторых случаях придётся тащить большой багаж), perl5(почти идеальный вариант и по портируемости и по удобству, но производительность - это проблема), perl6(тоже что и предыдущий, но более идеальный, однако производительность паррота пока говно, и не ясно будет ли толковый JIT, ну и ещё ракудо не созрел),CommonLisp(кажется, что идеал, в виде sbcl, но это язык с которым у меня нет опыта, однако это не проблема. Производительность видимо не проблема, раз компилируемый. Вопрос сразу к лисперам, как оно там, при значительном динамическом обновлении рабочего кода, ничего?).

Отдельно замечу, что проект будет по архитектуре чем-то напоминать emacs, другое предназначение совсем, но по архитектуре похоже. То есть 90% кода предполагается делать на том самом языке с сериализацией кода. Зачем это нужно? - для динамического обновления приложения, изменения его логики на лету и тд. Для данного приложения это жизненно необходимо. В отличие от емакса будет более модульно, из микрокомпонент, но это не суть важно, в контексте сабжевой задачи можно считать просто, что 10% кода это некая программа на С, которая загружает некоторый кусок(90%) на другом языке и общается с ним. Что порекомендует всезнающий олл? Вопрос прежде всего к тем, кто имеет не теоретические, а практические знания.

PS: фанатов языков прошу не беспокоить, до известного предела я готов посмотреть на какие-то варианты, но только до известного предела.

★★★
Ответ на: комментарий от mv

> а поподробнее?

Современные компиляторы Common Lisp преобразуют лисповый код в машинный код без потери динамических возможностей языка.

оп! вот не знал, класс.

а в чём фишка, если не трудно? (в смысле за счёт чего это обеспечивается?)

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

Сейчас это модно JIT зовётся. Компиляция по месту. То есть когда вы код меняете или эвалите что-то, то сначала код компилируется, а потом уже исполняется как обычный машкод.

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

а в чём фишка, если не трудно? (в смысле за счёт чего это обеспечивается?)

Даже в динамичном окружении можно выделить статичные части, которые не изменяются. Можно выводить типы и делать их propagation. Можно переопределённую функцию скомпилировать на ходу (что мешает?), положить бинарный код рядом со старым, изменить указатель функции со старой на новую, удалить старый код (пометить занимаемую им память, как свободную). Какая вообще разница: виртуалка или маш.код?

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

Сейчас это модно JIT зовётся. Компиляция по месту.

JIT - это компиляция портабельного байткода в машинный код целевой платформы. В случае с SBCL и подобными речь идёт о честном компиляторе: не входе исходник, на выходе маш.код. Ну и компилятор всегда в рантайме доступен.

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

Сейчас это модно JIT зовётся. Компиляция по месту. То есть когда вы код меняете или эвалите что-то, то сначала код компилируется, а потом уже исполняется как обычный машкод.

а! так вот про что mv говорит :) ну лиспер, такой лиспер - прямо никогда не скажет :)

так скорость jit не всегда (!) можно назвать сравнимой с скоростью исполнения статически вкомпилированного кода, много циклов eval-compile, к примеру, могут насмерть убить производительность

и да, насколько я помню OCaml был таки быстрее SBCL... ога, вот сцылко

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

Даже в динамичном окружении можно выделить статичные части, которые не изменяются. Можно выводить типы и делать их propagation. Можно переопределённую функцию скомпилировать на ходу (что мешает?), положить бинарный код рядом со старым, изменить указатель функции со старой на новую, удалить старый код (пометить занимаемую им память, как свободную). Какая вообще разница: виртуалка или маш.код?

одно слово: скорость

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

а! так вот про что mv говорит :) ну лиспер, такой лиспер - прямо никогда не скажет :)

Я не говорил про JIT. Более того, я говорил, что это не JIT.

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

И как у сбцл с трейсинг жит? Уже сделали? А то тут мужики http://lambda-the-ultimate.org/node/3851 считают, что трейсинг жит зарулил всех, а точнее комбинация статик+трейсинг, как мозилла сейчас делает.

anonymous
()
Ответ на: комментарий от mv

> а! так вот про что mv говорит :) ну лиспер, такой лиспер - прямо никогда не скажет :)

Я не говорил про JIT. Более того, я говорил, что это не JIT.

значит «неправильный лиспер» - это кто-то другой :)

ЗЫ спасибо за содержательные ответы, как будет подходящий проект поковыряюсь с лиспами всякими, а то чего-то и правда запустил :)

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

Ну почему же? Само понятие JIT не значит байткод. Да, часто оно так и есть. Но сам механизм подразумевает компиляцию по месту. Что в случе динамически сгенерированного кода в программе в sbcl и происходит. Просто без лишних сущностей типо байткода, но сам процесс похож.

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

Википедия считает иначе: «In computing, just-in-time compilation (JIT), also known as dynamic translation, is a technique for improving the runtime performance of a computer program.»

Да и по логике, JIT-компиляция происходит в момент использования/вызова, а в SBCL компиляция происходит сразу, при определении функции/метода/whatever.

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

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

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