Каждая программа на языке программирования высокого уровня должна быть оформлена в соответствии с правилами этого языка.
Программа может представлять собой единственный файл — запись из данных или программного кода, — сохранённый на диске. Но обычно сложное ПО состоит из файла, содержащего главную программу — ядро, окружённое набором файлов, которые содержат подпрограммы или процедуры.
Ядро осуществляет вызов процедур, необходимых для выполнения некоторой задачи, например показа диалогового окна или открытия файла. Процедура также может вызвать другую процедуру в том же самом файле, или в другом файле, который является частью программы, или в файлах Windows для общих функций.
Ядро и подпрограммы вместе определяют способ ввода (получения информации программой) с клавиатуры, из памяти, портов и файлов, правила для обработки входных данных и способ отправки, или вывода, информации на экран, в память, порты и файлы. Как правило, когда пользователь вводит информацию в программу, она запоминается как переменная.
Как предполагает термин, информация переменных меняется на разных ступенях. Программы сами по себе тоже способны хранить в переменных информацию, полученную в результате вычислений или манипуляций данными.
После того как программа приобретает информацию в переменной, она может ею управлять при помощи команд, которые выполняют математические операции над числами или анализируют текстовые строки.
Синтаксический анализ — это объединение, удаление или извлечение некоторых текстовых символов для того, чтобы использовать их в другом месте программы. Если переменная — это текст, её обычно называют строкой. Строка может быть и математической, но чаще термин «строка» относится к непрерывному ряду
Программы могут полагаться на BIOS для выполнения многих функций
Язык программирования всё ещё должен содержать команды для вызова служб BIOS.
Интерпретатор и компилятор — это программы, которые переводят исходный понятный людям код программы типа BASIC или С++ в машинный язык, который понимает компьютер.
Программа должна быть способна к выполнению различных задач при различных обстоятельствах. Это характеристика, которая отражает мощь и многосторонность языков программирования. И поэтому программы редко жёстко следуют по прямой от начала и до конца.
Существуют команды, которые заставляют компьютер выполнять переходы (ветвление) к различным частям программы для выполнения других команд. В BASIC это команда GOTO. Язык ассемблера делает то же самое с помощью команды JMP (сокращение от jump — «прыжок»).
Ветвление используется в комбинации с булевыми логическими функциями языков программирования. Например, чтобы программа изменила ход выполнения, когда выполнится определённое условие, может быть использована команда «if… then…» («если, то…»). Программа проверяет, является ли некоторое условие истинным, и если это так, то она выполняет некоторую команду.
Интерпретатор и компилятор — это программы, которые переводят исходный понятный людям код программы типа BASIC или С++ в машинный язык, который понимает компьютер.
Различие между компилятором и интерпретатором следующее: интерпретатор переводит исходный код строка за строкой при каждом запуске программы, а компилятор переводит весь исходный код в исполняемый файл, который на определённом типе компьютеров, таких как PC или Mac, запускается без интерпретатора.
Большинство продаваемых или загружаемых программ скомпилированы. Процесс компиляции начинается с части программы компилятора, называемой лексическим анализатором. Он прочитывает весь исходный код по одному символу. По мере считывания символов анализатор пытается объединить их в зарезервированные слова — компьютерные команды или знаки препинания, которые он понимает.
Когда лексический анализатор встречает зарезервированное слово или знак препинания, он генерирует лексему кода. Лексема подобна аббревиатуре, представляющей информацию в сжатом виде. Результатом лексического анализа является поток лексем, которые представляют все значимые элементы программы — команды, переменные и числа.
Вторая часть компилятора, называемая синтаксическим анализатором, выполняет синтаксический анализ, т. е. оценивает поток лексем, созданных лексическим анализатором. Синтаксический анализатор преобразует каждую лексему в узел синтаксического дерева, которое представляет логическую схему программы.
Каждый узел дерева представляет операцию программы, которая генерирует данные или команду, которая передаётся к вышестоящему узлу. Этот узел, в свою очередь, выполняет другую операцию и передаёт результат следующему узлу.
Когда синтаксический анализатор заканчивает работу, компилятор преобразует всю программу в дерево, которое представляет структуру программы. Самый верхний узел называется программой, а узлы, которые передают ей результаты, называются подпрограмма 1, подпрограмма 2 и т. д., вплоть до самых нижних специфических узлов дерева.
Третья часть компилятора называется генератором кода, который работает через синтаксическое дерево, производя сегменты машинного кода в каждом узле. Каждому узлу дерева генератор подбирает шаблон машинного кода, соответствующий операции, назначенной этому узлу.
Генератор заполняет пробелы в каждом шаблоне значениями и переменными, найденными в каждом узле. После того как шаблон заполнен, он добавляется к строке двоичных чисел, которые составляют машинный язык и значения программы.
На конечном этапе оптимизатор проверяет код, произведённый генератором кода, на избыточность. Оптимизатор устраняет любую операцию, которая выдаёт результат, идентичный предшествующим операциям, делая программу, выпускаемую компилятором, более компактной и быстрой.