Как компьютер понимает язык программирования

Обновлено: 05.07.2024

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

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

Но если Вы серьёзно хотите с этим разобраться, то лучше обратитесь к Википедии. Читая одну статью за другой, и задавая себе вопросы -- что теперь не понятно? --Вы быстрее составите для себя правильныю картину. Самостоятельная работа для ума полезнее.

См. "Вычислительные системы" в Википедии.

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

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

Как правило, любая элементарная инструкция компьютеру, на самом нижнем уровне, состоит из кода команды и, возможно, кода данных. Например, "прочесть данные из памяти по адресу Х в регистр А", "сложить данные из регистров А и В и поместить сумму в регистр С", "сравнить содержимое регистров А и В", "сдвинуть содержимое регистра А на N разрядов влево" и т. д. То есть даже на таких простых примерах видно, что любая инструкция - это команда (ЧТО сделать) и данные (С ЧЕМ это надо сделать) . И то, и другое есть числа. С данными и так понятно, что это числа, а с командами тоже просто: каждой команде ставится в соответствие определённое число - ведь набор команд всегда ограничен, а значит, их можно просто перенумеровать. Обратите внимание, что некоторым инструкциям не нужны данные. Скажем, команда СБРОС или ОСТАНОВ вполне обойдутся без каких-либо данных. А в однорегистровых процессорах (сейчас таких и не осталось, а вот я начинал с PDP-8, где регистр данных был всего один. ) таких команд было множество, как раз потому, что регистр - один. Поэтому команды инвертирования, сдвига, логических операций и т. п. могли относиться только к этому регистру.

Ну а дальше всё просто: раз каждой команде машинного языка можно поставить в соответствие конкретное число, то точно так же ей можно поставить в соответствие конкретное СЛОВО, которое для человека имеет некоторый смысл. То есть вместо команд 000, 001, 010. можно использовать AND, TAD, ISZ и т. д. (это реальные обозначения команд той самой PDP-8; поскольку памяти в ней было совсем мало, проходилось использовать короткие обозначения команд) . Ну и раз каждой команде соответствавло своё конкретное буквенное обозначение, то не штука было написать программу, которая САМА переводила эти буквенные обозначения в двоичные инструкции. Именно так работает ассемблер - язык программирования самого низкого уровня.

Но на ассемблере писать ОЧЕНЬ СЛОЖНО, потому что а) под каждый конкретный процессор (компьютер) нужен свой ассемблер, и б) ассемблерная программа - это список инструкций 1:1. То есть КАЖДОЕ действие компьютера придётся расписывать по командам ПОЛНОСТЬЮ. Нельзя сказать "прочитать такой-то файл в память", нужно ПОДРОБНО расписать, как распознаётся имя файла, как обратиться к диску, чтобы узнать, где этот файл лежит, как узнать длину файла, как задать адрес начала массива в памяти, как потом запихать все байты файла в ячейки памяти, как на каждом шаге проверять, не закончился ли файл/не переполнился ли массив.. . В общем, кошмар.
Вот поэтому и появились языки программирования высокого уровня (первым это создал К. Цузе ещё в 1941 году) , которые оперируют понятиями, "отвязанными" от конкретных команд машинного уровня и конкретной организации памяти. Поэтому на таком языке уже можно написать "ReadFile (text.doc, ^array)" - и программа-транслятор (не компиллятор! ) САМА переведёт эту инструкцию в ассемблерный код. Потом уже этот кусок ассемблерного кода можно соединить с другими модулями, в частности, стандартными библиотечными модулями (многие типовые операции - работа с клавиатурой и экраном, дисковое чтение/запись, распределение памяти.. . -заранее оттранслированы в машинные коды) . Поэтому следующий этап - это линковка (linking), когда написанный кусок программы связывается с библиотекой и другими кусками программы (если программа сложная) .

А компилятор и интерпретатор - это РАЗНЫЕ ТИПЫ языков высокого уровня. Компилятор (С, Паскаль, Модула, Дельфи) СНАЧАЛА распознаёт текст программы и создаёт промежуточный файл, из которого потом, после линковки, получается исполняемый файл программы. А интерпретатор (Фокал, Бэйсик) распознаёт команды "по ходу дела" и выполняет их одну за другой без того, чтобы предварительно обработать всю программу.

Машинный язык

Процессор компьютера не способен понимать напрямую языки программирования, такие как C++, Java, Python и т.д. Очень ограниченный набор инструкций, которые изначально понимает процессор, называется машинным кодом (или «машинным языком»). То, как эти инструкции организованы, выходит за рамки данного введения, но стоит отметить две вещи.

Во-первых, каждая команда (инструкция) состоит только из определенной последовательности (набора) цифр: 0 и 1 . Эти числа называются битами (сокр. от «binary digit») или двоичным кодом.

Например, одна команда машинного кода архитектуры ×86 выглядит следующим образом:

Во-вторых, каждый набор бит переводится процессором в инструкции для выполнения определенного задания (например, сравнить два числа или переместить число в определенную ячейку памяти). Разные типы процессоров обычно имеют разные наборы инструкций, поэтому инструкции, которые будут работать на процессорах Intel (используются в персональных компьютерах), с большей долей вероятности, не будут работать на процессорах Xenon (используются в игровых приставках Xbox). Раньше, когда компьютеры только начинали массово распространяться, программисты должны были писать программы непосредственно на машинном языке, что было очень неудобно, сложно и занимало намного больше времени, чем сейчас.

Язык ассемблера

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

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

Высокоуровневые языки программирования

компиляция, которая выполняется компилятором;

интерпретация, которая выполняется интерпретатором.

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

Проще говоря, процесс компиляции выглядит следующим образом:



Преимущества высокоуровневых языков программирования

Преимущество №1: Легче писать/читать код. Вот вышеприведенная команда, но уже на языке C++:

Преимущество №2: Требуется меньше инструкций для выполнения определенного задания. В языке C++ вы можете сделать что-то вроде а = Ь * 2 + 5; в одной строке. В языке ассемблера вам пришлось бы использовать 5 или 6 инструкций.

Преимущество №3: Вы не должны заботиться о таких деталях, как загрузка переменных в регистры процессора. Компилятор или интерпретатор берёт это на себя.

sxemagotovo33

Преимущество №4: Высокоуровневые языки программирования более портируемые под различные архитектуры (но есть один нюанс).Нюанс заключается в том, что многие платформы, такие как Microsoft Windows, имеют свои собственные специфические функции, с помощью которых писать код намного легче. Но в таком случае приходится жертвовать портируемостью, так как функции, специфические для одной платформы, с большей долей вероятности, не будут работать на другой платформе. Обо всем этом мы детально поговорим на следующих уроках.

Большинство новичков в программировании, при написании очередной программы на уровне "Hello world", просто нажимают кнопку Run и даже не задумывается о том, что происходит с их кодом в момент компиляции. А зря.

Подписывайтесь на канал, ставьте лайк и мы начинаем!

Для чего мне это нужно?

Если у вас сейчас появился такой вопрос, то вот ответ на него:

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

Надеюсь, вы меня понимаете. Если всё Ok, давайте наконец начнём!

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

Шаг первый - Препроцессор

В момент нажатия кнопки Run , вы отправляете свой код в компилятор. Всё начинается с препроцессора:

На всякий случай, этот символ выглядит так:

Итак, препроцессор ищет в вашем коде директивы, затем выполняет их.

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

Один из самых распространённых примеров :

Ссылается на заголовочный файл stdio.h, в процессе компиляции библиотека stdio будет включена в наш проект. Ссылается на заголовочный файл stdio.h, в процессе компиляции библиотека stdio будет включена в наш проект.

Шаг второй. Анализ.

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

Лексический анализ

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

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

После лексического анализа парсер (синтаксический анализатор), на основе грамматики языка, распознает построенные из лексем выражения и операторы, выявляет синтаксические ошибки.

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

Целью этого вида анализа является выявление разного рода смысловых ошибок. Например, повторное описание переменной.

Шаг три. Почти финал.

Вам было тяжело? Надеюсь, что нет. Мы скоро закончим.

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

Для обычного Windows приложения строится объектник (объектный модуль) - заготовка исполняемой программы в машинном коде.

Финал?

Далее судьба этого приложения тоже зависит от типа приложения.

