Yacc все еще используется в промышленности?

Вот один лайнер, который я нашел на JSPerf ....

Array.prototype.move = function(from, to) {
    this.splice(to, 0, this.splice(from, 1)[0]);
};

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

 Array.prototype.move2 = function(pos1, pos2) {
    // local variables
    var i, tmp;
    // cast input parameters to integers
    pos1 = parseInt(pos1, 10);
    pos2 = parseInt(pos2, 10);
    // if positions are different and inside array
    if (pos1 !== pos2 && 0 <= pos1 && pos1 <= this.length && 0 <= pos2 && pos2 <= this.length) {
      // save element from position 1
      tmp = this[pos1];
      // move element down and shift other elements up
      if (pos1 < pos2) {
        for (i = pos1; i < pos2; i++) {
          this[i] = this[i + 1];
        }
      }
      // move element up and shift other elements down
      else {
        for (i = pos1; i > pos2; i--) {
          this[i] = this[i - 1];
        }
      }
      // put element from position 1 to destination
      this[pos2] = tmp;
    }
  }

Я не могу взять кредит, все должно пойти на Richard Scarrott . Он использует метод сплайсинга для меньших наборов данных в этом тесте производительности . Тем не менее он значительно медленнее на больших наборах данных , как указывает Дарвейн .

19
задан hhafez 29 July 2009 в 01:44
поделиться

8 ответов

Да, эти инструменты стоит изучить, необходимо ли когда-нибудь создавать или изменять код, который анализирует грамматику.

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

В последнее время я услышал, что существует несколько новеньких, но принцип является тем же: Вы пишете декларативную грамматику в формате, который находится более или менее в Форме Бэкуса-Наура ( BNF), и yacc/bison/whatever генерирует некоторый код для Вас, которые были бы чрезвычайно утомительны для записи вручную.

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

редактирование: , Учитывая Ваш последующий вопрос о других инструментах, Yacc/Bison, конечно, является лучшим для проектов C/C++, так как они генерируют код C. Существуют подобные инструменты для других языков. Не все грамматики эквивалентны, и некоторые парсеры-генераторы могут только grok грамматики определенной сложности. Таким образом, Вы, возможно, должны были бы найти инструмент, который может проанализировать Вашу грамматику. См. http://en.wikipedia.org/wiki/Comparison_of_parser_generators

30
ответ дан 30 November 2019 в 02:42
поделиться

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

Никакой XML для меня, no-sir-ee :-).

Решениями с помощью lex/yacc является шаг от старых конфигурационных файлов key=val строки, так как они позволяют лучшие иерархические структуры как:

server = "mercury" {
    ip = "172.3.5.13"
    gateway = "172.3.5.1"
}
server = "venus" {
    ip = "172.3.5.21"
    gateway = "172.3.5.1"
}

И, да, я знаю, что можно сделать это с XML, но это, прежде всего, унаследованные приложения, записанные в C и, честно говоря, я, вероятно, использовал бы lex/yacc для нового (не-Java) задания также.

Поэтому я предпочитаю поставлять программное обеспечение вовремя и бюджет вместо того, чтобы поставить самую большую новую технологию удара свиста - мои клиенты не заплатят за мое образование, они хотят результаты прежде всего, и я уже опытен в lex/yacc и имею весь код шаблона для того, чтобы сделать его быстро.

6
ответ дан 30 November 2019 в 02:42
поделиться

Общее эмпирическое правило: код длится долгое время, таким образом, технологии, используемые в том коде, длятся долгое время, также. Потребовалось бы огромное количество времени для замены кодовой базы, которую Вы упоминаете (потребовалось 15 лет для создания его...), который в свою очередь подразумевает, что это все еще будет вокруг в 5, 10, или больше лет. (Существует даже шанс, что кто-то, кто читает этот ответ, закончит тем, что работал над ним!)

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

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

3
ответ дан 30 November 2019 в 02:42
поделиться

ШТЕПСЕЛИ являются новой жаркостью, но существует все еще тонна проектов, которые используют yacc или инструменты, более современные, чем yacc. Я осудил бы новый проект, который принял решение использовать yacc, но для существующего портирования проектов на более современный инструмент может не иметь смысла. Это делает наличие грубо знакомством с yacc полезный навык.

, Если бы Вы полностью незнакомы с темой парсеров-генераторов, я поощрил бы Вас узнавать об одном, любом. Многие понятия являются портативными между ними. Кроме того, это - полезный инструмент, чтобы иметь в поясе: после того как Вы знаете тот, Вы поймете, как они могут часто быть выше по сравнению с regex тяжелыми рукописными синтаксическими анализаторами. Если бы Вы уже довольны темой синтаксических анализаторов, я не волновался бы об этом. Вы изучите yacc, если и когда Вам будет нужно к тому, чтобы сделать что-то.

3
ответ дан 30 November 2019 в 02:42
поделиться

Я работаю над проектами то использование Yacc. Не новый код - но был ими новый, они будут все еще использовать Yacc или близкого родственника (Бизон, Byacc...).

Да, я рассматриваю его как стоящий изучения, работаете ли Вы в C.

Также рассматривают изучение ANTLR или других более современных парсеров-генераторов. Но знание Yacc сослужит Вам хорошую службу - это поможет Вам изучить любые другие подобные инструменты также, так как много основной теории подобно.

2
ответ дан 30 November 2019 в 02:42
поделиться

Я не знаю о yacc/bison а именно, но я использовал antlr, чашку, jlex и javacc. Я думал, что они будут только иметь академическое значение, но как оказалось, нам был нужен проблемно-ориентированный язык, и это дало нам намного более хорошее решение, чем некоторые "более простые" (regex базирующийся) синтаксические анализаторы там. Обслуживание могло бы быть проблемой во многих средах, хотя - так как у большинства кодеров в эти дни не будет опыта с парсингом инструментов.

2
ответ дан 30 November 2019 в 02:42
поделиться

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

Другой плюс для ANTLR ANTLRWorks: Среда разработки GUI ANTLR , который является большой справкой при разработке и отладке грамматик. Я должен все же видеть другую систему парсинга, которая поддерживается таким IDE.

2
ответ дан 30 November 2019 в 02:42
поделиться

Хотя использование регулярных выражений для этой цели не подходит и не эффективно, иногда регулярные выражения предоставляют быстрые решения для простых проблем совпадения, и, на мой взгляд, использовать регулярные выражения для тривиальных работ не так уж и страшно.

Существует окончательная запись блога о сопоставлении самых внутренних элементов HTML, написанных Стивеном Левитаном.

-121--1752194-

В Java существует некоторая несогласованность в том, как последовательности обрабатывает оператор = = в зависимости от того, как он был создан.

String a = "Hello";
String b = "Hello";
System.out.println(a == b ); // prints true.
String c = new String("Hello");
String d = new String("Hello"); 
System.out.println(c == d ); // prints false
-121--1760440-

Мы пишем новый код yacc в моей компании для доставки продуктов. Да, эта штука до сих пор используется.

1
ответ дан 30 November 2019 в 02:42
поделиться
Другие вопросы по тегам:

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