Как сделать интерпретатор на c

Обновлено: 05.07.2024

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

Зачем нужен интерпретатор

В переводе с английского языка компьютер — вычислитель. Мы привыкли пользоваться компьютером для подготовки документы, чтения новостей и просмотра фильмов. В повседневной жизни производить вычисления приходится крайне редко, поэтому такое определение может показаться странным.

Каждая команда имеет свой числовой — машинный — код: благодаря ему компьютер без труда понимает, что нужно делать. Человеку трудно писать программы в машинных кодах, однако на заре компьютерной эры программисты писали именно так. Вот так выглядели их программы:

Пытаясь облегчить себе работу, программисты придумали языки программирования: они понятнее человеку, поэтому писать программы на них проще. На этом этапе возникла проблема: если компьютер понимает команды только в виде чисел, как он будет выполнять команды, написанные на языке программирования?

Есть два вида программ, которые помогают решить эту проблему — интерпретаторы и компиляторы. Про компилятор можно почитать здесь, в этом тексте мы остановимся только на интерпретаторах.

Вкратце, интерпретатор — это программа, которая выполняет команды, написанные на каком-то языке программирования. Например, интерпретатор Python понимает команды языка Python, а интерпретатор JavaScript — команды языка JavaScript.

Экскурс в историю

Lisp оказался удачным изобретением. За прошедшие годы люди изобрели множество языков, которые оказались никому не нужны. Этого нельзя сказать о Lisp, который развивается до сих пор. Уточню, что разработкой интерпретаторов Lisp занимались разные команды, поэтому у них получались разные версии языка. Такие версии языка называют диалектами. Кроме Emacs Lisp, вы могли слышать о ClojureScript — диалекте LISP, который иногда используют вместо JavaScript при разработке фронтенда

Необязательно знать Lisp, чтобы увидеть, что в программе есть структура, и понять отдельные ее части. Доступность для понимания — выгодное преимущество языков программирования перед машинным кодом.

Есть интерпретаторы для таких популярных языков программирования, как Python и JavaScript. Они хорошо подходят и для работы, и для изучения программирования. Важную роль в этом играет то, что для них существует интерпретаторы, и чуть позже мы узнаем, почему это так.

Пример интерпретатора Python

Разберем в деталях работу интерпретатора — для этого напишем несложную программу, которая будет вычислять суммы чисел от 1 до 100:

Запустим интерпретатор python и построчно введем программу.

Пример работы интерпретатора Python

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

Выполняя команду print(sum) , интерпретатор печатает результат — число 5050. Если мы допустим ошибку, интерпретатор подскажет нам, где она находится.

Пример ошибки в программе

В примере выше мы забыли поставить двоеточие после инструкции for , о чем интерпретатор и сообщает.

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

Кроме того, интерпретируемые языки часто используют для разработки прототипов больших программ. В интерактивном режиме он постоянно выполняет одни и те же действия: читает команду программиста, выполняет ее и печатает результат. Такой режим называют Циклом Чтения-Выполнения-Печати, или, по-английски Read-Evaluate-Print Loop. Обычно это название сокращают до аббревиатуры REPL.

Цикл Чтения-Выполнения-Печати

Пример интерпретатора JavaScript

Интерпретатор JavaScript встроен прямо в браузер. Посмотрим, как он работает, на примере браузера Chrome.

В правом верхнем углу есть три вертикальные точки, которые вызывают меню браузера. Нажмите и выберите пункт меню Дополнительные инструменты, а затем Инструменты разработчика.

Инструменты разработчика Chrome

Вы увидите новое окно, заполненное вкладками. Все эти инструменты полезны и их стоит освоить. Но сейчас нам нужна одна вкладка — Console. В консоли мы можем набирать команды языка JavaScript и сразу видеть отклик интерпретатора.

Интерпретатор сохранит переменные a и b со значениями 1 и 2, затем вычислит значение 3 * (a + b) и напечатает результат 9.

Консоль Chrome

Выполнение программы

Цикл REPL помогает разрабатывать программу, но вводить каждую команду по отдельности не удобно: куда быстрее ввести их один раз, а затем запустить готовую программу. Для этого создадим текстовый файл sum . py и запишем там команды:

