Assembler
*nix
Virtualization
C
CPU
Comments 28
0
А писать программы для этой VM предполагается сразу в машинных кодах? :)
+1
Ну вот описание компилятора я и ожидал увидеть в статье в первую очередь, это же самое интересное в таких задачах :) А выполнение десятка операций из их кодов — это так, на закуску :)
+2
Автор не ставил целью написать компилятор, он ставил целью — написать виртуальную машину.
И это ему удалось.
В этом руководстве я расскажу, как написать собственную виртуальную машину (VM), способную запускать программы на ассемблере, такие как 2048 (моего друга) или Roguelike (моя).
Файлы для 2048 и Roguelike лежат в папке docs/supplies, можно запустить и радоваться .)

Если нужен компилятор С для LC-3 можете посмотреть код
github.com/haplesshero13/lcc-lc3
или здесь
highered.mheducation.com/sites/0072467509/student_view0/c_to_lc-3_compiler.html
или
github.com/haplesshero13/lc3tools
www.cemgokmen.com/2018/10/11/compiling-C-for-LC3

Автор написал rogue на ассемблере, но там есть и Си-версия, не знаю чем компилировал
github.com/justinmeiners/lc3-rogue
2048 на ассемблере
github.com/rpendleton/lc3-2048
+1

Я уже понял из статьи, что компилятора не будет. Но ведь согласитесь — глупо делать свою ВМ без компилятора в ее байт-код из какого-то удобочитаемого вида :) Поэтому, увидев название статьи я и подумал что будет описан компилятор :)

+2
Cогласитесь, что все зависит от задачи.) К примеру у вас есть бинарники для устаревшего процессора(нет в наличии и не появится), писать программы для этого процессора вы не собираетесь, но вы хотите запустить бинарники. Вы просто пишите виртуальную машину и запускаете бинарники, компилятор не нужен.
0
Мне, кажется, вы уже придираетесь.)
Одно другому не мешает — она и своя(написана вами), и для этого процессора(исполнение бинарников для него).
Если бы только процессора, то все программы написанные вами для x86 принадлежали бы AMD или Intel .)
Ну не упомянули LC-3 в заголовке, суть от этого не меняется.

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

Кто-то говорит, что дом строит и при этом «ни одного гвоздя не забил» в доме :)
0
Если вы нашли колеса, руль(они ваши) и собрали это вместе — это ваш велосипед, и он уникален

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

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

Я и не утверждаю, что для собственной ВМ надо сначала изобрести процессор со всей периферией, потом написать для него компилятор и уже с помощью этого компилятора на этом процессоре писать саму ВМ :)
Ну я своей аналогией тоже этого не говорил.)
0
От того, что вы интерпретируете не свой язык(описание), интерпретатор не становится не своим(вы же написали его и он в своем роде уникальный).

Ну вот про это я и писал — мое представление о «собственном» не настолько широкое :)
0
Я тоже сначала хотел это написать, но потом подумал, что не смогу ясно объяснить чем по большому счету отличается виртуальная машина от эмулятора процессора :)
0
Как сказано на странице репозитория проекта это VM для LC-3 и, по всей видимости, компилятор можно найти тут compilerLC3.shtml
+1
эта VM — грамотная программа.

А почему literate program переведено как грамотная программа?


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

+4

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

-1

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

+3

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

0

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

0
Знаком с ним только понаслышке, поэтому ничего определенного сказать не могу :)
+1
Где-то по LISP-машинам проходит тонкая граница между интерпретаторами и виртуальными машинами :)
0

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

0
/* 65536 locations */
uint16_t memory[UINT16_MAX];

Похоже, 2 байта недоложили.
0
Спасибо! Очень полезный материал! Как раз сейчас занимаюсь разработкой NES эмулятора (просто так, just for fun).
Only those users with full accounts are able to leave comments. , please.