LINUX.ORG.RU

Что нельзя сделать в языке java без метапрограммирования?

 ,


1

2

Приведите пожалуйста пример устранения шаблонного кода, который можно устранить метапрограммированием, но средствами языка Java невозможно или очень проблематично? А то мне тут чел втирает что средств только языка Java хватит чтобы избавится от любого повторяющего кода.

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

UPD3. На lombok я сделал @Transactional – единственное, что мне было полезного в спринге. Теперь спринг не нужен. // Спорить на эту тему не собираюсь. :)

Мой @Transactional естественно убог, умеет только в REQUIRED, но у него есть один специфический для проекта параметр, которого в спринговом и JEE-шном @Transactional нет. Код-обёртку генерирует внутри аннотированного метода (или всех методов аннотированного класса), поэтому (1) не нужен прокси-класс; (2) можно вешать на private-метод; (3) stack trace выглядит по-человечески, без миллиона прокси-вызовов на каждый вызов аннотированного метода; (4) работать будет очевидно быстрее, в т.ч. потому что никакой рефлексии: вся рефлексия осталась в buildtime.

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

Это было про Spring как про расширение языка Java, а не как какие-то фреймворки для создания чего-то там

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

Как минимум Clojure сделана именно под жаву и имеет структуры данных специально для взаимодействия с жавой, для использования ее стандартной библиотеки вместо создания собственной. Такой код уже не переносим за пределы жавы

Таки существует https://clojure.org/about/clojureclr

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

Вах вах, спасибо за такую ценную инфу, не думал что в яве настолько всё плохо с метапрограммированием. А в котлине ненамного лучше?

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

Клиентский и серверный(field/table/database) чарсеты посмотреть надо, по идее вам нужен utf8

cobold ★★★★★
()

А то мне тут чел втирает что средств только языка Java хватит чтобы избавится от любого повторяющего кода.

Проперти уже в Жаве появились?

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

С помощью рефлекшена можно. Правда это всё очень страшно выглядит да и по производительности вопросы есть.

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

Про котлин вообще ничего не знаю. Про МП в нём гуглил-гуглил, не нагуглил. И решил, что котлин не нужен.

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

Clojure сделана именно под жаву и имеет структуры данных специально для взаимодействия с жавой, для использования ее стандартной библиотеки вместо создания собственной.

Clojure в javascript компилируется и без явы спокойно работает. Ты хоть википедию почитай, а то позоришься как девочка в яслях.

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

Clojure в javascript компилируется и без явы спокойно работает. Ты хоть википедию почитай, а то позоришься как девочка в яслях.

Девочка в яслях тут одна, и чтение википедии ей не помогло, потому что в википедии не написали, что практически любое приложение сложнее hello world уже не портируется на ClojureScript:
https://clojurescript.org/about/differences
Потому есть смысл говорить, что это два разных диалекта.

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

Посмотри сколько тут хелловордов на cljs.
https://www.clojure-toolbox.com/

1200 работает на Clojure, 263 работает на ClojureScript, из них 170 работают на обоих платформах. Если посмотреть на какой-нибудь https://github.com/JulianBirch/cljs-ajax , то можно увидеть, что там примерно половина кода либы - это платформозависимый код, вторая половина - это надстройки над платформозависимым кодом. По сути, большинство проектов либ с поддержкой ClojureScript - это портирование либы Clojure на ClojureScript с переписыванием кусков на новые интерфейсы.

byko3y ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

метапрограммирование

Чур меня, чур

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

byko3y ★★★★
()

Ну, самый тупой пример

singleton class MyClass
{
    ....
}

….

MyClass foo = new MyClass();
MyClass bar = new MyClass();

System.out.println(foo == bar); // ==> true

без МП ессно такое не сделать

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

Динамическая интерпретация метамоделей. Специальная терминология для этого типа еще не разработана, точнее, она не устоялась

метаинтерпретатор/метакомпилятор/суперкомпилятор? если метакомпилятор это компилятор компиляторов(flex/bison/yacc/…), то метаинтерпретатор это интерпретатор метаязыка, а суперкомпилятор – трансляция графа вычислений программы DAG в эквивалентный, но свёрнутый за счёт прогонки в результате метапрограммы (заменили вычисления на мемоизацию вычислений, например, метапрограммой)

