본문으로 건너뛰기

© 2026 Molayo

HN요약2026. 05. 07. 02:19

JavaScript 컴파일 대상 언어 제안

요약

본 기사는 현재의 JavaScript가 가진 복잡성과 내재적 한계(예: 까다로운 문법, 명시적인 구조 필요)를 지적하며, 이를 개선할 새로운 컴파일 대상 언어 'Q'를 제안합니다. Q는 개발자에게 더 쉽고 직관적인 경험을 제공하는 것을 목표로 하며, 여러 가지 혁신적인 문법 규칙(예: 한 글자 키워드, 들여쓰기 기반 블록 구조, 콜론(:) 사용의 통일화 등)을 도입하여 가독성과 생산성을 극대화하고자 합니다. 이러한 변화를 통해 Q는 새로운 개발자가 쉽게 학습할 수 있고, 작성된 코드가 다른 사람들에게도 이해하기 쉬우며, 현대적인 프로그래밍 관행을 장려하는 이상적인 언어가 될 것으로 기대됩니다.

핵심 포인트

  • Q라는 이름의 새로운 컴파일 대상 언어를 제안하며, 이는 JavaScript의 복잡성을 해결하기 위함입니다.
  • 문법 단순화를 위해 모든 키워드를 한 글자로 제한하고, 들여쓰기 기반 블록 구조를 채택합니다 (Python 스타일).
  • 할당은 `:`로, 비교는 `=`로 통일하여 문법적 혼동을 줄이고 가독성을 높였습니다.
  • 대부분의 작업을 메시지(message) 호출 방식으로 처리하며, 이는 객체 지향 및 이벤트 처리를 통합적으로 관리합니다.
  • 반복문(Loops) 사용을 권장하지 않고, 대신 `.each()` 구조를 사용하여 컨테이너 클래스의 탐색 로직을 캡슐화하여 코드를 단순화했습니다.

JavaScript 는 이제 세계적으로 가장 보편적인 프로그래밍 언어로 자리 잡을 준비를 하고 있습니다. 웹 브라우저에 있으며, 이제 서버 사이드에서도 그 영역을 확장하고 있습니다. 최신 엔진들은 이를 기계어로 최적화할 수 있으며, 비동기 콜백을 통한 단선형 운영은 단순한 패러다임에서 효율적인 멀티태스킹 코드를 가능하게 합니다.

하지만 JavaScript 는 배우기가 어렵고, 더 나아가 숙달하기 어려운 복잡한 언어입니다. 또한 몇 가지 기능 (예: 여러 객체를 비동기로 채우기를 기다린 후 모두 사용 가능한 시점에 바로 사용하는 것) 은 JavaScript 에 내장 지원이 없으며, 제어 흐름을 위한 까다로운 라이브러리를 필요로 합니다.

따라서 제가 더 단순한 컴파일 대상 언어가 필요하다고 생각합니다. 이는 최고의 세계를 제공해 줄 것입니다 – 새로운 개발자에게 가르칠 수 있는 언어이며, 좋은 프로그래밍 관행을 장려하고, 이 언어로 작성된 모든 코드는 다른 사람들이 쉽게 이해할 수 있습니다. 저는 이 언어를 Q 라고 부르고, 다음과 같은 속성을 가질 것입니다:

  1. 블록 주석을 중첩할 수 있어야 합니다.

우리는 작게 시작합니다. 이는 소소한 불만입니다. 기본적으로 이미 주석 처리된 코드가 포함된 코드 단편을 비스마트하게 주석 처리할 수 있어야 하며, 컴파일러가 오류를 발생시키지 않아야 합니다.

  1. 모든 키워드는 한 글자로 이루어져야 합니다.

장점:

사람들은 26 개 이상의 키워드가 없음을 알고 있으며, 모두 배우도록 노력합니다. 어휘 학습은 알파벳의 일부 (부분집합) 를 배우는 것과字字字字 literal 로 동일합니다.

사용 중인 예약어가 있는지 더 이상 의문없이 확인할 필요가 없습니다.

코드 입력이 간결하고 효율적이며, 읽기 목적에 더 컴팩트합니다.

변수에 의미 있는 이름을 사용하는 것을 장려합니다. 예를 들어 i, j, k 는 키워드가 아닐 수 있지만, f 는 예제키워드인 JavaScript 의 "function" 이 될 수 있습니다.

영향:
내장 타입은 대문자로 이루어져야 합니다. 예를 들어:

var1: S.n // 새로운 문자열
var2: N.n // 새로운 숫자
  1. Python 과 같이 들여쓰기가 새로운 코드 블록을 시작합니다. 줄 바꿈은 괄호를 닫지 않은 경우 문장을 종료하지 않습니다.

장점:

줄바꿈이 문장을 종료하지 않는 경우, 대괄호 스타일에 대한 논의가 더 이상 없습니다. 코드가 더 읽기 쉬워집니다.

대괄호를 잊지 않아야 하며, 그보다 더 나쁜 "})" 과 "}" 사이의 혼동도 없어야 합니다 – 인정해 주세요, 많은 실수가 있었습니다.

세미콜론을 잊지 않아도 됩니다. 한 줄에 여러 문장을 배치하고 싶다면 여전히 사용할 수 있습니다. 하지만 그것은 드문 경우입니다.

IDE 에 더 친화적입니다. 현재 IDE 는 끝나는 대괄호를 추측하거나 문장이 다음 줄로 넘어갈지 여부를 추측하는 데 매우 어려움을 겪습니다. 언어가 IDE 를 이해하기 쉬워지면, 그것은 당신의 친구가 되어 모든 것을 즉시 발견하게 해줍니다.

영향:
인라인으로 정의된 함수를 포함하는 파라미터 리스트는 콤마-첫 번째 스타일을 통해 계속됩니다. 이는 익숙해지는데 시간이 걸리지만, 많은 실수를 방지합니다.

예제:

obj.message(param1, f (var1, var2)
alert(var1)
alert(var2)

, f (something)
// 다른 함수
r 2 // 2 를 반환
)
  1. 할당에는 : 를 사용하고, 비교에는 = 를 사용하며, JavaScript 의 === 에는 == 을 사용합니다.

장점: (언어를 타이핑하는 데 익숙해지면)

추가 = 를 입력하지 않고도 할당과 비교를 혼동하는 실수를 더 이상 하지 않습니다. 이 오류는 찾기 어렵습니다.

할당은 더 쉽게 식별됩니다. 이 언어는 또한 클래스의 특정 것을 보장하기 위해 : 를 재사용합니다 (따라서 C 의 "int a" 대신 "a: I").

엄격한 등식은 약간 더 쉽게 입력됩니다.

  1. : 와 메시지를 사용하여 대부분의 작업을 수행합니다.

장점:

Function calls, the keyword "new", 그리고 예외 (exceptions) 도 모두 메시지입니다. Ruby 와 비슷합니다. 다만 여기서는 메시지가 이벤트를 트리거하고, 이벤트 전후에 객체에서 훅을 추가할 수 있습니다.

var1: I // var1 을 선언하고 정수로 할당

var2: I.n(32) : 5 // 5 와 같은 32 비트 정수 생성
var3: MyClass.n(var1, var2);
var4: MyContainerClass.n(MyClass, 2, 3); // 더 멋진 기능들
f something(cool:I, fool:MyClass)
// 함수 내에서 작업 수행
r 2 // 2 반환

이 마지막 예제에서 함수는 정수와 MyClass 인스턴스를 각각 예상했습니다.

  1. 루프 (Loops) 는 권장되지 않으며, 대신 .each(function(i, obj) { }); 구조를 사용합니다. 단 키워드 x 를 사용합니다.

장점:

루프는 끔찍할 수 있습니다. 클로저 (closures) 와 관련된 문제가 JavaScript 개발자에게 꼬리뼈를 물고 있고, 루프 조건이 실제로 몇 번 실행되는지에 대한 우려 등이 있습니다.

컨테이너 클래스는 탐색 로직을 캡슐화해야 하며, 호출 코드는 로직을 "알지 못"하고 표준 메커니즘만 사용해야 합니다. 따라서 while() 과 until() 구조도 여전히 사용할 수 있지만, 컨테이너 인스턴스에 메시지를 보내며 .each 를 달성할 수 있습니다.

예제:

