What is Hackers' Pub?

Hackers' Pub is a place for software engineers to share their knowledge and experience with each other. It's also an ActivityPub-enabled social network, so you can follow your favorite hackers in the fediverse and get their latest posts in your feed.

0
0
0
0
0

오랜 세월에 걸쳐 해피해킹을 써 오면서 ...... 흰색은 누렇게 때가 타고 검은색은 허옇게 때가 타는 점이 몹시 맘에 안든다. ...... 해피해킹이면서 때가 덜 (안) 타는 키보드는 없단말인가 ......

0

Jira, Linear 등 일정 관리 앱이 풀어야할 가장 어려운 문제는, 사용자 중 상당수는 애초에 일정 관리를 하기 싫어하는 사람이라는 것이다. 안타깝게도 나도 거기 포함되는데, 문제는 그런 사람일 수록 일정 관리가 꼭 필요하다. 나중에 프로젝트가 복잡해지면 일정 관리 앱을 켜는 거 자체를 꺼리게 된다. 이걸 어쩌면 좋지.

1

You may notice a large drop in total post counts in the latest Pixelfed version, we have fixed the calculation to no longer include shared posts (which may have previously included remote shares).

The total posts count now properly reflects local posts and comments!

Total posts (pixelfed.social)
0
0

sigh

TFW I look at something I wrote and I meant "resident" but wrote "entrant" (apparently someone mentioning "reentrant" recently, which I encounter all too infrequently, decided to lodge itself too solidly in my memory and that variant came out instead) and there is no edit functionality so my erroneous writing is immortalized online.

When friggin BBS software that ran off of floppy disks from the 1980s had edit functionality with line editors (e.g. C-86 Citadel) and I just weep at the computational resources wasted on WordPress which still has less useful features.
0

bgl gwyng shared the below article:

같은 것을 알아내는 방법

Ailrun (UTC-5/-4) @ailrun@hackers.pub

같은 것과 같지 않은 것

국밥 두 그릇의 가격이 얼마인가? KTX의 속력이 몇 km/h인가? 내일 기온은 몇 도인가? 일상에서 묻는 이런 질문은 항상 같음의 개념을 암시적으로 사용하고 있다. 앞의 예시를 보다 명시적으로 바꾼다면 아래와 같이 (다소 어색하게) 말할 수 있다.

  • 국밥 두 그릇의 가격은 몇 원과 같은가?
  • KTX의 속력은 몇 km/h와 같은가?
  • 내일 기온은 몇 도와 같은가?

이런 질문들의 추상화인 이론들은 자연스럽게 언제 무엇과 무엇이 같은지에 대해서 답하는 데에 초점을 맞추게 된다. 예를 들면

  • x2+x+1=0x^2 + x + 1 = 0의 실수 해의 갯수는 0과 같다.
  • 물 분자 내의 수소-산소 연결 사이의 각도는 104.5도와 같다.
  • 합병 정렬의 시간 복잡도는 O(nlog⁡n)O(n\log{n})같다.

등이 있다. 이렇게 어떤 두 대상이 같은지에 대해서 이야기를 하다보면 반대로 어떤 두 대상이 같지 않은지에 대해서도 이야기하게 된다. 즉,

  • x+4x + 422로 나눈 나머지는 x+1x + 122로 나눈 나머지와 같지 않다.
  • 연결 리스트(Linked List)와 배열(Array)은 같지 않다.
  • 함수 λ x→x\lambda\ x \to x와 정수 55같지 않다.

같은 것과 판정 문제(Decision Problem)

이제 컴퓨터 과학(Computer Science)과 프로그래밍(Programming)에 있어 자연스러운 의문은 "두 대상이 같은지 아닌지와 같은 답을 주는 알고리즘(Algorithm)이 있나?"일 것이다. 다시 말해서 두 대상 aabb를 입력으로 주었을 때

  • 알고리즘이 참 값(True\mathtt{True})을 준다면 aabb가 같고
  • 알고리즘이 거짓 값(False\mathtt{False})을 준다면 aabb가 같지 않은

알고리즘이 있는지 물어볼 수 있다. 이런 어떤 명제가 참인지 거짓인지 판정하는 알고리즘의 존재 여부에 대한 질문을 "판정 문제"("Decision Problem")라고 하며, 명제 PP에 대한 판정 문제에서 설명하는 알고리즘이 존재한다면 "PP는 판정 가능하다"("PP is decidable")고 한다. 즉, 앞의 질문은 "임의의 aabb에 대해 aabb가 같은지 판정 가능한가?"라는 질문과 같은 의미라고 할 수 있다.

이 질문에 대한 대답은 당연하게도 어떤 대상을 어떻게 비교하는지에 따라 달라진다. 예를 들어 우리가 32 비트(bit) 정수에 대해서만 이야기하고 있다면 "임의의 32 비트 정수 aabb에 대해 aabb가 각 비트별로 같은지 판정 가능한가?"라는 질문에 대한 답은 "그렇다"이다. 반면 우리가 비슷한 질문을 자연수를 받아 자연수를 내놓는 임의의 함수에 대해 던진다면 답은 "아니다"가 된다.[1]

그렇다면 어떤 대상의 어떤 비교에 대해 판정 문제를 물어보아야할까? 프로그래머(Programmer)로서 명백한 대답은 두 프로그램(Program)이 실행 결과에 있어서 같은지 보는 것일 것이다. 그러나 앞서 자연수를 받아 자연수를 내놓는 함수에 대해 말했던 것과 비슷하게 두 프로그램의 실행 결과를 완벽하게 비교하는 알고리즘은 존재하지않는다. 이는 우리가 두 프로그램의 같음을 판정하고 싶다면 그 같음을 비교하는 방법에 제약을 두어야 함을 말한다. 여기서는 다음의 두 제약을 대표로 설명할 것이다.

  1. 문법적 비교(Syntactic Comparison)
  2. β\beta 동등성 (β\beta Equivalence)

1. 문법적 비교(Syntactic Comparison)

이 방법은 말 그대로 두 프로그램이 문법 수준에서 같은지를 보는 것이다. 예를 들어 다음의 두 JavaScript 프로그램은 문법적으로 같은 프로그램이다.

// 1번 프로그램
let x = 5;
console.log(x);

// 2번 프로그램
let x  =  5;
console.log( x );

공백문자의 사용에서 차이가 있으나, 그 외의 문법 요소는 모두 동일함에 유의하자. 반면 다음의 두 JavaScript 프로그램은 동일한 행동을 하지만 문법적으로는 다른 프로그램이다.

// 1번 프로그램
let x = 5;
console.log(x);

// 2번 프로그램
let x = 3 + 2;
console.log(x);

두 프로그램 모두 x5라는 값을 할당하고 5를 콘솔에 출력하나, 첫번째 프로그램은 = 5;를, 두번째 프로그램은 = 3 + 2을 사용하여 5를 할당하고 있기 때문에 문법적으로 다르다.

문법적 비교는 이렇게 문법만 보고서 쉽게 판정할 수 있다는 장점이 있으나, 두번째 예시처럼 쉽게 같은 행동을 함을 이해할 수 있는 프로그램에 대해서도 "같지 않음"이라는 결과를 준다는 단점을 가진다. 혹자는

3 + 2같은 계산은 그냥 한 다음에 비교하면 안돼? 컴파일러(Compiler)도 상수 전파(Constant Propagation) 최적화라던지로 3 + 25로 바꾸잖아?

라는 생각을 할 수도 있을 것이다. 이 제안을 반영한 방법이 바로 β\beta 동등성이다.

2. β\beta 동등성

바로 앞의 소절에서 단순 계산의 추가에 의해 같음같지 않음으로 변하는 것을 보았다. 이런 상황을 피하기 위해서는 같음을 평가할 때 프로그램의 실행을 고려하도록 만들어야 한다. 가장 대표적인, 대부분의 프로그래밍 언어(Programming Language)에 존재하는 프로그램의 실행은 함수 호출이다. 따라서 함수 호출을 고려한 같음의 비교는 f(c)와 함수 f의 몸체 b 안에서 인자 xc로 치환한 것을 같다고 취급해야한다. 예를 들어

let f = (x) => x + 3;

이 있다면, f(5)5 + 3 혹은 8을 같은 프로그램으로 취급해야한다. 이 비교 방법의 큰 문제는 함수가 종료하는지 알지 못한다는 것이다. 두 프로그램 ab를 비교하는데, a가 종료하지 않는 함수 l을 호출한다면, 이 알고리즘은 "같음"이나 "같지 않음"이라는 결과를 낼 수조차 없다. 즉, 올바른 판정법이 될 수 없다.

더 심각한 문제는 아직 값을 모르는 변수가 있는 "열린 프로그램"("Open Program")에 대해서도 이런 계산을 고려해야한다는 것이다. 다음의 JavaScript 예시를 보자.

let g = (x) => f(x) + 3;
let h = (x) => (x + 3) + 3;

gh는 같은 프로그램일까? 우리가 gh가 같은 프로그램이기를 원한다면 f(x)x + 3을 같은 프로그램으로 보아야한다. 대부분의 프로그램은 함수 안에서 쓰여지기 때문에 프로그램의 비교는 거의 항상 gh의 몸체와 같은 열린 프로그램들의 비교이다. 따라서 gh를 다른 프로그램으로 본다면 계산을 실행하여 두 프로그램을 비교하는 의미가 퇴색되고 만다. 그렇기 때문에 우리는 x와 같이 값이 정해지지 않은 변수가 있을 때에도 f(x)을 호출하여 비교해야만 한다. 이는 우리가 단순히 모든 함수가 종료하는지 여부를 떠나서, 함수의 몸체에 등장하는 모든 부속 프로그램(Sub-program)이 종료하는지 아닌지를 따져야만 한다는 이야기이다.

