연휴이고 하니 이것저것 파고 들고
마침 회사에서도 micom을 AVR에서 TI로 바꾸는 바람에 API를 보고 있는데
"내가 공부하는게 언어일까 API일까?" 라는 의문이 들었다.
솔찍히 말해서 C언어에서 배우면서 어려운 단계를 적다면
1. for 문 / while 문
2. array
3. 배열
4. 그리고 printf() scanf()
머 나오는 순서로 따지면 4번이 0 번이 될 가능성이 높은데
언어와 통합이 되어 있다고 할정도로 stdio / stdlib 가 필수적이긴 하지만
이걸 언어에 포함을 해야 할까? 라는 의문이 든다.
다른 언어들을 공부하면서도
솔찍히 파일 입출력이 없고 printf 같은 화면에 출력하는 방법이 없으면 사용이 많이 제약이 되는 것을 보면
api 자체를 (비록 언어에 통합이 되어 있는 기본 라이브러리라고 해도) 언어에 포함을 해야 할까? 라는 생각이 든다.
micom의 경우는 조금 더 심해서 하드웨어 종속적인 부분이 많이 다른데
둘다 C를 기반으로 하지만 하드웨어 핀 배열등이 다른데 이걸 언어라고 표현하지 않고 장비라고 하는 것을 보면
우리가 표현하는 언어를 배운다는 말은 실은 API를 배운다 라고 해야 하는게 맞지 않을까 라는 망상마저 드는데..
아무튼 새로 나오는 언어들은 오만 라이브러리들을 기본내장하고 나오는 것을 보면 언어의 정의가 바뀐것 같기도 하고.
단순하게 제어 반복문 이나 함수 / 변수 구조등만을 언어로 규정짓는 것 또한 바보같은 발상인것 같긴한데...
연휴이고 하니 뜬금없이 LISP 공부중인데 전에도 이해 못했고 이번에도 이해 못하고 있는 lisp -_-
LISP는 LISt Process 의 약자로
이름대로 모든것으로 LIST 에 기반하여 표현하게 되며, 리스트는 () 로 둘러쌓여 표현된다.
이러한 이유로 lisp 소스를 보면 ()가 가득히 둘러쌓여 가독성이 떨어지는 형태가 된다.
또한 리스트에서 계산등은 모두 전위표기법을 사용하게 되며 기본 연산은 다음과 같이 표현된다.
CL-USER>(+ 1 2 ) ; 1 + 2
3
CL-USER> (- 1 2 ) ; 1 - 2
-1
CL-USER> (/ 1 2) ; 1 / 2
1/2
CL-USER> (* 1 2) ; 1 * 2
2
CL-USER> (mod 3 2) ; 3 % 2
1
CL-USER> (log 2) ; log(2)
0.6931472
CL-USER> (sqrt 2) ; sqrt(2)
1.4142135
CL-USER> (< 1 2) ; 1 < 2
T
그리고 기호를 가지는 변수(?)는 setq 명령어를 이용하여 선언한다.
val을 입력하면 해석할 수 없는 변수이기 때문에 에러가 나지만 setq를 통해서 값을 정해주면
val만 입력해도 입력했던 값이 나오게 된다.
CL-USER> val
Invoking restart: Return to sldb level 2.
; Evaluation aborted on #<UNBOUND-VARIABLE #xC7B642E>.
CL-USER> (setq val 100)
100
CL-USER> val
100
CL-USER> (setq str "This is test string")
"This is test string"
CL-USER> str
"This is test string"
아무튼 defvar 라는 키워드를 이용해서 변수를 선언 할수도 있는데 setq와는 다르게 리턴되는 값이 다르다
CL-USER> (defvar loop 10)
LOOP
CL-USER> loop
10
함수는 defun (DEFine + FUNction 인 듯?)을 통해서 선언이 가능하다.
단순하게 3을 리턴하는 함수로 three 라는 것을 만드는 예제이다.
> (defun three () 3)
THREE
> (three)
3
> (+ (three) 1)
4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> three()
error: unbound variable - THREE
> three
error: unbound variable - THREE
> (+ three 1)
error: unbound variable - THREE
인자를 사용하는 함수로 인자는 아래와 같이 사용한다.
CL-USER> (defun add (x y) (+ x y))
ADD
CL-USER> (add 3 4)
7
리스트는 아래와 같이 '을 먼저 찍고 해주면 된다. (아직 이해 부족.. OTL)
물론 리스트도 setq로 선언하여 사용이 가능하다.
> '(1 2 3)
(1 2 3)
> (1 2 3)
error: bad function - 1
'/어포스트로피/apostrophe
'foo는 (quote foo) 와 동일하고 s expression 에서 함수가 아닌 것으로 해석하도록 하는 명령어이다.
어떻게 보면 변수로 인식시킨다고 해야 하려나? replace 라고 된것을 보면 -_-
Creating sets (actually, creating variables) can be done with setf : this creates a set called learned with three members:
(setf learned '(VB C++ LISP))
The apostrophe is uses to designate that something in brackets isn't a function (or an S-expression). Basically, if LISP receives something like (VB C++ LISP) it assumes VB is the name of a function and C++ and LISP are its arguments. The apostrophe says that this isn't a function, it's a list, and can itself be an argument in a function.
이 녀석을 어디서 주워들어서 이런 고난의 길(?)을 걷고 있는건지도 까먹었는데..
아무튼 이 녀석의 특징은 후위표기법(postfix)와 유사하다는 점이다.
스택에 넣기 때문에 이러한 특징을 보이는데
예를 들어 2 + 3 이라는 것을 위해서는 아래와 같이 입력을 하면된다.
2 ok
3 ok
+ ok
. 5 ok
2 3 + . 5 ok
위의 녀석이나 아래 녀석이나 마찬가지 이지만, 이해의 편의를 위해서 위에 것으로 설명을 하면
2 를 스택에 넣고
3 을 스택에 넣고
+ 연산을 하면 스택에서 2개의 값을 빼내서 더하고 다시 스택에 넣고
. 은 현재 스택을 보여주는데 가장 위에 5가 들어있게 된다.(결과로서)
솔찍히 스택을 배우는 법도 키워드가 어떤게 있는지도 모르겠고
무엇을 어떻게 해야할지 모르겠지만, 묘하게 끄는 매력이 있는 언어이긴 하다.
후위표기법으로 인해서 전위표기법을 사용하는 lisp와도 문법적인 연관성도 있어 보이긴 하지만..
단순하게 함수 이름이나 바꾸고 그러는걸 리팩토링이라고 하는줄 알았는데
어떻게 보면, 내부 루틴을 함수로 꺼내내거나 하는식으로 유지보수가 편하도록 하는 행위이다.
소프트웨어 공학에서 리팩토링(refactoring)은 주로 '결과의 변경 없이 코드의 구조를 재조정함'을 뜻한다. 주로 가독성을 높이고 유지보수를 편하게 한다. 버그를 없애거나 새로운 기능을 추가하는 행위는 아니다. 사용자가 보는 외부 화면은 그대로 두면서 내부 논리나 구조를 바꾸고 개선하는 유지보수 행위이다.
사족 : 그러고 보니. Nvidia는 Geforce 8000 이상부터 ATI는 HD 급 부터라고 한거 봐서는..
Nvidia의 CUDA / ATI의 ATI Stream(OpenCL) 적용 하드웨어와 일치하는 느낌이 드는데..
결국에는 GLSL은 특화된 CUDA/OpenCL 이라고 보면 되려나?