След написването на първата статия на как да създадете своя собствена операционна системаНякой ми каза дали мога да направя статия за как да създам език за програмиране. Отначало не обръщах много внимание, но сега и по други начини научих много повече за създаването на програмни езици. Така че нека направим основен език за програмиране, лесно вградими в други програми и които работят с виртуална машина, която също ще проектираме. Днес трябва да направим най-основната виртуална машина.
Вероятно се чудите: Виртуална машина? Но не е ли много трудно и забавя ли програмите? " За разлика от това, обикновена виртуална машина е много проста и относително бърза. Аз избрах Ръжда като език за виртуалната машина. Но какво е това Ръжда?
Ръжда инсталира в Linux По прост начин. Няма обаче официален колет. Потребители на Ubuntu може да добавите тези две АОП: ppa: hansjorg / ръжда y ppa: cmrx64 / товар, потребители на Арка може да използва AUR (cargo-git е пакетът, който инсталира всичко). Останалите могат да използват:
curl -s https://static.rust-lang.org/rustup.sh | sudo sh
Как работи виртуалната машина?
Ако знаете как работи асемблерният свят, той е абсолютно същият, със стека или стека. Ако не, ще ви го обясня. Нека си представим следния код:
отпечатайте 2 + 3
Компютърът не разбира какво означава 2 + 3, нито знае какъв ред да следва. Компютрите работят с батерии или стекове, в които данните се натрупват и непрекъснато се извличат. Този код във нашата виртуална машина трябва да изглежда по следния начин:
PUSH 2 PUSH 3 ADD PRINT
По принцип бихме поставили 2 на стека отгоре, 3 също. ADD ще изтегли (т.е. премахне го от стека и ще получи стойността му) последните 2 елемента в стека и ще добави резултата в горната част на стека. PRINT ще вземе последния елемент от стека и ще го използва, за да ни го покаже. Сега нека направим това в Ръжда.
Първо трябва да дефинираме език за байткод, бихме могли да използваме съществуващ такъв като този в Ява о ел CLR на .NET / Mono, но ще създадем по-основен.
https://gist.github.com/a01de8904fd39a442c20
За всяка инструкция използваме шестнадесетична нотация. На високо сме сложили # [производно (FromPrimitive)], е особеност на Ръжда и ще ни помогне по-късно да можем да сравним изброяването с байтове директно.
Сега трябва да направим функция, която изпълнява всяка от тези инструкции. За това трябва да прочетем байт и да го сравним с инструкциите, които имаме в изброяването. Ако откриете съществуващи, трябва да изпълните действието си.
https://gist.github.com/8950ce212a2de2f397f9
Правим това, за да прочетем всеки байт поотделно и да ги изпълним:
https://gist.github.com/12e24a1f0dd65e4cd65d
Както можете да видите, ние правим разлика, ако преди това сме получили командата PUSH (нашата команда INTEGER), следващият байт ще бъде изцяло взет в стека. Там използваме две функции, които не съм ви научил, self.pop () y self.push (), които очевидно отговарят за обработката на стека.
https://gist.github.com/54147f853a8a2b8c01d9
Те не са много сложни, но функцията pop има механизми за откриване на грешки. Всъщност в Ръжда, ако премахнем тези механизми, това ще ни даде грешка при компилацията. Сега просто трябва да се обадим в програма Перин (нашата виртуална машина) и изпълнете байт код.
https://gist.github.com/99b1ab461318b3a644d0
Този байт код може да се прочете от файл, но тук за простота съм го съхранил в променлива. Ако го изпълним, това ще ни даде очаквания резултат:
Perin v0.1 Perin VM изпълнява FlopFlip байт код Стартиране на екземпляр PerinVM PerinVM v0.1.0 Цяла стойност 5
Целият код е достъпен на GitHub под Лиценз за Apache 2.0: https://github.com/AdrianArroyoCalle/perin. За да компилират те трябва да имат Товарен инсталиран и поставен:
такса изграждане && ./target/main
В следващата глава ще видим повече за нашия език за програмиране.
Интересно любопитство, макар и да не е много полезно в действителност, не боли да се знае.
Страхотно е, че рекламирате Rust, това е език, който обещава много, не само че е по-сигурен от c ++, но (засега) по-ясен в синтаксиса си.
Що се отнася до снимката, не бих помислил за Java evolution XD.
И от fortran никога не съм го използвал, но не съм чувал много хубави неща за него ...
Аз го правя и това е особено полезно в инженерството, въпреки че Python набира все по-голяма позиция.
Fortran е може би другият велик език заедно с C. Все още днес в наистина критични въпроси ще бъде един или друг.
И би било дискусионно, че Fortran е като „еволюция“ на C, когато може би трябва да е обратното, тъй като C е по-нов, по-модерен и с повече възможности; въпреки че едното не е откъснато ни най-малко от другото.
Въпреки че крайните позиции са спорни от някаква гледна точка.
+1 към Java
Да видим дали това ми харесва, ще дам нещо на програмирането, но основно, за да видя дали разбирам повече.
Каква е истинската цел на създаването на нов програмен език? На мен лично ми се струва, че е трик да се скрие изходния код.
Приятелю, какво се случи с продължението на „твоята собствена операционна система“? Не го оставяйте там, моля, продължете.
Всъщност вие сте майстор и точно тези две песни завладяха напълно вниманието ми, но не бих искал да останат наполовина.
Знам, че много от нас мислят по същия начин и чакаме продължението и заключенията на тези много интересни теми.
Много интересно, много благодаря. 🙂
Не считам java за език за програмиране, а по-скоро за интерпретатор на команди, тъй като не е компилируем
[Езикът за програмиране е официален език, предназначен да изразява процеси, които могат да се извършват от машини като компютри.]
По тази причина Java е език за програмиране. Дори bash езикът (linux shell language) е език за програмиране сам по себе си.
Има два вида езици:
- Съставено
- Интерпретиран
- Смесени (Виртуални машини, родните библиотеки се компилират и функционалният код се интерпретира)
Преводачите са много полезни, когато става въпрос за мултиплатформена платформа и нямат катастрофални резултати за това. Java, VB.NET, C ++ .NET, F #, C # са смесени езици. Баш езикът, bat, PHP, Javascript и много други са интерпретирани езици.
Ако не считате Java като език, тъй като тя се интерпретира (което не е така), не трябва да разглеждате много други езици, които се използват за създаване на програми. Освен това, по това правило от три не трябва да смятате, че има някакъв език за програмиране, освен самия машинен език.
И защо не? Дори машинният език не може да се счита за език, тъй като той всъщност е просто набор от команди, „интерпретирани“ от процесора.
Тъй като ефективно, ВСИЧКИ езици не са нищо повече от набор от команди, които се интерпретират от процесор.
Може да ви хареса език повече или по-малко (Java, в този случай), да изглежда повече или по-малко полезен и мощен, но да се каже, че той не е език за програмиране, защото не е компилиран ... противоречи на всички дефиниции на езика за програмиране.
Надявам се, че не изглеждах прекалено груб
без тишина само унищожи живота ни
хахахахаха, perdoooon. не беше моето намерение xD
java е език за програмиране. Тъй като можете да разработите приложение и когато компилирате, правите .jar, който се интерпретира от JVM. Тогава според вашата python логика той също не се интерпретира, но се компилира в различни изпълними файлове ...
Много добра информация
добра информация, но имам съмнение, че ще бъде възможно да се създаде нов програмен език от нулата, без да се налага да се разчита на други аналогии или софтуер. Говоря по същия начин, по който са създадени други езици като java или HTML.
Ще се радвам много на вашата помощ по този въпрос.