이런 강한 제약조건으로 인해 β\beta 동등성을 통해서 프로그램 비교의 판정 문제를 해결 가능한 곳은 매우 제한적이지만, β\beta 동등성이 매우 유용한 한가지 경우가 있다. 바로 의존 형이론(Dependent Type Theory)의 형검사(Type Checking)이다.

의존 형이론과 형의 같음

의존 형이론은 형(Type)에 임의의 프로그램을 포함할 수 있도록 하는 형이론(Type Theory)의 한 종류이다. 예를 들어 명시적인 길이(n)를 포함한 벡터(Vector) 형Vector n Int과 같이 쓸 수 있다. 이 형은 n개의 Int값을 가진 벡터를 표현하는 형이다. 이제 append라는 두 벡터를 하나로 연결하는 함수를 만든다고 해보자. 대략 다음과 같은 형을 쓸 수 있을 것이다.

append : Vector n a -> Vector m a -> Vector (n + m) a

즉, append는 길이 n짜리 a 형의 벡터와 길이 m짜리 a 형의 벡터를 합쳐서 길이 n + m짜리 a 형의 벡터를 만드는 함수이다. 이 함수를 사용해서 길이 5의 벡터를 길이 2와 길이 3짜리 벡터 x, y로부터 만들고 싶다고 하자.

append x y : Vector (2 + 3) a

안타깝게도 우리는 길이 2 + 3짜리 벡터를 얻었지, 길이 5짜리 벡터를 얻진 못했다. 여기서 앞서의 질문이 다시 돌아온다.

아니, 2 + 35로 계산하면 되잖아?"

그렇다. 이런 의존 형에 β\beta 동등성을 적용하면 우리가 원하는 형을 바로 얻어낼 수 있다. Vector (2 + 3) aVector 5 a같은 형이기 때문이다. 더욱이, 의존 형의 경우 종료하지 않는 부속 프로그램이 잘못된 형을 줄 수 있기 때문에 많은 경우 종료하지 않는 부속 프로그램을 어차피 포함하지 않는다. 다시 말해, 앞서 말한 제약 조건 즉 모든 부속 프로그램이 종료해야만 한다는 제약조건은 의존 형의 경우 상대적으로 훨씬 덜 심각한 제약조건이 되는 것이다.

이런 의존 형에 있어서의 β\beta 동등성 검사를 "변환 검사"("Conversion Check")라고 하며, 두 형이 β\beta 동등일 경우 이 두 형이 서로 "변환 가능하다"("Convertible")라고 한다. 이 변환 검사는 의존 형이론 구현에 있어서 가장 핵심인 기능 중 하나이며, 가장 잦은 버그를 부르는 기능 중 하나이기도 하다.

마치며

이 글에서는 같음과 같지 않음의 판정 문제에 대해 간략히 설명하고 프로그램의 같음을 판정하는 법에 대해서 단순화하여 다루어보았다. 구체적으로는 문법 기반의 비교와 β\beta 동등성을 통한 비교로 프로그램의 같음을 판정하는 법을 알아보았고, 이 중 β\beta 동등성이 적용되는 가장 중요한 예시인 의존 형이론을 β\beta 동등성을 중점으로 짤막하게 설명하였다. 마지막 문단에서 언급했듯 의존 형이론의 구현에 있어서 β\beta 동등성을 올바르게 구현하는 것은 가장 중요한 작업 중 하나이기에, 최근 연구들은 β\beta 동등성의 구현 자체를 의존 형이론 안에서 함으로서 검증된 β\beta 동등성의 구현을 하기 시작하고 있다. 이 글이 같음과 같지 않음과 판정 문제 그리고 β\beta 동등성에 있어 유용한 설명을 내놓았기를 바라며 이만 줄이도록 하겠다.


  1. 두 함수가 같다라고 보는 방법에 따라 다르나, 두 함수가 항상 같은 값을 가진다면 같다고 하자. 이때 함수의 판정 문제는 정지 문제(Halting Problem)와 동일하다. 임의의 튜링 기계(Turing Machine) ff가 입력 nn을 받았을 때 종료하면 g(n)=1g(n) = 1, 아니면 g(n)=0g(n) = 0이라고 하면 이 함수 gg와 상수 함수 c(n)=1c(n) = 1가 같은 함수임을 보이는 것은 ff가 항상 종료한다는 것을 보이는 것과 동등하다. ↩︎

