Компиляторы — Из исходного кода в машинный / Хабр

Из исходного кода в машинный

Статьи Авторы Компании

Сначала показывать

Порог рейтинга

Уровень сложности

phillennium

Время на прочтение 27 мин

Количество просмотров

6.1K

Блог компании JUG Ru Group Java *C++ *Системное программирование *Компиляторы *

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

Вроде бы те и другие существуют в одной Java-экосистеме, но задачи совершенно разные. Поэтому редкое место, где они пересекаются и могут что-то поведать друг другу — Java-конференции.

Мы проводим их регулярно (уже в апреле будет JPoint). И на предыдущей нашей конференции Иван Углянский dbg_nsk поделился с Java-разработчиками тем, как всё выглядит с его стороны.

Чем он вообще занимается? Почему JVM-инженеры всё так медленно делают? На каком языке стоит писать рантайм, а на каком компилятор? Как «папка бога» в Windows привела к неожиданным последствиям? Может ли «обычный джавист» стать JVM-инженером?

Поскольку все эти вопросы из доклада звучат интересно, мы решили для Хабра сделать его текстовую версию (а для тех, кому удобнее видео, прикладываем ссылку на ютуб). Далее повествование идёт от лица Ивана.

Читать дальше →

Всего голосов 63: ↑63 и ↓0 +63

Комментарии 10

rsashka

Уровень сложности Средний

Время на прочтение 8 мин

Количество просмотров

2. 3K

Блог компании Timeweb Cloud Ненормальное программирование *Программирование *Совершенный код *Компиляторы *

Мнение

Близится релиз языка NewLang с принципиальной новой «фишкой», переделанным вариантом препроцессора, который позволяет расширять синтаксиса языка для создания различных диалектов DSL за счет макросов.

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


О чем идет речь?


DSL (Предметно-ориентированный язык) — язык программирования, специализированный для конкретной области применения. Считается, что использование DSL существенно повышает уровень абстрактности кода, а это позволяет вести разработку более быстро и эффективно и существенно упрощает решение многих задач.

Условно, можно выделить два подхода к реализации DSL:

  • Разработка независимых трансляторов синтаксиса с помощью генераторов лексеров и парсеров для определения грамматики целевого языка посредством БНФ и регулярных выражений (Lex, Yacc, ANTLR и т.  д.) и последующей компиляцией полученной грамматики в машинный код.
  • Разработка или встраивание диалекта DSL на языке (метаязыке) общего назначения, в том числе за счет применения различных библиотек или специальных парсеров / препроцессоров.

Далее речь пойдет о втором варианте, а именно, о реализации DSL на базе языков (метаязыков) общего назначения и новом варианте реализации макросов в NewLang как основы для разработки DSL.

Читать дальше →

Всего голосов 11: ↑11 и ↓0 +11

Комментарии 20

antoshkka

20 фев в 12:00

Время на прочтение 8 мин

Количество просмотров

20K

Блог компании Яндекс Программирование *C++ *Компиляторы *

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

Комитет занимался полировкой C++23:

  • static operator[];
  • static constexpr в constexpr-функциях;
  • безопасный range-based for;
  • взаимодействие std::print
    с другими консольными выводами;
  • монадический интерфейс для std::expected;
  • static_assert(false) и прочее.

И прорабатывал новые фичи C++26:

  • std::get и std::tuple_size для агрегатов;
  • #embed;
  • получение std::stacktrace из исключений;
  • stackful-корутины.

Подробности

Всего голосов 48: ↑47 и ↓1 +46

Комментарии 27

DCSinpo

Время на прочтение 29 мин

Количество просмотров

3. 9K

Open source *Программирование *Компиляторы *

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

Читать далее

Всего голосов 10: ↑10 и ↓0 +10

Комментарии 2

Sivchenko_translate

19 фев в 12:36

Время на прочтение 19 мин

Количество просмотров

6.3K

Криптография *Программирование *C++ *Компиляторы *

Перевод

