프로그래밍 언어 / Tucker님의 Go 언어 프로그래밍 #2
본글은 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트입니다.
프로그램
프로그램은 명령이 적혀있는 문서이다.
그런데 명령이 무슨 언어로 이루어져있을까?
바로 프로그래밍 언어
로 이루어져있다.
컴퓨터는 0과 1밖에 모르는데 이상태에서 어떻게 명령을 하지?
초기 프로그램
오래전에는 근성으로 0과 1로만 코딩을 했다고 한다.
이정도면 나는 안할거같다. 요즘 세상에 태어난게 얼마나 다행인지
앞의 4개의 숫자는OP코드로써 ADD 같은 명령을 뜻한다.
그리고 그 외의 숫자들은 각각 명령을 수행할 때 필요한 데이터들이다.
근데 0011이 ADD인지 어떻게 알지?
0011이 입력되면 멀티플랙서(먹스)가논리소자로 처리후
add쪽 전기신호가 열리면서 연산을 처리한다.
천공카드에 구멍을 뚫어서 프로그래밍을 했다.
구멍을 잘못 뚫었다면? - 쉣
지금도 한줄만 잘못써도 힘든데...
어셈블리어의 등장
모니터와 키보드가 나타나면서 어셈블리어가 등장했다. (인간이 이해할 수 있는 정도 )
이런 언어들도 결국 기계어(이진수)로 변환되고 명령이 실행된다.
프로그래밍 언어를 기계어 형태로 바꾸는 것을
컴파일(compile)이라고 한다.
어셈블리어의 단점
기계어에 일대일 대응을 해서 적어줘야하기 때문에 고급기능 구현이 어렵다.
확실히 자유도는 높지만 그만큼 피로도가 높을 것이다.
고수준 언어
어셈블리어를 제외한 언어를
고수준 언어라고 한다. C언어 C++, JAVA , Python 등등이 있다.
이제 인간의 언어 문법과 유사하게 프로그래밍이 가능해졌다.
정적컴파일 언어와 동적 컴파일 언어
하지만 고수준 언어들도 최종적으로는 컴파일이 진행되어야한다.
기계어를 변환하는 시점에 따라 두가지 컴파일 언어로 나뉜다.
정적컴파일:실행하기 전에 미리 컴파일, 속도가 빠르다. (c언어 go)
동적컴파일: 실행할때마다 그때마다 코드를 기계어로 바꾸는 언어(java ,python )
속도가 다소 느리다.
정적컴파일 언어와 동적 컴파일 언어
정적컴파일은 실행하기 전에 미리 컴파일을 한다. 여기에는 결점이 존재하게 된다.
우리는 앞서 초기프로그램을 살펴볼 때 OP코드로 명령을 내리는 것을 볼 수 있었다.
반도체 회사마다 OP코드가 달라서 따로따로 컴파일 해주어야한다...
아마 반도체 회사 두개 이상은 알 것이다. AMD, INTEL 등등
설상가상으로 운영체제마다 다르게 만들어줘야한다.
그렇다면 컴파일 해야하는 가짓수는
그런데 동적 컴파일 언어는 동일한 코드를 가져도
동적컴파일언어가 실행할때 플랫폼이 무엇인지 파악하고 그때 마다 컴파일을 해주는 것이다.
그런데 왜 go언어는 정적 컴파일 언어일까?
- 우선 정적 컴파일 언어의 속도를 무시할 수 없다.
- 플랫폼 상황이 좋아졌다. 운영체제의 수가 예전보다 줄었고 go는 여러 플랫폼의 실행파일을 편하게 만들어준다.
go언어 환경변수(goos) 빌드 타입 바꾸기
$ENV:GOOS = "OS이름"
만약 리눅스르 변경해 빌드를 한다면 리눅스에서만 실행이된다.
강타입 vs 약타입 언어
만약 프로그램은 이런 식을 어떻게 계산할까?
"12" + 12 =?
문자 12 와 숫자 12를 더하는 것이다.
이에 따라 언어가 또 두가지로 나뉘는데
약타입: 서로 타입이 다른데 그 타입을 알아서 바꿔주는 언어가 있다. (자바스크립트)
예를 들면 1212(문자로 바꿨을 시) , 24(숫자로 변환시)가 된다.
강타입 : 생각해보면 이상하긴 하다. 12는 문자인데 어떻게 숫자라 더해지는게 말이되냐? 이런 컨셉을 가진 것이 강타입 언어이다. 그리고 1212로 해야할지 24로 해야할지도 모르겠으니 그냥 오류라고 말해준다.
그런데 모든 1부리그에든 2부리그든 순위가 있듯 강타입 언어 약타입 언어에도 순위가 있다.약한놈들중에 강한놈... 강한놈들중에 약한놈 ..
go는 최강타입 언어이다
. 타입을 계속 맞추어야한다.. !!!!
가비지컬렉터 있냐?
가비지 컬렉터는 (Garbage Collector )필요없는 메모리를 자동으로 처리해주는 도구이다.
가비지컬렉터가 없는 언어는 c, c++
이고 직접 사용자가 메모리를 지워야함
메모리관리를 제대로안하고 한계까지 쓰면 멈추거나 버그가 생긴다.
가비지 컬렉터가 없으면 지우는 명령만 해주면 되지만 가비지 컬렉터가 있으면
버려하는 메모리가 무엇인지 검사를 하는 행동이 추가되기 때문에 성능이 낮춰진다.
Go는 고도의 가비지컬렉터를 지원하는데 굉장히 빠른 가비지컬렉터를 가진다.
느낄수 없을 정도로 빠르다. 1ms이하로 걸린다 .
본글은 Tucker님의 Go 언어 프로그래밍 학습 글입니다. 감사합니다.
Uploaded by Notion2Tistory v1.1.0