Read more →
5
2
2
0

アメリカ国内でiPhoneの製造か。
ディスプレイもバッテリーも半導体も作ってない国で、4年で製造ライン組み上げるのは無理でしょう。それに人件費も高すぎる。児童労働や奴隷狩りもやりかねないけど、したってコストに見合わないよ。
トランプが去れば関税は消えるんだから、それまで関税の低い国や地域(ペンギンの島もあるし!)を経由して完成品を輸入する方がいいに決まってるじゃないか。

itmedia.co.jp/news/articles/25

0

생성형 AI가 비판적 사고에 미치는 영향 [PDF]
------------------------------
- 생성형 AI(Generative AI, 이하 GenAI)가 지식 노동자들의 *비판적 사고 능력* 과 *인지적 노력* 에 어떤 영향을 미치는지를 조사한 설문 기반의 연구 논문
- 총 319명의 지식 노동자를 대상으로 GenAI를 업무에 활용한 *936개의 실제 사례* 를 수집함
- 핵심 연구 질문:
-
RQ1 : GenAI 사용 중 언제,…
------------------------------
https://news.hada.io/topic?id=20218&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

0
0
0
0
0
0

I've updated my "How to have a great first PyCon" blog post for 2025.

I linked to more blog posts from others on "how to PyCon", updated links to this year's PyCon website, added more updates around the implosion of Twitter, and updated some outdated references.

See you at ! 👋 🐍💖

trey.io/pycon-tips

0
0
0
0
0

因為藥品的價格差異,導致有美國人去加拿大買藥,或是中國人去印度買藥的狀況。如果現在從中國或是印度出口到美國的iPhone要徵收30-100%的關稅,但加拿大跟墨西哥不用,而導致有巨大的物價差,那跨境購物、免稅商店及跑單幫的生意又會再出現。🤔

0
0
0
0

브라우저 탭 라이프

사이드 탭
트리 탭
탭 잠그기
탭 배경색 바꾸기
탭 타이틀 바꾸기 및 고정

다 설치했다니, 이제사 탭 뭉치에서 방황하는 시간이 좀 줄어드나 싶네요.

가상 데스크탑으로 구분, 브라우저 창으로 구분, 그런데도 한 브라우저당 탭을 몇 십개씩 열어 놓습니다. 마음의 여유가 없어지니, 한 주제를 오래 못 보나 싶습니다. 언제 바꾸긴 해야 할 것 같은 탭 라이프인데, 외부 요인이 생겨야 가능할 것 같습니다.

0
0

the reason that LGBTQIA+ is a "all or nothing" issue is because for decades we have experienced people trying to fragment our collective voices, turning us against each other. I will not compromise on accepting aro & ace identities. I will not "tone it down" because that's what they always fucking say.

the second i compromise and do things like reject neo pronouns... the worse it's going to get as they continue to narrowly define how to be queer in the "correct" way. On tumblr I've watched trans folk talk about how the reason transphobia is so rampant was because we allowed neopronouns. It fucking hurts right, that's not it. They were never going to accept us anyway, continuing to try to make ourselves fit their image is just going to cause more harm than good.

0
0

Mind Over Magic

정진명의 굳이 써서 남기는 생각 @jm@guji.jjme.me

서지정보

게임명: Mind Over Magic
개발사: Starkypants
배급사: Klei Publishing
출시일: 2025년 2월 13일
장르: 생존 기지건설

생각

같이 게임 이야기를 나누는 친구들로부터, 정보가 넘치지만 맛들리면 오래 잡을 수 있는 게임이고, 『폭풍반대』 같은 맛이라길래 잡아보게 된 게임입니다.

마법 학교를 건설해나가며 바깥쪽의 위협과 아래쪽의 위협을 이겨나갈 수 있는 콜로니를 만들어나간다는 콘셉트 같습니다만, 일단 게임이 너무 복잡해서 이해하지 못했고, 뭘 해야 할지 모른 채 덩그러니 남겨진 채로 제가 게임을 오래 붙들고 있을 수 없어 얼마 플레이하지는 못했습니다. 다른 분들은 몇십 시간을 재미있게 플레이했는데, 저는 그렇게 붙들고 있지를 못하겠더라고요.

어째서 이렇게 되었는가? 게임 잘못은 아닙니다. 설명이 부족할 수는 있지만 원래 그런 장르에 가깝습니다.(일어날 수 있는 일이 너무 다양하기 때문에 설명을 일일히 넣는 것이 게임의 이해를 돕는 것보다 질리게 만들 수 있는 장르라고 생각합니다.) 제가 개인적으로 시간을 원하는 타이밍에 일시정지할 수 있는 장르에 완벽주의적으로 굴다 미쳐버리는 경향이 있어서, 다음에 뭐가 일어날 지 모르고 시간을 어떻게 보내야 할 지 모르겠는 점이 제게는 심적 부담이 심했던 것 같습니다. 웃기지 않나요. 첫 판이고 아무 일도 없을 수도 없는데 지레 겁먹어 게임을 더 진행시키지 못한다니. 그만큼 지쳐있다는 방증일 수도 있겠지만요.

좀 더 플레이해보고 쓰고 싶지만, 다른 어떤 계기가 있지 않는 한 더 잡고 있지 않을 것 같지는 않아서 마무리하고 일단 올립니다. 어떤 계기가 있으면 다시 플레이해보고 좀 더 의미있는 글로 바꿀지도 모르겠습니다.

Read more →
0

the reason that LGBTQIA+ is a "all or nothing" issue is because for decades we have experienced people trying to fragment our collective voices, turning us against each other. I will not compromise on accepting aro & ace identities. I will not "tone it down" because that's what they always fucking say.

0

[공지]
현재 논비건 CW에 대한 이슈가 굉장히 핫합니다.
머스타드에는 이런 규칙이 있습니다.

:zooming_left: 강요하지 마세요. :zooming_right:

이는 타인에게 사상을 강요하는 것을 포함하며,
비건 분들만 사상을 강요하지 말라는 게 아니라
비건 분들"에게도" 사상을 강요하지 말라는 의미입니다.

동물이 죽어있는 사진을 올리면
즉시 조치가 취해지듯이
동물을 죽이거나 어떻게 죽이는 묘사를 올려도
신고 및 조치를 취할 수 있습니다.

또한 비건 분들에게 도축 과정을 설명하면서
잔인한 워딩을 사용하면서 불링을 시도하는 분들이 있다면
즉시 관리자에게 이야기를 하거나 신고를 해주시길 바랍니다.

감사합니다.

0
0
0

アメリカ国内でiPhoneの製造か。
ディスプレイもバッテリーも半導体も作ってない国で、4年で製造ライン組み上げるのは無理でしょう。それに人件費も高すぎる。児童労働や奴隷狩りもやりかねないけど、したってコストに見合わないよ。
トランプが去れば関税は消えるんだから、それまで関税の低い国や地域(ペンギンの島もあるし!)を経由して完成品を輸入する方がいいに決まってるじゃないか。

itmedia.co.jp/news/articles/25

0

Git 20주년 회고 – 여전히 이상하고, 여전히 멋진 도구
------------------------------
- Git은 20년 전 Linus Torvalds가 첫 커밋을 하며 시작된 버전 관리 시스템임
- 원래는 단순한 개인 프로젝트였지만, 이후 전 세계적으로 가장 널리 사용되는 버전 관리 시스템으로 성장함
- 작성자는 GitHub 공동 창립자이며, Git 관련 책과 커뮤니티를 구축하면서 Git의 발전에 깊게 관여해왔음
- 초기에는 단…
------------------------------
https://news.hada.io/topic?id=20217&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

0
0

The U.S. without good reason declared a trade war on the world.

Europe is now letting their unexpected adversary, the U.S., suffer at its own hand.

“‘In that case,’ said Napoleon, ‘let us wait twenty minutes; when the enemy is making a false movement we must take good care not to interrupt him.’”

- 1836, French Revolution: Volume 5 by Archibald Alison, Page 476, William Blackwood and Sons. Edinburgh.

screenshot of a thread by Jakob Hanke Vela @HankeVela:   Apr 7 • 7 tweets • 1 min read   Brussels is watching amazed, as Trump destroys the US economy. "Nobody in the Commission thought that the US government would be this stupid and self-destructive," an EU official tells me. "That they would blow up their own country by letting ChatGPT make their trade policy." 🧵   EU officials are quietly preparing brutal countermeasures — but they’re in no rush. Markets are doing the work for them. Here’s what’s happening behind the scenes: 📜📌   Trump’s chaos is collapsing the US markets faster than any EU retaliation could. Inside the Commission and among EU governments, the mood is: Don't give Trump an excuse to blame this on others.   Since February, the S&P 500 has dropped 20%.  European officials believe Trump's trade chaos is backfiring — and see no reason to escalate while the damage grows organically.   [trimmed to fit alt text]
0
0
0

Simon Park shared the below article:

같은 것을 알아내는 방법

Ailrun (UTC-5/-4) @ailrun@hackers.pub

같은 것과 같지 않은 것

국밥 두 그릇의 가격이 얼마인가? KTX의 속력이 몇 km/h인가? 내일 기온은 몇 도인가? 일상에서 묻는 이런 질문은 항상 같음의 개념을 암시적으로 사용하고 있다. 앞의 예시를 보다 명시적으로 바꾼다면 아래와 같이 (다소 어색하게) 말할 수 있다.

  • 국밥 두 그릇의 가격은 몇 원과 같은가?
  • KTX의 속력은 몇 km/h와 같은가?
  • 내일 기온은 몇 도와 같은가?

이런 질문들의 추상화인 이론들은 자연스럽게 언제 무엇과 무엇이 같은지에 대해서 답하는 데에 초점을 맞추게 된다. 예를 들면

  • x2+x+1=0x^2 + x + 1 = 0의 실수 해의 갯수는 0과 같다.
  • 물 분자 내의 수소-산소 연결 사이의 각도는 104.5도와 같다.
  • 합병 정렬의 시간 복잡도는 O(nlog⁡n)O(n\log{n})같다.

등이 있다. 이렇게 어떤 두 대상이 같은지에 대해서 이야기를 하다보면 반대로 어떤 두 대상이 같지 않은지에 대해서도 이야기하게 된다. 즉,

  • x+4x + 422로 나눈 나머지는 x+1x + 122로 나눈 나머지와 같지 않다.
  • 연결 리스트(Linked List)와 배열(Array)은 같지 않다.
  • 함수 λ x→x\lambda\ x \to x와 정수 55같지 않다.

같은 것과 판정 문제(Decision Problem)

이제 컴퓨터 과학(Computer Science)과 프로그래밍(Programming)에 있어 자연스러운 의문은 "두 대상이 같은지 아닌지와 같은 답을 주는 알고리즘(Algorithm)이 있나?"일 것이다. 다시 말해서 두 대상 aabb를 입력으로 주었을 때

  • 알고리즘이 참 값(True\mathtt{True})을 준다면 aabb가 같고
  • 알고리즘이 거짓 값(False\mathtt{False})을 준다면 aabb가 같지 않은

알고리즘이 있는지 물어볼 수 있다. 이런 어떤 명제가 참인지 거짓인지 판정하는 알고리즘의 존재 여부에 대한 질문을 "판정 문제"("Decision Problem")라고 하며, 명제 PP에 대한 판정 문제에서 설명하는 알고리즘이 존재한다면 "PP는 판정 가능하다"("PP is decidable")고 한다. 즉, 앞의 질문은 "임의의 aabb에 대해 aabb가 같은지 판정 가능한가?"라는 질문과 같은 의미라고 할 수 있다.

이 질문에 대한 대답은 당연하게도 어떤 대상을 어떻게 비교하는지에 따라 달라진다. 예를 들어 우리가 32 비트(bit) 정수에 대해서만 이야기하고 있다면 "임의의 32 비트 정수 aabb에 대해 aabb가 각 비트별로 같은지 판정 가능한가?"라는 질문에 대한 답은 "그렇다"이다. 반면 우리가 비슷한 질문을 자연수를 받아 자연수를 내놓는 임의의 함수에 대해 던진다면 답은 "아니다"가 된다.[1]

그렇다면 어떤 대상의 어떤 비교에 대해 판정 문제를 물어보아야할까? 프로그래머(Programmer)로서 명백한 대답은 두 프로그램(Program)이 실행 결과에 있어서 같은지 보는 것일 것이다. 그러나 앞서 자연수를 받아 자연수를 내놓는 함수에 대해 말했던 것과 비슷하게 두 프로그램의 실행 결과를 완벽하게 비교하는 알고리즘은 존재하지않는다. 이는 우리가 두 프로그램의 같음을 판정하고 싶다면 그 같음을 비교하는 방법에 제약을 두어야 함을 말한다. 여기서는 다음의 두 제약을 대표로 설명할 것이다.

  1. 문법적 비교(Syntactic Comparison)
  2. β\beta 동등성 (β\beta Equivalence)

1. 문법적 비교(Syntactic Comparison)

이 방법은 말 그대로 두 프로그램이 문법 수준에서 같은지를 보는 것이다. 예를 들어 다음의 두 JavaScript 프로그램은 문법적으로 같은 프로그램이다.

// 1번 프로그램
let x = 5;
console.log(x);

// 2번 프로그램
let x  =  5;
console.log( x );

공백문자의 사용에서 차이가 있으나, 그 외의 문법 요소는 모두 동일함에 유의하자. 반면 다음의 두 JavaScript 프로그램은 동일한 행동을 하지만 문법적으로는 다른 프로그램이다.

// 1번 프로그램
let x = 5;
console.log(x);

// 2번 프로그램
let x = 3 + 2;
console.log(x);

두 프로그램 모두 x5라는 값을 할당하고 5를 콘솔에 출력하나, 첫번째 프로그램은 = 5;를, 두번째 프로그램은 = 3 + 2을 사용하여 5를 할당하고 있기 때문에 문법적으로 다르다.

