Как получить доступ и использовать библиотеку / пакет Java в Smalltalk
В комментариях к другому вопросу Stackru было упомянуто, что возможно получить доступ к пакетам Java из Smalltalk.
Тем не менее, я не смог найти какую-либо информацию по этому поводу при поиске в сети.
Любое понимание в этом отношении будет высоко оценено.
1 ответ
По сути, есть три способа (пере) использования Java -кода в Smalltalk/X:
Реализуйте / привязки портов к Java с использованием JNI, как предложил Виктор. Хотя это не было перенесено на Smalltalk/X, это было сделано Johan Brichau et al. - поиск "JavaConnect",
затем есть "Java Bridge" для подключения к удаленной JVM и выполнения там кода, разработанного и использованного eXept в своих продуктах. AFAIK, это проприетарный пакет - вы можете приобрести лицензию на него (или нет). Для получения дополнительной информации вы можете попросить eXept.
и наконец, есть stx:libjava, который представляет собой API-интерфейс Smalltalk / X для загрузки классов Java непосредственно в среду выполнения Smalltalk / X.
Каждый из этих вариантов, как обычно, имеет свои плюсы и минусы. Я собираюсь сосредоточиться на последнем - stx:libjava - это то, что @tukan имел в виду.
STX: libjava
Отказ от ответственности: я (пере) разработал и (пере) реализовал большую часть stx:libjava, так что прислушивайтесь к моим взглядам.
stx:libjava - это пакет, который позволяет загружать код Java в среду Smalltalk / X и выполнять его. После загрузки нет разницы между кодом Java и объектами Java, а также кодом Smalltalk и объектами Smalltalk - они оба живут в одной и той же среде выполнения (виртуальная машина, если вы предпочитаете). Фактически, большая часть времени выполнения не знает (и не заботится), является ли данный объект или метод фактически Smalltalk или Java. В среде выполнения есть только два компонента, которые различают - это интерпретатор байт-кода (поскольку байт-код Smalltalk / X сильно отличается от байт-кода Java) и внешний интерфейс JIT-компилятора (по той же причине). Из-за этого нет никакой разницы в производительности между выполнением кода Smalltalk или Java.
Простой пример
Вот пример использования процессора SAXON XSLT, реализованного на Java из Smalltalk/X:
[
config := JAVA net sf saxon Configuration new.
config setAllNodesUntyped: true.
factory := JAVA net sf saxon TransformerFactoryImpl new: config.
stylesheet := factory newTemplates:
(JAVA javax xml transform stream StreamSource new:
(JAVA java io File new: 'cd.xsl')).
input :=
(JAVA javax xml transform stream StreamSource new:
(JAVA java io File new: 'cd.xml')).
output :=
(JAVA javax xml transform stream StreamResult new:
(JAVA java io File new: 'cd.html')).
transformer := stylesheet newTransformer.
transformer transform: input to: output.
] on: JAVA java io IOException do:[:ex|
Transcript showCR:'I/O error: ', ex getMessage.
ex printStackTrace.
] on: JAVA javax xml transform TransformerException do:[:ex|
Transcript showCR:'Transform error: ', ex getMessage.
ex printStackTrace.
].
Дальнейшие ссылки
Следующие ресурсы могут дать вам лучшее представление о чем:
Об интеграции Smalltalk и Java https://www.sciencedirect.com/science/article/pii/S0167642313002839?via%3Dihub
На пути к обновлению кода времени выполнения в Java - исследование с использованием STX: LIBJAVA https://pdfs.semanticscholar.org/d7da/968e4ab36d6deca51bd45b9bbb70e73a2afd.pdf?_ga=2.80940304.648336672.1556837288-1980277485.1556837288
Быстрый тур, показывающий, как разработать простой "Hello World!" приложение, использующее Smalltalk / X и Java http://swing.fit.cvut.cz/projects/stx/doc/online/english/programming/java-helloworld.html
Динамическое обновление кода в STX: LIBJAVA https://www.youtube.com/watch?v=p3J554BNEz8
Весело с Java https://youtu.be/p21z3bAt7b0