2008-12-02 9 views
19

Die Software-Basis, die ich entwickle, verwendet eine beträchtliche Anzahl von yacc, mit der ich mich nicht befassen muss. Manchmal denke ich, dass es hilfreich wäre, einige Probleme zu verstehen, die ich finde, aber die meiste Zeit kann ich mit meiner völligen Ignoranz von yacc davonkommen.Wird Yacc immer noch in der Industrie verwendet?

Meine Frage gibt es genug neue Projekte da draußen, die immer noch yacc verwenden, um die Zeit zu rechtfertigen, die ich lernen muss?

Edit: Angesichts der Antwort ist vor allem für das Lernen Yacc, gibt es eine ähnliche Sprache, die Sie über Yacc empfehlen würde?

Antwort

30

Ja, diese Tools sind es wert, gelernt zu werden, wenn Sie jemals Code erstellen oder ändern müssen, der eine Grammatik analysiert.

Seit vielen Jahren ist das de-facto-Werkzeug zum Generieren von Code zum Analysieren einer Grammatik yacc oder sein GNU-Cousin Bison.

In letzter Zeit habe ich gehört, es gibt ein paar neue Kinder auf dem Block, aber das Prinzip ist das gleiche: Sie schreiben eine deklarative Grammatik in einem Format, das mehr oder weniger in Backus-Naur-Form (BNF) und yacc ist/bison/was auch immer einen Code für dich erzeugt, der extrem mühsam wäre, mit der Hand zu schreiben.

Auch die Prinzipien hinter Grammatiken können sehr nützlich sein, um zu lernen, auch wenn Sie nicht direkt an einem solchen Code arbeiten müssen. Ich habe nicht viel mit Parsern gearbeitet, seit ich einen Kurs über Compiler Design am College gemacht habe, aber das Verständnis von Laufzeitstacks, Lookahead-Parsern, Ausdrucksauswertung und vielen anderen verwandten Dingen hat mir enorm geholfen, meinen Code effektiv zu schreiben und zu debuggen.

bearbeiten: Angesichts Ihrer Nachfolgefrage zu anderen Tools sind Yacc/Bison natürlich am besten für C/C++ - Projekte geeignet, da sie C-Code generieren. Es gibt ähnliche Tools für andere Sprachen. Nicht alle Grammatiken sind äquivalent, und einige Parsergeneratoren können nur Grammatiken einer bestimmten Komplexität erzeugen. Also musst du vielleicht ein Werkzeug finden, das deine Grammatik analysieren kann. Siehe http://en.wikipedia.org/wiki/Comparison_of_parser_generators

+0

Stimmen Sie völlig mit Bill überein - absteigende Parser sind kritischer Teil des Entwicklungserbes, das scheint in Vergessenheit geraten zu sein. – stephbu

6

Ich weiß nicht über neue Projekte, die es verwenden, aber ich bin in sieben verschiedenen Wartungsaufgaben beteiligt, die lex und yacc für die Verarbeitung von Konfigurationsdateien verwenden.

Kein XML für mich, nein-Sir-ee :-).

Lösungen lex/yacc verwenden, sind ein Schritt von den alten Konfigurationsdateien von key=val Linien, da sie besser hierarchische Strukturen wie lassen:

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

Und, ja, ich weiß, was Sie tun können, dass mit XML, aber Dies sind in erster Linie ältere Anwendungen, die in C geschrieben sind. Um ehrlich zu sein, würde ich wahrscheinlich auch lex/yacc für neue (nicht-Java) Jobs verwenden.

Das liegt daran, dass ich es vorziehe, Software pünktlich und kostengünstig zu liefern, anstatt die beste neue Technologie zu liefern - meine Kunden zahlen nicht für meine Ausbildung, sie wollen in erster Linie Ergebnisse und ich bin bereits Experte auf lex/yacc und haben den ganzen Vorlagencode, um es schnell zu machen.

+4

Ich stimme zu, dass Grammatiken wie oben für Konfigurationsdateien besser sind, aber nicht für den Grund, den Sie behaupten. Keine Zeit zu haben, um zu lernen, ist ein schrecklicher Grund. Ein besserer Grund ist, dass XML-Konfigurationsdateien tatsächlich hässlich, aufgebläht und für die Verarbeitung durch Programme und nicht für Personen geeignet sind. –

+4

Es hat nichts damit zu tun, keine Zeit zum Lernen zu haben. Wie bei allen Geschäftsentscheidungen gibt es eine Kosten-Nutzen-Analyse - warum sollte man eine neue Methode lernen, langsamer zu gehen (für mich), wenn es einen vollkommen guten schnelleren Weg gibt? Ich betreibe ein Unternehmen, keine Bildungseinrichtung. Freizeit ist besser mit der Familie verbracht. – paxdiablo

2

Ich arbeite an Projekten, die Yacc verwenden. Kein neuer Code - aber wenn sie neu wären, würden sie immer noch Yacc oder einen nahen Verwandten (Bison, Byacc, ...) benutzen.