Ещё в мае 2022 года я переориентировал пару команд в Google на разработку полностью гомоморфного шифрования (вот объявление об этом в рассылке). С тех пор я участвовал в работе над многими проектами в этой области, в частности, руководил поддержкой на github. com/google/fully-homomorphic-encryption – это опенсорсный ПГШ-компилятор для C++. В этой статье даётся вводная информация о том, как при помощи этого инструмента компилировать программы с расчётом на ПГШ. Также пробежимся по тому, из чего этот компилятор состоит.

Читать далее

Всего голосов 21: ↑20 и ↓1 +19

Комментарии 20

AceRodstin

Время на прочтение 9 мин

Количество просмотров

12K

Компиляторы *

Recovery mode

Некоторое время назад настроение политиков ведущих стран мира вызывало опасения в отношении будущего IT сектора. Санкции Microsoft, Apple, ARM, Ubuntu и многих других не то чтобы повлияли на рынок компьютеров, а полностью предопределили будущее направление развития отечественной кибер инфраструктуры. Об этом говорит политика импортозамещения, проводимая в России.

Поэтому, считаю, не стоит объяснять необходимость нового языка программирования. Если аргументов, представленных выше не достаточно, то в качестве дополнения можно указать избыточность (конструкции типа exactly-once в Python или присваивание как выражение всего, что только вздумается в Kotlin) существующих языков программирования. А также, устаревшую концепцию интерфейса в C++, устаревший стандарт snake_case стандартной библиотеки C++ и т.д.

Читать далее

Всего голосов 31: ↑4 и ↓27 -23

Комментарии 25

DCSinpo

Время на прочтение 32 мин

Количество просмотров

3.4K

Open source *Программирование *Компиляторы *

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

В данной статье мы продолжим начатое и рассмотрим следующую стадию анализа исходного кода программы — семантический анализ.

Читать далее

Всего голосов 17: ↑16 и ↓1 +15

Комментарии 21

YuriPanchul

Время на прочтение 2 мин

Количество просмотров

134K

Компиляторы *FPGA *Производство и разработка электроники *Искусственный интеллект Будущее здесь

Мнение

Вчера у меня в ленте на фейсбуке (жаль что в закрытом посте) проявился еще один аспект ChatGPT, жуть которого я не вполне осознавал. Представьте, что ваш менеджер присылает вам емейл: «я вот тут сгенерил с помощью ChatGPT код на языке описания аппаратуры SystemVerilog, который реализует мою идею, ты его поправь немного и в продакшн, а то нас сроки поджимают».

Почему это жутко? Потому что в обсуждаемом посте ChatGPT сгенерил так называемый несинтезируемый код. Это означает: код вроде и есть, и после массажирования даже будет компилироваться в симуляторе, но вот чип из него сделать нельзя. Никак, вообще никак. Для решения этой задачи нужно написать совсем другой код, у которого не будет ни одной строчки общего с тем, что прислал менеджер.

То есть менеджер думает, что вместе с ChatGPT сделал за вас 90% работы, а на самом деле.

Читать далее

Всего голосов 160: ↑146 и ↓14 +132

Комментарии 322

RustLangRu

Время на прочтение 2 мин

Количество просмотров

2.7K

Open source *Программирование *Системное программирование *Компиляторы *Rust *

Перевод

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

Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.67.0 вам достаточно выполнить команду:

rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.

Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Читать дальше →

Всего голосов 18: ↑18 и ↓0 +18

Комментарии 5

DCSinpo

Время на прочтение 36 мин

Количество просмотров

11K

Open source *Программирование *Компиляторы *

Из песочницы

Это первая статья из цикла о том, как создать свой собственный ООП язык программирования с использованием LLVM.

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

Читать далее

Всего голосов 52: ↑50 и ↓2 +48

Комментарии 16

Makcimka132

Время на прочтение 4 мин

Количество просмотров

12K

Программирование *Компиляторы *

Из песочницы

Приветствую всех читателей данной статьи.

Тут я постараюсь описать год усердной, тяжёлой работы на моим собственным компилятором языка программирования Rave.

Удачного чтения!

Читать далее

Всего голосов 30: ↑25 и ↓5 +20

Комментарии 52

Izaron

Время на прочтение 17 мин

Количество просмотров

6.3K

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

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