метаинтерпретатор может транспилировать в компилируемый язык, вычисляя что-то частично (небольшую часть метамодели). метакомпилятор это параметризуемый транслятор (например, грамматикой разрабатываемого языка или те же семантические/синтаксические предикаты). суперкомпилятор в стиле haskell это частичный вычислитель, каррирование с наворотами. суперкомпилятор в стиле рефал это автоматический рефакторинг, сворачивание графа вычислений программы, и замену машины, вычисляющей программу и её модели на эквивалентную, но более эффективную (мемоизованную), с меньшим количеством состояний и трасс выполнения (сворачивание гиперграфа в граф сшивкой эквивалентных в каком-то смысле и критерии оптимизации узлов, что можно проверить мемоизацией прогонки)

плюс 3 проекции футамуры-турчина, если мы уж рефал вспомнили. плюс метасистемный переход, если «феномен науки».

только непрерывная кибернетическая коэволюция бутстрап-систем – disruptive & supportive technologies в смысле «дилеммы инноватора» спасёт отцов русской кибернетики. только хардкор! (и ничего захаржкоженного)

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

Интроспекция

иногда её ещё делят на интроспекцию и интерцессию (рид онли).

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

так себе поделка. Legioner может круче запилить схему или лисп на CTFE D template mixin/string mixin.

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

3.Развитием идеи кодогенерации целого исходника с нуля является замена кусков исходника: ищем метки ///something-begin/// и ///something-end/// и генерируем код между ними.

чего только не делают извращенцы, лишь бы про Literate Programming не читать. а казалось же – всего лишь нужно освоить M-x org-babel-tangle

опять же, вот вам пример метаинтерпретатора. язык на котором в org-mode пишутся сниппеты между #BEGIN_SRC...#END_SRC это и есть метаязык, со своей грамматикой и метапеременными, параметрами вызова. ну то есть, эта метаинформация сниппета: #NAME myname :tangle src.c :var foo=bar baz=xyzzy и есть метаданные метаязыка, блока кода. далее у блока данных (ящика :DRAWER, таблицы или текста) тоже есть имя и другие метаданные.

чего в классическом не хватает – настраиваемых, например наследуемых метапеременных. и вызова в подстановке не только беспонтового ... <<myname>>() но и с параметрами ...<<myname>>(foo=123,baz="ASDASD") или наследования между блоками кода по метаклассам каким-то. например.

опять же, интересно не когда текст в текст, а когда модель в модель, например AST в AST.

например, то же skribilo на Guile. как замену org-mode babel. чтобы не только чем-то типа DOM можно было парсить этот markdown с блоками кода и блоками данных, (иерархический DOM там нафиг не нужен, это костыли) – но и AST макросами, например свой reader macro или свой reader или свой writer для трансляции в промежуточное представление лиспового AST, который skribilo на Guile уже и так делает.

теперь не хватает разве что метаклассов, метаобъектного протокола и чего-то вроде MVC или паттерна реактор между такими AST макросами/шаблонами/метамоделями/компонентами какого-то условного метапрога, лол.

//киберпанковская капча с дикими пальмами

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

чота ещё кажется не упомянул сюда аннотации, сборщики байткода и свой кастомный ClassLoader и dependency inversion – типичные java костыли для реалиции того же Aspect-Oriented Programming стиля, а так почти полный набор будет.

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

это если не брать изначально расширяемые языки. например, тот же Algol 60 c двухэтажными грамматиками, которыми любую КЗ-грамматику можно было описать. или вот, extended C xoc от Russ Cox.

extensible compiler здесь означает по сути расширяемый метакомпилятор. дефолтная грамматика которого похожа на обычный язык типа си, но это по сути расширяемый метаязык. в общем, читай его диссер.

//таперича капча предлагает костыли и велосипеды

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

// UPD1: Опять же, какого чёрта делать в рантайме то, что надо делать в билдтайме; из-за всей этой дичи JEE- и спринг-приложения и стартуют так долго

а не, упомянул. какого чорта – действительно интересно. зачем там пилят свой class loader, зачем это байткододрочерство с asm.java и т.п.

вот действительно, если посмотреть на AOP Фреймворк для JVM. почему там эти инъекции не могут быть сделаны на голой ява и надо скатываться в байткододрочерство. почему Dependency Inversion framework каждый второй страдает тем же самым.

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

хорошо хоть аннотации есть, но дальше фантазия требует большего – аннотаций аннотаций, метаклассов, метаобъектный протокол поверх них и прочего полиморфизма высшего порядка :)))

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

Всеми этими безобразиями с генерацией сорцов / изменениями их по месту можно сделать очень много, но не всё: нельзя нормально разворачивать DSL

до кучи, не хватает сравнения с теми же Xtend/Xtext, Spoofax/StrategoXT, JetBrain MPS.

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

//киберпанковская капча с дикими пальмами

метапрог это носорог, выползающий из телевизора – он плохо видит с разбегу, но при таком весе это не его проблемы :)

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