LINUX.ORG.RU

Ocaml vs C/C++. реализация транслятора


0

0

Есть задачка - реализовать транслятор (frontend) определенного, достаточно сложного языка. По синтаксической/семантической сложности язык сопоставим с С++. К транслятору выдвигаются особенно жесткие требования по быстродействию и объму памяти (разбирать придестя код размером до 15 мб). Необходимо выбрать язык реализации. Наиболее вероятные кандидаты C/С++, в качестве альтернативы рассмартивается Ocaml.

Хотелось бы уточнить у местных гуру, насколько применение Ocaml в данной ситуации оправдано, какова производительность скомпилированной OCaml-программы по сравнению с программой написанной на C/C++, какие требования к оперативной памяти по сравнению с С/C++-программой

Ты собрался руками разбирать код по сложности сравнимый с С++?

Безумству храбрых.... Может yacc все-же взять? А он вроде как код только на си может делать. (Ну еще на паскаль порт есть).

alexru ★★★★
()
Ответ на: комментарий от alexru

yacc или какая-то его модификация может делать код и для C++,

но к вашему сведению yacc граматику для C++ из-за его сложности не напишешь.

anonymous
()
Ответ на: комментарий от anonymous

Yacc генерит код для разбора LALR(1)-языка. Какая-же это синтаксическая кончтрукция С++ не подлежит LALR(1) анализу?

alexru ★★★★
()
Ответ на: комментарий от alexru

вы хоть C++ знаете?

например

Type f();

может значить либо создание объекта,
либо предварительное объявление функции,
это зависит от контекста,

и как поможет в этом случае yacc?

anonymous
()
Ответ на: комментарий от anonymous

Знаю. И cpp и теорию построения компиляторов.

Никак не поможет. он и не предназначен для этого. Это не синтаксис. Это семантика. И то что ИНОГДА семантику можно разбирать при помощи синтаксического анализатора ни о чем не говорит.

alexru ★★★★
()
Ответ на: комментарий от alexru

>Никак не поможет. он и не предназначен для этого. Это не синтаксис. Это >семантика.

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

anonymous
()
Ответ на: комментарий от anonymous

Какие лексемы? Как интерпретировать этот кусок зависит не от контекста синтаксического, а от контекста семантического (его из-за простоты делают руками). Yacc в данном случае для обоих случаев вызовет один Action. А внутри него семантический анализатор решит как трактовать конструкцию.

alexru ★★★★
()
Ответ на: комментарий от alexru

> Ты собрался руками разбирать код по сложности сравнимый с С++?

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

Кстати и в Си++ к вашему сведению основная сложность именно в семантике, особенно в семантике шаблонных конструкций. А контекстно-зависимые предложения типа a * b, которые опять таки разбираются через семантику, это уже бантики.

anonymous
()
Ответ на: комментарий от alexru

Слушай, ты в Бауманке учишься ? Ориентируешься в теории трансляции ? Есть маза переговорить по этому делу - ICQ 191581134

anonymous
()
Ответ на: комментарий от alexru

> Yacc в данном случае для обоих случаев вызовет один Action.

слушай сколько умных слов выучил, а мозгов совсем нет,

объясняю еще раз

int f();

что в данном случае на f yacc дергать?
имя переменной или имя функции,

переводя на твой язык(ты наверное по-русски плохо говоришь),
какой action вызвать,

а если никакой или какой-нибудь общий,
то на хрена здесь yacc, программу на слова разбить?

anonymous
()
Ответ на: комментарий от anonymous

>Конечно воспользуюсь автоматическим генератором, но помимо синтаксиса в >анализируемом языке существует довольно сложная семантика

советую прочитать статью, как наши с ММ и ВМК С++ компилятор писали,
там есть в должной мере и технические подробности,

ссылка недавно в Talks пробегала.

anonymous
()

За что люблю ЛОР, так это за то, что тут никогда не возможно такое http://www.rsdn.ru/Forum/Message.aspx?mid=1347701&all=1

Там все скучно, по полочкам, максимально объективно, а тут настоящие креативвы !

anonymous
()
Ответ на: комментарий от anonymous

Он тебе пытался объяснить, что Си и Си ++ конеткстно-зависимые языки. 

например 


int foo () 
{
    a *b; // Что это объявление указателя или операция умножения ? 
}

Все зависит от того, как объявлены a (и b) ранее (т.е. от семантического
 контекста) 

anonymous
()
Ответ на: комментарий от anonymous

Тогда уж лучше к этой болтологии добавить кандидатский диссер Зуева на interstron.ru. C творениями этого человека я знаком.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.