Основная причина, по которой Java не обнаруживает все недостижимые утверждения, заключается в том, что вообще невозможно ответить, доступен ли код или нет. Это следует из того, что проблема остановки неразрешима над машинами Тьюринга.
Итак, ясно, что все недостижимые утверждения не могут быть обнаружены, но почему бы не попробовать оценить условия? Представьте себе, что используемое условие не просто false
, а нечто вроде ~x == x
. Например, все эти утверждения будут печатать true
для каждого источника int x
( ).
System.out.println((x + x & 1) == 0);
System.out.println((x + -x & 1) == 0);
System.out.println((-x & 1) == (x & 1));
System.out.println(((-x ^ x) & 1) == 0);
System.out.println((x * 0x80 & 0x56) == 0);
System.out.println((x << 1 ^ 0x1765) != 0);
Операции могут быть довольно сложными; для их решения требуется время. Это значительно увеличит время сборки, и в конце концов, оно не обнаружит все недостижимые утверждения. Компилятор был разработан, чтобы приложить некоторые усилия, но не тратить слишком много времени на это.
Остается только вопрос: где прекратить разрешать условия? Причины этого не имеют математического обоснования и основаны на сценарии использования. Обоснование для вашего конкретного случая дано JLS-14.21
Я использовал JEuclid для рендеринга MathML в моем проекте Symja (система символьной математики Java - пункт 4 вашего списка). JEuclid может быть слишком медленным (особенно при запуске) для отображения MathML на мобильном телефоне.
Другие альтернативы для рендеринга математических выражений с TeX:
и для реорганизации уравнений или в качестве общих библиотек математики Java:
Проекты калькуляторов для Android:
JScience ( jscience.org ), похоже, имеет некоторую экспериментальную поддержку для внедрения MathML.
Я хотел бы сказать, что я Он очень впечатлен возможностями, которые автор JScience выбрал и доказал, что способен поддерживать его мощную библиотеку Java.
Это довольно удивительный образец мастерства. Если вы занимаетесь значительным количеством сложной математики в своих программах на Java или просто хотите создать утилиту, с которой можно разбираться, тогда вам стоит взглянуть на эту библиотеку. Это может даже дать вам некоторые идеи о вещах, о которых вы никогда не думали делать раньше, потому что они были «слишком сложными».
Существует проект с открытым исходным кодом под названием MathEclipse , который также может вас заинтересовать.
На странице реализаций W3C MathML ( http://www.w3.org/Math/Software/mathml_software_cat_editors.html ) есть несколько упоминаний об инструментах на основе Java. .. это может быть хорошее место для начала поиска.
Удачи.
Я использовал это для вашего пункта 3 выше (рендеринг): http://jeuclid.sourceforge.net/
Он отлично справляется с использованием MathML и создает JPG, PNG и т. д. Он также будет отображать уравнения в графическом интерфейсе пользователя (и я предполагаю, что вы можете посмотреть код графического интерфейса и включить его в свой собственный проект)
Конечно, это зависит от наличия браузера, который будет отображать MathML.
В качестве альтернативы можно попробовать jsMath , библиотеку JavaScript, которая использует TeX для отображения уравнений .