2008-12-02 17 views
19

Baza oprogramowania dla której pracuję używa znaczącej ilości yacc, z którymi nie muszę się uporać. Czasami myślę, że byłoby to pomocne w zrozumieniu niektórych problemów, które znajduję, ale przez większość czasu mogę uciec z całkowitą ignorancją yacca.Czy Yacc nadal jest używany w branży?

Moje pytanie jest wystarczająco dużo nowych projektów, które nadal używają Yacc, aby zagwarantować czas, muszę go nauczyć?

Edycja: Biorąc pod uwagę, że odpowiedź jest w większości na korzyść nauki Yacc, czy istnieje podobny język, który poleciłbyś ponad Yacc?

Odpowiedz

30

Tak, te narzędzia warto poznać, jeśli zajdzie potrzeba utworzenia lub zmodyfikowania kodu, który analizuje gramatykę.

Przez wiele lat de facto narzędziem generowania kodu do analizy gramatyki był yacc lub jego kuzyn GNU, żubr.

Ostatnio słyszałem, że w bloku jest kilka nowych dzieci, ale zasada jest taka sama: piszesz deklaratywną gramatykę w formacie, który jest mniej więcej w formie Backus-Naur (BNF) i Yacc/bison/cokolwiek generuje dla ciebie kod, który byłby bardzo żmudny do napisania ręcznie.

Ponadto zasady gramatyki mogą być bardzo przydatne do nauki, nawet jeśli nie trzeba bezpośrednio pracować nad takim kodem. Nie pracowałem z parserami od czasu, gdy ukończyłem Compiler Design w college'u, ale zrozumienie stosów środowiska wykonawczego, analizatorów wyrażeń, oceny wyrażeń i wielu innych powiązanych rzeczy pomogło mi niezmiernie skutecznie pisać i debugować mój kod.

edytuj: Biorąc pod uwagę twoje pytanie uzupełniające na temat innych narzędzi, Yacc/Bison oczywiście są najlepsze dla projektów C/C++, ponieważ generują kod C. Istnieją podobne narzędzia dla innych języków. Nie wszystkie gramatyki są równoważne, a niektóre generatory parsera mogą jedynie gramować gramatyki o pewnej złożoności. Może więc zajść potrzeba znalezienia narzędzia, które będzie analizować twoją gramatykę. Patrz: http://en.wikipedia.org/wiki/Comparison_of_parser_generators

+0

Całkowicie zgadzam się z Billem - malejące parsery są krytyczną częścią dziedzictwa rozwojowego, która wydaje się być zapomniana. – stephbu

6

Nie wiem o nowych projektach, które go używają, ale jestem zaangażowany w siedem różnych zadań konserwacji, które wykorzystują lex i yacc do przetwarzania plików konfiguracyjnych.

Brak XML dla mnie, no-sir-ee :-).

Rozwiązania wykorzystujące lex/yacc są krokiem w górę ze starych plików konfiguracyjnych key=val liniach ponieważ umożliwiają lepsze hierarchicznych struktur, takich jak:

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

i, tak, wiem, że można to zrobić z XML, ale są to przede wszystkim starsze aplikacje napisane w C i, szczerze mówiąc, prawdopodobnie użyłbym lex/yacc również dla nowych (nie Java) zadań.

To dlatego, że wolę dostarczać oprogramowanie na czas i budżet niż dostarczać najlepszą nową technologię whiz-bang - moi klienci nie zapłacą za moją edukację, chcą przede wszystkim wyników i jestem już ekspertem w dziedzinie leksykografii/yacc i mają cały kod szablonu, aby zrobić to szybko.

+4

Zgadzam się, że gramatyki takie jak wyżej są lepsze dla plików konfiguracyjnych, ale nie z powodu, dla którego się roszczą. Brak czasu na naukę jest okropnym powodem. Lepszym powodem jest to, że pliki konfiguracyjne XML są w rzeczywistości brzydkie, nadęte i nadają się do przetwarzania przez programy, a nie ludzi. –

+4

To nie ma nic wspólnego z brakiem czasu na naukę. Podobnie jak w przypadku wszystkich decyzji biznesowych, istnieje analiza kosztów i korzyści - dlaczego warto nauczyć się nowego sposobu, aby robić to wolniej (dla mnie), gdy jest na to doskonale dobry, szybszy sposób? Prowadzę firmę, a nie instytucję edukacyjną. Wolny czas lepiej spędzić z rodziną. – paxdiablo

2

Pracuję przy projektach wykorzystujących Yacc. Nie nowy kod - ale gdyby były nowe, nadal używają Yacc lub bliskiego krewnego (Bison, Byacc, ...).