Ja, ich halte es für das Lernen wert, wenn Sie in C arbeiten

Sehen Sie sich auch das Lernen ANTLR oder andere modernere Parser-Generatoren.Aber das Wissen um Yacc wird Ihnen zugute kommen - es wird Ihnen auch helfen, andere ähnliche Werkzeuge zu lernen, da vieles in der Basistheorie ähnlich ist.

3

Eine allgemeine Faustregel: Der Code hält lange, so dass die in diesem Code verwendeten Technologien auch eine lange Zeit dauern. Es würde eine enorme Zeit brauchen, um die von Ihnen erwähnte Codebasis zu ersetzen (es dauerte 15 Jahre, um sie zu bauen ...), was wiederum impliziert, dass sie in 5, 10 oder mehr Jahren noch da sein wird. (Es gibt sogar eine Chance, dass jemand, der diese Antwort liest, am Ende daran arbeitet!)

Eine andere Faustregel: Wenn eine Allzweck-Technologie so alltäglich ist, dass Sie sie schon kennen, ist es wahrscheinlich alltäglich genug solltest du dich damit vertraut machen, denn du wirst es eines Tages wiedersehen. Wer weiß: Vielleicht haben Sie Ihrem Werkzeugkasten ein nützliches Werkzeug hinzugefügt ...

Yacc ist eine dieser Technologien: Sie werden wahrscheinlich wieder darauf stoßen, es ist nicht so schwierig, und die Prinzipien, die Sie lernen werden, gelten für die gesamte Familie der Parserkonstruktoren.

+0

Ich verstehe die ersten beiden Punkte, die Sie machen (in Bezug auf die Wahrscheinlichkeit, dass die sw immer noch da sein wird und stoßen in yacc), aber die Firma wirft das aktuelle Produkt und von vorne anfangen, so trifft nicht wirklich auf mich :) – hhafez

2

Ich weiß nicht speziell über Yacc/Bison, aber ich habe Antlr, Tasse, Jlex und Javacc verwendet. Ich dachte, dass sie nur von akademischer Wichtigkeit wären, aber wie sich herausstellte, brauchten wir eine domänenspezifische Sprache, und dies gab uns eine viel bessere Lösung als einige "einfachere" (Regex-basierte) Parser da draußen. Wartung kann jedoch in vielen Umgebungen ein Problem darstellen, da die meisten Programmierer heutzutage keine Erfahrung mit Parser-Tools haben.

+0

seit Meine nächste Rolle wird Java-Rolle sein. Ich schaue mir mal an: jlex/javacc – hhafez

+0

Es ist * gut * die investierte Zeit wert, um das Werkzeug auszuwählen, das am besten zu der Grammatik passt, mit der Sie die Sprache beschreiben. CUP ist LALR Antlr ist LL * JavaCC ist LL (k) Und einige Lexer und Parser arbeiten besser oder schlechter zusammen. Wir gingen mit CUP + JLex, aber alles hängt von der Sprache ab. – Draemon

2

Ich hatte nicht die Chance, es mit anderen Analysesystemen zu vergleichen, aber ich kann ANTLR basierend auf meiner eigenen Erfahrung und auch mit seiner großen und aktiven Benutzerbasis definitiv empfehlen.

Ein weiterer Pluspunkt für ANTLR ist ANTLRWorks: The ANTLR GUI Development Environment, was eine große Hilfe beim Entwickeln und Debuggen Ihrer Grammatiken ist. Ich habe noch ein anderes Analysesystem zu sehen, das von solch einer IDE unterstützt wird.

+0

ANTLR hat meistens die gleiche Syntax wie YACC, wird aber auch in Verbindung mit Java verwendet. Die Prinzipien sind die gleichen. – boutta

3

PEGs sind die neuen Schärfe, aber es gibt immer noch eine Tonne von Projekten, die Yacc oder Tools moderner als yacc verwenden. Ich würde mich über ein neues Projekt ärgern, das sich für yacc entschieden hat, aber für bestehende Projekte macht die Portierung auf ein moderneres Werkzeug keinen Sinn. Dies macht eine grobe Vertrautheit mit yacc zu einer nützlichen Fähigkeit.

Wenn Sie mit dem Thema Parser-Generatoren völlig unbekannt sind, würde ich Sie ermutigen, über einen, irgendeinen zu lernen. Viele der Konzepte sind zwischen ihnen übertragbar. Es ist auch ein nützliches Werkzeug in den Gürtel: Sobald Sie einen kennen, werden Sie verstehen, wie sie im Vergleich zu Regex schweren handgeschriebenen Parsern oft überlegen sein können. Wenn Sie sich mit dem Thema Parser schon auskennen, würde ich mir darüber keine Sorgen machen. Du wirst Yacc lernen, wenn und wenn du etwas tun musst.

1

Wir schreiben neuen YACC-Code bei meiner Firma für den Versand von Produkten. Ja, dieses Zeug wird noch benutzt.

Verwandte Themen