다음 예제에서는 2 에서 198 까지 포함되는 짝수 배열을 반복합니다.

([1..100]*2).x (index)
// 이 인덱스를 사용
// 이 코드 블록에서
...
  1. 예외 (Exceptions) 는 이전 예외 처리 객체에서 포크될 수 있는 객체에 대한 메시지입니다.

장점:

JavaScript 는 비동기 함수 호출에 전달된 콜백에 예외를 던질 때 예외를 잡는 데 매우 나쁩니다. 당신의 콜 스택은 이미 사라져버렸습니다 (비동기 호출이므로) 그리고 예외를 잡을 사람이 없습니다.

관심해야 할 개념이 적습니다. 예외는 이제 메시지일 뿐입니다. "catch" 와 "finally" 절은 예외 처리 객체의 방법들일 뿐입니다.

이는 또한 오류 처리에 대한 좋은 패러다임을 만들어냅니다. 오류 콜백 AND 예외를 잡는 데 유연하게 대처할 수 있습니다.

예제:

// 여기서는 콜백을 전달하고 예외를 잡습니다

foo.bar(f ()
// 이 코드는 인라인으로 정의된 콜백입니다
, callback2, // 변수로 저장된 콜백
): {
'Some exception type 1': f (param1, param2)
// 어떤 일이 일어나고 있음
, 'Some exception type 2': errorHandler
, 'Some exception type 3': errorHandler
, '': f (param1, param2)
// 이 것은 모든 다른 예외를 잡습니다
}, f()
// 이는 finally 절입니다
// 아니면 finally 핸들러

다음과 같이 수동으로 예외를 던집니다.

// 예외 던지기
e[exceptionMessage] (params)
e['Some exception type 2'] (params)
...

여기서 무엇을 알아보세요. 이 문法是 메시지 전송과 일관성 있습니다. 이름이 알려진 메시지는 obj.message 로 보내고, 이름이 변수인 메시지는 obj[message] 로 보냅니다.

예외가 던질 때 (제로로 나누거나 e.msg() 로 수동으로), 메시지를 처리할 수 있는 객체를 찾도록 함수 스택을 위로 올라갑니다.

다음과 같은 함수 호출 문法是 이를 가능하게 합니다.

foo.bar() [: someObject [ , someFunction ]]

이것은 메시지 던지는 다양한 메시지에 경청하는 "보이지 않는" 객체를 복사하여 someObject 와 확장하고, 그 후 함수를 호출합니다. 그런 다음 "t" 키워드는 이 객체를 나타내며, 이 객체에서 방법을 호출하면 먼저 스택을 unwind 합니다.

  1. 또한 case statements 와 enums 도 없을 것입니다. 이들은 모두 메시지로 처리할 수 있습니다. 루프와 마찬가지로, case statements 와 enums 는 캡슐화를 깨뜨리는 것을 장려합니다... cases 와 enums 는 메시지로 처리해야 하며, 호출 코드는 어떤 메시지가 있는지 알 필요가 없어야 합니다. 특히 그 것이 단순히 메시지를 전달하는 '컨테이너'라면 더욱 그렇습니다.

  2. 마지막으로, 원하는 작업을 수행하는 동안 이 함수를 반복적으로 호출할 수 있는 일부 "재진입 함수 (re-entrant functions)" 를 지원하도록 구축하는 것이 좋겠습니다. 이 함수는 호출을 큐에 넣고, 비동기 처리가 완료된 후 모든 콜백을 한 번 호출합니다. 또한 함수 호출의 결과를 캐싱 (memoizing) 하고, 일부 세마포어 (semaphore) 를 사용하여 리소스 사용을 제한해야 합니다.

이것은 어떻게 구현할지 확실하지 않지만, 언어 구성 요소로 있으면 좋겠습니다.


Wow, 이 포스트는 길지만 제가 이러한 아이디어를 오랫동안 가지고 있었고, 이를 구현하는 데 시간이 없었습니다. 적어도 여기에 있는 해커들에게 제안할 수 있으며, 이것이 someday 실제 구현에 포함될 수 있기를 바랍니다 :)

AI 자동 생성 콘텐츠

본 콘텐츠는 HN Claude Code Search의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
2

댓글

0