Подождите, я думал, что компьютеры могут понимать только 0 и 1??

Вступление, которое вы, вероятно, должны пропустить (на самом деле нет)

Итак, пока я лежу здесь, в постели, с моей собакой, устроившейся под моей правой рукой, поддерживая ее в самом неудобном положении для набора текста… быть еще одной вещью, которую я планировал сделать, но так и не сделал.

Я не знаю, действительно ли я подчеркнул это в своем вступительном посте, но большая часть написания этих статей предназначена для моего собственного образования. Мне нравится, когда люди, не являющиеся техническими специалистами, просят меня ответить на технические вопросы, потому что это действительно позволяет мне выявить пробелы в моем понимании вещей и делает меня лучшим инженером. Иногда эти пробелы существуют из-за того, что я никогда не тратил время на то, чтобы погрузиться достаточно глубоко, когда только начинал учиться, иногда просто прошло так много времени с тех пор, как я впервые познакомился с этим. Лучше всего я могу объяснить это так: мы ежедневно используем так много слов с уверенностью. Многие из них, мы можем не осознавать, мы начали использовать только потому, что слышали, как их использует кто-то другой, и получили общее представление о том, как использовать их в предложении. Затем, скажем, приходит ребенок и просит нас дать ему определение слова и объяснить, что оно означает. Гав. В половине случаев лучшее, что я могу дать им сразу, — это предположение или «ну, вот как вы использовали бы это в предложении». Такими могут стать многие концепции программирования, лучшие практики, инструменты и т. д. (по крайней мере, мне так кажется? Может быть, у меня просто гораздо меньше места в мозгу, чем у других людей?? Может кто-нибудь проверить, пожалуйста.)

При всем при этом одна из тем, о которой я действительно хотел прочитать больше и записать в одном месте для собственного ознакомления, — это то, что, как я думаю, может быть полезно и многим менее техническим людям. Большинство людей, даже если они вообще ничего не знают о кодировании, слышали о кодировании (надеюсь). Вероятно, они знают название одного или двух языков. Много раз люди будут спрашивать меня, почему существует так много языков или в чем разница между ними. Я думаю, что это супер правильные вопросы.

С технической точки зрения, я думаю, полезно немного глубже изучить, почему языки были первоначально разработаны и какие другие языки вдохновили их. Понимание проблемы, для решения которой был создан конкретный язык, может оказаться очень полезным для определения наилучшего варианта его использования. Очевидно, что языки растут в геометрической прогрессии после публикации, особенно с открытым исходным кодом, но нынешний вариант использования обычно все еще тесно связан с его первоначальной целью. Если вы технический читатель, я должен отметить, что, поскольку существует так много языков, я собираюсь очень-очень-очень-очень поверхностно коснуться каждого. Это означает, что я не буду вдаваться в детали ALGOL 58, 60 и 68. Я даже не буду говорить о различиях между Python 2 и 3 (а их так много!!). Если я оговорюсь в чем-то, ПОЖАЛУЙСТА, дайте мне знать, чтобы я мог это исправить, но если я просто не расскажу обо всех возможностях вашего любимого языка или не углублюсь в каждый вариант его использования ... Я не хочу вас обидеть .

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

В ЛЮБОМ СЛУЧАЕ. Я написал роман до фактического поста, просто объясняя пост (классический). Я собираюсь вернуться и написать заголовок, чтобы люди знали, что они могут пропустить это и не пропустить важное дерьмо из-за моей болтовни. Если вы читали, надеюсь, это дало вам милое представление о том, почему я пишу это. Если вы продолжите чтение после всего этого, дайте мне знать, если я что-то напутал в объяснении, вы думаете, что я должен включить более подробную информацию или у вас есть какие-либо другие вопросы.

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

ОМГ, я так рада, что ты спросил! Язык программирования — это набор правил, которые говорят компьютеру, что делать. Довольно просто. У каждого языка программирования есть свой способ представления и обработки этих правил, поэтому существует множество разных правил для разных нужд. У меня были люди, которые спрашивали меня: «Как работает программирование? Разве компьютеры не понимают только 0 и 1??» Правильный. Процессоры понимают двоичные числа (последовательность 0 и 1), и на самом фундаментальном уровне — ВСЕ языки программирования в конечном итоге будут преобразованы именно в это. Это то, что мы называем машинным кодом. Языки программирования позволяют разработчикам писать инструкции для компьютера в более удобном для человека формате, чем если бы они писали построчный машинный код. Через секунду я углублюсь в то, как это на самом деле работает.

Хорошо… так как же компьютер понимает языки программирования?

Вы можете себе представить, как неприятно было бы сидеть и писать машинный код строка за строкой, где одна строка доставляет компьютеру одну единственную инструкцию. Первые компьютерные программы на самом деле выглядели как тот неприятный скриншот, который я украл из Google выше. БРУТАЛЬНЫЙ. Честно говоря, огромное уважение первооткрывателям языков программирования, потому что они действительно проделали большую работу, чтобы сделать жизнь остальных из нас значительно проще.

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

Компилятор

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

Компилятор запускает программу одновременно и переводит весь исходный код в исполняемый машинный код. Исполняемый файл — это файл, который может быть запущен, выполнен на компьютере. У этого есть свои плюсы и минусы (как и во всем). Компилируемые языки обычно работают быстрее, потому что все уже преобразовано в машинный код до того, как вы его запустите (вы поймете больше, когда я объясню альтернативу с интерпретаторами). Однако это также может затруднить отладку скомпилированных языков, поскольку вам придется ждать, пока весь код будет скомпилирован, прежде чем вы сможете увидеть, где в вашем коде есть ошибки. Ошибки могут возникать из-за неправильно написанных правил или ошибок в написании кода, которые не ожидаются компилятором и не могут быть преобразованы в машинный код. Скомпилированный код запускается с использованием исполняемого файла, созданного компилятором из исходного кода.

Кроме того (я не думаю, что это лучший раздел для этого, возможно, я реорганизую, когда буду писать остальные), я хочу отметить, что только потому, что ваш код компилируется без ошибок, не означает, что он будет потом беги отлично. Это просто означает, что теперь он МОЖЕТ работать, потому что он был успешно переведен в машинный код. Запустив его, вы можете обнаружить, что он делает не то, что вам нужно, но я говорю не об этих ошибках.

Итак, это компилятор. Некоторыми примерами компилируемых языков, о которых я расскажу позже, являются C и C++.

Устный переводчик

Интерпретатор также переводит исходный код в машинный код, но с помощью другого процесса. Вместо того, чтобы преобразовывать весь исходный код в машинный код за один раз и использовать полученный исполняемый файл для его запуска, интерпретатор позволяет вам запускать ваш исходный код и транслировать его в машинный код построчно по ходу выполнения. Надеюсь, это проясняет, почему тогда интерпретируемый язык будет работать медленнее, чем компилируемый язык. Хотя в этом есть свои преимущества. Поскольку интерпретируемый язык преобразуется в машинный код во время работы, он остановится, как только обнаружит синтаксическую ошибку (синтаксис — это настоящие правила используемого вами языка, вроде грамматики для разговорных языков?). Это значительно упрощает отладку и позволяет вам двигаться быстрее при программировании, потому что вам не нужно ждать, пока весь код скомпилируется, прежде чем вы поймете, что есть проблема. Вы знаете, как это раздражает, когда вы ждете, пока скомпилируется массивный исходный код, и понимаете, что в строке 3 была ошибка? В интерпретируемом коде он потерпит неудачу почти мгновенно, поэтому вы можете исправить ошибку и продолжить свой путь. Еще одно преимущество интерпретируемого кода заключается в том, что поскольку он транслируется во время выполнения и ему не нужно генерировать какие-либо исполняемые файлы, он использует меньше памяти. Интерпретатор фактически работает с использованием исходного кода.

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

Некоторыми примерами интерпретируемых языков являются Python, Ruby и JavaScript.

Ассемблер

Я кратко объясню, что такое ассемблер, но я не буду много говорить об ассемблере, поэтому не буду вдаваться в подробности. Язык ассемблера как бы на один шаг выше машинного кода. Он использует основные символы для представления того, что делает машинный код. Ассемблер — это «низкоуровневый» язык программирования, что означает, что он не слишком сильно отличается от машинного кода, поскольку делает его более удобочитаемым для человека. Я больше сосредоточусь на языках программирования «высокого уровня», которые требуют гораздо большей абстракции. Ассемблер, как вы уже могли догадаться, переводит ассемблерный код в машинный код. Ву. Итак, у вас есть это, все каким-то образом попадает в машинный код.

Мы сделали это!

Итак, теперь, надеюсь, вы понимаете на высоком уровне, как языки программирования превращаются в 0 и 1, которые может обрабатывать ЦП. Я углублюсь в историю некоторых более ранних языков программирования во второй части (в идеальном мире, где я остаюсь организованным), а затем, вероятно, просто сделаю часть 3 для языков, с которыми вы, вероятно, более знакомы. Может быть, мне понадобятся еще части, я болтун.

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

Бинарный

Строка из нулей и единиц, представляющая число с основанием 2.

Машинный код

Язык, использующий двоичные (или шестнадцатеричные) числа, понятный компьютеру.

Исходный код

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

Исполняемый

Файл, который может быть запущен на компьютере.

Время выполнения

Время, в течение которого программа работает/выполняется компьютером.

Время компиляции

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

Компилятор

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

Устный переводчик

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

СПАСИБО ЗА ПРИСОЕДИНЕНИЕ.

хохо