Я делаю расширяемый кодогенератор для C++, в котором можно реализовать много полезного. Примеры модулей: перевод значений enum в строку и обратно, перевод структуры в JSON и обратно, декларативный веб-сервер, система слотов и сигналов, свой динамический полиморфизм, генератор кода для тестов…

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

Читать далее

Всего голосов 22: ↑22 и ↓0 +22

Комментарии 12

RustLangRu

Время на прочтение 4 мин

Количество просмотров

3.7K

Open source *Программирование *Системное программирование *Компиляторы *Rust *

Перевод

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

Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.66.0 вам достаточно выполнить команду:

rustup update stable

Если у вас ещё нет rustup, то можете установить его со страницы на нашем веб-сайте, а также ознакомиться с подробным описанием выпуска 1.66.0 на GitHub.

Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Читать дальше →

Всего голосов 31: ↑31 и ↓0 +31

Комментарии 5

d7d1cd

Время на прочтение 5 мин

Количество просмотров

1.4K

Программирование *Компиляторы *

Разрабатывая для IBM i, я столкнулся с необычным, на мой взгляд, поведением линкера…

Читать далее

Всего голосов 1: ↑1 и ↓0 +1

Комментарии 12

Number571

Время на прочтение 12 мин

Количество просмотров

4.8K

Программирование *Assembler *Компиляторы *

Примерно год назад я писал язык программирования под названием ALLang. Расшифровка его звучит так: Another LISP Language, что незамысловато даёт понимание его второсортности. Тем не менее, таковой язык всё же предлагает интересные особенности в своей реализации со стороны эзотерических языков.

Читать далее

Всего голосов 23: ↑21 и ↓2 +19

Комментарии 9

vda19999

Время на прочтение 6 мин

Количество просмотров

3.2K

Ненормальное программирование *C++ *Assembler *Системное программирование *Компиляторы *

Эта статья написана по мотивам моей курсовой работы, основной смысл которой описан здесь. В процессе работы над ней мне понадобилось добавить в учебной ОС, над которой я работал, поддержку thread_local переменных, о чём я и хочу здесь рассказать в надежде что кому-то это окажется полезно.

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

Код расположен в двух репозиториях.

Читать далее

Всего голосов 7: ↑6 и ↓1 +5

Комментарии 4

tmteam

Время на прочтение 6 мин

Количество просмотров

2.9K

Open source *Программирование *.NET *Компиляторы *C# *

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

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

Let’s make some nFun!

Всего голосов 9: ↑9 и ↓0 +9

Комментарии 33

quasilyte

Время на прочтение 21 мин

Количество просмотров

4.7K

Блог компании VK PHP *Программирование *Системное программирование *Компиляторы *

Многие из нас пользовались шаблонизаторами текстов. Twig в PHP, text/template в Go, Jinja в Python — их сотни.

Но задумывались ли вы, как они устроены внутри? Какие вообще есть способы исполнить шаблон со сложными конструкциями? В этой статье разбираются возможные оптимизации и проблемы, которые могут возникнуть в той или иной реализации, а также то, как на наши решения может влиять язык программирования, на котором мы создаём этот шаблонизатор.

Наиболее детально рассмотрим KTemplate, который я написал для KPHP (на PHP он тоже работает без проблем).

Читать дальше →

Всего голосов 46: ↑46 и ↓0 +46

Комментарии 7

YuriPanchul

Время на прочтение 7 мин

Количество просмотров

9.6K

Компиляторы *Хакатоны FPGA *Программирование микроконтроллеров *Производство и разработка электроники *

10 лет назад в Санта-Клара, Калифорния, неподалеку от Интела и NVidia, стоял кампус Huawei. В нем работали не только китайцы, но и вообще обычная публика Silicon Valley — индусы, американцы, даже русские попадались. Бизнесмены калифорнийских электронных компаний говорили «Huawei — это дверь в Китай» и заключали с ними крупные сделки.

Но американское правительство Huawei невзлюбило. Можно обсусоливать те или иные поводы, но коренная причина понятна — американскому правительству хочется, чтобы Америка сохраняла технологическое преимущество. Ибо если технология коммодифицируется и айфон не будет ничем особенным, то кто будет читать брошурки про продвижение демократии, распостраняемые американскими посольствами в других странах? Над ними будут просто смеяться.