문법적 비교는 이렇게 문법만 보고서 쉽게 판정할 수 있다는 장점이 있으나, 두번째 예시처럼 쉽게 같은 행동을 함을 이해할 수 있는 프로그램에 대해서도 "같지 않음"이라는 결과를 준다는 단점을 가진다. 혹자는

3 + 2같은 계산은 그냥 한 다음에 비교하면 안돼? 컴파일러(Compiler)도 상수 전파(Constant Propagation) 최적화라던지로 3 + 25로 바꾸잖아?

라는 생각을 할 수도 있을 것이다. 이 제안을 반영한 방법이 바로 β\beta 동등성이다.

2. β\beta 동등성

바로 앞의 소절에서 단순 계산의 추가에 의해 같음같지 않음으로 변하는 것을 보았다. 이런 상황을 피하기 위해서는 같음을 평가할 때 프로그램의 실행을 고려하도록 만들어야 한다. 가장 대표적인, 대부분의 프로그래밍 언어(Programming Language)에 존재하는 프로그램의 실행은 함수 호출이다. 따라서 함수 호출을 고려한 같음의 비교는 f(c)와 함수 f의 몸체 b 안에서 인자 xc로 치환한 것을 같다고 취급해야한다. 예를 들어

let f = (x) => x + 3;

이 있다면, f(5)5 + 3 혹은 8을 같은 프로그램으로 취급해야한다. 이 비교 방법의 큰 문제는 함수가 종료하는지 알지 못한다는 것이다. 두 프로그램 ab를 비교하는데, a가 종료하지 않는 함수 l을 호출한다면, 이 알고리즘은 "같음"이나 "같지 않음"이라는 결과를 낼 수조차 없다. 즉, 올바른 판정법이 될 수 없다.

더 심각한 문제는 아직 값을 모르는 변수가 있는 "열린 프로그램"("Open Program")에 대해서도 이런 계산을 고려해야한다는 것이다. 다음의 JavaScript 예시를 보자.

let g = (x) => f(x) + 3;
let h = (x) => (x + 3) + 3;

gh는 같은 프로그램일까? 우리가 gh가 같은 프로그램이기를 원한다면 f(x)x + 3을 같은 프로그램으로 보아야한다. 대부분의 프로그램은 함수 안에서 쓰여지기 때문에 프로그램의 비교는 거의 항상 gh의 몸체와 같은 열린 프로그램들의 비교이다. 따라서 gh를 다른 프로그램으로 본다면 계산을 실행하여 두 프로그램을 비교하는 의미가 퇴색되고 만다. 그렇기 때문에 우리는 x와 같이 값이 정해지지 않은 변수가 있을 때에도 f(x)을 호출하여 비교해야만 한다. 이는 우리가 단순히 모든 함수가 종료하는지 여부를 떠나서, 함수의 몸체에 등장하는 모든 부속 프로그램(Sub-program)이 종료하는지 아닌지를 따져야만 한다는 이야기이다.

이런 강한 제약조건으로 인해 β\beta 동등성을 통해서 프로그램 비교의 판정 문제를 해결 가능한 곳은 매우 제한적이지만, β\beta 동등성이 매우 유용한 한가지 경우가 있다. 바로 의존 형이론(Dependent Type Theory)의 형검사(Type Checking)이다.

의존 형이론과 형의 같음

의존 형이론은 형(Type)에 임의의 프로그램을 포함할 수 있도록 하는 형이론(Type Theory)의 한 종류이다. 예를 들어 명시적인 길이(n)를 포함한 벡터(Vector) 형Vector n Int과 같이 쓸 수 있다. 이 형은 n개의 Int값을 가진 벡터를 표현하는 형이다. 이제 append라는 두 벡터를 하나로 연결하는 함수를 만든다고 해보자. 대략 다음과 같은 형을 쓸 수 있을 것이다.

append : Vector n a -> Vector m a -> Vector (n + m) a

즉, append는 길이 n짜리 a 형의 벡터와 길이 m짜리 a 형의 벡터를 합쳐서 길이 n + m짜리 a 형의 벡터를 만드는 함수이다. 이 함수를 사용해서 길이 5의 벡터를 길이 2와 길이 3짜리 벡터 x, y로부터 만들고 싶다고 하자.

append x y : Vector (2 + 3) a

안타깝게도 우리는 길이 2 + 3짜리 벡터를 얻었지, 길이 5짜리 벡터를 얻진 못했다. 여기서 앞서의 질문이 다시 돌아온다.

아니, 2 + 35로 계산하면 되잖아?"

