Действительно ли возможно кодировать драйвер устройства в Java?

Вопрос : Возврат пустого поля tk.Entry в предыдущее состояние при щелчке

Ниже приведен универсальный OOP решение.
Спасибо @Henry Yik, за if event.widget["foreground"] == "grey": часть.

class EntryInstruction(tk.Entry):
    def __init__(self, parent, instruction=None):
        super().__init__(parent)
        self.instruction = instruction

        self.focus_out(None)
        self.bind('<FocusIn>', self.focus_in)
        self.bind('<FocusOut>', self.focus_out)

    def focus_in(self, event):
        if self["foreground"] == "grey":
            self.delete(0, "end")
            self.configure(fg="black")

    def focus_out(self, event):
        if not self.get():
            self.configure(fg="grey")
            self.insert(0, self.instruction)

Использование :

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        entry = EntryInstruction(self, '<enter name>')
        entry.grid(row=0, column=0)

        entry = EntryInstruction(self, '<enter email>')
        entry.grid(row=1, column=0)

if __name__ == "__main__":
    App().mainloop()

Протестировано с Python: 3,5

22
задан Thomas Owens 30 June 2009 в 22:26
поделиться

10 ответов

Существует несколько способов, которыми это может быть сделано.

Во-первых, код, работающий на "уровне ОС", не должен быть написан на том же языке как ОС. Это просто должно смочь быть связанным вместе с кодом ОС. Фактически все языки могут взаимодействовать с C, который является действительно всем, что это необходимо.

Настолько мудрый языком, нет технически никакой проблемы. Функции Java могут вызвать функции C, и функции C могут вызвать функции Java. И если ОС не записана в C (скажем, ради аргумента, что это записано в C++), затем код C++ ОС может назвать в некоторое промежуточное звено C код, который вперед к Вашему Java, и наоборот. C является в значительной степени лингва франка программирования.

После того как программа была скомпилирована (к собственному коду), его исходный язык больше не релевантен. Ассемблер выглядит почти таким же, независимо от которого языка исходный код был записан в перед компиляцией. Пока Вы используете то же соглашение о вызовах в качестве ОС, это не проблема.

Большей проблемой является поддержка во время выполнения. Не много программных сервисов доступно в ОС. Обычно нет никакой виртуальной машины Java, например. (Нет никакой причины, почему технически не могло быть, но обычно, но обычно, безопасно предположить, что это не присутствует).

К сожалению, в его представлении "по умолчанию", как байт-код Java, программа Java требует большого количества инфраструктуры. Этому нужен Java VM для интерпретации и JIT байт-код, и этому нужна библиотека классов и так далее.

Но существует два пути вокруг этого:

  • Java поддержки в ядре. Это было бы необычным шагом, но он мог быть сделан.
  • Или скомпилируйте свой исходный код Java в собственный формат. Программа Java не должна быть скомпилирована в байт-код Java. Вы могли скомпилировать его в x86 ассемблер. То же идет для любых библиотек классов, которые Вы используете. Они также могли быть скомпилированы полностью в ассемблер. Конечно, части Библиотеки классов Java требует определенных функций OS, которые не будут доступны, но затем использования тех классов можно было избежать.

Таким образом да, это может быть сделано. Но это не просто, и неясно, что Вы получили бы.

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

20
ответ дан 29 November 2019 в 03:50
поделиться

Запись Драйверов устройств Соляриса в Java покрывает устройство псевдодиска, записанное в Java.

Другой для Linux. Идет больше подробно на том, почему Вы могли бы хотеть DD в Java также (так как некоторые люди задавались вопросом взглядами других сообщений и комментариев),

19
ответ дан 29 November 2019 в 03:50
поделиться

Это не невозможно, но возможно трудно и возможно имеет не много смысла.

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

Это имеет возможно не слишком много смысла, потому что ядро должно запустить JVM для выполнения драйвера. Также реализации JVM обычно съедают много памяти.

Вы могли также использовать код Java, скомпилированный, чтобы быть выполненными исходно на платформе (не с помощью JVM). Это обычно не настолько эффективно, но это могло подойти для драйвера устройства.