Для Windows приложения компоновщик (линкер) формирует исполняемый .exe файл, подключая к объектному модулю другие такие же модули, в том числе, содержащие элементы стандартных библиотек, которые вы используете в своём проекте (например, stdio).

Если программа состоит из нескольких файлов, они компилируются по-отдельности и объединяются на этапе компоновки. После всего этого мы имеем готовый .exe файл, который можно запускать.

Заключение

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

Ставьте лайки и подписывайтесь на канал. Это не только мотивирует меня, но и способствует популяризации канала.
Чем больше подписчиков и лайков я получаю, тем больше у меня желание выдавать вам качественный и полезный контент, поэтому:

Спасибо за внимание, с вами был Дад.

Пишите в комментариях, что вы думаете о новом "логотипе" и названии канала, нравится ли вам?

Также пишите ваше мнение о данной статье, считаете ли вы её полезной. Любые ваши отклики улучшают качество контента на этом канале!

Что такое язык программирования

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

Особенности языка программирования

Язык программирования – это технический, искусственный язык, обладающий некоторыми свойствами естественного. Так, в любом из них есть лексика, синтаксис и семантика. Программист обязан соблюдать алгоритм, иначе код получится нерабочим. Схема одинакова практически для любого языка программирования – хоть для Fortran, появившегося в 50-х годах прошлого века, хоть для React 2012 года.

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

Язык программирования

Тенденции в сфере программирования:

  1. Регулярно появляются новые языки программирования с более простым форматом создания кода (переход на высокоуровневые системы).
  2. Более актуальными становятся платформы, поддерживающие облачные технологии, сайты и мобильные приложения.
  3. Разнообразие несколько усложняет изучение материальной части, переход на другие языки иногда затруднен из-за различий в механике.

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

Чем язык программирования отличается от алгоритма

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

Синтаксис Java

Различия касаются следующего:

  1. Одна и та же команда (алгоритм) выглядит по-разному в зависимости от языка программирования.
  2. Понимание алгоритма упрощает выполнение техзадания на любой платформе.
  3. Высокоуровневые языки проще для понимания, чем низкоуровневые типа Ассемблера.

Последнее объясняется применением понятных пользователю слов и удобным форматированием со смещением строк. Редакторы кода обычно подсвечивают типовые участки различным цветом. Визуальное оформление помогает ориентироваться в «чужих» программах, а также ускоряет разработку собственного алгоритма.

Как компьютер понимает языки программирования

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

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

  1. Исходный текст программы прогоняется через модуль компилятора.
  2. После запуска происходит выполнение заданного алгоритма программы.
  3. В ряде случаев возможна декомпиляция и редактирование кода.

При отладке используется интерпретатор, который считывает и выполняет программу пошагово, с визуальным отображением результата. Интересный факт – оба приложения (компилятор и интерпретатор) также написаны на том или ином языке программирования. Они представляют собой тот же набор машинного кода, который ранее был неким исходным текстом, например на C++.

Многие программы состоят из неких стандартных модулей типа «открыть окно ввода данных». Чтобы упростить и ускорить создание продуктов, все чаще применяются готовые библиотеки кода. Они представляют собой заранее написанные и проверенные модули, которые достаточно вставить в текст. Или сохранить в отдельном файле, куда программа будет периодически обращаться.

Почему появляются новые языки программирования

Пиком развития модульного программирования считаются фреймворки. Типичные представители этой категории для разработки веб-ресурсов – Bootstrap, React.js, Django, Laravel, Angular. На рынке подобных «изделий» насчитывается несколько десятков. Такие инструменты часто называют «новыми» языками программирования.

Новые языки программирования

Причины разработки новинок:

  1. Изменение локальных и сетевых технологий.
  2. Рост мультимедийных возможностей оборудования.
  3. Возрастают потребности пользователей компьютеров.

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

Что лучше изучать новичку

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

Можно начать с Python, а следом за ним осваиваться с Java и C++. Остальные языки программирования берут многое из синтаксиса перечисленных базовых платформ. Если акцент изначально ставится на разработке сайтов, стоит поработать над навыками в PHP, Ruby, JavaScript. Программы для мобильных устройств чаще пишут на Objective-C, Swift и Java.

Читайте также: