자신 만의 프로그래밍 언어 만들기 (I)

프로그래밍 언어의 진화

에 대한 첫 번째 기사를 쓴 후 자신의 운영 체제를 만드는 방법누군가 내가 기사를 쓸 수 있는지 말해 줬어 프로그래밍 언어를 만드는 방법. 처음에는 그다지주의를 기울이지 않았지만 지금은 프로그래밍 언어 생성에 대해 훨씬 더 많은 것을 배웠습니다. 그러니하자 기본 프로그래밍 언어, 다른 프로그램에 쉽게 임베드 할 수 있으며 또한 설계 할 가상 머신과 함께 작동합니다. 오늘날 우리는 가장 기본적인 가상 머신을 만들어야합니다.

아마 궁금 할 것입니다. «가상 머신? 하지만 그렇게 어렵지 않고 프로그램 속도도 느려질까요? " 반대로 단순 가상 머신은 매우 간단하고 상대적으로 빠릅니다. 나는 선택했다 가상 머신의 언어로. 그러나 그것은 무엇입니까 ?

실행 보안에 초점을 맞춘 프로그래밍 언어이므로 누군가가 가상 머신을 닫을 수있는 것은 사실상 불가능합니다. 개발중인 컴파일 된 언어입니다. 모질라. 서보기구, 대체 도마뱀 붙이, 그 안에서 발전하고 있습니다. 구문을 변경할 수는 있지만 사용할 코드는 첫 번째 안정 릴리스까지 유지됩니다.

설치 Linux 간단한 방법으로. 그러나 공식 소포는 없습니다. 사용자 Ubuntu 이 두 가지를 추가 할 수 있습니다 PPA: ppa : hansjorg / 녹  y ppa : cmrx64 /화물, 사용자 아치 사용할 수 있습니다 AUR (화물 깃 모든 것을 설치하는 패키지입니다). 나머지는 다음을 사용할 수 있습니다.

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

가상 머신은 어떻게 작동합니까?

어셈블러 세계가 어떻게 작동하는지 안다면 스택이나 스택이 정확히 동일합니다. 그렇지 않은 경우 설명해 드리겠습니다. 다음 코드를 상상해 봅시다.

2 + 3 인쇄

컴퓨터는 2 + 3의 의미를 이해하지 못하며 따라야 할 순서도 모릅니다. 컴퓨터는 데이터가 축적되고 지속적으로 추출되는 배터리 또는 스택으로 작동합니다. 가상 머신의 코드는 다음과 같습니다.

푸시 2 푸시 3 인쇄 추가

기본적으로 우리는 스택에 2, 3도 놓을 것입니다. ADD는 스택의 마지막 2 개 항목을 가져 와서 (즉, 스택에서 제거하고 값을 가져오고) 결과를 스택의 맨 위에 추가합니다. PRINT는 스택의 마지막 항목을 가져와 우리에게 표시하는 데 사용합니다. 이제 그것을하자 .

먼저 언어를 정의해야합니다. 바이트 코드, 우리는 같은 기존 것을 사용할 수 있습니다 자바 O 엘 CLR .NET / Mono의 버전이지만 좀 더 기본적인 것을 만들 것입니다.

https://gist.github.com/a01de8904fd39a442c20

