3.1 Введение
В первой и второй главах описываются два основных элемента программирования: тесная связь между данными и функциями. Мы увидели, как высокоуровневые функции могут рассматривать функции как операции над данными. Также мы увидели, что данные могут использовать передачу сообщений и связывать поведение с объектными системами. Мы изучили методы организации больших программ, такие как абстракция функций, абстракция данных, наследование классов и универсальные функции. Эти основные концепции составляют прочную основу для создания модульных, поддерживаемых и расширяемых программ.
Эта глава посвящена третьему основному элементу программирования: самой программе. Программа Python — это просто набор текста. Только через процесс интерпретации мы можем выполнять какие-либо значимые вычисления на основе текста. Языки программирования, подобные Python, очень полезны, потому что мы можем определить интерпретатор, который является программой, выполняющей оценку и выполнение Python. Не будет преувеличением считать интерпретатор самым основным понятием в программировании. Интерпретатор — это всего лишь ещё одна программа, которая определяет значение выражений в языке программирования.
Принятие этой концепции требует изменения нашего восприятия себя как программистов. Нам нужно рассматривать себя как дизайнеров языка, а не просто как пользователей языка, разработанного другими.
На самом деле мы можем рассматривать многие программы как интерпретаторы определённых языков. Например, ограничитель из предыдущей главы имеет свои собственные примитивы и способы комбинирования. Ограничительный язык очень специализирован: он предоставляет декларативный способ описания определённого типа математических отношений, а не универсальный язык для описания вычислений. Хотя мы уже разработали определённый язык, материал этой главы значительно расширит диапазон языков, которые мы можем интерпретировать.
Языки программирования сильно различаются по своей синтаксической структуре, характеристикам и областям применения. В универсальных языках программирования структуры определения и вызова функций встречаются повсеместно. С другой стороны, существуют мощные языки программирования, не содержащие объектных систем, высокоуровневых функций или управляющих структур, таких как while
и for
. Чтобы продемонстрировать, насколько разными могут быть языки, мы представим Logo в качестве мощного и выразительного языка программирования с очень небольшим количеством продвинутых функций.
В этой главе мы изучим дизайн интерпретаторов и вычислительные процессы, которые они создают при выполнении программ. Идея разработки интерпретатора для универсального языка может показаться пугающей. В конце концов, интерпретаторы выполняют любые возможные вычисления, зависящие от их входных данных. Однако типичные интерпретаторы имеют простую общую структуру: две рекурсивные переменные функции, первая оценивает выражения в среде, вторая вызывает функции с параметрами.
Эти функции являются рекурсивными, поскольку они взаимно определяют друг друга: вызов функции требует оценки выражения тела функции, а оценка выражения может включать вызов одной или нескольких функций. Следующие два раздела этой главы посвящены рекурсивным функциям и структурам данных, которые являются основой для понимания дизайна интерпретатора. Последние разделы этой главы сосредоточены на двух новых языках программирования и задаче реализации интерпретатора для них.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )