На чем написан компилятор си

Компилятор C написан на C

В принципе логично, но кто-нибудь знает, первый компилятор как был сделан? :-0

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Re: Компилятор C написан на C

> В принципе логично, но кто-нибудь знает, первый компилятор как был сделан? :-0

Издеваешься, что-ли? На ассемблере, естественно.

Re: Компилятор C написан на C

вот мы сейчас свой язык делаем kernfach:) сперва пишем на Си простенький транслятор kernfach->C. А реальный компилятор будем писать на самом kernfach.

Re: Компилятор C написан на C

по ходу первые компиляторы ассемблера были написаны последовательностью нулй и единиц (машинных команд).

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Re: Компилятор C написан на C

dilmah, это правильный подход, после бутстрапа компилятор считается платформо-независимым.

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Re: Компилятор C написан на C

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

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Re: Компилятор C написан на C

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Re: Компилятор C написан на C

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Re: Компилятор C написан на C

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

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Re: Компилятор C написан на C

> то есть самый первый компилятор C написанный на C был скомпилирован руками

да уж, в компилеростроении с кривыми руками делать нечего:)

Источник

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

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

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

Зачем нужен компилятор?

Процессор — самая важная часть компьютера. Он обрабатывает информацию, выполняет команды пользователя и следит за работой всех подключенных устройств. Но процессор может разобрать только машинный код — набор 0 и 1, которые записаны в определённом порядке.

Почему именно 0 и 1? В процессор поступают электрические сигналы. Сильный сигнал обозначается цифрой 1, а слабый — 0. Набор таких цифр обозначает какую-то команду. Процессор ее распознает и выполняет.

Программы для первых компьютеров выглядели как огромные наборы 0 и 1. Чтобы записать такую программу, инженеры пользовались гибкими картонными карточками — перфокартами. Цифры на перфокарте записывались поочередно, в несколько строк. Чтобы записать 1, программист делал отверстие в карте. Места без отверстия обозначали 0.

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Компьютер считывал перфокарту специальным устройством и выполнял записанную команду. Для одной программы составляли сотни перфокарт.

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

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

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

Преобразование программного кода в машинный называется компиляцией. Компиляция только преобразует код. Она не запускает его на исполнение. В этот момент он “статически” (то есть без запуска) транслируется в машинный код. Это сложный процесс, в котором сначала текст программы разбирается на части и анализируется, а затем генерируется код, понятный процессору.

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Разберём этапы компиляции на примере вычисления периметра прямоугольника:

После запуска программы компилятору нужно определить, какие команды в ней записаны. Сначала компилятор разделяет программу на слова и знаки — токены, и записывает их в список. Такой процесс называется лексическим анализом. Его главная задача — получить токены.

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

Так операция P = 2*(a + b) будет преобразована в логическое дерево:

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

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

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

На чем написан компилятор?

В 1950-е годы группа разработчиков IBM под руководством Джона Бэкуса разработала первый высокоуровневый язык программирования Fortran, который позволил писать программы на понятном человеку языке. Помимо языка, инженеры работали и над компилятором. Он представлял собой программу с набором исполняемых команд, которая могла компилировать другие программы на Fortran, в том числе и улучшенную версию себя.

В дальнейшем язык Fortran и его компилятор использовали, чтобы написать компиляторы для новых языков программирования. Такой подход используют программисты и в настоящее время. Писать машинный код долго и неудобно. К тому же, для современных процессоров он может отличаться. Придется писать несколько версий одного и того же компилятора для разных компьютеров. Быстрее и проще написать компилятор на существующем языке программирования. Для этого разработчики выбирают удобный язык и пишут на нем первую версию своего компилятора. Он будет более универсальным для компьютеров и легко скомпилирует улучшенную версию себя. На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

Какие бывают компиляторы?

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

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

Если программа будет работать на нескольких операционных системах, то нужен кросс-компилятор — компилятор, который преобразует универсальный машинный код. Например, GNU Compiler Collection(сокращенно GCC) поддерживает C++, Objective-C, Java, Фортран, Ada, Go и поддерживает разную архитектуру процессоров.

Начинающие программисты даже не знают о наличии компилятора на компьютере. Они пишут программы в интегрированной среде разработки, в которую встроен компилятор, а иногда и не один. В этом случае, выбор компилятора делает среда, а не программист. Например, MS Visual Studio поддерживает компиляторы для операционных систем Windows, Linux, Android. Выбирая тип проекта, Visual Studio определяет процессор и операционную систему компьютера, и после этого выбирает подходящий компилятор.

Какие ошибки может определить компилятор?

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

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

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

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

Частые вопросы

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

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

Источник

Первый компилятор C от Денниса Ритчи — на Github

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си
Компьютер DEC с носителем DECtape