Вопрос, имеет смысл реализовывать драйвер в Java? Или указал в другом отношении: Каково преимущество, на которое Вы надеетесь при использовании Java для реализации драйвера вместо другой альтернативы? Если можно ответить на этот вопрос, необходимо найти способ позволить.

В конце подсказка к JNode, проект, который пытается реализовать полную ОС просто на основе Java.

4
ответ дан 29 November 2019 в 03:50
поделиться

У Вас есть слишком узкое представление драйверов устройств.

Я записал такие драйверы устройств сверху БОЛЬШИНСТВА в автомобильном приложении. Более широкое использование могло бы быть драйверами для USB-устройств, если Java когда-нибудь получает достойную библиотеку USB.

В этих случаях существует универсальный протокол низкого уровня, который обрабатывается в собственном коде, и драйвер Java обрабатывает специфические особенности устройства (форматы данных, конечные автоматы...).

3
ответ дан 29 November 2019 в 03:50
поделиться

Вы, возможно, услышали ссылку на JDDK?

Запись драйвера устройства 100% в Java не возможна без собственного кода обеспечить взаимодействие между (1) определенными для ОС точками входа драйвера и конвенциями и (2) экземпляром JVM. Экземпляр JVM мог быть запущен "незавершенный" (и "незавершенный" может иметь различные значения в зависимости от ОС и на том, является ли драйвер драйвером привилегированного режима или непривилегированного режима), или как отдельный процесс пространства пользователя, с которым может связаться тонкий, собственный уровень адаптации драйвера и на который упомянутый уровень адаптации драйвера может разгрузить фактическую работу пространства пользователя.

3
ответ дан 29 November 2019 в 03:50
поделиться

Возможно скомпилировать код Java в аппаратный собственный компонент (т.е. не байт-код JVM) инструкции. Посмотрите, например, GCJ. С этим в руке Вы намного ближе к способности скомпилировать драйверы устройств, чем Вы были прежде.

Я не знаю, насколько практичный это, все же.

2
ответ дан 29 November 2019 в 03:50
поделиться

Возможный?

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

Вероятный?

Вряд ли. По крайней мере не в мире Windows или MacOS или даже Linux... По крайней мере, не в ближайшее время. Поскольку языки как C# и Java зависят от CLR и JVM. Путем эта работа языков означает, что они не могут эффективно быть загружены в ring0.

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

2
ответ дан 29 November 2019 в 03:50
поделиться

Драйверы устройств должны быть записаны на языке, который может выполниться в ядре, или скомпилированном в него или загруженном как модуль во времени выполнения. Это обычно устраняет писать драйверы устройств в Java, но я предполагаю, что Вы теоретически могли реализовать JVM в драйвере устройства и позволить ему выполнить код Java. Не то, чтобы любой нормальный человек хотел бы сделать это.

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

1
ответ дан 29 November 2019 в 03:50
поделиться

В первую очередь, обратите внимание, что я не эксперт по драйверам устройств (хотя я записал некоторым сам назад в день), а тем более эксперт по Java.

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

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

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

Но, если Ваше устройство передаст использование, скажем, последовательный порт или USB, и если ОС должна будет не обязательно знать об устройстве (то только Ваше приложение получит доступ к устройству*), то можно записать драйвер на любом языке, который обеспечивает необходимые средства получить доступ к устройству.

Так, например, Вы, вероятно, не можете записать драйвер платы SCSI в Java, но можно записать драйвер для собственного устройства управления, лампы лавы USB, аппаратного ключа лицензии, и т.д.

* очевидный вопрос здесь, конечно, проводит тот подсчет как драйвер?

-1
ответ дан 29 November 2019 в 03:50
поделиться

Windows Driver Foundation (WDF) является Microsoft API, который действительно позволяет записывать драйверы устройств в режиме User и Kernel. Это делается сегодня, и теперь он совместим с w2k и более поздними версиями (раньше w2k не был поддерживаемым объектом). Нет причин, по которым нельзя выполнить JNI вызовы для выполнения некоторой работы в JRE . . . (если предположить, что JNI все еще является способом вызова Java из C/C++ . . ... мои знания датируются в этой области). Это мог бы быть интересный способ, чтобы алгоритмы высокого уровня напрямую жевали данные из USB-трубки для чего-нибудь в этом роде ... крутого!

.
1
ответ дан 29 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: