Изучение языков программирования
Я программировал в течение многих лет (в основном Python), но я не понимаю, что происходит за кулисами при компиляции или выполнении моего кода.
В начале question я спросил ранее об операционных системах, я ищу нежное введение в программирование языка программирования. Я хочу уметь определять и понимать основы таких терминов, как компилятор, интерпретатор, собственный код, управляемый код, виртуальная машина и т.д. Что было бы интересным и интерактивным способом узнать об этом?
Ответы
Ответ 1
Код для выполнения в двух словах
Программа (код) подается в компилятор (или интерпретатор).
Символы используются для формирования жетонов (+, идентификаторов, чисел), а их значение хранится в какой-то вещи, называемой таблицей символов.
Эти токены объединяются для формирования операторов: (int a = 6 + b * c;). В основном в виде дерева синтаксиса:
=
/ \
/ \
a +
/ \
/ \
6 *
/ \
b c
Внутри интерпретатора дерево выполняется непосредственно.
С компилятором дерево, наконец, преобразуется в код промежуточного кода или ассемблера.
Теперь у вас есть один или несколько "объектных файлов". Они содержат код ассемблера без точных переходов (поскольку эти значения еще не известны, особенно если цели находятся в других объектных файлах).
Объектные файлы связаны вместе с компоновщиком, который заполняет пробелы для переходов (ссылки ans). Результатом компоновщика является библиотека (которая также может быть связана) или исполняемый файл.
Если вы запустите исполняемый файл, данные программы будут скопированы в память, и есть еще несколько ссылок на jugling для соответствия указателям с правильными ячейками памяти. И тогда управление передается первой инструкции.
Ответ 2
компиляторы, интерпретаторы и виртуальные машины - всего лишь примеры деталей реализации. То, что вы можете посмотреть, это теория языков программирования, генеративная грамматика, языковые переводчики, и вам нужна, возможно, некоторая компьютерная архитектура, чтобы связать теорию с реализациями.
Лично я узнал из Sebesta book. Это дает очень широкое введение в тему, не вдаваясь в мельчайшие детали. Он также имеет хорошую главу об истории языков программирования (~ 20 языков ~ 3 газеты на язык). В нем есть хорошее объяснение грамматики и теории языков в целом. Кроме того, он дает хорошее введение в парадигмы Схемы, Пролога и программирования (Логика, Функциональный, Императивный ^, Объектно-ориентированный).
^ Он больше концентрируется на императивной парадигме, чем первые два.
Ответ 3
В основных терминах вы пишете исходные файлы. Это причудливые текстовые файлы, которые берутся compiler, который выводит какой-то исполняемый код (что его выполняет, зависит от типа кода, о котором вы говорите). Компилятор имеет несколько частей:
- Некоторая форма preprocessing в файле, который обрабатывает макросы и т.п. (например, с C).
- A parser, который принимает исходные файлы, проверяет, что они соответствуют синтаксическим правилам вашего языка и преобразует файл в структуру данных в памяти, которая легче манипулируется другими частями программы. Это называется Абстрактный синтаксис Дерево или AST.
- Некоторая форма анализа AST, которая проверяет, что фактический код, который вы написали, не нарушает никаких правил языка (например, рекурсия на языке, который его не поддерживает), а также многое другое.
- Optimization, например оптимизация хвостовых вызовов, оптимизация циклов и многие другие виды оптимизации.
- генерация кода, который является фактическим процессом принятия окончательного AST и любых других сгенерированных данных и превращения его в двоичный файл некоторых сортировка, которая может быть выполнена или интерпретирована.
Интерпретатор:
Интерпретатор - это программа, которая принимает в какой-то форме двоичные данные, которые представляют собой программу, не скомпилированную для кода, непосредственно исполняемого целевой машиной, и выполняет команды внутри. Примерами являются python, java и lua.
Исходный код:
Это код, который был скомпилирован в собственные инструкции, непосредственно исполняемые целевой машиной. Например; если вы запустите на архитектуре x86, тогда С++ скомпилирует исполняемый файл, который будет понятен процессору.
Виртуальная машина:
Это, как правило, программа, созданная для моделирования конструкции и работы процессора. Это может быть так же просто, как программа, которая читает в bytecode и запускает операции на родном языке, основанные на командах, которые представляет байтовый код (хотя вызов этого виртуальная машина может быть растянутой), или она может быть такой же сложной, как полная имитация поведения процессора и всех связанных с ним периферийных устройств.
эти другие ответы имеют хорошие моменты в них, но эта информация и ссылки должны помочь вам начать. Любые другие вопросы, просто спросите!
(Большая часть этой статьи была написана с помощью википедии, хотя некоторые из них были записаны из памяти)
Ответ 4
На этом сайте есть отличная серия лекций о структуре и интерпретации компьютерных программ, что является именно тем типом, который вы хотите учить. Сопровождающий учебник тоже полезен, я лично прочитал все это. Я думаю, что смотреть лекции довольно хорошо, вы получаете около 60% пути.
Ответ 5
О, это огромный вопрос с множеством письменных книг об этом. Я действительно сомневаюсь, что вы получите достойный ответ в этом вопросе. Вам нужно попасть в свой локальный книжный магазин или забрать несколько классов comp sci.
Чтобы быстро ввести:
- Компилятор: Программа, которая преобразует написанный код в инструкции, которые понятны процессору.
- Интерпретатор: Программа, которая считывает письменный код и "на лету" переводит и предоставляет соответствующие инструкции для процессора.
- Управляемый код: Код, который выполняется на виртуальной машине, например. для обеспечения межплатформенной совместимости (Java).
- Виртуальная машина: Программа, которая эмулирует поведение, а точнее API, полномасштабной компьютерной среды. Помимо прочего, это дает некоторые преимущества безопасности и совместимость с платформами.
Ответ 6
http://en.wikipedia.org/wiki/Dragon_Book_(computer_science) будет объяснять многие из этих концепций, вы должны дать ему прочитать, это было настоящим открытием для меня.
Ответ 7
Если вы хотите знать, как перейти от исходного кода к тому, что действительно работает на целевой машине, вы должны получить копию знаменитого Red Dragon Книга. Я использовал его для создания парсеров и лексических анализаторов. Хотя это датируется 1986 годом, и я уверен, что есть промежуточный прогресс, насколько я могу судить, он не был превзойден как текст.
Похоже, что Эддисон-Уэсли сделал перепечатку своего предшественника - книги "Зеленый дракон" и передал его как нечто недавнее, поэтому будьте осторожны, чтобы получить подлинную статью.
Ответ 8
Когда я узнал о программировании, где-то во второй половине прошлого века, я узнал, что все нужно преобразовать в машинный код. Языки Script могли бы решить, какой код вызывать на основе сценария. Скомпилированный код сначала будет скомпилирован в p-код, который означает предварительно скомпилированный код, который необходимо связать с другим прекомпилированным кодом для создания полного приложения. Мне тогда понравился Turbo Pascal, просто потому, что Turbo Pascal скомпилирован непосредственно к коду machione, и он не использовал промежуточный р-код между ними. То есть до Turbo Pascal 4.0, который создал *.tpu скомпилированные единицы. Большинство других компиляторов будут компилироваться в формате .obj.
Когда Java была создана, что-то относительно новое стало популярным. В принципе, компилятор Java просто компилирует код в некоторый двоичный файл Script. Этот Script можно было бы интерпретировать, хотя вскоре этот механизм тоже изменился.
В настоящее время переводчики почти вымерли. Большинство скриптовых языков сначала будут скомпилированы в машинный код, тогда машинный код будет храниться в некотором кеше и, таким образом, он может быть выполнен очень быстро, без необходимости повторной интерпретации каких-либо повторяющихся инструкций. Это хорошо работает для текстовых и двоичных скриптов. PHP будет примером текстового script. Java и .NET являются двоичными сценариями, поскольку вы обычно компилируете код в этот двоичный формат Script. (Они будут называть это разными, но я думаю, что бинарные скрипты звучат лучше.)
В общем, трюк состоит в том, чтобы преобразовать код в машинный код, используя любые возможные способы. Было много способов сделать это, и это немного сложно, чтобы все было ясно.
Я также помню время, когда я мог написать приложение на С++, где SQL-запросы были бы расположены внутри самого кода. Это было очень практично, но для этого требовался препроцессор, который сначала проанализировал бы инструкции SQL из кода, чтобы преобразовать это в другие операторы С++ и заменив операторы SQL на эти более сложные команды С++. Тогда все это будет скомпилировано в p-код. Затем вам нужно связать его с дополнительными библиотеками SQL, и, наконец, у вас был исполняемый файл.
Ответ 9
Эта лекция из Стэнфорда охватывает несколько языков программирования вплоть до бит и болтов, включая Python (хотя я только смотрел пара из C).
Ответ 10
Вы можете найти много лекций. Например, в Itunes U