각 명령어에 대해 XNUMX 진수 표기법을 사용합니다. 높은 곳에 우리는 # [(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. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   승용차

    흥미로운 호기심은 실제로는 그다지 유용하지 않지만 아는 것이 아프지 않습니다.

    Rust를 광고하는 것은 대단합니다. 그것은 많은 것을 약속하는 언어입니다. C ++보다 더 안전 할뿐만 아니라 (현재로서는) 구문이 더 명확합니다.

    사진에 관해서는 Java evolution XD를 고려하지 않습니다.

    1.    승용차

      그리고 포트란에서 나는 그것을 사용하지 않았지만 그것에 대해 많은 좋은 것을 듣지 못했습니다 ...

      1.    포리어스

        그렇습니다. 파이썬이 기반을 다지고 있음에도 불구하고 엔지니어링에 특히 유용합니다.

      2.    요한 복음

        Fortran은 아마도 C와 함께 다른 훌륭한 언어 일 것입니다. 오늘날에도 정말 중요한 질문은 둘 중 하나가 될 것입니다.

        그리고 Fortran이 C의 '진화'라는 것은 논쟁의 여지가있을 것입니다. C가 더 새롭고 더 현대적이며 더 많은 가능성을 가지고 있기 때문에 아마도 그 반대가되어야 할 때입니다. 하나는 적어도 다른 하나와 분리되지는 않았지만.

        최종 입장은 모두 어떤 관점에서 논란의 여지가 있지만.

    2.    시스코

      자바 +1

  2.   Portaro

    내가 이것을 좋아하는지 보자, 프로그래밍에 무언가를 줄 것이지만 더 많이 이해하는지 확인하기 위해 기본입니다.

  3.   사용자gnulinux

    새로운 프로그래밍 언어를 만드는 진짜 목적은 무엇입니까? 개인적으로는 소스 코드를 숨기는 계략 인 것 같습니다.

  4.   예리

    친구, "자신의 운영 체제"의 연속은 어떻게 되었습니까? 그대로 두지 말고 계속하세요.

    사실, 당신은 마스터이고이 두 곡이 제 관심을 완전히 사로 잡았지만, 저는 그들이 중간에 머물지 않기를 바랍니다.

    나는 우리 중 많은 사람들이 똑같이 생각하고이 흥미로운 주제의 연속과 결론을 기다리고 있다는 것을 알고 있습니다.

  5.   크리스티안 데이비드

    매우 흥미 롭습니다. 대단히 감사합니다. 🙂

  6.   솔직한

    Java는 컴파일 할 수 없기 때문에 프로그래밍 언어가 아니라 명령 인터프리터라고 생각하지 않습니다.

    1.    마리오

      [프로그래밍 언어는 컴퓨터와 같은 기계에 의해 수행 될 수있는 프로세스를 표현하도록 설계된 공식 언어입니다.]

      이러한 이유로 Java는 프로그래밍 언어입니다. Bash 언어 (리눅스 쉘 언어)조차도 그 자체로 프로그래밍 언어입니다.

      두 가지 유형의 언어가 있습니다.
      -컴파일
      -해석
      -혼합 (가상 머신, 네이티브 라이브러리 컴파일 및 기능 코드 해석)

      인터프리터는 다중 플랫폼과 관련하여 매우 유용하며 이에 대한 비참한 성능이 없습니다. Java, VB.NET, C ++ .NET, F #, C #은 모두 혼합 언어입니다. bash 언어, bat, PHP, Javascript 등은 해석 언어입니다.

      Java가 해석되기 때문에 언어로 간주하지 않는 경우 (아닙니다) 프로그램을 만드는 데 사용되는 다른 많은 언어를 고려하지 않아야합니다. 더욱이 세 가지 규칙에 따라 기계어 자체를 제외하고 프로그래밍 언어가 있다고 생각해서는 안됩니다.

      기계어조차도 실제로는 프로세서에 의해 "해석 된"명령 집합이기 때문에 언어로 간주 될 수 없습니다.

      사실상 모든 언어는 프로세서가 해석하는 일련의 명령에 불과하기 때문입니다.

      어느 정도 언어 (이 경우 Java)를 좋아할 수도 있고, 다소 유용하고 강력 해 보이지만 컴파일되지 않았기 때문에 프로그래밍 언어가 아니라고 말하면 모든 프로그래밍 언어 정의에 위배됩니다.

    2.    마리오

      😐 너무 무례 해 보이지 않았 으면 좋겠어요

      1.    마리아 안토니에 타 데 마누엘라 카르데나스

        당신은 우리의 삶을 파괴했을뿐

      2.    마리오

        hahahahaha, perdoooon. 내 의도가 아니었다 xD

    3.    카를로스

      자바는 프로그래밍 언어입니다. 응용 프로그램을 개발할 수 있고 컴파일 할 때 JVM에 의해 해석되는 .jar를 만듭니다. 그런 다음 파이썬 논리에 따라 해석되지 않지만 다른 실행 파일로 컴파일됩니다 ...

  7.   엘리아스 몽겔 로스

    아주 좋은 정보

  8.   카를로스 아르투로

    좋은 정보이지만 다른 유추 나 소프트웨어에 의존하지 않고도 처음부터 새로운 프로그래밍 언어를 만드는 것이 가능할 것입니다. 나는 다른 언어가 자바 나 HTML처럼 만들어진 것과 같은 방식으로 말한다.
    이 질문에 도움을 주셔서 대단히 감사합니다.