И вот правительство начало Huawei жучить — и от Андроида отлучило, и от других критических технологий. Но на всяких хитрецов найдется гайка с левой резьбой. И вот что Huawei стал делать по этому поводу.

Читать далее

Всего голосов 45: ↑30 и ↓15 +15

Комментарии 61

pmswga

Время на прочтение 14 мин

Количество просмотров

1.9K

PHP *C++ *Системное программирование *Компиляторы *

Всем доброго дня, уважаемые читатели. В данной статье вы узнаете как добавить новые функции в runtime KPHP, чтобы ими можно было пользоваться как ни в чём не бывало.

В качестве задачи — добавления функций для парсинга файлов и строк в формате env.

Рассмотрим этапы сборки KPHP, реализациий функций, написание тестов.

Читать далее

Всего голосов 12: ↑11 и ↓1 +10

Комментарии 1

Компиляторы: принципы, технологии и инструментарий – книга и теория компиляторов

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

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

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

 

Компиляторы: принципы, технологии, инструменты

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

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

  2. Автокод — это код, который очень похож на машинный код, но таковым не является.

  3. Ассемблер — это скрипт, который может перевести исходную программу, выраженную автокодом, в исполняемый код.

  4. Интерпретатор — это скрипт, который просто выполняет код, который в него поступил.

Компиляторы можно разработать на автокоде или на высокоуровневых языках. Также есть специализированные языки для разработки компиляторов — «компиляторы компиляторов» (КК).

 

Компиляторы: принципы и технологии

Еще раз уточним, что компилятор ничем не отличается от обычного транслятора (программы переводчика). То есть фактически то, что мы делаем, когда переводим текст с русского на английский, чтобы объяснить иностранцу, как найти Большой Театр, — это же действие проводит компилятор с нашей написанной программой, просто в роли «иностранца» будет компьютер, который воспринимает только собственный машинный код.

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

Любые компиляторы используют следующие принципы и технологии в своей работе:

  1. Проводят лексический анализ кода;

  2. Проводят синтаксический анализ кода;

  3. Генерируется промежуточный код;

  4. Код оптимизируется;

  5. Распределяется память между переменными компилируемого скрипта;

  6. Генерируется объектный код и компонуются программные сегменты.

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

 

Теория компиляторов

Теория компиляторов возникла еще в 70-х годах прошлого столетия. Тогда программисты прониклись идеей создать единый язык программирования для всего на свете и единый компилятор.

Но мир меняется, и требования к языкам программирования тоже меняются. Программы решают очень разносторонние задачи, и представить, что все можно написать одним языком программирования, очень сложно. Ведь сфера деятельности у программирования разная: одно дело писать скрипт для управления полетом баллистической ракеты, а другое — скрипт для начисления зарплаты 10-ти сотрудникам. Задачи разные, подходы разные, языки программирования разные, соответственно, и компиляторы будут разные.

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

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

 

Книги для разработки компилятора

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

  1. «Компиляторы. Принципы, технологии и инструментарий». Ахо Альфред В. , Лам Моника С. Данная книга есть в 2-х изданиях, последнее издание ориентировано на современные реалии. Но полезным будут оба издания, чтобы вы могли посмотреть, как менялась теория создания компиляторов.

  2. «Engineering a compiler». Книга наполнена материалом, затрагивающим последние тенденции в разработке компиляторов.

  3. «Modern Compiler Implementation». Andrew W. Appel. В этой книге четко проработаны все этапы создания компилятора. Есть информация, чем отличается создание компиляторов для разных языков программирования. Также есть целая серия книг с похожим названием, но для разных языков программирования: Java, C, ML и др.

  4. «Introduction to Compiler Design». В этой книге подробно описано, как создавать компиляторы для простых ЯП. Очень подробно описана сама концепция создания компилятора.

  5. «Compiler Construction». Это «живая» книга, которая постоянно обновляется. У нее нет конкретных авторов, ее пишет вики-сообщество. Много практических моментов. Основной посыл книги — это то, что создать собственный компилятор может даже новичок.

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

