Създайте свой собствен език за програмиране (I)

Еволюцията на езиците за програмиране

След написването на първата статия на как да създадете своя собствена операционна системаНякой ми каза дали мога да направя статия за как да създам език за програмиране. Отначало не обръщах много внимание, но сега и по други начини научих много повече за създаването на програмни езици. Така че нека направим основен език за програмиране, лесно вградими в други програми и които работят с виртуална машина, която също ще проектираме. Днес трябва да направим най-основната виртуална машина.

Вероятно се чудите: Виртуална машина? Но не е ли много трудно и забавя ли програмите? " За разлика от това, обикновена виртуална машина е много проста и относително бърза. Аз избрах Ръжда като език за виртуалната машина. Но какво е това Ръжда?

Ръжда Това е език за програмиране, който е фокусиран върху сигурността на изпълнението, така че с него ще бъде практически невъзможно някой да затвори виртуалната машина. Това е компилиран език в разработка, създаден от Mozilla. Servo, заместител на Гущер, се развива в него. Все още можете да промените синтаксиса си, но кодът, който ще използвам, ще бъде запазен до първото стабилно издание.

Ръжда инсталира в 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

В следващата глава ще видим повече за нашия език за програмиране.


Оставете вашия коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

*

*

  1. Отговорен за данните: Мигел Анхел Гатон
  2. Предназначение на данните: Контрол на СПАМ, управление на коментари.
  3. Легитимация: Вашето съгласие
  4. Съобщаване на данните: Данните няма да бъдат съобщени на трети страни, освен по законово задължение.
  5. Съхранение на данни: База данни, хоствана от Occentus Networks (ЕС)
  6. Права: По всяко време можете да ограничите, възстановите и изтриете информацията си.

  1.   пътник каза той

    Интересно любопитство, макар и да не е много полезно в действителност, не боли да се знае.

    Страхотно е, че рекламирате Rust, това е език, който обещава много, не само че е по-сигурен от c ++, но (засега) по-ясен в синтаксиса си.

    Що се отнася до снимката, не бих помислил за Java evolution XD.

    1.    пътник каза той

      И от fortran никога не съм го използвал, но не съм чувал много хубави неща за него ...

      1.    Страшно каза той

        Аз го правя и това е особено полезно в инженерството, въпреки че Python набира все по-голяма позиция.

      2.    Джон каза той

        Fortran е може би другият велик език заедно с C. Все още днес в наистина критични въпроси ще бъде един или друг.

        И би било дискусионно, че Fortran е като „еволюция“ на C, когато може би трябва да е обратното, тъй като C е по-нов, по-модерен и с повече възможности; въпреки че едното не е откъснато ни най-малко от другото.

        Въпреки че крайните позиции са спорни от някаква гледна точка.

    2.    Франциско каза той

      +1 към Java

  2.   Портаро каза той

    Да видим дали това ми харесва, ще дам нещо на програмирането, но основно, за да видя дали разбирам повече.

  3.   usergnulinux каза той

    Каква е истинската цел на създаването на нов програмен език? На мен лично ми се струва, че е трик да се скрие изходния код.

  4.   Йели каза той

    Приятелю, какво се случи с продължението на „твоята собствена операционна система“? Не го оставяйте там, моля, продължете.

    Всъщност вие сте майстор и точно тези две песни завладяха напълно вниманието ми, но не бих искал да останат наполовина.

    Знам, че много от нас мислят по същия начин и чакаме продължението и заключенията на тези много интересни теми.

  5.   Кристиан Дейвид каза той

    Много интересно, много благодаря. 🙂

  6.   Франко каза той

    Не считам java за език за програмиране, а по-скоро за интерпретатор на команди, тъй като не е компилируем

    1.    Mario каза той

      [Езикът за програмиране е официален език, предназначен да изразява процеси, които могат да се извършват от машини като компютри.]

      По тази причина Java е език за програмиране. Дори bash езикът (linux shell language) е език за програмиране сам по себе си.

      Има два вида езици:
      - Съставено
      - Интерпретиран
      - Смесени (Виртуални машини, родните библиотеки се компилират и функционалният код се интерпретира)

      Преводачите са много полезни, когато става въпрос за мултиплатформена платформа и нямат катастрофални резултати за това. Java, VB.NET, C ++ .NET, F #, C # са смесени езици. Баш езикът, bat, PHP, Javascript и много други са интерпретирани езици.

      Ако не считате Java като език, тъй като тя се интерпретира (което не е така), не трябва да разглеждате много други езици, които се използват за създаване на програми. Освен това, по това правило от три не трябва да смятате, че има някакъв език за програмиране, освен самия машинен език.

      И защо не? Дори машинният език не може да се счита за език, тъй като той всъщност е просто набор от команди, „интерпретирани“ от процесора.

      Тъй като ефективно, ВСИЧКИ езици не са нищо повече от набор от команди, които се интерпретират от процесор.

      Може да ви хареса език повече или по-малко (Java, в този случай), да изглежда повече или по-малко полезен и мощен, но да се каже, че той не е език за програмиране, защото не е компилиран ... противоречи на всички дефиниции на езика за програмиране.

    2.    Mario каза той

      Надявам се, че не изглеждах прекалено груб

      1.    мария антониета де мануела карденас каза той

        без тишина само унищожи живота ни

      2.    Mario каза той

        хахахахаха, perdoooon. не беше моето намерение xD

    3.    Карлос каза той

      java е език за програмиране. Тъй като можете да разработите приложение и когато компилирате, правите .jar, който се интерпретира от JVM. Тогава според вашата python логика той също не се интерпретира, но се компилира в различни изпълними файлове ...

  7.   Елиас Монгелос каза той

    Много добра информация

  8.   Карлос Артуро каза той

    добра информация, но имам съмнение, че ще бъде възможно да се създаде нов програмен език от нулата, без да се налага да се разчита на други аналогии или софтуер. Говоря по същия начин, по който са създадени други езици като java или HTML.
    Ще се радвам много на вашата помощ по този въпрос.