Profile img

크로이세

@kroisse@hackers.pub · 16 following · 34 followers

나는 코딩을 하는 게 아니야. 그냥 바이브를 타고 있는 거지.

GitHub
@Kroisse

소신발언: C 비슷한 문법을 가진 언어 중에서 C++가 제일 문법이 이질적이다.

템플릿은 말할 것도 없고, 앞뒤에 아무 것도 붙지 않은 {}를 polymorphic한 값으로 취급하는 건 아마도 C++가 유일할 것이다.

3
1
0
1
0

고등학생 때부터 Vim을 썼으니까, Vim/Neovim을 합치면 거의 15년 가까이 썼던 것 같다. 그러다가 Deno와 TypeScript를 접하면서 Visual Studio Code로 갈아탔는데, 그러고 한 2–3년? Zed가 나와서 Zed를 또 1년 가까이 썼다. (아, VS Code를 쓸 때도 Zed를 쓸 때도 Vim 키 바인딩을 끄지는 못 했다.)

그런데 요즘에는 Claude Code니 OpenCode니 LLM 기반의 코딩 에이전트들을 꽤 열심히 쓰게 되면서 에디터 자체를 잘 안 쓰게 되었다. 심지어 import 한 줄 추가하는 것도 프롬프트로 해결하게 된다. 그래야 LLM한테 맥락이 주어져서 혼선이 없기 때문이다. (내가 말 없이 코드를 고쳐 두면 LLM이 뭔가의 이상 상황으로 받아들이거나, 무심코 원래 코드로 되돌리기도 한다.) 그러다 보니 커밋 직전에 디테일을 손 보거나 코드를 리뷰할 때 빼고는 에디터를 잘 안 켜게 된다. 켜더라도 즉각적으로 열리는 걸 선호하게 되어서, Vim/Neovim이 가장 먼저 손이 가더라.

결국에는 몇 년 동안의 방황을 거쳐 다시 Vim/Neovim으로 돌아오게 되었다는 이야기. 그래서 조만간 먼지가 쌓인 Vim/Neovim 설정도 새해 맞이를 겸해서 한 번 청소를 해야겠다 싶다.

1
1

크리스마스는 새 프로그래밍 언어를 공개하기에 좋은 날이죠. 아직 미완성이지만 요즘 작업하고 있던 프로젝트를 소개합니다. https://github.com/Kroisse/tribute

순수 함수형이고, 모나드는 없고, 소유권도 없고, 타입클래스나 트레잇도 없습니다. 물론 객체 시스템도 없고요. 대신 제네릭과 대수적 효과를 넣을 예정입니다. ad-hoc polymorphism을 배제하고 어디까지 갈 수 있는지 시험해보려는 게 목적 중 하나인데 생각보다 할만할 것 같아요.

그리고 매우 vibe-coded되어 있습니다. Claude Code와 Codex가 없었으면 엄두도 못 냈을 듯.

문법적으로는 Rust와 Gleam에, 의미론적으로는 Gleam과 Unison에 영감을 많이 받았습니다. 사실 Gleam과 Unison 둘 다 네이티브 바이너리로 컴파일을 아직 못 하고 있어서 시작한 프로젝트이기도 합니다. 하지만 정작 Tribute도 첫 타겟은 네이티브가 아니라 WebAssembly 3.0입니다. GC 구현을 만들기 귀찮았거든요.

9
1

Gleam의 흥미로운 점 두 가지.

  1. 함수 오버로딩도 인터페이스 다형성도 타입클래스도 없다. 심지어 이건 기본 타입과 연산자에서도 동일해서 정수 타입인 Int와 부동소수점 실수 타입인 Float는 사용하는 연산자가 다르다! 실수 두 개를 더하려면 5.0 + 3.0이 아니라 5.0 +. 3.0이라고 써야 한다. https://tour.gleam.run/basics/floats/
  2. 위의 링크를 눌러 보았다면 눈치챘을지도 모르겠지만, Gleam에서 0으로 나누기는 에러가 아니다! 이건 정수와 실수 모두 동일하며, 그렇다고 Infinity-Infinity, NaN 따위가 나오는 것도 아니다. Gleam에서 a / 00이다.
2