На Github выложили last1120c и prestruct-c — ранние версии самого первого компилятора С в истории. Код написан самим Деннисом Ритчи в 1972-1973 гг.

Компиляторы найдены несколько лет назад на старой магнитной ленте DECtape, вставленной в антикварный компьютер VAX производства компании DEC.

Деннис Ритчи известен как создатель языка программирования C и ключевой разработчик операционной системы UNIX, чем внёс неоценимый вклад в развитие компьютерной науки и вычислительной техники. К сожалению, величие заслуг Ритчи перед человечеством большинство из нас осознало только после его смерти в 2011 году.

Как написал сам автор в истории создания языка C, ключевыми стали 1972-1973 годы: именно тогда произошёл переход от бестипового языки B к слабо типизованному C, с переходной стадией NB. Ни один из предшествующих языков не сохранился до наших дней.

Ранние версии первого компилятора C удалось с трудом скомпилировать в самого себя, используя ранние эмуляторы Unix для PDP-11. Тем не менее, сам компилятор сегодня совершенно непригоден к использованию, он представляет исключительно историческую ценность.

Кроме катушки с кодом last1120c, найдена лента с кодом prestruct-c, это предварительная копия компилятора до внесения изменений в структуры. Ранний компилятор ничего не знает о структурах, строка struct нигде не появляется. В версии last1120c структуры появились, но синтаксис сильно отличается от современного C и даже от K&R I (ранняя версия C). В общем, это очень древний реликт.

Источник

Как я писал компилятор С++. Пересказ спустя 15 лет

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

На чем написан компилятор си. Смотреть фото На чем написан компилятор си. Смотреть картинку На чем написан компилятор си. Картинка про На чем написан компилятор си. Фото На чем написан компилятор си

С чего все начиналось

В далеком 2001-ом году, когда мне купили первый компьютер Duron 800mhz/128mb ram/40gb hdd, я стремительно взялся за изучение программирования. Хотя нет, сначала меня постоянно мучил вопрос, что же поставить Red Hat Linux, FreeBSD или Windows 98/Me? Ориентиром в этом бесконечном мире технологий для меня служил журнал Хакер.
Старый такой, стебный журнал. К слову, с тех пор, стиль изложения в этом издании почти не поменялся.

Виндузятники, ламеры, трояны, элита, линух — вот это все сносило крышу. Реально хотелось
поскорей освоить этот весь стек, которые они там печатали и хакнуть Пентагон (без интернета).
Внутренняя борьба за то, становиться ли Линуксоидом или рубится в игры на винде продолжалась до тех пор, пока в дом не провели интернет. Модемный, скрежечащий 56kb/s интернет, который занимал телефон на время подключения, и качал mp3-песню в районе получаса. При цене порядка 0.1$/mb, одна песня вытягивала на 40-50 центов. Это днем.

А вот ночью, были совсем другие расценки. Можно было с 23.00 до 6.00 залипать во все сайты не отключая изображения в браузере! Поэтому все что можно было скачать из сети за ночь, качалось на винт, и далее прочитывалось уже днем.
В первый день, когда мне домой провели и настроили сеть, админ передо мной открыл IE 5 и Яндекс. И быстро ретировался. Думая, что же первым делом искать в сети, я набрал что-то вроде «сайт для программистов». На что первой ссылкой в выдаче выпал совсем недавно открывшийся rsdn.ru. И на нем я стал зависать продолжительное время, испытывая чувство неудовлетворенности, от того, что мало что понимаю. На то время флагманом и самым популярным языком на форуме (да и вообще) был С++. Поэтому вызов был брошен, и ничего не оставалось, как догонять бородатых дядек в их знаниях по С++.
А еще был не менее интересный сайт на то время — firststeps.ru. Я до сих пор считаю их метод подачи материала наилучшим. Маленькими порциями (шагами), с небольшими конечными результатами. Тем не менее все получалось!

Но вернемся к теме поста. Осилив Кнута, надо было двигаться дальше. Попутно я сходил на курсы Turbo Pascal, прочитал Кернигана и Ритчи, а за ними С++ за 21 день. Из С и С++, мне было не все понятно, я просто брал и переписывал тексты из книг. Загуглить или спросить было не у кого, но зато времени было вагон, так как школу я забросил и перешел в вечернюю, в которую можно было практически не ходить, или появляться на 3-4 урока в неделю.
В итоге с утра до ночи, я фанатично развивался, познавая все новые и новые темы. Мог написать калькулятор, мог написать простое приложение на WinApi. На Delphi 6 тоже получалось что-то нашлепать. В итоге, получив диплом о среднем образовании, я уже был подготовлен на уровне 3-4 курса университета, и разумеется на какую специальность идти учится вопроса не стояло.

