Создание расширения для языка Java - Шаги? - PullRequest
7 голосов
/ 08 июня 2011

Мне было интересно, каковы общие шаги, необходимые для создания какого-либо расширения Java или плагина. Более конкретно, я собираюсь создать что-то вроде структуры C ++ в java, которая позволит мне объявлять методы из определенного класса, чтобы я мог указать порядок, в котором они должны выполняться JVM. На данный момент это всего лишь кусок неба, и меня интересует, как работает AspectJ или другие java-расширения, позволяющие вам объявлять синтаксис, который не является родным для java. Я предполагаю, что для этого потребуется какой-то плагин компилятора.

В качестве примера я представляю что-то вроде следующего

public struct weakProfile {
   streamDataViaGprs();
   sendSimpleMap();
}

public struct strongProfile {
   streamDataVia3G();
   sendComplexMap();
   sendAudio();
}

В приведенном выше примере, если у меня есть веб-служба, а клиент имеет слабый профиль, что означает, что устройство, которое они используют для вызова службы, имеет низкую обработку и плохую пропускную способность, тогда я хотел бы только доставлять streamDataViaGprs() и sendSimpleMap() функциональность. Однако, если клиентское устройство обладает мощными возможностями обработки и отличной пропускной способностью соединения, то я бы хотел streamDataVia3G(), sendComplexMap() и sendAudio(). Это моя конечная цель, однако я не уверен, что будет связано с разработкой структуры, как описано выше, не говоря уже о том, возможно ли это.

Ответы [ 7 ]

16 голосов
/ 08 июня 2011

Нет API для плагинов компилятора. Вы можете сделать как минимум четыре вещи:

1) Напишите свой собственный компилятор для вашего нового языка, который переводит ваш код в код Java, а затем передает его компилятору Java (раньше был популярным, сейчас используется редко). Ваш «компилятор» может просто выполнять простые преобразования текста, пропуская большую часть кода без изменений, так что это разумный способ сделать что-то, если ваши изменения небольшие и локальные.

2) Напишите свой собственный компилятор для вашего нового языка, который испускает файлы Java .class (сейчас очень часто это делается: Groovy, Scala, Clojure - все работает таким образом.)

3) Используйте «библиотеку инженерных данных для байт-кода», чтобы взять скомпилированные файлы .class, проанализировать их, изменить их и либо записать их обратно на диск, либо динамически загрузить и выполнить их (это именно то, что AspectJ и большинство профилировщиков делают .)

4) Получите исходный код фактического Java-компилятора Sun ^ H ^ H ^ HOracle - он доступен в OpenJDK - и измените его. Это хардкор и, вероятно, не лучший план.

Какой путь вы выберете, конечно, зависит от ваших навыков и требований.

3 голосов
/ 20 июля 2011

Если вы используете Eclipse, вы можете взглянуть на Xtext .Он позволяет вам создавать DSL и редактор кода (с подсветкой синтаксиса и дополнением кода) внутри Eclipse.

Существует также JetBrains MPS , система мета-программирования.

2 голосов
/ 20 июля 2011

Взгляните на JastAddJ .

1 голос
/ 20 июля 2011

Вы действительно должны войти в некоторые Java-аннотации .Они позволяют помечать поля, классы и методы, чтобы внешние сущности могли рассуждать о коде.Одна аннотация, запеченная в языке, - @Override, если компилятор видит эту аннотацию, он проверяет, что метод на самом деле переопределяет что-то или он жалуется.Однако вы можете писать свои собственные аннотации, так что вы можете создать аннотацию @struct (хотя я сам не думаю, что это особенно понятно ...).

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

1 голос
/ 08 июня 2011

Предлагаю посмотреть ObjectTeams .Это проект eclipse, который позволяет улучшить закрытый исходный код, такой как Java-компилятор Eclipse, редактор java-файлов и т. Д. Они также создают некоторые примерные расширения Java.Другой вариант - использовать Jetbrains MPS , хотя это не совсем Java.MPS - это проекционный подход к расширяемым языкам.Они поставляются с представлением Java и с кучей хороших расширений.Их «базовый язык» можно рассматривать как что-то вроде «Java ++».

Однако я не знаком со структурами C ++, но разве простой Java-класс с открытыми полями почти не отличается от структуры?

0 голосов
/ 20 июля 2011

Прежде всего позвольте мне сказать, что я верю, что могут быть более простые способы решения упомянутой вами проблемы, кроме плагина компилятора. Вдобавок ко всему, я хотел бы изучить использование типов Java Enum , которые являются полноценными объектами и могут содержать поведение. Тем не менее, Java Инструмент обработки аннотаций может помочь вам сгенерировать код времени компиляции. Это средство, с помощью которого Project Lombok выполняет магию компиляции, поэтому изучение его кода может быть полезным.

0 голосов
/ 30 июня 2011

Спасибо за все предложения, ребята. В итоге я использовал Xtext, и это позволило мне создать свой собственный DSL (Domain-Specific Language). Очень хороший инструмент!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...