Gleam 언어는 뭔가 별다른 복잡한 요소가 없어서 오히려 재밌는 구석이 있는 것 같다. 제네릭 말고는 별다른 다형성 기능이 없어서 오히려 설계를 고민하게 만든다던지. 서브타입도 타입클래스도 없으니까 제네릭 인자로 넘긴 타입에 뭔가 연산을 하고 싶으면 반드시 호출하는 쪽에서 연산에 필요한 함수를 그때그때 전달해야 한다. TypeScript의 any 타입처럼 gradual typing이 지원되는 것도 아니라서 정 타입시스템을 우회하고 싶으면 그때그때 Dynamic 타입으로 인코딩과 디코딩을 거쳐야 한다. Erlang 기반이니까 액터를 끌어다 쓸 수 있기는 하지만 아무래도 다른 언어에서 그냥 객체를 정의하고 메서드를 부르는 것보다는 무겁게 느껴진다. 액터라고 해서 타입이 아예 없는 것도 아니고.

2

알고계십니까? 고대의 언어인 줄 알았던 Smalltalk 친척 Self는 놀랍게도 최근까지도 업데이트가 되고 있습니다. https://selflanguage.org/

JavaScript의 .prototype 개념에도 영향을 주었다고 알려진 Self가 어떤 언어인지 궁금하시다면 Series about Self(lobste.rs)를 읽어보세요. 프로그래밍 언어에 대한 여러분의 시야가 넓어지는 데에 도움이 될 겁니다.

한국어 번역:

  1. 환경
  2. 언어
  3. 디버거, 트랜스포터, 그리고 문제점
  4. 커뮤니티, 역사, 미래, 형이상학
1

알고계십니까? 고대의 언어인 줄 알았던 Smalltalk 친척 Self는 놀랍게도 최근까지도 업데이트가 되고 있습니다. https://selflanguage.org/

JavaScript의 .prototype 개념에도 영향을 주었다고 알려진 Self가 어떤 언어인지 궁금하시다면 Series about Self(lobste.rs)를 읽어보세요. 프로그래밍 언어에 대한 여러분의 시야가 넓어지는 데에 도움이 될 겁니다.

한국어 번역:

  1. 환경
  2. 언어
  3. 디버거, 트랜스포터, 그리고 문제점
  4. 커뮤니티, 역사, 미래, 형이상학
8
1
0

여러분 int *p를 (int *)(uintptr_t)p 캐스팅하지 마세요 출처라는 것이 바뀝니다

1

C++에서 UB는 하드웨어 수준에서는 UB가 아니라고 생각했던 얼마 전에 나어게 경종을 올렸던 글. "Pointers are complicated" 시리즈. 주로 Rust에 관한 글이지만 abstract machine, memory model의 개념은 C++에도 있으며 하드웨어와는 확연히 다르다. 특히 포인터가 얼마나 까다로운 개념인지, 컴파일러가 어떠한 가정하에서 최적화를 수행하는지 다시금 익혔다.

6
1
4

오래 전

현대 컴퓨터는 계산기라기보다는 복사 기계에 더 가깝다

는 문장을 읽었고 그것에 대해 종종 생각함. 생각해 보면 정말 하는 일이 대개 그런 것에 속한다고 느낌. 어딘가에 있다는 데이터를 모으고 가공하고 정제해서 또 어딘가에 두고 그걸 누군가 가져갈 수 있게 하는 일 끊임 없이 반복함. 데이터의 형식이나 크기나 여러 속성이 다양하고 그래서 다루는 방법과 기술에도 많은 차이가 있지만 어쨌든. 요즘 종종 인용되는 타입 검사는 해결책이 아니라 증상이다(Type Checking is a Symptom, Not a Solution)에 대한 반응들을 보고 직렬화 글과 거기 인용된 인터넷은 디버깅 모드로 돌아가고 있다는 글까지 떠올랐음.