Чтобы выполнить программу, достаточно запустить интерпретатор Python, указав имя файла в параметрах:

Интерпретатор выполняет команды одну за одной и в конце завершает свою работу. Такой режим работы интерпретатора называют пакетным.

Таким образом, интерпретатор может работать в двух режимах. Интерактивный режим (REPL) помогает нам проверять идеи и придумывать решение задач. Пакетный режим выполняет готовую программу.

Устройство интерпретатора

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

В программе на Python, которую мы обсуждали выше есть операторы присваивания, цикл for и вызов функции print . Все это — команды, которые понимает интерпретатор Python. Для каждой команды в интерпретаторе есть блок кода, который умеет такую команду исполнять.

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

Так — в цикле — интерпретатор и работает. Анализирует введенную команду, затем выполняет, снова анализирует и снова выполняет. Анализ текста это, конечно, не тривиальная задача, но и не слишком трудная, так что интерпретаторы на самом деле не такие сложные программы.

Как работает интерпретатор

Достоинства и недостатки

Простота изучения. REPL помогает проверять, как работают незнакомые конструкции и быстро осваивать синтаксис языка.

Простота программирования. Как и компилятор, интерпретатор избавляет от необходимости писать программы в машинных кодах.

Кроссплатформенность. Интерпретаторы разработаны для разных платформ — Mac, Windows, Linux, поэтому написанная нами программа будет работать на всех платформах.

Улучшение программы за счет интерпретатора. Скорость программ зависит не только от качества кода, но и от того, насколько быстро работает интерпретатор. Например, программисты Google постоянно улучшают интерпретатор JavaScript, который работает в браузере Chrome. Если мы написали программу на JavaScript, с каждой новой версией Chrome она работает быстрее, даже если мы ничего в ней не меняем.

Низкая скорость. Интерпретируемые программы работают медленнее, чем программы в машинных кодах. Это происходит потому, что интерпретатор должен сначала проанализировать текст команды, и лишь потом выполнить ее. Программа в машинных кодах сразу понятна компьютеру.

Зависимость от интерпретатора. Интерпретируемой программе нужен интерпретатор. В Windows программы в машинных кодах имеют расширение .exe. Такую программу, скажем, архиватор 7-zip можно просто запустить. А для того, чтобы выполнить программу на языке Python, нужен интерпретатор python.

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

Позднее обнаружение ошибок. Интерпретаторы выполняют программы по одной команде. Если в синтаксисе команды допущена ошибка, интерпретатор не сможет об этом узнать, пока не приступит к ее анализу. В больших программах есть куски, которые выполняются реже других и, возможно, там есть ошибки, про которые программист не знает. Чтобы избежать ошибок, которые увидит пользователь программы, приходится тестировать её гораздо тщательней.

Выводы и рекомендации

Интерпретатор языка программирования — это программа, выполняющая команды, написанные на этом языке. Мы, например, говорим интерпретатор Python или интерпретатор JavaScript.

Интерактивный режим (REPL) помогает программистам изучать синтаксис языка и проверять свои идеи.

Интерпретатор состоит из анализатора текста и исполнителей отдельных команд языка, таких как цикл for , проверка if , вызов функции print , и других.

К достоинствам интерпретируемых языков относят простоту изучения. Именно поэтому программирование начинают изучать с таких языков, как Python и JavaScript.

Вы когда-нибудь хотели создать свой язык программирования? Большинство программистов призывают к поиску идеи создания, управления и модификации своих языков программирования. Однако, лишь немногие программисты могут легко и непринужденно создать язык программирования. Создание полного компилятора является многообязывающей задачей, но гораздо проще создать интерпретатор языка. Методы, используемые для создания итерпретаторов языка, изучаются редко или изучаются довольно абстрактно. В этой главе на практических примерах вы будете изучать секреты интерпретации языка и грамматического разбора выражений.