Tak, uważam, że jako wart nauki, jeśli pracujesz w C.

również pod uczenie ANTLR lub inne bardziej nowoczesne generatory parsera.Ale znajomość Yacc pomoże ci nauczyć się innych podobnych narzędzi, ponieważ wiele podstawowych teorii jest podobnych.

3

Ogólna zasada: kod trwa bardzo długo, więc technologie używane w tym kodzie trwają również długo. Zajmie to ogromną ilość czasu, aby zastąpić wspomniany kod źródłowy (zbudowanie go zajęło 15 lat ...), co z kolei oznacza, że ​​będzie on trwał około 5, 10 lub więcej lat. (Istnieje nawet szansa, że ​​ktoś, kto przeczyta tę odpowiedź, nadrobi się do pracy!)

Inna zasada: jeśli technologia powszechnego użytku jest na tyle powszechna, że ​​już ją spotkałeś, prawdopodobnie jest dość powszechna powinien się z tym zapoznać, bo pewnego dnia znów go zobaczysz. Kto wie: zapoznając się z tym, być może dodałeś przydatne narzędzie do swojej skrzynki narzędziowej ...

Yacc to jedna z tych technologii: pewnie znowu do niej wpadniesz, to nie jest takie trudne, a zasady, których się nauczysz, odnoszą się do całej rodziny konstruktorów analizatorów składni.

+0

Rozumiem dwa pierwsze punkty, które robisz (w odniesieniu do prawdopodobieństwa, że ​​sw nadal będzie w pobliżu i wpadał na Yacc), ale firma wyrzuca obecny produkt i zaczyna od zera, więc tak naprawdę nie odnosi się do mnie :) – hhafez

2

Nie wiem konkretnie o yacc/bison, ale użyłem antlr, cup, jlex i javacc. Sądziłem, że będą miały znaczenie akademickie, ale okazało się, że potrzebujemy języka specyficznego dla danej domeny, co dało nam znacznie lepsze rozwiązanie niż niektóre "prostsze" (oparte na regexie) parsery. Konserwacja może być problemem w wielu środowiskach - ponieważ większość programistów nie ma obecnie doświadczenia z narzędziami do analizowania.

+0

od moją następną rolą będzie rola Java, którą przyjrzę się jlex/javacc – hhafez

+0

Jest to * dobrze * warty zainwestowanego czasu, aby wybrać narzędzie najlepiej pasujące do gramatyki, której używasz do opisu języka. CUP to LALR Antlr to LL * JavaCC to LL (k) Niektóre lexery i parsery działają razem lepiej lub gorzej. Udaliśmy się z CUP + JLex, ale to wszystko zależy od języka. – Draemon

2

Nie miałem okazji porównać go z innymi parsującymi systemami, ale zdecydowanie mogę polecić ANTLR na podstawie własnego doświadczenia, a także z jego dużą i aktywną bazą użytkowników.

Kolejnym plusem dla ANTLR jest ANTLRWorks: The ANTLR GUI Development Environment, który jest bardzo pomocny przy tworzeniu i debugowaniu gramatyki. Nie widziałem jeszcze innego systemu analizy, który jest obsługiwany przez takie IDE.

+0

ANTLR ma w większości taką samą składnię jak YACC, ale jest również używany w połączeniu z Javą. Zasady są takie same. – boutta

3

PEGs to nowa gorączka, ale wciąż jest mnóstwo projektów wykorzystujących narzędzia yacc lub narzędzia bardziej nowoczesne niż yacc. Zmarszczyłbym brwi na nowy projekt, który zdecydowałby się na użycie yacc, ale dla istniejących projektów przeniesienie do bardziej nowoczesnego narzędzia może nie mieć sensu. To sprawia, że ​​posiadanie znajomości z Yacc jest przydatną umiejętnością.

Jeśli nie jesteś całkowicie zaznajomiony z tematem generatorów analizatora składni, zachęcam Cię do poznania jednego z nich. Wiele koncepcji jest przenośnych między nimi. Ponadto, jest to przydatne narzędzie, które można znaleźć w pasku: gdy już się go pozna, zrozumiesz, jak często mogą być lepsze w porównaniu do regex ciężkich ręcznych analizatorów. Jeśli już dobrze znasz temat analizatorów składni, nie martwię się o to. Nauczysz się yacc, jeśli i kiedy będziesz potrzebował, aby coś zrobić.

1

Piszemy nowy kod Yacc w mojej firmie do wysyłki produktów. Tak, te rzeczy są nadal używane.

Powiązane problemy