(이 글은 Hackers' Pub에서 제공하는 Markdown 문법 가이드에 익숙해지기 위한 시도로 작성함.)

5

LWN.net의 What every programmer should know about memory 시리즈를 훑어 보고 나서 든 생각인데, 현대적인 컴퓨터의 메모리 모델이란 건 사용성 관점에서는 놀라울 정도로 투명하게 추상화되어 있으면서 동시에 성능 관점에서는 무시무시할 정도로 새는 부분이 많은 추상화인 것 같다.

인상깊었던 부분 중 하나는, 코드를 실행해 보기 전에는 완벽한 최적화가 사실상 불가능한 메모리 접근 패턴이 드물지 않게 발생할 수 있다는 건데, 이런 부분 때문에 JIT 컴파일러가 AOT 컴파일보다 잠재적으로 더 우수한 성능을 낼 수 있다는 주장이 있었던 걸까 싶다.

LWN.net의 What every programmer should know about memory 시리즈를 훑어 보고 나서 든 생각인데, 현대적인 컴퓨터의 메모리 모델이란 건 사용성 관점에서는 놀라울 정도로 투명하게 추상화되어 있으면서 동시에 성능 관점에서는 무시무시할 정도로 새는 부분이 많은 추상화인 것 같다.

인상깊었던 부분 중 하나는, 코드를 실행해 보기 전에는 완벽한 최적화가 사실상 불가능한 메모리 접근 패턴이 드물지 않게 발생할 수 있다는 건데, 이런 부분 때문에 JIT 컴파일러가 AOT 컴파일보다 잠재적으로 더 우수한 성능을 낼 수 있다는 주장이 있었던 걸까 싶다.

6

소스코드 사이의 안정적인 하이퍼링크를 만들수 있는 기능이 없다. 가령 A.hs에서 주석을 쓰면서 B.hs의 foo란 함수의 구현의 특정 부분을 언급하고자 할때, 그냥 B.hs L:77 이렇게, 소스코드가 수정이라도 되면 바로 유효하지 않게되는 방식으로 언급할수 밖에 없다. 만약 소스 코드 어디에서든 전역적인 심볼을 자유롭게 선언할 수 있다면 이 문제를 해결할 수 있을텐데...

2
1

지금 리눅스 진영에서 컨테이너/네임스페이스의 입지가 어떻게 될까요? 사실 요즘 서비스 배포할때는 죄다 컨테이너 쓰잖아요? 근데 또 컨테이너로 할수 있는 것중 상당수는 그냥 기존 권한 관리로도 가능하단 말이죠? 근데 컨테이너를 쓸땐 기존 권한 관리를 그냥 없는셈 치고 접근하게 되는데 이게 정말로 다들 동의하는 방식인지가 궁금합니다.

3

커뮤니티에서 정치적인 주제를 금지하면 결국 관리자가 보기에만 정치적이지 않은, 자기 입맛에 맞는 정치적인 글만 남더라구요

3
0
0
13
2
0
6

크로이세 shared the below article:

Rust 컴파일러 개발 관련 명령어 모음집

notJoon @joonnot@hackers.pub

이 글은 러스트 컴파일러에 기여할 때 자주 사용하는 명령어와 작업 흐름을 소개합니다. 기본적인 빌드 명령어부터 특정 컴포넌트만 빌드하는 방법, 테스트 실행 및 `--bless`, `--force-rerun` 플래그 활용법을 설명합니다. Stage 시스템(Stage 0, 1, 2)을 구분하여 각 Stage의 역할과 사용법을 안내하고, UI 테스트 작성 규칙과 에러 주석 문법을 상세히 다룹니다. 또한, 직접 컴파일러 실행, 디버그 어설션 활성화, 백트레이스 활성화 등 디버깅 명령어와 컴파일러 버그 수정 워크플로우를 예시와 함께 제시합니다. 마지막으로, 자주 발생하는 문제와 해결법, 빌드 시간 단축 방법, 디버깅용 환경 변수 설정까지 다루어 러스트 컴파일러 개발에 실질적인 도움을 제공합니다. 이 글을 통해 러스트 컴파일러 기여자들이 효율적으로 개발하고 디버깅하는 데 필요한 지식을 얻을 수 있습니다.

Read more →
11
4

visionOS에서 한국어 입출력에 문제가 없는 터미널 에뮬레이터가 없어서 진지하게 하나 만들어야 하나 고민 중……

그래도 텍스트 에디터를 만드는 것보다는 난이도가 낮지 않을까?

2

visionOS에서 한국어 입출력에 문제가 없는 터미널 에뮬레이터가 없어서 진지하게 하나 만들어야 하나 고민 중……

그래도 텍스트 에디터를 만드는 것보다는 난이도가 낮지 않을까?

3

C++ Concepts는 마치 mypy나 Pyright 같은 정적 타입 검사기가 없던 시절의 Python 3.x와 같다. 타입 검사를 boolean predicate로 하고 자빠졌다는 점에서. 이런 걸 어쨌든 컴파일 타임에 타입 검사가 되기는 한다는 이유로 정적 타입 언어라고 불러줄 수 있는 건가?

2

C++ Concepts는 마치 mypy나 Pyright 같은 정적 타입 검사기가 없던 시절의 Python 3.x와 같다. 타입 검사를 boolean predicate로 하고 자빠졌다는 점에서. 이런 걸 어쨌든 컴파일 타임에 타입 검사가 되기는 한다는 이유로 정적 타입 언어라고 불러줄 수 있는 건가?

2
5
2
0
0
3
3

크로이세 shared the below article:

AI도 무조건 틀리는 Javascript 퀴즈

중고 자몽차(따뜻함) @dvbeetle@hackers.pub

이 JavaScript 퀴즈는 `age` 객체와 `preferences` 객체를 사용하여 각 이름에 대한 나이를 출력하는 문제입니다. `forEach` 메서드를 통해 배열의 각 요소(이름)를 `printAge` 함수에 전달하고, 이 함수는 템플릿 리터럴을 사용하여 "name is age" 형태의 문자열을 콘솔에 출력합니다. Claude Opus, GPT 4.5, Gemini 2.5 Pro와 같은 고급 AI 모델들도 이 문제에서 오답을 냈다는 점이 흥미롭습니다. 이 코드를 통해 JavaScript의 객체 접근과 배열 메서드 사용법을 다시 한번 상기할 수 있습니다.

Read more →
3

@hongminhee洪 民憙 (Hong Minhee) @kodingwarriorJaeyeol Lee 저걸 읽어 보니 진짜 문제는 Claude Code가 아니라 git worktree와 Dev Containers를 섞어서 쓰려던 저에게 있었다는 걸 깨달았습니다 😂

CLAUDE_CONFIG_DIR 환경 변수는 참고할 필요가 있겠네요. 저게 credentials 정보를 담는 폴더인지, 아니면 그냥 settings.json이 들어가는 자리인지 봐야겠습니다.

1

이제 La Terminal과 Emacs vterm과 Claude Code와 한국어 IME가 결부된 버그를 신나게 밟아제끼는 중

Anthropic에는 Dev Containers 쓰는 개발자만 없는 게 아니라 Emacs 쓰는 CJK 개발자도 없는 게 틀림없다

1

이제 La Terminal과 Emacs vterm과 Claude Code와 한국어 IME가 결부된 버그를 신나게 밟아제끼는 중

Anthropic에는 Dev Containers 쓰는 개발자만 없는 게 아니라 Emacs 쓰는 CJK 개발자도 없는 게 틀림없다

3
3

한때 이 문제에 대한 해법으로, 텍스트로 된 소스 코드가 아닌 문법 트리를 직접 편집하는 식의 IDE를 구상한 적이 있었다. 그런데 이제 대 LLM 시대가 와서 AI도 텍스트를 주로 다루잖아. 우린 안 될 거야 아마.

4

여기에 Visual Studio Code까지 참전하면 remote tunnel에 접속은 되고 그게 윈도면 WSL까지도 접속되는데 희안하게 원격지에 있는 dev container에는 못 붙는 기묘함을 보임.

0
8

깨알팁: 유효한 유니코드 코드포인트 값의 범위에는 구멍이 있습니다. UTF-16을 위해 만들어진 surrogate pair 영역입니다. 이 영역의 값은 UTF-16 외에서는 의미가 없고 사용될 수 없습니다.

UTF-16이 한 트롤링으로 Byte Order Mark (U+FFFE) 라는 것도 있죠... UTF-16LE인지 UTF-16BE인지 확인하기 위해 바이트 인코딩된 문자열 맨 앞에 넣는 문자인데 (0xFE가 먼저 오면 LE) 어떤 에디터는 이걸 UTF-8 문자열에도 집어넣어서 UTF-8인지 확인하겠다고 설치고 다니는 이하생략

2
3

아는 친구한테 들은 얘기인데, 최근 이직한 회사에서 Python을 쓰는데 린트나 포매터 같은 것도 전혀 설정을 안 해놓고 살고 있기에 도입하자고 했더니 “그런 거 쓸 거면 Python 안 쓰죠”라는 말과 함께 제안을 거절 당했다고 한다. Python에서도 린트나 포매터는 물론이고 타입 체커까지 붙여서 살려면 살 수 있지만, 어쩐지 그런 거 신경 쓸 사람들은 최근 10년 사이에 다들 다른 언어로 넘어가 버리고 그런 거 신경 안 쓰는 사람들만 Python을 계속 쓰게 된 게 아닌가 싶은 생각이 들었다.

3