이제 가상 머신 파트를 끝나고 컴파일러와 운영체제에 다와간다.

이번에 봐야하는 장은 고급 언어로 HACK에서 사용하는 고급언어인 JACK에 대해서 보면된다.

JACK은 JAVA나 C++ 같은 객체지향 언어 비슷한거라 저자분 말로는 배우는데 1시간이면 충분하다고 한다.

이런 고급언어 처럼 상속같은건 안되지만 왠만한 건 다 가능해서 테트리스나 스네이크, 퐁, 스페이스 인베이더 등 게임도 만들수가 있다.

 

 

이번 장 학습 개요와 절차 지행 프로그래밍

 

이번 장에서 다루는 내용은 아래와 같다.

1. JACK을 이용한 프로그래밍 예제,  절차지향, 객체지향, 리스트 처리 등

2. 문법 관련 예시들

3. 응용 어플리케이션 개발 관련 내용

 

 

 모든 언어를 공부할때 처음 만나는 hello world 출력하기 예제, 자바랑 거의 비슷하다. 우측에 주석문에 대한 내용이 있는데 /**    */ 가 API 설명 블록인지는 처음알았다.

 

 이번에는 절차와 배열을 이용한 프로그래밍 예시인데 키보드 입력을 받아서 배열에다가 담아내는 내용이네. 이 예제 코드로 JACK 언어에 대해서 좀 보면

 

1. JACK 프로그램은 여러 개의 .jack 클래스 파일을 모아서 Main.jack의 main 함수서 시작한다.(Main.jack은 꼭있어야함)

2. 흐름 제어도 제공하고

3. 기본 자료형으로 int, char, boolean, 클래스 정의한 타입인 OS에서 제공하는 Array와 String, 그리고 추상 자료형을 구현한 사용자 정의 클래스도 사용할수 있다.

4. 제공되는 OS 서비스로 Keyboard.readInt, Output.printString 등이 있다.

 5. OS에서 배열 자료형을 제공하는데, jack arrays are not typed 이 부분은 뭔 의미인지 잘모르겠다.

 

 

객체 지향 프로그래밍

 다른 언어처럼 JACK도 필요한 클래스를 추상 데이터 타입 ADT로 표현할수 있으니 구현해놓고 이걸 보고 쓰면된다.

 

 JACK에서는 기본 자료형으로 int, char, boolean만 제공하고 있다. 소수점 자리 날라가는거 없이 분수 표현을 하기 위해서 만들어진 Fraction 클래스가 있는데, field는 맴버 변수가 된다.

 

 Jack의 서브 루틴으로는 메서드와 생성자 그리고 함수가 있는데 메소드는 이 클래스 외부서 접근해서 사용할 수 있지만 function의 경우 이 함수 내부에서만 사용된다. 생성자는 생성자고, JACK에서는 가비지 컬랙터가 제공되지 않으니 사용하지 않는 객체는 명시적으로 해제해야되며 JACK의 모든 서브루틴은 return문으로 종료되어야한다.

 

서브루틴 전반에 대해서 봤는데, 그러면 JACK에서 클래스 객체는 어떻게 만들어지는지를 보자. 생성자는 기본적으로 OS와 컴파일러에서 어느 RAM 공간에다가 객체를 저장할지 다뤄준다. 또, 객체를 생성하면 스택에는 객체의 주소(객체의 값들이 있는 곳의 주소)가 올라가고, 힙 영역에는 그 객체의 값들이 보관된다.

 좌측 클라이언트 코드에서 a = Fraction.new(2, 3)한 결과 지역 변수 a는 스택에 올라갔고 이 스택의 값은 이 변수의 값들의 주소(heap에 위치)를 나타낸다. 이 지역 변수이자 분수인 a의 값들은 힙 영역 RAM[15087], RAM[15088] 에 저장 되어있다.

 빨리 넘어가기위해 생략하지면 연결 리스트를 제공하고 있어 리스트 처리도 가능하다.

 

 

OS를 구성하는 클래스는 위 8개고, 우측의 기능들을 제공한다.

 

 서브루틴 작성할 때 다른 클래스에 있는 내용을 가져와서 쓰면되지, 또 작성하지 말아야 한다.

 

 

 

 

 

JACK 언어 특징

 이제 JACK 언어를 이용한 고급 언어 프로그래밍을 마치고 JACK 언어의 문법, 데이터 타입, 클래스 등 언어적 특징을 살펴보자

 

 JACK은 토큰, 우리나라 말로 하면 형태소랑 비슷할거 같은데, 의미를 가진 최소 단위인 토큰들로 이뤄져있는데 이 토큰들은 신텍스 요소 그러니까 문법적 요소로 분류하면 위의 표와 같다. 이 부분들은 뒤의 컴파일러 파트에서 필요해서 간단하게 짚고 넘어간다. 대충 코딩하면 몰라도 되긴한데 컴파일러를 만들어야되니

 

 공백이나 주석문은 //, /*, /** 같은 식이고,   (), [], {}, ,, ;, +, - 같은 것들을 심볼, int, boolean, class, true 같은 것들은 예약어, 이도 저도 아닌 숫자는 상수, 그 외의 숫자 이외로 시작하는 문자들의 모음을 식별자라고 부른다.

 

 

 클래스의 맴버 변수, 정적 변수는 맨 앞에다가 선언해줘야 되고, 그 뒤에는 서브루틴들을 선언한다.

 

 서브루틴 그러니까 생성자, 메소드, 함수 같은 것들은 위의 형태로 선언과 구현을 한다. 함수 function은 외부에서 사용 불가능한 static 메소드이고, 그냥 메소드는 이 객체를 생성해서 외부에서 쓸수있다. 

 

 

 이제 데이터 타입을보면, 아까 어떤 기본타입이 있는지 말했으니 넘어가고 

 

객체는 위와 같이 선언하고 할당할 수 있으며, let 객체명 = 다른 객체; 시에는 얕은 복사가 이뤄진다.

객체의 선언 : var 클래스명 객체이름;

객체 할당 : let 객체명 = 객체 인스턴스;

 문자열 String은 OS에서 제공하는 String 클래스의 인스턴스며, 특이한점이라면 charAt(index) 라는 함수로 특정 문자 갑을 가져올수 있다.

 

 JACK 언어의 타입은 약한 타입, 약한 형태를 가지고 있는데, 이 말은 한 타입의 값을 다른 타입에다가 어떻게 할당할지 형 변환이 이뤄질지를 정의하지 않았다는 말을 의미한다. 왜냐면 다른 타입 끼리 할당하거나 어떻게 처리할지까지 정의하면 컴파일러가 너무 복잡해지다보니 간단한 컴파일러를 만들다보니 이렇게 됬다.

 

 변수의 경우 1) 해당 클래스와 모든 클래스의 서브루틴에서 접근가능한 정적 변수(같은 클래스 인스턴스끼리 공유하는 변수라 공유 변수라고도 함), 2) 클래스 단위에서 정의되어 객체의 속성을 나타내는 필드 변수, 3) 해당 서브루틴 안에서만 사용되는 로컬 변수와 4) 콜러가 서브루틴으로 전달하는 파라미터 변수 4 종류로 나눌수 있다.

  클래스와 필드 변수는 그 클래스(정적 변수, 해당 클래스의 모든 인스턴스), 그 클래스 인스턴스(필드 변수)에서만 접근이 가능하여 외부에서는 사용이 불가하고, 개발자가 작성한 경우 접근자 accessor(자바로 따지면 게터, 세터같은거)와 메소드로 접근이 가능하다.

 구문 statement는 변수에 값을 할당할때 쓰는 let, 조건문 if, 반복문 while, 함수 호출하는 do, 값을 반환하는 return 정도가 있다.

 

 각 구문들은 변수 명과 또 다른 구문 그리고 표현식 expression으로 이뤄져 있는데, 다음과 같은 표현식들이 존재한다.

1. 상수

2. 변수명 : 변수는 static( 그 클래스와 인스턴스 전체), field(그 클래스 인스턴스 내), local(그 서브루틴 안), parameter(그 서브루틴 안) 중 하나에 속한다.

3. this : 현재 객체의 포인터를 의미한다.

4. arr[expression] : arr은 Array 클래스의 한 타입으로 arr의 요소를 이와 같이 접근한다.

5. 서브루틴 : non-void type을 반환한다는데, return;으로 끝나는 메인함수는 뭔가 싶은데 아직은 잘모르겠다.

6. -expression, ~expression : 이 경우 -는 산술 부정 연산, ~는 논리 부정 연산을 한다.

 

 

 

 서브루틴 호출 : 서브루틴에 함수, 메소드, 생성자가 있는데 매번 호출 가능 범위가 햇갈린다. 이걸 보면서야 정리가 됬는데, 함수는 해당 클래스 안에서만, 메소드는 해당 클래스 그러니까 인스턴스 밖에서, 생성자/소멸자도 밖에서 사용가능하다.

 

 

JACK 프로그램

 이제 JACK 언어에 대해서 대부분을 살펴봤고, 이제 JACK으로 구현한 어플리케이션, OS 사용 등 예시를 둘러보고 이번 장을 마치자.

 

 JACK으로 개발한 이런 프로그램들이 있고

 

 잭 응용 프로그램을 만들려면 하나의 폴더에다가 구현한 .jack 클래스 파일들과 컴파일러를 놓고 컴파일을 하자. 생성된 vm 파일들을 가상 머신으로 로드해서 실행하면 된다.

 

 

 JACK OS 클래스로 이런것들이 있다.

1. Output : 화면에 문자 출력

2. graphics : 화면에 선, 원, 픽셀, 사각형 등 출력

3. inputs : 키보드 입력 읽기

4. Math, String, Array : 수학, 문자열, 배열 처리

5. Memory : 메모리 읽기, 쓰기, 할당, 해제

6. Sys : 중지, 에러 등, 가상머신 파트 마지막 부팅 내용에서 sp=256   sys.init 인가로 시작한다 했던거 같은데 init 이 왜없는지는 아직 모르겠다.

 

 

 

 

 와 대강 2 ~ 3시간만에 9장 내용을 대강 정리했다. 이번 금요일에 OS까지 하는걸 목표로 하다보니까. 이번장이야 이미프로그래밍은 익숙하니 금방 끝내겠지 하고 9, 10장을 한번에 끝낼 생각으로 시작했었다.

 

 그런데 오늘 수업 중에 여유있을때 컴파일러 파트 PPT 자료를 보는데 문법, 구문, 표현식, 파싱 같은 내용들이 수두룩한걸 보고나서 정리를 시작하려고 보니까 대충 넘겨서는 안될 부분들이 좀 있더라.

 

 원래 생각햇던것 보다는 이번장 양이 많아지기는 했는데, 책만 봤을때에 비하면 PPT 자료가 이해하기가 너무 좋게 잘 정리되어있어서 이덕분에 빨리 마무리 할 수 있었다.

 

 다음 장은 컴파일러 1 : 문법 분석 파트다. 좀 쉬고 10장 시작해야지.

+ Recent posts