К

  • Роберт Шелдон

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

Компилятор — это специальная программа, которая переводит исходный код языка программирования в машинный код, байт-код или другой язык программирования. Исходный код обычно пишется на языке высокого уровня, понятном человеку, таком как Java или C++. Программист пишет исходный код в редакторе кода или в интегрированной среде разработки (IDE), которая включает в себя редактор, сохраняя исходный код в один или несколько текстовых файлов. Компилятор, поддерживающий исходный язык программирования, читает файлы, анализирует код и переводит его в формат, подходящий для целевой платформы.

Компиляторы, преобразующие исходный код в машинный, предназначены для конкретных операционных систем и компьютерных архитектур. Этот тип вывода иногда называют объектным кодом (который не имеет отношения к объектно-ориентированному программированию). Выводимый машинный код полностью состоит из двоичных битов — 1 и 0 — поэтому он может быть прочитан и выполнен процессорами на целевых компьютерах. Например, компилятор может выводить машинный код для платформы Linux x64 или 64-разрядной платформы Linux ARM.

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

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

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

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

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

  • Лексический анализ. Компилятор разбивает исходный код на лексемы, которые представляют собой отдельные фрагменты кода, представляющие определенные шаблоны в коде. Затем лексемы токенизируются для подготовки к синтаксическому и семантическому анализу.
  • Анализ синтаксиса. Компилятор проверяет правильность синтаксиса кода на основе правил исходного языка. Этот процесс также называется парсингом. На этом этапе компилятор обычно создает абстрактные синтаксические деревья, представляющие логические структуры определенных элементов кода.
  • Семантический анализ. Компилятор проверяет правильность логики кода. Этот шаг выходит за рамки анализа синтаксиса и проверяет точность кода. Например, семантический анализ может проверить, были ли переменным присвоены правильные типы или правильно ли они были объявлены.
  • Генерация ИК-кода. После прохождения кодом всех трех фаз анализа компилятор создает промежуточное представление (IR) исходного кода. IR-код упрощает перевод исходного кода в другой формат. Однако он должен точно представлять исходный код во всех отношениях, не упуская ни одной функциональности.
  • Оптимизация. Компилятор оптимизирует код IR при подготовке к окончательной генерации кода. Тип и степень оптимизации зависят от компилятора. Некоторые компиляторы позволяют пользователям настраивать степень оптимизации.
  • Генерация выходного кода. Компилятор генерирует окончательный выходной код, используя оптимизированный код IR.
Диаграмма, иллюстрирующая порядок типичных шагов компилятора.

Иногда компиляторы путают с программами, называемыми интерпретаторами. Хотя эти два похожи, они различаются важными способами. Компиляторы анализируют и конвертируют исходный код, написанный на таких языках, как Java, C++, C# или Swift. Они обычно используются для генерации машинного кода или байт-кода, который может выполняться целевой хост-системой.

Интерпретаторы не генерируют ИК-код и не сохраняют сгенерированный машинный код. Они обрабатывают код по одному оператору во время выполнения без предварительного преобразования кода или его предварительной подготовки для конкретной платформы. Интерпретаторы используются для кода, написанного на языках сценариев, таких как Perl, PHP, Ruby или Python.

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

Последнее обновление: апрель 2022 г.

Продолжить чтение о компиляторе
  • Сравнение 6 лучших языков программирования
  • Статическая и динамическая типизация: подробности и различия
  • 5 мертвых языков программирования, которые мы никогда не должны забывать
  • Парадигма функционального программирования в масштабе предприятия
  • Интерпретируемые и компилируемые языки: в чем разница?
управление мобильными устройствами
Программное обеспечение

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

Сеть

  • физический слой

    Физический уровень — это первый и самый нижний уровень модели связи Open Systems Interconnection (OSI).

  • коаксиальный кабель

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

  • мегагерц (МГц)

    Мегагерц (МГц) — это множитель, равный одному миллиону герц (106 Гц). Герц — стандартная единица измерения частоты в …

