@uhbif19

Почему реализовать C настолько сложно?

Я не знаю C. Он слишком некрасивый и неинтересный, чтобы я смог заставить себя выучить его.

Но на мой, беглый взгляд C кажется предельно простым языком. Тут нет множества встроенных типов, хорошей типизации, бибиотеки и всего остального. Кажется что создавать компиляторы или трансляторы должно быть достаточно просто.

Но, насколько я понимаю это не так. Пишут что Clang до сих пор не может скомпилировать некоторый сложный код; разработчики утилит часто испоьзуют уже имеющиеся фронтенды, видимо из-за сложности разработки.

Возникают вопросы:

1. Почему так?
2. Есть ли способы/утилиты, транслировать сложный C-код в простой?
3. Существуют ли вообще работоспособные трансляторы из C в другой язык?
  • Вопрос задан
  • 4016 просмотров
Решения вопроса 1
@alexanius
Язык Си очень сложный и написать его нормальную реализацию - весьма нетривиальная задача.

При написании фронтенда встаёт задача во-первых правильно его распарсить. А с точки зрения построения парсера, Си далеко не самый простой язык. Готовой BNF грамматики для него Вы не найдёте. Плюс необходимо поддерживать пол десятка разных стандартов.

Далее нужно продумать что и как ВЫ будете отдавать в мидленд. Т.е. нужно спроектировать представление, с которым будет удобно работать оптимизациям, которое будет отображать как можно больше особенностей языка, но при этом не будет слишком сложным.

Нужно сделать обработку и вывод ошибок. Например в edg (промышленный фронтенд) разных сообщений об ошибках 2500.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
На самом деле C (не говорю про C++) - крайне простой и понятный язык. Встроенные типы в нём есть, мягкая статическая типизация тоже присутствует, практически всё, кроме логики выполнения самой программы, работает как раз через библиотеки.
Транслировать в другие языки можно, но многие вещи, легко выполняющиеся на C в других языках будут выглядеть не лучшим образом, попробуйте на своём любимом языке написать аналог:
unsigned char buf[1024];
read(f, buf, 1024);
unsigned long int *p = (unsigned long int *)(buf+*((unsigned long int *)(buf+2)));
unsigned long int *q = (unsigned long int *)(buf+*((unsigned long int *)(buf+10)));
for (p < q)
    *(p++) = 0;
Ответ написан
@PokimonFromGamedev
Ведущий разработчик Kotlin
Си очень простой язык и написать компилятор для него очень легко.
Собственно их и пишут в массовых количествах. К любому процессору есть компилятор Си. Другие языки подтягиваются позже или вообще не подтягиваются.

Про Clang. Ну это же open source. Такие проекты в большинстве случаев разрабатываются очень медленно.

И вообще в таких проектах много тараканов. Люди делают как хотят и что хотят, а не что нужно и важно пользователям.
Пример про gcc. Допустим есть код с функцией и указателем на нее. Превращаем этот указатель на функцию в другой тип (например в функцию принимающую на один аргумент больше). И вызовем функцию по этому указателю.
gcc - выдаст варнинг и НЕ СОЗДАСТ кода. Просто вставит заглушку - упасть тут.
msvc - создаст работающий код (ну да, там стек немного покорежится, но ведь мы этого и хотели)
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Компилятор С написать несложно. Сложно написать его так, чтобы он генерировал качественный код. Подавляющее большинство багов gcc связано с оптимизацией.
Ответ написан
@uhbif19 Автор вопроса
Нашел хороший ответ на вопросы 2, 3.

Это язык CIL и набор инструментов Frama-c, для работы с ним. CIL - строгое подмножество С, что хорошо, и он сохраняет структуру кода в отличие от SSA.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы