Какие шаги необходимы для добавления новых функций в C? - PullRequest
3 голосов
/ 26 сентября 2010

Предположим, я хотел бы создать новый язык программирования, только добавив новый примитив тип данных в C, скажем boolean.Что бы понадобилось для этого?

РЕДАКТИРОВАТЬ : Я не очень-то проясняю себя здесь.Я хотел бы разработать новый язык с синтаксисом, точно таким же, как C, но с кучей новых примитивных типов данных.Этот язык должен выводить код на C, и я бы затем использовал GCC для компиляции исполняемых / объектных файлов.

Ответы [ 4 ]

5 голосов
/ 27 сентября 2010

В комментариях вы говорите, что предложенный вами язык (я назову его Ext-C, для Extended C) - это DSL, предназначенный для узкой аудитории (вы, ваши студенты), тогда вам потребуется:

  • Написать код для анализа Ext-C, распознавая, какие части являются чистыми C, а какие - Ext-C.
  • Напишите генератор кода C, который представляет перевод Ext-C на C.
  • Соберите его в препроцессор, который читает исходные файлы Ext-C и записывает исходные файлы C.
  • Напишите сценарий компилятора (или программу), который обрабатывает синтаксический анализ аргументов и запуска препроцессора Ext-C для файлов Ext-C перед запуском компилятора C для остальной части перевода.

Взгляните на Cfront как на один из возможных источников идей.

Взгляните на IBM Informix ESQL / C (предоставляется бесплатно от IBM как часть IBM Informix ClientSDK или CSDK); есть скрипт 'esql', который управляет компиляцией, и препроцессор 'esqlc', который фактически анализирует исходный код ESQL / C и генерирует соответствующий код C. Программисты запускают скрипт esql для компиляции программ ESQL / C; они не запускают программу esqlc вручную, если у них нет необычно извращенной и мазохистской серии.

Обратите внимание, что одной из самых сложных частей любого DSL является интеграция с отладчиком. Вы можете сделать так, чтобы ваш препроцессор генерировал директивы '#line', которые иногда помогают, а иногда и мешают. (В моем арсенале сценариев есть один, который комментирует директивы #line; я использую его, когда мне нужно отладить промежуточный код C, но все же удается вернуться к исходному исходному коду.) Вы можете увидеть, как lex и yacc (и варианты) также обрабатывают это в своем выводе. Рекомендуется также, чтобы препроцессор очищал промежуточный файл по умолчанию (при успешной компиляции), но предоставлял опцию, чтобы промежуточный файл оставался доступным для проверки. Обратите внимание, что если ваш препроцессор не гарантирует, что весь вывод является действительным C - поскольку он просто копирует части ввода в вывод, не проверяя его, как это делает компилятор C, - то вам нужно убедиться, что пользователи (программисты) могут определить, где исходная ошибка есть в исходном файле, даже если ошибка обнаружена компилятором C, а не компилятором Ext-C.

Язык программирования IBM Informix 4GL является полным языком, который полностью анализируется его основным компилятором, который затем (несколько упрощенно) генерирует код на Си. Существует скрипт c4gl для управления компиляцией и компоновкой, а также препроцессор / компилятор i4glc1 (и, поскольку я слишком упрощал, i4glc2, i4glc3 и i4glc4 тоже). Если сгенерированный код C не удается скомпилировать, это указывает на ошибку в компиляторе I4GL - это не ошибка пользователя.

2 голосов
/ 27 сентября 2010

Полагаю, вы могли бы написать сценарий оболочки или препроцессор между вашим новым языком и GCC, чтобы конвертировать небольшие биты, которые вы добавляете, в обычный синтаксис языка Си. Думайте об этом как о слое, как препроцессор GCC.

Вы можете написать синтаксический анализатор на любом языке, даже на самом C - все, что будет принимать текстовый файл, изменять его и записывать его, либо в другой файл, либо в стандартный вывод для GCC для чтения и компиляции. *

Надеюсь, это поможет

Джеймс

1 голос
/ 27 сентября 2010

Что касается вашего примера типов данных: вы не можете просто преобразовать произвольный тип данных в C. Булев, как вы можете, потому что он проще, чем существующие типы, и может быть легко представлен любым целочисленным типом (как правило, #define d).в любом случае).Но скажем, вы хотели что-то вроде 256-битного целого числа, давайте назовем это superlong .Этот супердлинный тип никогда не может быть напрямую переведен в код C, поскольку в C. не существует эквивалентного типа данных.

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

0 голосов
/ 27 сентября 2010

Если вы хотите, чтобы он получил широкую поддержку, вам нужно убедить ISO включить его в следующий стандарт. Насколько я могу судить, на данный момент нет особого импульса для пересмотра С. Все интересное происходит в C ++, например, C ++ 0x.

...