Интерпретаторы важны по трем очень важным причинам. Во-первых, они могут обеспечивать удобную интерактивную среду (как доказательство - интерпретатор стандартного языка BASIC, которыми снабжаются большинство персональных компьтеров). Многие пользователи-новички находят, что интерактивная среда более удобна, чем компилятор. Во-вторых, интерпретаторы языка обеспечивают превосходные интерактивные отладочные возможности. Даже ветераны-программисты при отладке трудных программ прибегают к помощи интерпретатора языка, потому что он позволяет динамично устанавливать значения переменных и условий. В-третьих, большинство языков запросов к базе данных работают в режиме интерпретации.

В этой главе будет разработан интерпретатор для подмножества языка BASIC, который еще называют "SMALL BASIC". BASIC выбран вместо Cи, потому что BASIC легче интерпретируется, чем Cи или другой структурный язык. Интерпретатор для структурного языка, такого как Cи более труден, чем для BASIC из-за автономных функций с локальными переменными, которые обеспечивают интерпретатору многозначность. Принципы, используемые в интерпретаторе BASIC, применимы и для других языков, и вы можете использовать написанные программы в качестве отправной точки. Прежде, чем начать работу, необходимо изучить сущность языковой интерпретации, особенно перед тем, как браться за интерпетацию такого сложного языка, как Cи. Если вы не знаете BASIC, не беспокойтесь, команды используемые в SMALL BASIC очень легкие для понимания.

Мы начинаем с сердца любого интерпретатора: синтаксического анализатора выражений.

СИНТАКСИЧЕСКИЙ РАЗБОР ВЫРАЖЕНИЙ