Поступив на кафедру Компьютерных систем и сетей, я уже свободно писал на С и С++ задачи любого уровня сложности университета. Хотя, зайдя на тот же rsdn.ru, понимал, как много еще нужно изучить и насколько бывалые форумчане прокаченней меня в плюсах. Это задевало, непонимание и вместе с тем жгучее желание знать все, привело меня к книге «Компиляторы. Инструменты. Методы. Технологии» — А.Ахо, Рави Сети. В простонародье именуемой книгой Дракона. Вот тут и началось самое интересное. Перед этой книгой, был прочитан Герберт Шилдт, Теория и практика С++, в которой он раскрывал продвинутые темы разработки, такие как шифрование, сжатие данных, и самое интересное — написание собственного парсера.

Начав скрупулезно изучать книгу дракона, двигаясь от лексического анализа, затем к синтаксическому и наконец к проверке семантики и генерации кода, ко мне пришло судьбоносное решение — написать свой компилятор С++.
— А почему бы и нет, спросил себя?
— А давай, ответила та часть мозга, которая с возрастом становится все скептичней ко всему
новому. И разработка компилятора началась.

Подготовка

Модемный интернет к тому времени мне перекрыли, в силу смены телефонных линий на цифровые, поэтому для ориентира был скачан стандарт ISO C++ редакции 1998 года. Уже полюбившимся и привычным инструментом стала Visual C++ 6.0.
И по сути задача свелась к тому, чтобы реализовать то, что написано в стандарте С++. Подспорьем в разработке компилятора была книга дракона. А отправной точкой, был парсер-калькулятор из книги Шилдта. Все части пазла собрались воедино и разработка началась.

Препроцессор

Лексический анализатор

Синтаксический анализатор

nrcpp/Parser.cpp
Задача синтаксического анализатора — проверить правильность расстановки лексем, который были получены на этапы лексического анализа.
За основу синтаксического анализатора были взяты опять же простенький парсер из Шилдта, прокаченный до уровня синтаксиса С++, с проверкой переполнения стека. Если мы например напишем:

То мой рекурсивный анализатор съест стэк, и выдаст, что выражение слишком сложное.
У внимательного читателя, может возникнуть вопрос. А зачем изобретать велосипед, ведь был же yacc и lex. Да, был. Но на том этапе, хотелся велосипед с полным контролем над кодом. Разумеется в производительности он уступал сгенерированному этими утилитами коду. Но не в этом была цель — техническое совершенство. Цель была — понять все.

Семантика

Занимает соотвественно главы с 3-ей по 14-ую стандарта ISO C++ 98. Эта наиболее сложная часть, и я уверен, что >90% С++ разработчиков не знает всех правил описанных в этих разделах. Например:
Знали ли вы, что функцию можно объявлять дважды, таким образом:

Есть такие конструкции для указателей:

А это указатель на функцию-член класса X:

Это первое, что пришло в голову. Стоит ли говорить, что при тестировании кода из стандарта в Visual C++ 6, я не редко получал Internal Compiler Error.

Разработка анализатора семантики языка заняла у меня 1.5 года, или полтора курса универа. За это время меня чуть не выгнали, по другим предметам кроме программирования, за счастье получалась тройка (ну, ок четверка), а компилятор тем временем разрабатывался и обрастал функционалом.

Генератор кода

Чего нет в nrcpp?

Зачем писать свой велосипед?

А в заключении хочу отметить то, ради чего писалась этот пост. Написание своего велосипеда, даже если на это потрачено 2 с лишним года, кормит меня до сих пор. Это бесценные знания, база, которая будет с Вами на протяжении всей карьеры разработчика. Будут меняться технологии, фреймворки, выходить новые языки — но фундамент в них будет заложен из прошлого. И на их понимание и освоение уйдет совсем немного времени.

Источник

Как компилятор может быть написан на том же языке который он компилирует?

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

1 ответ 1

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

С другими языками также такое происходило. К примеру, go был вначале написан на си, а потом код так модифицировали, что бы он был максимально похож на go код (https://go-review.googlesource.com/c/go/+/5652).

Но как появился самый первый компилятор тогда? Есть хорошая статья https://jameshfisher.com/2018/01/11/bootstrapping-a-c-compiler/ которая описывает, как поэтапно можно это сделать.

То есть, вначале все пишется ручками в памяти, в ноликах и единицах, потом постепенно наращиваются инструменты и в конце концов, такими итерациями можно дойти до современного мира. Вот люди пишут простейший си компилятор https://github.com/rdtscp/c-bootstrap

И будет ли трансляция в ассемблер по сути равна компиляции

если у нас есть компилятор ассемблера, то да. Почему «компилятор»? потому что ассемблеры бывают разные. Тот же FLAT assembler обладает таким разувесистым синтаксисом, что я бы побоялся его называть его компилятор «программой для замены на двоичный код».

Да, процесс, когда компилятор компилирует сам себя называется bootstrapping. и это не имеет отношения к html.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *