Ява или Скала для FSM Parser? - PullRequest
2 голосов
/ 04 марта 2010

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

Я реализовал FSM в Java, используя два массива int:

states[][]
actions[][] 

По мере отладки я понял, что может быть проще использовать Java Enums, поскольку переменная этих типов должна отображаться в качестве значения в представлении отладки в IntelliJ. Однако, когда я начал идти по этому пути, казалось, что единственный способ использовать Enums - это поместить таблицы состояний и действий в HashMap - или есть способ создать многомерный массив, где измерения являются значениями Enum? Я бы предпочел не принимать создание объекта и снижение производительности, связанные с HashMap, если я могу помочь.

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

Итак, вопрос в том, будет ли Scala лучшим языком для выражения жесткого FSM, или мне лучше придерживаться массивов Java int?

Ответы [ 3 ]

2 голосов
/ 04 марта 2010

От всей души рекомендую вам взглянуть на Scala - это отличный язык, и его стоит оценить. Но проблема, которую вы описали, сама по себе не является хорошей причиной для выбора нового языка. Если вы изучите Scala, очень вероятно, что реализация вашего синтаксического анализатора FSM будет проще, чем в Java, но изучение Scala плюс реализация простого анализатора FSM, вероятно, будет не проще, чем просто сделать это в Java. *

Кроме того, не совсем понятно, что вы хотите подробно: хотите ли вы индексировать массивы по значению Enum? Вы можете распечатать. Вы хотите, чтобы массивы содержали Enums? Это должно просто работать. Вы хотите интерпретировать внутренний массив как Enum? Напишите функцию-обертку, которая создает объект, который дает вам представление, которое выглядит так, как вы хотите.

1 голос
/ 04 марта 2010

Мне кажется, ваша главная забота - производительность. Хотя есть много причин, по которым можно сделать это в Scala, сделать его быстрее не является одной из них. Это будет так же быстро, как Java, если вы позаботитесь о том, чтобы избежать абстракций более высокого уровня, но не быстрее.

1 голос
/ 04 марта 2010

Многомерные массивы перечислений в порядке.

Не работает ли для вас следующее (возможно, я неправильно понял ваш вопрос):

public class SO {

    public static void main( String[] args ) {
        States[][] array = new States[0][];
    }

    private enum States {
        a,
        b
    }    
}

Если у вас есть большой FSM или их много (как, например, в играх), и вы правильно хотите избежать ненужного создания объектов (и ненужного GC, который действительно может убить вашу игру), то, безусловно, можно использовать перечисления Java получить некоторую безопасность и при этом иметь эффективный код.

Еще одна хорошая вещь - это то, что оператор «case» для перечислений в Java, если я не ошибаюсь, используется по умолчанию для (быстрого) переключения таблиц (вместо переключателя поиска с ошибками).

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