그렇다. 이런 의존 형에 β\beta 동등성을 적용하면 우리가 원하는 형을 바로 얻어낼 수 있다. Vector (2 + 3) aVector 5 a같은 형이기 때문이다. 더욱이, 의존 형의 경우 종료하지 않는 부속 프로그램이 잘못된 형을 줄 수 있기 때문에 많은 경우 종료하지 않는 부속 프로그램을 어차피 포함하지 않는다. 다시 말해, 앞서 말한 제약 조건 즉 모든 부속 프로그램이 종료해야만 한다는 제약조건은 의존 형의 경우 상대적으로 훨씬 덜 심각한 제약조건이 되는 것이다.

이런 의존 형에 있어서의 β\beta 동등성 검사를 "변환 검사"("Conversion Check")라고 하며, 두 형이 β\beta 동등일 경우 이 두 형이 서로 "변환 가능하다"("Convertible")라고 한다. 이 변환 검사는 의존 형이론 구현에 있어서 가장 핵심인 기능 중 하나이며, 가장 잦은 버그를 부르는 기능 중 하나이기도 하다.

마치며

이 글에서는 같음과 같지 않음의 판정 문제에 대해 간략히 설명하고 프로그램의 같음을 판정하는 법에 대해서 단순화하여 다루어보았다. 구체적으로는 문법 기반의 비교와 β\beta 동등성을 통한 비교로 프로그램의 같음을 판정하는 법을 알아보았고, 이 중 β\beta 동등성이 적용되는 가장 중요한 예시인 의존 형이론을 β\beta 동등성을 중점으로 짤막하게 설명하였다. 마지막 문단에서 언급했듯 의존 형이론의 구현에 있어서 β\beta 동등성을 올바르게 구현하는 것은 가장 중요한 작업 중 하나이기에, 최근 연구들은 β\beta 동등성의 구현 자체를 의존 형이론 안에서 함으로서 검증된 β\beta 동등성의 구현을 하기 시작하고 있다. 이 글이 같음과 같지 않음과 판정 문제 그리고 β\beta 동등성에 있어 유용한 설명을 내놓았기를 바라며 이만 줄이도록 하겠다.


  1. 두 함수가 같다라고 보는 방법에 따라 다르나, 두 함수가 항상 같은 값을 가진다면 같다고 하자. 이때 함수의 판정 문제는 정지 문제(Halting Problem)와 동일하다. 임의의 튜링 기계(Turing Machine) ff가 입력 nn을 받았을 때 종료하면 g(n)=1g(n) = 1, 아니면 g(n)=0g(n) = 0이라고 하면 이 함수 gg와 상수 함수 c(n)=1c(n) = 1가 같은 함수임을 보이는 것은 ff가 항상 종료한다는 것을 보이는 것과 동등하다. ↩︎

Read more →
5
2
2

I built a latency meter with an Arduino and a photo transistor to answer one question: Is click-to-photon latency higher on Wayland than on X11?

And the answer is: Yes, actually.

⏱️ 42 ms on X11, compositing off
⏱️ 56 ms on X11, compositing on
⏱️ 64 ms on Wayland
⏱️ 71 ms on Windows 10

Tested with Plasma 6.3.4 and Firefox 137. I will improve my methods and confirm these numbers. See replies for details.

0
0
0

Exciting news for fans of typography!

"For decades, software like Adobe InDesign and LaTeX has evaluated multiple lines of text at a time as they decide where to end one line and begin the next. It’s just that the web didn’t use a multiline algorithm. Until now.

We are excited to bring this capability to the web for the first time, in Safari Technology Preview 216."

webkit.org/blog/16547/better-t by @jensimmons

0
0
0
0
0
0
0

이상하다 ...... 담당 프로그래머가 아직 제출하지 않은 내 요구사항 문서를 어제 저녁때 본거같은데 ...... 왜 아직 날 죽이러 오지 않지...? 무기 사러 간 걸까 ......

0

논비건 표기도 필요하지만 좀 저는 오래 전 연합우주의 당시 맞팔인 사람이 어떻게 도축을 하면 고기가 부드러워진다든가 동물 입장에서도 낫겠다하는 그런 글을 올린 걸 봐서... 트리거 눌려서 CW표기 좀 해달라고 했다가 거하게 조리돌림 당했답니다.

0

xan - 터미널용 CSV 마법사
------------------------------
- *터미널에서 대용량 CSV 파일을 빠르고 효율적으로 처리* 할 수 있는 Rust 기반 도구
- 다양한 데이터 조작 기능 외에도 *표시, 시각화, 분석, 웹 스크래핑, 텍스트 처리, 네트워크 분석* 까지 지원
- 내부적으로는 고성능을 위해 *멀티스레딩* , *표현식 언어* , *병렬 처리* 를 활용
- 초대형 CSV (기가…
------------------------------
https://news.hada.io/topic?id=20221&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

0
0