Безопасность

  • фазз-тестирование (фаззинг)

    Fuzz-тестирование (фаззинг) — это метод обеспечения качества, используемый для обнаружения ошибок кодирования или ошибок, а также лазеек в системе безопасности в программном обеспечении…

  • SOAR (организация безопасности, автоматизация и реагирование)

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

  • цифровая подпись

    Цифровая подпись — это математический метод, используемый для проверки подлинности и целостности сообщения, программного обеспечения или цифрового…

ИТ-директор

  • доказательство концепции (POC)

    Доказательство концепции (POC) — это демонстрация продукта, при которой работа сосредоточена на определении того, можно ли превратить идею в …

  • хорошие навыки

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

  • управление корпоративными проектами (EPM)

    Управление корпоративными проектами (EPM) представляет собой профессиональные практики, процессы и инструменты, используемые для управления несколькими …

HRSoftware

  • пассивный кандидат

    Пассивный кандидат (пассивный кандидат на работу) — это любой работник, который не ищет работу активно.

  • проверка сотрудников

    Проверка сотрудников — это процесс проверки, проводимый работодателями для проверки биографических данных и проверки информации о новом…

  • Эффект хоторна

    Эффект Хоторна — это изменение поведения участников исследования в ответ на их знание о том, что они …

Служба поддержки клиентов

  • квалифицированный маркетолог лид (MQL)

    Квалифицированный маркетолог (MQL) — это посетитель веб-сайта, уровень вовлеченности которого указывает на то, что он может стать клиентом.

  • автоматизация маркетинга

    Автоматизация маркетинга — это тип программного обеспечения, которое позволяет компаниям эффективно ориентироваться на клиентов с помощью автоматизированного маркетинга …

  • успех клиента

    Успех клиента — это стратегия, направленная на то, чтобы продукция компании соответствовала потребностям клиента.

Введение в компиляторы — GeeksforGeeks

Компилятор — это программное обеспечение, которое обычно принимает код на языке высокого уровня (например, C++ и Java) в качестве входных данных и сразу же преобразует входные данные в язык более низкого уровня. В нем перечислены все ошибки, если входной код не соответствует правилам своего языка. Этот процесс намного быстрее, чем интерпретатор, но становится сложно отлаживать все ошибки вместе в программе.

 
Компилятор — это программа-переводчик, которая переводит инструкции языка высокого уровня в язык машинного уровня. Программа, поступающая на вход компилятора, называется 9.0041 Исходная программа . Эта программа теперь преобразована в язык машинного уровня компилятором, известным как объектный код .

 

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

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

Следующим шагом является синтаксический анализ, когда компилятор проверяет код на наличие синтаксических ошибок и гарантирует, что он соответствует правилам языка программирования. Компилятор создает абстрактное синтаксическое дерево (AST), которое представляет структуру кода.

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

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

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

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

Компиляторы также позволяют разрабатывать программное обеспечение для различных платформ и архитектур. Единая кодовая база может быть скомпилирована в исполняемый код, который работает в нескольких операционных системах, таких как Windows, macOS и Linux. Эта кросс-платформенная совместимость упрощает разработку программного обеспечения, которое может использоваться широким кругом пользователей.
 

Существуют разные компиляторы:


 
  • Кросс-компилятор – Скомпилированная программа может работать на компьютере, процессор или операционная система которого отличается от той, на которой работает компилятор.
     
  • Компилятор Bootstrap — Компилятор, написанный на языке, который он собирается компилировать.
     
  • Декомпилятор – Компилятор, осуществляющий трансляцию с языка низкого уровня на язык более высокого уровня.
     
  • Транскомпилятор — Компилятор, переводящий языки высокого уровня.
     

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

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

Наиболее часто используемые компиляторы с точки зрения компьютерных языков —

  • C — Turbo C, Tiny C Compiler, GCC, Clang, Portable C Compiler
  • C++, Dev C++ 9,0042 -GCC , Кодовый блок
     
  • Java — Intellij Idea, Eclipse IDE, Netbeans, BlueJ, JDeveloper
  • Kotlin — INTELLIJ IDEA, ECLIPSE IDE
  • Python — CPYTHON, JDPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON, SPYTHON.