일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 온라인 ddl
- 마운트
- jack 문법
- mysql 엔진
- innodb 버퍼풀
- 핵기계어
- ec2
- 밑바닥부터 구현하는 컴퓨팅 시스템
- performance스키마
- 필수 스크립트
- dff
- MySQL
- 밑바닥부터 만드는 컴퓨팅 시스템
- 구문 분석
- 안전하게 테이블 변경
- nandtotetris
- 컴퓨터 아키텍쳐
- vm번역기
- 운용 시 유용한 쿼리
- 도커
- 스택머신
- InnoDB
- 리눅스
- vm머신
- s3
- 메모리 세그먼트
- Terraform
- innodb구조
- 밑바닥부터 만드는 운영체제
- 어뎁티브 해시 인덱스
- Today
- Total
이것이 점프 투 공작소
NandToTetris : 고수준 언어 Jack (밑바닥부터 만드는 컴퓨팅 시스템) 본문
이제는 핵 플랫폼의 고수준 언어 Jack이 드디어 나타났습니다.
기본적으로 java, c++같은 객체기반 언어라고 합니다.
상속은 지원하지 않지만, 여러가지 응용프로그램을 만들수 있다고합니다.
잭은 여기 플랫폼에서만 사용되는 언어이기에 잭을 학습한다기 보다는
'컴파일러와 os를 개발할 때 지지대 역할을 하는 언어'정도로만 생각하고 학습하려합니다.
Hello World
컴파일된 잭 프로그램이 실행될 때는 항상 Main.main함수에서 실행됩니다.
잭은 표준 클래스 라이브러기가 존재하며 이를 잭 OS라이브러리라고 합니다.
절차적 프로그래밍과 배열 처리
변수 할당 및 반복을 처리하는 전형적인 명령문들입니다.
keyboard와 Output은 os라이브러리의 클래스입니다.
잭에서 Array객체는 타입과 상관없이 모든 값들을 저장 할 수 있습니다.
추가로 잭에서는 기본데이터 타입으로 int, char, boolean을 지원합니다.
클래스 사용하기
아래 사진에 Fraction 클래스가 있는데,
접근자, 생성자, this등 객체지향과 관련된 익숙한 명령들이 보입니다.
jack은 가비지 컬랙터가 없기에 사용한 객체는 명시적으로 free가 필요하고, 서브루틴은 항상 return문으로 종료해야합니다.
아래는 Main함수에서 Fraction 클래스를 사용하는 예제입니다.
메모리 관점에서 class
클래스와 클래스 인스턴트를 2개 생성하는 main함수가 있습니다.
컴파일러에 생성자를 컴파일 할때 os를 호출하고 이때 os가 사용가능한 RAM 공간를 찾아서 RAM 공간에다가 객체를 저장합니다.
a인스턴트의 local 변수에는 15087이 들어있고 이 변수를 포인터로 취급해서 값을 찾으면 heap에 있는 값 '2' 을 찾을 수 잇습니다.
다음 heap의주소에는 a인스턴스의 다른 값이 들어있습니다.
List
리스트의 각 데이터들의 주소는 통제할 수 없습니다.
생성자가 동작하면 데이터들은 메모리 전체에 분산되지만, vm머신은 시작주소만 알고있다면 다음 요소의 위치를 계산해서 다음 데이터를 읽을 수 있습니다.
아래 코드처럼 리스트를 구현해서 LinkedList를 만들어 사용할 수 있습니다.
잭 언어 구문
jack 언어에서 임의의 수의 공백, 주석으로 구분되는 기호, 예약어, 상수, 식별자입니다.
클래스
잭의 기본 프로그래밍 단위는 클래스입니다.
클래스들은 xxx.jack이라는 개별파일에 저장되며, 각각 별도로 컴파일됩니다.
클래스 선언 이후에는 하나 이상의 서브루틴을 생성 할 수 있으며 각각 생성자, 함수, 메서드 중 하나를 정의합니다.
기본 문법
//, /* */ 으로 주석을 표시합니다.
while, function 등 약 70개 정도의 keyword가 있습니다.
var, let, do는 컴파일러 작성을 쉽게하기위해 의도적으로 만들어졌습니다. (추후 컴파일러에서 알게된다고 함)
상수에는 int, string, boolean 상수가 있습니다.
타입 변환
jack에서 문자(char)와 숫자타입은 타입변환이 가능합니다.
string을 char를 변환하려면 charAt()를 통해 변환해야합니다.
Array를 선언할때 조금 특이한 문법이 있는데,
arr = 5000 이런식으로 숫자를 사용해서 배열을 초기화하는데 이는 배열의 기본주소가 5000에서 시작한다는걸 의미합니다.
그리고 Fraction 객체를 x를 정의한 다음, 배열객체 arr을 넣는데
이렇게 되면 x는 arr배열을 가리키게 되며, x.print와 같은 Fraction의 메소드를 사용 가능하게됩니다.
자바와 c++에서도 객체를 배열로 쉽게 직렬화가 가능한데 jack은 그런 관계를 더 명확하게 정의했다고 합니다.
그리고 jack은 연산 우선순위가 없어서 4 + 3*3라는 계산식이 21이 나올수도 있습니다.
괄호를 필수적으로 적용해야합니다.
클래스에서는 서브루틴에서 접근가능한 정적 변수, 클래스 단위에서 정의되어 사용되는 필드 변수
하나의 서브루틴 안에서만 사용되는 로컬 변수, 서브루틴에 전달되는 파라미터 변수 총 4가지가 있습니다.
명령문
고수준 언어에서 익숙한 명령문들의 문법입니다.
jack application 개발
직접 작성한 jack언어와 jack os라이브러리(graphics, inputs, Math, String, Array, Memory, Sys, Output)를 사용해서
아래와 같은 다양한 프로그램을 만들 수 있습니다.
jack 클래스 파일을 만들고 jack언어로 프로그램을 만든다음 jackCompiler에 파일이나 directory를 넣어서 컴파일합니다.
컴파일러는 vm파일을 만들고 vm에뮬레이터를 통해 실행시킵니다.
'NandToTetris' 카테고리의 다른 글
NandToTetris : 컴파일러 2: 코드 생성 (밑바닥부터 만드는 컴퓨팅 시스템) (0) | 2025.03.10 |
---|---|
NandToTetris : 컴파일러 1: 구문 분석 (밑바닥부터 만드는 컴퓨팅 시스템) (0) | 2025.03.09 |
NandToTetris : 가상머신2-제어 (밑바닥부터 만드는 컴퓨팅 시스템) (0) | 2025.02.26 |
NandToTetris : 가상머신1-프로세싱 (밑바닥부터 만드는 컴퓨팅 시스템) (0) | 2025.02.19 |
NandToTetris : 어셈블러 (밑바닥부터 만드는 컴퓨팅 시스템) (어셈블러 구현 X) (1) | 2025.02.18 |