Наиболее важной частью интерпретатора языка является синтактический анализатор выражений, который преобразует числовые выражения, такие как (10-X)/23, в такую форму, чтобы компьютер мог понять ее и вычислить. В книге по языку Cи: The Complete Reference (Osborne/McGraw-uill, 1987) вступительная глава посвящена синтаксическому анализу выражений. Подобного же рода синтаксический анализ, основанный на принципах, изложенных в вышеупомянутой книге, (правда, с небольшими изменениями) будет использоваться для построения интерпретатора SMALL BASIC в данной главе нашей книги. (Так как эта глава содержит только краткие сведения о синтаксическом анализе выражений, то для более детального изучения этой проблемы советуем вам обратиться к источнику: The Compelete Reference.

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

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

ВЫРАЖЕНИЯ

Хотя выражения могут быть составлены в принципе из любых типов данных, в этой главе мы будем иметь дело только с числовыми выражениями. Будем считать, что для наших целей числовые выражения могут строится из следующих элементов:

операторы + - / * ^ % = () > ', ',', ';' являются операторами, они не могут использоватся в выражениях функций и конструкциях типа IF, PRINT и операторах присваивания. (Заметим, что анализатор языка Cи должен обрабатывать и эти операторы в различных их комбинациях).

Что касается языка BASIC, старшинство операторов не определено. В процессе работы синтаксический анализатор присваивает операторам следующие приоритеты:

Операторы равного приоритета выполняются слева направо.

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

ЛЕКСЕМЫ

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

содержит компоненты "А", "*", "В", "-", "(", "W", "+", "10" и ")". Каждый компонент представляет собой неделимый элемент выражения. Такой компонент или независимая часть выражения называется лексемой. Функция, разбивающая выражение на составные части, должна решать четыре задачи: (1) игнорировать пробелы и символы табуляции, (2) извлекать каждую лексему из текста, (3) если необходимо, преобразовывать лексему во внутренний формат, (4) определять тип лексемы.

Каждая лексема имеет два формата: внешний и внутренний. Внешний формат - это символьная строка, с помощью которой вы пишите программы на каком-либо языке программирования. Например, "PRINT" - это внешняя форма команды PRINT языка BASIC. Можно построить интерпретатор из расчета, что каждая лексема используется во внешнем формате, но это типичное решение проблемы программистом-непрофессионалом, который лишь два часа назад оторвался от материной юбки и час назад увидел настоящий компьютер. Настоящие мужчины ориентируются на внутренний формат лексемы, который является просто числом, и разрабатывают интерпретаторы исходя из этой профессиональной точки зрения на проблему. Поясним этот подход. Например, команда PRINT может иметь порядковый внутренний номер 1, команда INPUT - 2 и т.д. Преимущество внутреннего формата заключается в том, что программы, обрабатывающие числа, более быстродействующие, чем программы, обрабатывающие строки. Для реализации такого подхода необходима функция, которая берет из входного потока данных очередную лексему и преобразует ее из внешнего формата во внутренний. Помните, что не все лексемы имеют разные форматы. Например, операторы не подлежат преобразованию потому, что они могут трактоваться как символы или числа в своих внешних форматах.

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

Функция, которая возвращает следующую лексему в выражении, называется get_token( ). Она работает из расчета того, что в языке SMALL BASIC, программа хранится как одна строка, ограниченная в конце символом завершения строки (�). Функция get_token() сканирует текст программы, анализируя по одному символу, при этом глобальный указатель анализатора принимает значение адреса очередной считаной лексемы. В версии get_token(), приведенной ниже, этот указатель называется prog. Так как prog является глобальной переменной, то его значение между вызовами get_token сохраняется и позволяет другим функциям использовать его.

Анализатор, разрабатываемый в этой главе, использует шесть типов лексем: DELIMITER, VARIABLE, NUMBER, COMMAND, STRING и QUOTE (разделитель, переменная, число, команда, строка и кавычки). Тип VARIABLE приписывается переменным. Тип DELIMITER приписывается операторам и скобкам. Тип NUMBER - для чисел. Тип COMMAND - для команд языка SMALL BASIC. Тип STRING временно используется внутри get_token() пока идет разбор лексемы. Тип QUOTE используется при определении кавычек, ограничивающих строку. Глобальная переменная token_type содержит тип лексемы. Внутреннее представление лексемы помещается в глобальную переменную tok.

Ниже приведена функция get_token(). Все остальные необходимые вспомогательные функции для полного синтаксического анилизатора будут приведены в этой главе немного позже.

Посмотрите внимательно на get_token(). Многие программисты любят помещать пробелы перед выражениями для улучшения удобочитаемости и наглядности своей программы. Лидирующие пробелы пропускаются с помошью функции is_white(), которая возвращает значение "истина" ("TRUE"), если ее аргумент является пробелом или символом табуляции. Псле пропуска пробелов, сканер, реализуемый с помощью программы prog, указывает на каждое число, переменную, команду, символ "возврат каретки" или ноль, если достигнут конец выражения (программы). Если очередным анализируемым символом является символ "возврат каретки" (r), то возвращается значение "конец строки программы" ("EOL"). Если очередной символ является оператором, то в качестве значения глобальной переменной token возвращается соответствующая строка, при этом в переменную token_type помещается значение DELIMITER. В противном случае проверяется наличие кавычек. Затем происходит проверка является ли лексема числом. Если лексема является символом, то она, следовательно, является или переменной или командой. Функция look_up() сравнивает внешний формат лексемы с таблицей лексем, определенной при разработке анализатора и, если находит соответствующе значение в ней, возвращает внутреннее представление лексемы (команды). В противном случае лексема трактуется как переменная. И, наконец, если символ не удовлетворяет ни одному из условий, приведенных выше, то он трактуется как символ конца выражения. При этом значение token обнуляется.

Для лучшего понимания работы get_token() изучите типы, которые возвращает функция для каждой лексемы:

Таблица 1. Таблица типов лексем

ЛексемаТип лексемы
PRINTCOMMAND
AVARIABLE
+DELIMITER
100NUMBER
-DELIMITER
(DELIMITER
BVARIABLE
*DELIMITER
CVARIABLE
)DELIMITER
/DELIMITER
2NUMBER
nullDELIMITER

Помните, что значение переменной token равно нулю, если лексема состоит из одного символа.

Некоторые функции интерпретатора нуждаются в повторном просмотре лексемы. В этом случае лексема должна быть возвращена во входной поток. Функция putback() решает эту задачу.

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

C++ — это объектно-ориентированный язык программирования, который изначально был создан как надмножество C . Языки C и C++ являются одними из самых популярных технологий, используемых для написания программ.

Эта статья призвана помочь вам выбрать бесплатный компилятор для C / C++ для различных операционных систем.

Open Watcom V2 Fork

Он может работать и создавать исполняемые файлы под Windows ( 16-разрядные, 32-разрядные и 64-разрядные версии ), Linux ( 32-разрядные и 64-разрядные версии ), OS / 2 и MS-DOS ( 16-разрядные и 32-разрядные режимы ). Стоит пояснить, что Watcom — это был известный коммерческий компилятор, пока первоначальные разработчики не прекратили его продажи и не опубликовали исходный код ( в соответствии с публичной лицензией Sybase Open Watcom ).

Microsoft Visual Studio Community

Для индивидуальных или начинающих программистов Microsoft Visual Studio Community включает в себя много важных инструментов из коммерческих версий проекта. Вы получите в свое распоряжение IDE , отладчик, оптимизирующий компилятор, редактор, средства отладки и профилирования. С помощью этого пакета можно разрабатывать программы для настольных и мобильных версий Windows , а также Android . Компилятор C++ поддерживает большинство функций ISO C++ 11 , некоторые из ISO C++ 14 и C++ 17 . В то же время компилятор C уже безнадежно устарел и не имеет даже надлежащей поддержки C99 .

Clang: Фронтенд языка программирования C для LLVM

Clang — компилятор C , C++ , Objective C и Objective C++ , разработанный под Apple . Это часть проекта LLVM . Clang реализует различные стандарты ISO C и C++ , такие как C11 , ISO C++ 11 , C++ 14 и частично C++ 1z .

Он также поддерживает расширения, которые можно найти в семействе компиляторов C GNU . Компилятор C для Windows выпущен под лицензией BSD . К сожалению, на момент написания этой статьи, он предоставляется только в исходной форме, и вам придется собирать его самостоятельно.

MinGW-w64

Проект MinGW-w64 предоставляет библиотеки, заголовки, необходимые компиляторам C и C++ GNU для работы в системе Windows . В случае MinGW-w64 эти файлы поддержки позволяют создавать 64-битные программы в дополнение к 32-битным . Проект также предоставляет кросс-компиляторы, так что можно скомпилировать программу Windows из системы Linux .

AMD x86 Open64 Compiler Suite

Это версия набора компиляторов Open64 ( описанного ниже ), которая была настроена для процессоров AMD и имеет дополнительные исправления ошибок. Компилятор C / C++ соответствует стандартам ANSI C99 и ISO C++ 98 , поддерживает межъязыковые вызовы ( так как он включает в себя компилятор Fortran ), 32-битный и 64-битный код x86 , векторную и скалярную генерацию кода SSE / SSE2 / SSE3, OpenMP 2.5 для моделей с разделяемой памятью, MPICH2 для моделей с распределенной и разделяемой памятью; содержит оптимизатор, поддерживающий огромное количество оптимизаций ( глобальную, цикл-узел, межпроцедурный анализ, обратную связь ) и многое другое. Набор поставляется с оптимизированной AMD Core Math Library и документацией. Для этого набора компиляторов требуется Linux .

Компилятор C/C++ Open Source Watcom / Open Watcom

Является бесплатным компилятором для Windows 7 с открытым исходным кодом. Он генерирует код для Win32 , Windows 3.1 (Win16) , OS / 2 , Netware NLM , MSDOS ( 16-битный и 32-битный режим ) и т. д. Watcom был очень популярным компилятором несколько лет назад до тех пор, пока Sybase не закрыла его. Он также включает в себя довольно известный STLport ( реализация библиотеки стандартных шаблонов C++ ). Обновление: этот проект, похоже, застопорился, и в настоящее время запущен новый проект Open Watcom V2 Fork ( описан выше ).

Компилятор Digital Mars C/C++ (замена Symantec C++)

Digital Mars C / C ++ является заменой Symantec C++ с поддержкой компиляции программ для Win32 , Windows 3.1 , MSDOS и 32-разрядных расширенных MSDOS . Если используемый ПК не имеет процессора с плавающей запятой ( машины pre-Pentium ), можно связать эмуляцию с плавающей запятой в вашей программе. Компилятор поддерживает определение C++ из аннотированного руководства по C++ ( ARM ) и расширенные функции языка AT & T версии 3.0 , включая шаблоны, вложенные классы, вложенные типы, обработку исключений и идентификацию типа во время выполнения.

UPS Debugger (интерпретатор C)

Это графический отладчик уровня исходного кода для X Window , который содержит встроенный интерпретатор языка C . Он может обрабатывать один или несколько исходных файлов. Можно использовать его для создания исполняемого файла с байтовым кодом и выполнения интерпретатора в этом исполняемом файле. Если вам нужен интерпретатор для отладки или создания прототипов программ, или просто для изучения языка, попробуйте этот инструмент. Он поддерживает следующие платформы: Solaris , SunOS , Linux , FreeBSD , BSD / OS и некоторые другие Unix-платформы .

The BDS C Compiler

Помните старый ( популярный ) компилятор C BDS для систем CP / M 8080 / Z80 ? В настоящее время этот компилятор языка C находится в публичном доступе, в комплекте с исходным кодом языка ассемблера. Пакет представляет собой розничную версию компилятора с компоновщиком и руководством пользователя. Его можно использовать для простой генерации кода 8080/8085 / Z80 для встраиваемых систем ( то есть создавать собственные процедуры для замены любого кода библиотеки, который обращается к функциям операционной системы ).

Компилятор C / C++ Bloodshed Dev

Это интегрированная среда разработки Win32 , включающая в себя компилятор C++ egcs и отладчик GNU из среды Mingw32 . А также редактор и другие средства, облегчающие разработку программ с использованием компилятора Mingw32 gcc на платформе Windows . Он также содержит программу установки для приложений.

Компилятор C Orange

Он работает как в Windows , так и в DOS , имеет интегрированную среду разработки с редактором программ ( с подсветкой синтаксиса и автоматическим завершением кода ). Он может генерировать программы для Win32 и MSDOS , а также файлы Intel и Motorola hex ( что полезно, если вы пишете программы для встроенных систем ). Для вывода MSDOS ваши программы будут использовать расширитель DOS .

DeSmet C

DeSmet C должен быть знаком тем, кто программировал на C в 1980-х годах. Это компилятор C для MSDOS . Он был выпущен под лицензией GNU GPL и поставляется с руководствами, редактором и сторонним оптимизатором.

Apple Xcode для Mac OS X

Xcode — это интегрированная среда разработки Apple , которая включает в себя редактор с подсветкой синтаксиса, систему управления сборкой, отладчик, компилятор C GNU ( gcc ), конструктор интерфейса, AppleScript Studio , поддержку разработки на Java , инструменты разработки WebObjects . Чтобы получить в свое распоряжение данные инструменты необходимо быть участником Apple Developer Connection ( ADC ) . Но онлайн-членство является бесплатным.

Tiny C Compiler — самый компактный Linux C компилятор

Portable Object Compiler

Это набор библиотек классов и компилятор Objective C , который преобразует код Objective C в простой C-код . Работает на Windows , Linux , OS / 2 , Macintosh и т. д.

C & C++ компиляторы Mingw32

Эта система поставляется с компилятором GNU C / C++ , который можно использовать для создания исполняемых файлов Win32 . Она содержит собственный , который находится в открытом доступе. Предполагается, что приложения, созданные с использованием этой системы, будут быстрее, чем, те которые созданы с помощью Cygwin32 , и они не ограничиваются положениями лицензии GNU . Mingw32 поставляется с инструментами для обработки текста ( sed, grep ), генератором лексического анализатора ( flex ), генератором парсеров ( bison ) и т. д. Mingw32 также поставляется с компилятором ресурсов Windows .

Компилятор C / C++ GNU

На странице компилятора C GNU можно получить ссылки на бинарные файлы и исходный код для компилятора GNU C . Также можно использовать приведенные в этой статье ссылки на наиболее часто запрашиваемые бинарные версии ( MSDOS и Win32 ).

Компилятор C Pelles

Компилятор C Compaq

Пользователи Linux / Alpha теперь могут бесплатно скачивать и использовать компилятор Compaq , просто заполнив форму и приняв лицензионное соглашение. Компилятор может использоваться для генерации любых программ, коммерческих или иных. Он включает в себя математическую библиотеку и отладчик ( ladebug ), перенесенный из True64 Unix . Он поставляется с обычными справочными страницами, а также справочником по языку и руководством программиста.

Интерпретатор C / C++ Ch Embeddable (стандартная версия)

Интерпретатор C / C++ , поддерживающий стандарт ISO 1990 C ( C90 ), основные функции C99 , классы C++ , а также расширения к языку С , такие как вложенные функции, строковый тип и т. д. Он может быть встроен в другие приложения и аппаратные средства, использоваться в качестве языка сценариев. Код C / C++ интерпретируется напрямую без компиляции промежуточного кода. Поскольку этот интерпретатор поддерживает Linux , Windows , MacOS X , Solaris и HP-UX , созданный вами код можно перенести на любую из этих платформ. Стандартная версия бесплатна для личного, академического и коммерческого использования. Для загрузки пакета необходимо зарегистрироваться.

Компиляторы C и C++ DJGPP

Это система разработки, основанная на хорошо известном компиляторе C / C++ GNU . Она генерирует 32-разрядные исполняемые файлы MSDOS , которые являются файлами с длинными именами Windows 95 . Это очень функциональная система с IDE , графическими библиотеками, генераторами лексического анализатора ( flex ), генераторами парсеров ( bison ), утилитами обработки текста и так далее. Компилятор языка C , утилиты и библиотеки поставляются с исходным кодом.

Cilk — ANSI компилятор на основе C

Sphinx — компилятор C—

Компилятор C LSI C-86

Сайт этого компилятора написан на японском языке. Он выглядит как кросс-компилятор, позволяющий генерировать код для ROM . Старая версия компилятора ( 3.30c ) предоставляется бесплатно. Бесплатная версия работает только на MSDOS .

Кросс-компилятор C SDCC

Компилятор C LADSoft CC386

Это компилятор ANSI C для MSDOS / DPMI и Win32 , который поставляется с библиотекой среды выполнения, компоновщиком, отладчиком, DOS-расширителем ( версия MSDOS ), IDE ( версия Win32 ) и утилитой make . Также доступен исходный код. При работе в режиме совместимости с C99 он компилирует большинство конструкций C99 .

Проект Cygwin (компиляторы C и C ++)

Компилятор C LCC-Win32

Это компилятор C для Windows , который генерирует графический интерфейс Win32 и консольные приложения. Он поставляется со своим собственным компоновщиком, IDE , отладчиком, редактором и компилятором ресурсов. LCC- Win32 основан на компиляторе LCC и является бесплатным только для некоммерческого использования.

LCC — перенанаправляемый компилятор для ANSI C

LCC — это компилятор C ( только исходный код ), который генерирует код для Alpha , Sparc , MIPS R3000 и Intel x86 . Он является основой как минимум для двух других компиляторов Win32 C ( также описанных выше ).

Cyclone C

Leonardo IDE

Это IDE на базе Macintosh , компилятор и отладчик для программ на C . Он включает в себя редактор с подсветкой синтаксиса, ANSI C компилятор, компилятор для языка визуализации ALPHA , редактор графов, обратимый виртуальный процессор и т. д.

Обратите внимание, что программы в код, который будет выполняться для виртуального ЦПУ. Виртуальная машина и отладчик позволяют выполнять код вперед и назад и поддерживать многозадачность. IDE поставляется с анимированными алгоритмами, примерами исходного кода таких игр, как Tetris , Checkers и других. IDE полезна для проверки и отладки исходного кода, поиска процессов, неэффективно использующих память и т. д.

Примечание: этот проект был прекращен.

Turbo C 2.01

Пожалуйста, оставляйте ваши мнения по текущей теме материала. За комментарии, дизлайки, подписки, отклики, лайки огромное вам спасибо!

Дайте знать, что вы думаете по данной теме статьи в комментариях. Мы очень благодарим вас за ваши комментарии, подписки, лайки, дизлайки, отклики!

Дайте знать, что вы думаете по этой теме в комментариях. За комментарии, лайки, дизлайки, подписки, отклики огромное вам спасибо!

Обложка: Руководство по созданию интерпретатора языка Pascal на Python

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

Примеры кода приведены на Python, однако подробные пояснения позволят читателю использовать для реализации любой другой удобный язык. В качестве интерпретируемого языка выбран Pascal, однако и здесь вы не будете ограничены — можно обратиться к любому другому языку, с семантикой которого вы хорошо знакомы.

Если вы не знаете, как работает компилятор, то вы не знаете, как работает компьютер. И если вы не уверены на 100%, что знаете, как работает компилятор, то вы не знаете, как он работает. — Стив Йиг


Различие между компилятором и интерпретатором

Почему вам нужно создать свой интерпретатор:

  1. Написать компилятор — значит задействовать и/или развить сразу несколько различных технических навыков. Причем навыков, которые окажутся полезными в программировании вообще, а не только при написании трансляторов.
  2. Вы станете чуть ближе к разгадке тайны, как же все-таки работают компьютеры. Компиляторы и интепретаторы — это магия. И нужно чувствовать себя комфортно при работе с этой магией.
  3. Вы сможете создать собственный язык программирования, восполняющий видимые вам недостатки существующих. А это, во-первых, сейчас модно, а во-вторых, при достаточном везении вы обретете мировую известность.
  4. Да ну и чем вам еще сейчас можно заняться? (Кстати, мы уже предлагали вам несколько вариантов на зимние каникулы и лето.)

Что приятно, статьи подробно иллюстрируются. Создается впечатление, что автор перед вами ведет настоящую лекцию. Вот, например, одна из синтаксических диаграмм:


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

Часть 1. Основные понятия, разбиение на токены и сложение однозначных чисел.

Часть 2. Обработка пробельных символов, многозначные числа.

Часть 3. Синтаксические диаграммы, одиночные умножение и деление.

Часть 4. Множественные умножения и деления, форма Бэкуса-Наура.

Часть 5. Калькулятор с произвольным числом операций, ассоциативность и порядок выполнения операторов.

Часть 6. Заканчиваем калькулятор: произвольный уровень вложенности.

Часть 7. Базовые используемые структуры данных. Также рекомендуем эту серию статей.

Часть 9. Объявление программы, составные операторы, присваивание, таблицы символов и обработка переменных.

Часть 10. Продолжение предыдущей части руководства. Обработка комментариев.

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

Компилятор VS интерпретатор: ключевые отличия

Интерпретаторы и компиляторы отвечают за преобразование языка программирования или сценариев (язык высокого уровня) в машинный код. Но если обе программы делают одно и то же, чем они различаются? Давайте разберемся.

Компилятор

Что такое компилятор?

Компилятор — это компьютерная программа, которая переводит компьютерный код с одного языка программирования на другой. Компилятор берет программу целиком и преобразует ее в исполняемый компьютерный код. Для этого требуется целая программа, так как компьютер понимает только то, что написано двоичным кодом. Задача компилятора — преобразовать исполняемую программу в машинный код, который и распознается компьютером. Примерами скомпилированных языков программирования являются C и C++.

Компилятор в основном используется для программ, которые переводят исходный код с языка программирования высокого уровня на язык программирования более низкого уровня.

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

Интерпретатор

Что такое интерпретатор?

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

Интерпретатор представляет собой машинную программу, которая непосредственно выполняет набор инструкций без их компиляции. Примерами интерпретируемых языков являются Perl, Python и Matlab.

  • И компилятор, и интерпретатор выполняют одну и ту же работу — преобразовывают язык программирования высокого уровня в машинный код. Однако компилятор преобразовывает исходный материал в машинный код перед запуском программы. Интерпретатор выполняет эту функцию при ее запуске.

Как это работает?

Интерпретатор создает программу. Он не связывает файлы и не генерирует машинный код. Происходит построчное выполнение исходных операторов во время исполнения программы.

Читайте также: