на чем был написан компилятор ассемблера

Как был написан первый компилятор?

Я слышал про курицу и яйцо и загрузчик. У меня есть несколько вопросов.

что написал первый компилятор, который преобразовал что-то в двоичные инструкции?

сборка скомпилирована или переведена в двоичные инструкции?

. Мне было бы трудно поверить, что они написали компилятор в двоичном формате.

6 ответов

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

первый программы делались именно таким образом-написанные от руки опкоды.

однако большую часть времени проще использовать ассемблер для «компиляции» кода сборки, который автоматически выполняет эти запросы кода операции, а также полезен при вычислении адресов/смещений для именованных меток перехода и т. д.

первые ассемблеры были написаны от руки. Затем эти ассемблеры можно использовать для сборки более сложных ассемблеров, которые затем можно использовать для сборки написанных компиляторов для языков более высокого уровня и так далее. Этот процесс итеративного написания инструментов для упрощения создания следующего набора инструментов называется (как упоминал Дэвид Рабинович в своем ответе) загрузки.

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

яйца задолго до куриц. Ответ на большинство проблем «курицы и яйца» один и тот же: эволюция. У некоторых людей тоже есть проблемы с верой в биологическую эволюцию, но неверие-это не аргумент (google argumentum ad ignorantiam).

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

Если вы хотите сломать барьер, который держит компьютеры чувствовать себя как магия, я настоятельно рекомендую читать код Чарльза Петцольда и/или элементы вычислительных систем. Имея только базовые знания программирования, эти чудесно доступные книги помогут вам понять компьютеры сверху донизу. Очевидно, что комп получить невозможно. научный. или степень EE после всего 2 книг, но я могу сказать как программист-самоучка, который пропустил формальное обучение: эти книги потрясли мой мир!

что написал первый компилятор, который преобразовал что-то в двоичные инструкции?

иногда это все еще происходит в небольшой степени-для исправления небольших бит кода или создания thunks. Я помню, как набирал числа в базовые строки,которые затем выполнялись как небольшие, быстрые подпрограммы на ранних микро. Я также помню переключение переключателей на передней панели PDP-11, чтобы ввести программу загрузчика в его память для университетского курса.

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

Источник

Что такое ассемблер и нужно ли его изучать

Этому языку уже за 70, но на пенсию он пока не собирается.

на чем был написан компилятор ассемблера. Смотреть фото на чем был написан компилятор ассемблера. Смотреть картинку на чем был написан компилятор ассемблера. Картинка про на чем был написан компилятор ассемблера. Фото на чем был написан компилятор ассемблера

на чем был написан компилятор ассемблера. Смотреть фото на чем был написан компилятор ассемблера. Смотреть картинку на чем был написан компилятор ассемблера. Картинка про на чем был написан компилятор ассемблера. Фото на чем был написан компилятор ассемблера

Есть традиция начинать изучение программирования с вывода на экран строки «Hello world!». На языке Python, например, это всего одна команда:

Всё просто, понятно и красиво! Но есть язык программирования, в котором, чтобы получить тот же результат, нужно написать солидный кусок кода:

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

Сложно? Давайте разбираться.

на чем был написан компилятор ассемблера. Смотреть фото на чем был написан компилятор ассемблера. Смотреть картинку на чем был написан компилятор ассемблера. Картинка про на чем был написан компилятор ассемблера. Фото на чем был написан компилятор ассемблера

Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.

Немного о процессорах и машинном языке

Чтобы объяснить, что такое язык ассемблера, начнём с того, как вообще работает процессор и на каком языке с ним можно «разговаривать».

Процессор — это электронное устройство (сейчас крошечная микросхема, а раньше процессоры занимали целые залы), не понимающее слов и цифр. Он реагирует только на два уровня напряжения: высокий — единица, низкий — ноль. Поэтому каждая процессорная команда — это последовательность нулей и единиц: 1 — есть импульс, 0 — нет.

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

Например, для Intel 8088 инструкция 0000001111000011B — это операция сложения двух чисел, а 0010101111000011B — вычитания.

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

Поэтому много лет назад был создан язык ассемблера, в котором коды операций обозначались буквами и сокращениями английских слов, отражающих суть команды. Например, команда mov ax, 6 означает: «переместить число 6 в ячейку памяти AX».

Когда и как был создан ассемблер?

Это произошло ещё в сороковых годах прошлого века. Ассемблер был создан для первых ЭВМ на электронных лампах, программы для которых писали на машинном языке. А так как памяти у компьютеров было мало, то команды вводили, переключая тумблеры и нажимая кнопки. Даже несложные вычисления занимали много времени.

Проблему решили, когда ЭВМ научились хранить программы в памяти. Уже в 1950 году была разработана первая программа-транслятор, которая переводила в машинный код программы, написанные на понятном человеку языке. Эту программу назвали программой-сборщиком, а язык — языком ассемблера (от англ. assembler — сборщик).

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

Как устроен язык ассемблера?

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

Коды операций в языке ассемблера мнемонические, то есть удобные для запоминания:

Регистрам и ячейкам памяти присваиваются символические имена, например:

EAX, EBX, AX, AH — имена для регистров;

meml — имя для ячейки памяти.

Например, так выглядит команда сложения чисел из регистров AX и BX:

А это команда вычитания чисел из регистров AX и BX:

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

Вот некоторые из них:

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

Вот, например, код, на ассемблере, выводящий на экран цифры от 1 до 10:

Здесь действие будет выполняться в цикле — как, например, в циклах for или do while в языках высокого уровня.

Единого стандарта для языков ассемблера нет. В работе с процессорами Intel разработчики придерживаются двух синтаксисов: Intel и AT&T. Ни у того ни у другого нет особых преимуществ: AT&T — стандартный синтаксис в Linux, а Intel используется в мире Microsoft.

Одна и та же команда в них выглядит по-разному.

Например, в синтаксисе Intel:

mov eax, ebx — команда перемещает данные из регистра eax в регистр ebx.

В синтаксисе AT&T эта команда выглядит так:

Почему для разных семейств процессоров нужен свой ассемблер?

Дело в том, что у каждого процессора есть набор характеристик — архитектура. Это его конструкция и принцип работы, а также регистры, адресация памяти и используемый набор команд. Если у процессоров одинаковая архитектура, то говорят, что они из одного семейства.

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

Кому и зачем нужен язык ассемблера?

Даже из нашего примера «Hello, World!» видно, что ассемблер не так удобен в разработке, как языки высокого уровня. Больших программ на этом языке сейчас никто не пишет, но есть области, где он незаменим:

Если вы хотите разрабатывать новые микропроцессоры или стать реверс-инженером, то есть смысл серьёзно заняться изучением языка ассемблера.

Востребованы ли программисты на ассемблере сегодня?

Конечно. Хотя на сайтах по поиску работу вы вряд ли найдёте заявки от работодателей с заголовками: «Нужен программист на ассемблере», зато там много таких, где требуется знание ассемблера дополнительно к языкам высокого уровня: C, C++ или Python. Это вакансии реверс-инженеров, специалистов по компьютерной безопасности, разработчиков драйверов и программ для микроконтроллеров/микропроцессоров, системных программистов и другие.

Предлагаемая зарплата — обычная в сфере IT: 80–300 тысяч рублей в зависимости от квалификации и опыта. Вот, например, вакансия реверс-инженера на HeadHunter, где требуется знание ассемблера:

на чем был написан компилятор ассемблера. Смотреть фото на чем был написан компилятор ассемблера. Смотреть картинку на чем был написан компилятор ассемблера. Картинка про на чем был написан компилятор ассемблера. Фото на чем был написан компилятор ассемблера

на чем был написан компилятор ассемблера. Смотреть фото на чем был написан компилятор ассемблера. Смотреть картинку на чем был написан компилятор ассемблера. Картинка про на чем был написан компилятор ассемблера. Фото на чем был написан компилятор ассемблера

на чем был написан компилятор ассемблера. Смотреть фото на чем был написан компилятор ассемблера. Смотреть картинку на чем был написан компилятор ассемблера. Картинка про на чем был написан компилятор ассемблера. Фото на чем был написан компилятор ассемблера

Стоит ли начинать изучение программирования с языка ассемблера?

Нет, так делать не нужно. Для этого есть несколько причин:

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

обложка: Полина Суворова для Skillbox Media

Источник

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

Из Википедии — свободной энциклопедии

на чем был написан компилятор ассемблера. Смотреть фото на чем был написан компилятор ассемблера. Смотреть картинку на чем был написан компилятор ассемблера. Картинка про на чем был написан компилятор ассемблера. Фото на чем был написан компилятор ассемблера

Язы́к ассе́мблера (англ. assembly language ) — машинно-ориентированный язык программирования низкого уровня. Представляет собой систему обозначений, используемую для представления в удобно читаемой форме программ, записанных в машинном коде. Его команды прямо соответствуют отдельным командам машины или их последовательностям. Является существенно платформо-зависимым: языки ассемблера для различных аппаратных платформ несовместимы, хотя могут быть в целом подобны.

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

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

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

Источник

Как был написан первый компилятор?

Я слышал о курице, яйце и бутстрепе. У меня есть несколько вопросов.

Что написал первый компилятор, преобразовавший что-то в двоичные инструкции?

Сборка скомпилирована или переведена в двоичные инструкции?

. Мне трудно поверить, что они написали компилятор в двоичном формате.

6 ответов

Однако в большинстве случаев проще использовать ассемблер для «компиляции» ассемблерного кода, который автоматически выполняет эти поиски кода операции, а также помогает при вычислении адресов / смещений для именованных меток перехода и т. Д.

Первые ассемблеры писались вручную. Затем эти ассемблеры можно было бы использовать для сборки более сложных ассемблеров, которые затем можно было бы использовать для сборки компиляторов, написанных для языков более высокого уровня, и так далее. Этот процесс итеративного написания инструментов для упрощения создания следующего набора инструментов называется (как упомянул Дэвид Рабиновиц в своем ответе) начальная загрузка.

Воз сказал в одном из своих публичных выступлений, что когда он только начинал, он не мог позволить себе компилятор, поэтому скомпилировал его в двоичный код вручную на бумаге. Если вы хотите увидеть что-то еще более дикое, прочтите об условиях, при которых Билл Гейтс и Пол Аллен написали Бейсик для Альтаир 8800.

Если вы хотите сломать барьер, который заставляет компьютеры чувствовать себя волшебными, Я НАСТОЯТЕЛЬНО рекомендую прочитать CODE Чарльза Петцольда и / или Элементы вычислительных систем. Обладая базовыми знаниями программирования, эти чудесно доступные книги помогут вам разобраться в компьютерах сверху донизу. Очевидно, что нельзя получить комп. наука или степень EE после всего 2 книг, но я могу сказать как программист-самоучка, пропустивший формальное обучение: эти книги потрясли мой мир!

Что написал первый компилятор, преобразовавший что-то в двоичные инструкции?

Человек сделал. Прочтите о системе A-0 :

В 1952 году Грейс Хоппер завершила свой первый компилятор для Sperry, известный как A-0. Система A-0 представляла собой набор инструкций, которые могли переводить символьный математический код на машинный язык. Создавая A-0, она взяла все подпрограммы, которые собирала на протяжении многих лет, и записала их на магнитную ленту. Каждой программе был присвоен номер вызова, чтобы машина могла найти его на ленте. «Все, что мне нужно было сделать, это записать набор номеров для звонков, позволить компьютеру найти их на ленте, перенести и внести дополнения. Это был первый компилятор», как описывает Грейс.

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

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

Источник

Как были сделаны первые компиляторы?

Мне всегда интересно это, и, возможно, мне нужен хороший урок истории по языкам программирования. Но так как большинство компиляторов в настоящее время сделаны на C, как были созданы самые первые компиляторы (AKA до C) или все языки были просто интерпретированы?

С учетом вышесказанного, я до сих пор не понимаю, как был создан даже первый язык ассемблера, я понимаю, что такое язык ассемблера, но я не вижу, как они получили ОЧЕНЬ первый язык ассемблера (например, как они сделали первый Команды (как mov R21 ) или W / E установлен в двоичный эквивалент?

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

Вот о чем говорит начальная загрузка компилятора (поскольку никто не упомянул, как она называется =).

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

Проблема курицы и яйца

Если нужен компилятор для языка X, чтобы получить компилятор для языка X (который написан на языке X), как был написан первый компилятор? Возможные методы решения этой проблемы курицы или яйца включают в себя:

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

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

Небольшое приближение к рукам обнаруживает EDSAC Первоначальные заказы с конца 40-х годов. Поскольку это был первый ассемблер, он, вероятно, был написан на машинном языке.

Позже появились ассемблеры для других машин, таких как SOAP I и II для IBM 650. SOAP I, вероятно, также был написан на машинном языке, хотя я не нашел окончательного утверждения.

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

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

Когда у вас есть ассемблер, вы можете написать компилятор для языка более высокого уровня в ассемблере.

Хотя не всегда возможно написать компилятор / интерпретатор для языка на самом языке. Интерпретатор JavaScript, написанный на JavaScript, существует, но компиляторы / интерпретаторы в современных браузерах по-прежнему написаны на C или C ++ по соображениям производительности. JavaScript, написанный на JavaScript, просто слишком медленный.

Но вам не нужно использовать C как «начальный язык» для компилятора. Первый компилятор F # был написан на OCaml, который является другим языком, наиболее тесно связанным с F #. Когда компилятор был готов, он был переписан на F #. Первый компилятор для Perl 6 был написан на Haskell (чистый функциональный язык, сильно отличающийся от Perl), но теперь имеет компилятор, написанный на C.

Интересным примером является Rust, где первый компилятор был написан на OCaml (теперь он переписан на Rust). Это примечательно, потому что OCaml, как правило, считается более высоким уровнем, чем Rust, который является языком систем ближе к железу. Так что это не всегда языки более высокого уровня, реализованные в языках более низкого уровня, это также может быть наоборот.

Затем вы использовали бы этот едва функциональный компилятор или ассемблер для реализации немного более способного компилятора или ассемблера, который может распознавать большее подмножество целевого языка. Вспенить, промыть, повторить, пока не получится конечный продукт.

Это не так сложно, как кажется. В детстве;) Я сделал несколько разборок x86 в виду.

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

Т.е. иногда вы переходите даже с языка на коды, что неудивительно.

Не так давно программирование в двоичном коде все еще было навыком, которым пользовались люди.

ОЧЕНЬ ПРОСТОЙ ОТВЕТ. Предположим, мы пишем аппаратную программу и сохраняем ее в ПЗУ. Это можно рассматривать как компилятор. Поэтому я просто хочу сказать, что самый первый компилятор был аппаратным. По мере совершенствования технологии эти простые компиляторы затем использовались для написания компиляторов высокого уровня.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *