블록 코딩
,
,
,
,
,
,
,
,
,
은(는) 여기로 연결됩니다. |
시각적 언어의 하나인 언리얼 엔진의 블루프린트 |
[clearfix]
1. 개요
visual programming language, VPL개별 명령과 동작을 블록이나 그래프와 같은 직관적인 형태로 시각화하여 진입장벽이 낮은 인터페이스를 제공하는 고수준(high-level)의 도메인 특화 프로그래밍 언어.
학습 난이도가 상대적으로 낮아 코딩 교육용으로 널리 활용되지만, 실무에서도 게임 기획자, 디자이너 등 비개발자 특수 직군에서 프로토타이핑 비용 절감을 위해 사용하기도 하며, 각종 미디어 소프트웨어의 내장 스크립트 용도로 활용되기도 한다.
2. 종류
크게 인터페이스의 특징에 따라 나눌 수 있다. 개별 도메인에 맞춰 매우 특수한 인터페이스를 채택하는 경우도 많기에 꼭 이중 하나인 것은 아니다.- 노드 기반(node-based): 그래프 및 유한 상태 기계에 기반하는 시각적 프로그래밍 언어. 시작과 종료, 조건문과 다른 노드로의 분기 및 전이(transition), 병렬 실행 등등의 개념을 표현하는 데 적합하다. 기본적인 인터페이스는 여러 입력(input)과 여러 출력(output)을 가지는 개별 노드를 정의하고 클릭과 드래그로 노드를 조건(trigger), 전이(transition) 등으로 잇는 방식. 기존의 DAW 및 virtual wire 인터페이스와 매우 유사한 방식이기 때문에 음향 제작, VFX, 이미지 생성 용도 언어에서 사용되기도 한다. 제약이 상대적으로 자유롭기 때문에 때문에 자칫하면 스파게티 코드가 발생하기도 하나, 병렬 실행[1]과 순환(cycle)을 폭넓게 활용하는 등 상대적으로 표현력이 높은 편이기도 하다.
- 순서도 기반(flowchart-based): flow 기반, control flow 기반이라고도 한다. 흔히 의사 코드로 접할 수 있는 순서도(control flow)와 비슷한 구조인 만큼 코드의 선형성이 강해 실제 프로그래밍 언어와 통사 구조가 비슷하다는 특징이 있다.
3. 특징
- syntax error가 거의 발생하지 않는다. 정확히는 구문 작성이 임의의 텍스트를 입력하는 것이 아닌 인터페이스적으로 올바른 구문만 조립이 강제되기 때문에 파싱 과정에서 딱히 힘을 들일 필요가 없는 것. 다만 0으로 나누거나 하는 등의 runtime error 등은 얄짤없다.
- 정적 타입 언어 비율이 높다. 모든 VPL이 정적 타입인 것은 아니나 상술한 인터페이스 설계로 숫자형, 문자열형, 배열형 등등의 일관된 사용을 반드시 강제하기 쉽다. 이런 타입 시스템이 오류를 줄이기도 하고, 교육용 언어의 경우 각 자료형을 서로 다른 색깔이나 모양으로 보여주면서 실제 프로그래밍 언어에 대한 개념을 쌓는 데 도움을 줄 수 있기 때문. 다만 타입 시스템이 극도로 단순하기 때문에 타 언어처럼 구조체 같은 복합(compound) 타입이나 사용자 정의 타입 등을 만들기는 쉽지 않다.
- GUI식 컨트롤을 적극적으로 활용하는 만큼 대부분 마우스 조작을 필수적으로 요구하는 경우가 많고, 때문에 숙련되었을 경우 일반적인 프로그래밍 언어보다 생산성이 떨어지는 경우가 대부분이다. 변수명이나 숫자 등을 적기 위해 키보드 조작도 필요하기 때문에 마우스와 키보드 사이로 손을 자주 옮겨다니게 되는데다, UI에 직접 마우스를 대고 끌어오는 조작 자체도 번거롭기 짝이 없다.
- 네이티브로 컴파일되는 것보다 인터프리트 방식의 구현이 조금 더 많다. 아무래도 인터프리트 방식이 구현이 더 쉽고, 특정 소프트웨어나 플랫폼에 내장된 스크립팅용 시각 언어의 경우 실행에 별도의 프로세스를 요구하지 않아도 되기 때문. 특히 교육용 언어의 경우 명령이 순차적으로 실행되는 걸 보여줄 수 있는 편이 교육상 이점이 있기도 하다.
- 다만 아두이노 등의 마이크로컨트롤러를 타겟으로 하거나 앱인벤터처럼 앱을 빌드하는 경우, 각 플랫폼에 맞는 적절한 바이너리로 컴파일이 되기도 한다.
- 일부 특수 목적 언어는 다른 언어로의 풀 트랜스파일 및 출력을 지원하기도 한다. 예를 들어 엔트리의 경우 내부적으로 Python으로 컴파일을 지원한다.
- 소스 작성을 시각적으로 하는 만큼, 실행 결과도 시각적으로 보여주는 경우도 존재한다. 트랜스파일 위주인 특수 목적을 가진 언어보다는 아닌 교육용 언어들이 주로 가지는 특징. 주로 화면에 무언가를 보여주거나, 움직이거나, 그래프를 그리거나, 소리를 출력하는 등의 기능을 내장하고 있다. 교육용 언어가 아니더라도 이미지 프로세싱 및 procedural generation 용도의 언어는 실행 결과 자체가 이미지나 영상, 또는 이에 준하는 형태로 출력되기도 한다.
- 오해하기 쉽지만, 실행의 시각화를 지원한다고 모두 시각적 프로그래밍 언어에 해당하는 것은 아니다. MATLAB과 같은 수치해석 언어는 주로 시각화 소프트웨어를 내장하고 있으나, 시각적 프로그래밍 언어의 정의에서 '시각적(visual)'이란 소스의 시각화만을 의미한다.
- 플랫폼 종속성이 매우 높다. 단순한 텍스트 에디터 하나와 컴파일러/인터프리터만 있으면 최소한의 개발환경 구성이 끝나는 일반 언어와 달리, 우선 고유한 시각적 입력 인터페이스를 필요로 하는 동시에 경우에 따라 결과를 실행 및 시각화할 구현체도 필요해진다. 특정 플랫폼에서만 실행할 수 있거나 소스를 고유 포맷으로 저장해야 하는 경우가 다반사다. 플랫폼 종속성이 매우 높은 경우 사실상 해당 플랫폼에 내장된 스크립트 언어 정도의 취급을 받기도 한다.
- 디버깅이 다소 힘든 편이다. LabVIEW와 같은 극소수의 예외를 제외하면 많은 경우 자체 플랫폼 내에 쓸만한 수준의 디버거를 내장하고 있지 않으며, 많은 경우 개별 스텝 또는 flow 단위로 실행을 일일히 하는 수밖에 없다.
- no-code와 혼동되기 쉽지만, 엄밀한 정의가 애매한 만큼 겹치거나 상충하는 영역과 반례가 다수 존재한다. 의미상 no-code는 자주 쓰이는 소프트웨어 솔루션의 자동화(automation) 및 SaaS화이지만, 시각적 프로그래밍은 순수하게 문제 해결을 위한 완전히 자유로운 프로그래밍을 권장한다. DSL의 관점으로 보면 시각적 프로그래밍 언어의 domain 범위가 더 넓은 셈. 하지만 명확한 정의가 없는 만큼, no-code와 VPL이 겹치는 영역 또한 상당히 많이 존재한다. 특히 교육용이 아닌 실무에서 쓰이는 DSL의 경우 no-code와의 유사성이 더욱 짙어지는 편.
4. 주요 용도
일반적으로 도메인 특화 언어로 만들어지기 때문에 수많은 분야의 수많은 용도로 개발된 언어가 존재한다. 아래는 그중에서도 자주 쓰이는 용도들이다.- 교육용 - 코딩 교육에 사용되는 용도.
- 비디오 및 이미지 생성, VFX, procedural generation - 주로 독립 구현보다는 개별 비디오 편집 소프트웨어나 게임 엔진 등에 내장되는 스크립트 언어 형태로 쓰인다.
- DAW, 음향 스크립팅
- no-code: 자주 사용되는 정형화된 API나 기타 자동화 동작을 빠르게 정의하는 용도. 이 경우 플랫폼 종속성이 매우 커지기 때문에 독립적인 언어로 불리지 않을 때도 있다. 주로 node 기반 인터페이스를 사용하는 편.
- 게임 프로토타이핑 및 스크립팅: 비개발 직군의 빠른 프로토타이핑을 위해 사용되는 언어. 대표적인 예시로 blueprint가 있다.
- 게임 모드 제작: 개발뿐 아니라 end-user들이 쉽게 모드를 생성할 수 있도록 하기 위한 용도. 주로 모드 생태계가 풍부한 게임이나 인터랙티브한 리듬 게임 등에서 볼 수 있다.
- 자동화: 주로 업무 자동화 용도로 활용된다.
5. 목록
- 언리얼 엔진 blueprint
- Node-RED
- 앱인벤터
- LabVIEW
- xod - 마이크로컨트롤러용 프로그래밍 언어
- 스크래치
- Houdini
- flowcode: 마이크로컨트롤러용 프로그래밍 언어
- Antimony - CAD 기반 그래프 프로그래밍 언어
- 레고 마인드스톰
- vvvv
- Simulink
- Blocks - Sphero사가 개발한 로봇 코딩용 언어
- PatternNode - 상태 기계 기반 이미지 패턴 생성용 언어
- Snap! - 스크래치와 비슷한 프로그래밍 교육 플랫폼.
- 엔트리
- Max - 오디오 시각화 언어
- SwiftVPL - Swift로 컴파일되는 노드 기반 프로그래밍 언어.
- Vizzy
- Riven
- Samsung Automation Studio
- Codeflow
- 로보로보 로직 - 로보로보 사에서 자체 개발한 로봇 코딩용 언어.
- TouchDesigner
- PANE
- Udon
- Drakon
- 차근차근 게임 코딩
- UAV toolkit - 안드로이드용 교육용 프로그래밍 언어 앱.
- 헬로메이플 - 넥슨에서 메이플스토리 시리즈 IP 기반으로 만든 교육용 블록 코딩 플랫폼.
- 숨 - 순서도 기반 프로그래밍 언어
- 마인크래프트 에듀케이션 코드 빌더
- lynx
6. 라이브러리
- blockly - 블록 기반 프로그래밍 언어를 설계할 수 있는 메타라이브러리.
- NoFlo - FBP 구현 프레임워크. 웹과 Node.js를 동시에 지원한다.
- rete - JavaScript용 그래프 프로그래밍 언어 개발 라이브러리
- litegraph.js - JavaScript용 노드 기반 언어 UI 라이브러리
- joy.js - 블록 언어와 같은 드래그 인터페이스가 있지는 않다. 전반적인 느낌은 dynamic form과 비슷하다.
7. 기타
- 일반적인 상용 프로그래밍 언어를 시각적 언어와 비교해 text programming language라고 부르는 경우가 있으나, 대비성을 강조하기 위한 목적으로는 거의 쓰이지 않는다.
[1] 대표적인 예시로 CI 파이프라인 설계 언어 등이 있다. 전체 빌드 과정이 DAG기 때문에 순서도보다 그래프 형태로 표현하는 쪽이 더 직관적이다.