💡이 글은 'let', 'var', 'const'등에 대한 블로깅을 하다가 
도저히 안되겠다 싶어서 쓰게된, I don't know JavaScript 그 첫번째 게시글이 될 것 이다.


💡이 글은 이렇게 꼬리를 물어 시작되었다.💡
왜 'var'를 쓰면 안되지? -> 호이스팅이 뭐지? -> 스코프는? -> 클로저?
-> 렉시컬 스코프? -> 컴파일? -> AST? -> 토크나이징, 파싱?
-> 인터프리터/컴파일? -> 스크립트언어? -> JIT 컴파일?
-> 아니 애초에 프로그래밍 언어는 뭐지? -> 고급언어/ 기계어? -> ???

Programming Language

언어는 한 사회의 구성원들이 어떠한 사물, 행위, 감정 등에 이름을 부여하기로 약속하여 의사를 소통하기 위해 만든 하나의 장치로 해석할 수 있다.

가령 우리가 '얼음'에 '얼음'이라는 이름을 부여하기로 약속하지 않았다면, 그건 그냥 고체화된 H2O일 뿐이다.

결론적으로 우리는 언어를 통해 상호작용(Interaction)을 한다.

이것은 프로그래밍 언어도 마찬가지다.
프로그래밍 언어도 약속하고, 약속을 통해 소통을한다.

약속

프로그래밍 언어에서 약속은 크게 두가지로 분류된다.

  1. reserved word
  2. declare

reserved word

예약어(reserved word)란, 해당 프로그래밍 언어 자체에 내장된 기본 '문법', '객체'(표준 내장 객체), '내장 함수' 등을 말한다.

이것은 나(개발자)와 프로그래밍 언어가 맺는 약속이 아닌, 프로그래밍에 기본적으로 탑재된 약속들이다. ex) var let function error Math Number 등등등등...
이는 우리(개발자)가 함부로 변경할수도, 재선언할수도 없으며 우리가 이해하는 언어의 기본적 속성인 언어의 사회성에 속한다.

💡우리는 이것을 얼음이라 부르기로 약속했어요
(위 링크의 동영상은 언어의 약속에 대해 설명한다.)
여기서의 '얼음'이 언어 자체의 약속이다. '사회적 약속'으로 우리는 '얼음'이라고 부르지 '삼다수 바'로 부르지 않는다.

declare

선언(declare)이란, 프로그래밍 언어 자체에 내장된 약속이 아닌,
우리(개발자)가 코드를 작성하며 프로그래밍 언어와 하는 약속들이다.

var x
alice();
/* 우리는 방금 JavaScript와 함께 변수 x와 함수 alice();를 약속했다.
프로그래밍 언어에서는 이를 '선언'한다고 한다.

💡추가로 위에서는 '선언'만 했지 의미를 부여하지 않았다.💡
JavaScript에서는 '선언'과 '할당' 즉 의미 부여는 '별개'의 행동이다.
만약 이렇게 '선언'이 되었지만 의미가 부여되지 않았다면,
JavaScript에서는 기본적으로 undefined 즉 정의되지 않았다는 '값'을 가진다. 

이는 해당 언어 자체가 아닌, 만들려는 소스코드에서만의 약속이므로, 우리는 이 약속을 선언할 수도, 수정할 수도 있다.

💡우리는 이것을 얼음이라 부르기로 약속했어요
(위 링크의 동영상은 언어의 약속에 대해 설명한다.)
여기서 '삼다수 바'는 일종의 선언이다. '해당 코드를 작성하는 집단''프로그래밍 언어' 사이에서만 의미가 통하는 일종의 '은어'라고 볼 수도 있겠다.

의사 소통

우리는 프로그래밍 언어를 통해 컴퓨터와 소통한다.
우리는 컴퓨터에게 무언가 해달라고 코드를 전송하고,
컴퓨터는 가능한 부탁이면 실행, 불가능한 부탁이면, 왜 불가능한지 우리에게 알림을 전송한다.
ex)

foo.substring(1); // ReferenceError: foo is not defined
// 💡우리는 foo.substring(1)를 실행해달라 요청했고, 컴퓨터는 실행 불가능한 이유를 말해주었다.

이는 컴퓨터가 우리와 의사를 소통하는 기본적인 과정이다.

결국 프로그래밍이라는건 프로그래밍 언어를 사용하여 컴퓨터에게 우리가 원하는, 즉 우리의 의사를 전달 하는 과정이다.

그러면 여기서 하나의 의문점이 든다.

💡왜 언어는 다양할까?

인간의 언어와는 다르게 컴퓨터 언어의 경우에는 보다 의도적으로 개발됐다. 즉 각각의 언어가 자기만의 목적이 있다는 의미이다.

개발 언어는 해석 방식, 메모리 관리 방식, 정적 타입인지 동적타입인지, 프로그래밍 패러다임 등에 따라 나눌 수 있다. 또한 각 분류방식은 중첩될 수 있다.

ex) JavaScript는 JTT 컴파일이 가능한 인터프리터 언어이자, 가비지 컬렉터가 존재하는 관리 언어이며 동적타입 언어이다. 또한 함수형 프로그래밍, 객체 지향 프로그래밍도 어느정도씩 가능하다.
각각의 분류법에 대해 자세히 설명하자면 길어지니, 해당 부분은 차 후 포스팅 해보겠다.

이번 시간에는 각각의 대분류 법에 대해 간단히 살펴보자.

해석 방식에 따른 분류

💡컴퓨터는 프로그래밍 언어를 읽지 못한다.
모든 프로그래밍 언어는 컴퓨터가 알아들을 수 있게 번역을 해야한다.
이런 번역을 컴파일, 인터프리트라고 하며 프로그래밍 언어는 크게 컴파일 언어인터프리터 언어로 나누어 진다. 여기서 두개를 섞은 JIT 컴파일 언어도 있다.

추후 설명예정

메모리 관리 방식에 따른 분류

프로그래밍 언어와 우리가 사용하는 언어의 가장 큰 차이점이 바로 메모리 부분이지 않을까 싶다. 그 이유는 컴퓨터라는 것이 결국 계산장치이고, 프로그래밍 언어도 결국 컴퓨터에게 무언가를 실행시키기 위해 존재하기 때문 결국, 계산을 위한 데이터메모리에 저장되어야 하고, 어느 메모리에 접근해야 하는지, 즉 메모리 주소가 존재할 수 밖에 없다. 이는 결국 같은 결과값을 구현하더라도 메모리 관리에 따라서 실행능력이 천차만별로 달라질 수 있다는 것이고, 메모리 관리를 우리가 직접 하는지, 언어에게 자동으로 맡기는지에 따라 비관리 언어관리 언어로 이루어진다.

당연하게도 잘만 쓰면 비관리 언어가 더 좋은 성능을 낼 수 있다.
세계에서 가장 빠른 자동차 레이싱 대회인 f1과 수많은 스포츠카들이 아직도 수동 기어 변속 방식을 고집하는 것과 비슷한 이유다.

추후 설명 예정

타입에 따른 분류

  1. 정적 타입 언어
    자료형(Type)이 고정돼 있는 언어. 간단히 말하자면 정수형 1은 계속 정수형 1이다.
  2. 동적 타입 언어
    실행 시간자료형(Type)이 결정되는 언어. 즉 정수형 1로 정의했어도, 실행단계에서 함수or메소드가 문자열을 받아들이게 설계되어있다면, 자동으로 문자열로 바꿔준다. 이는 개발할때 매우 편하다고 볼 수 있지만, 예상치 못한 문제를 생성하기도 한다.

추후 설명 예정

패러다임에 따른 분류

명령형 언어

명령형 언어는 명령형 프로그래밍을 지향하는 언어로써 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것이다.
전통적인 프로그래밍 방식이라고 할 수 있으며 '절차적 프로그래밍 언어''객체 지향 프로그래밍 언어'가 이에 속한다. 간단히 말하자면, A를 실행하면 결과값을 B에 참조하고 이후 그걸 기반으로 C를 실행해. 와 같이 어떤 방법으로 해야하는지 프로그래밍을 하면 명령형 프로그래밍이라 한다.

절차형 언어

절차형 언어란 알고리즘,로직에 의거하여 절차적으로 문제를 해결하도록 짜는 언어를 뜻한다. 대표적으로 C가 절차형 언어이다.

추후 설명 예정

객체 지향형 언어

객체 지향형 언어는 데이터와 데이터를 처리할 메소드를 한데 묶어 객체를 만들고 객체들을 조립하는 방식으로 짜는 언어를 뜻한다. 절차형 언어보다 가독성, 생산성이 좋고, 유지보수가 편하다는 장점이 있다. (복잡하고 긴 코드를 쪼개서 모듈화 하는 것으로 보면 쉽다.) 추상화, 캡슐화, 상속성, 다형성 등이 있으며 현재 가장 많이 사용하는 프로그래밍 방식이기도 하다.

추후 설명 예정

선언형 언어

선언형 언어는 명령형 프로그래밍과 반대되는 개념을 적용한 언어로써 어떤 방법으로 해야하는지를 표현하기 보다 무엇과 같은지 설명하는 경우에 선언형 이라고 한다. 함수형 언어, 논리형 언어가 여기에 속한다.
선언형 언어에 대해 간단히 설명하자면 HTML을 보자(HTML은 프로그래밍 언어가 아니긴하지만...)
<title>``<div>``<body>와 같이 '무엇'이 나타나야 하는지를 묘사하는 것이지 어떤 방법으로 나타내야 하는지 묘사하지 않는것을 선언형이라고 한다.

함수형 언어

함수형 언어란 자료 처리를 수학적 함수의 계산으로 취급하는 언어이다.
즉 상태와 가변 데이터를 취급하지 않는다. 변화가 적기때문에 코드의 안정성이 높아지고 직관적인 코드를 짤 수 있으며 특히 재귀함수를 처리할때 유용하다.

솔직히 잘 모르겠다 나중에 뭐가 더 쌓이면 다시 공부해보자
🔥🔥추후 설명 예정
논리형 언어

미안한데 더 모르겠다
아 ㅋㅋ 아무튼 이런게 있다고

🔥🔥추후 설명...할수 있나?
profile
const isInChallenge = true; const hasStrongWill = true; (() => { while (isInChallenge) { if(hasStrongWill) {return 'Success' } })();

0개의 댓글