c는 메모리 관리를 직접 하고, 파이썬 자바는 그런것들을 인터프리터, jvm이 대신 해주는데
프로그램의 목적에따라 각자의 특성이 장점이 되기도 하고 단점이 되기도 함
런타임에 메모리 언제 회수할지 프로그래머가 결정할 수 있다는 c의 특징은 딱 필요한 만큼의 스펙만 갖춘 하드웨어 제어용 mcu를 다룰 땐 장점이 될 수 있지
그걸 인터프리터나 jvm이 대신하는 경우 개발자가 편하고
, gc 돌릴 시점을 판단하는 등의 행위도 모두 오버헤드지만 대체로 오버스펙인 pc에선 성능에 미치는 영향도 negligible하니 전혀 단점이 되지 않는 거고
비단 메모리 뿐만 아니라...
일반적으로 c로 프로그래밍을 하면 cpu가 하는 동작 하나하나를 투명하게 알 수 있잖아. 누군가 내가 모르는 사이 대신 해주는 것이 없는거지.
컴파일 하면 바이너리, 어셈을 통해 cpu가 무슨 동작을 하는지 100% 알 수 있고, 숙련된 c 프로그래머라면 대충 내가 작성한 프로그램이 머신레벨에서 어떻게 동작할지 감안하며 코드를 작성할 수 있다.
c도 하이레벨이긴 하지만 소위 "더 하이레벨" 이라고 불리우는 추상화된 언어일수록 이런 부분이 굉장히 불투명하다. 인간은 뭘 할지만 알려주고, 어떻게 할지는 가상머신이나 인터프리터가 결정하는 거지.
"무엇을 할지" 가 더 중요하고 어떻게할지는 크게 중요하지 않으면 추상화 레벨이 높을수록 장점이고
"어떻게 할지" 가 중요하면 추상화 단계가 낮을수록 장점이다
이건 맞는 말인데 비추가 달렸네...
무수한 비추의 요청
근데 이런 말 나올 때마다 의문이 드는게, 진짜 현업에서 C로 개발하는 사람들이 자기가 짠 코드로인해 cpu가 무슨 동작을 하는지 100%다 알고 다 신경쓰고 감안하면서 코딩할까?
C언어를 이용했을 때 그러한 장점을 얻을 수 있다는건 동의하지만, 실제 개발자가 그렇게 개발할 것 같진 않은데
어셈으로 작성하라면 100% 하진 못하지만 대충 어떤 스텝을 밟을지는 알지
로우레밸 땔감들은 어떤지 모르겠는데, 왠만큼 슉련도 있으면 그정도는 머리속에 그리면서 함
Cpu 존나 복잡해져서 대충 컴프일러가 맞춰주는거로 하는거지
ㅇㅇ 그 패턴을 대체로 알고있음
맞는 말이 아니니 비추가 달리는거지 수동으로 가비지컬렉션을 칼같이 하는 놈도 못봤고 이미 주기적으로 비워줘야 하는 수준의 코드면 설계 디자인패턴 자체가 잘못된거지 c는 그리고 로우레벨이고 자꾸 c 가지고 헛소리 하는거면 애초에 레지스터영역에서 노는 에셈블리를 해야지 필요 없는 수준에서 까지의 완전 무결한 디테일을 찾으면서 c를 예를 드는게 웃긴데 그냥 니가 c 밖에 안해본게 아님?
어셈으로 너무 하기 힘드니까 c로 하는거고;; 메모리 회수 시점은 완전무결한게 아니라 런타임 환경에 따라 최적 지점이 달라질수 있는거고
머신 레벨에서 제어는 어셈이 근본이지군더더기 하나도 없이 하려면 c 컴파일러가 배정해주는 영역 자체도 비효율적이라고 느껴져야 하는거 아님? 전부다 수동으로 제어해야지
그건 나보다 컴파일러 만든 사람들이 더 똑똑하니 그냥 맡긴다. 아무리 어셈으로 직접 개지랄 해봐도 컴파일러가 만드는 코드보다 최적일순 없더라
어셈으로 하면 일단 만들기가 너무 힘들어서 그정도를 타협의 마지노선으로 잡음.. 그리고 드물지만 실제로 어셈 튜닝해서 쓰기도 함
어 가비지컬렉션도 왠만한 애들이 하는거보다 잘되있음
가 가비지 컬렉터 타이밍봐서 돌리는거 자체가 다 리소스 쓰는거잨ㅎ아
리소스 걱정하는거면 어셈을 해야지 왜 컴파일러에 의존함? 그 자체도 리소스인데
컴파일러가 리소스라고?
니가 짠 코드를 컴파일러에서 에뮬레이팅 해준 기계어가 필요치 않은 부분까지 포함이 되어 있는지 확인도 못하는 수준아님?
컴파일러가 왜 에뮬레이팅을 함:
기계어로 예뮬레이팅 해주는거지 먼 헛소리야
컴파일러 하는 기능 모름?
넌 c언어로 짜서 돌릴때 뭐로 변환되는지 모르고 하는소리임?
누가 그걸 에뮬레이팅이라고 하냐 캄파일이라고 하지;
뱐횐되는간 바이너리지, cpu인스트럭션 집합이고
일종의 기계어로 에뮬레이팅 하는 과정을 컴파일링이라고 하는거지
실제 인스트럭션으로 만들어쥬는데 거기에 에뮬레이팅이란 표햔을 쓰는간 참 생소하네
하 생소한건 니가 못들어 본건 아닐까?
응 못들아봤으니 생소한거 맞지. 컴퍼일이란 단어 두고 그걸 왜 에뮬레이팅이라고 함
응 니가 모르는거지 저수준 언어 c 에서 어셈으로 에뮬레이팅 되는거고 최종적으로 어셈에서 바이너리로 컴파일링되는 일련의 과정이지
이제 알았을듯 ㅋ
응 gc가 돌아가는거지 메모리영역 직접 반환 아니야
아 다른댓글에 달아여하는데 잘못달았네. 왜 댓글을 2쓰레드로 만들어 놓음 귀찮게
애초에 이딴 똥글싸재끼면서 메모리 반환 걸고 넘어지는 니가 더 병신이고 gc는 개발자 의사대로 수동 호출도 되는거고 실제로 c언어 강점 말하고 싶은거면 레지스터변수로 직접 제어하는 분야의 예를 들어야지 좆병신 깜냥도 안되는 새끼가 헛소리 하고 있누 ㅋ
메모리 수준에서 깔짝댈거면 뭐하러 c 잡고 있냐 그건 걍 니가 어디다 써야하는지 자체를 모르는거지
그리고 에뮬레이팅은 링커가해
응 링커 돌리고 컴파일 해야해
메모리 말고 다른것둘도 있다고 말허고싶었는데 갑자기 그쪽으로 가면 말돌린다고 발작할까봐ㅋㅋㅋ 니가 계속 메모리 얘기 하길래 맞춰서 응해준건데
어 니가 먼저 본문에 메모리 소리 했는데 ㅋ
메모리만 있다고 안함 예로 메모리 든거지
어 그래서 내가 앞으로 똥글싸재낄꺼면 레지스터변수라도 알고 싸재끼라고 한거야 다음버전에선 좀더 수준 높은 떡밥좀 말아와라 메모리 수준에서 C 강점 얘기하지말고 ㅋㅋ
학부 2학년만돼도 다 배우는 레지스터를 누가 모르냐
너가 모르는거 같은데 저레벨 언어 강점 얘기하면서 예를 메모리로 시작하는 병신이면 그럴만 한데?
c 허이레벨이라고 ㅋㅋ c가 기계어냐? printf가 추상화된 함수가 아니라고 생각함? 어셈은 바이너리에 1:1대응되니까 로우레벨인거지.
어 지금 수준에선 저레벨 맞음
필요 없는 군더더기를 그렇게 싫어하면 디씨도 웹브라우저 끄고 피들러로 api 호출해서 플레인텍스트느 제이슨 데이터 분석하면서 코멘트 달아야지 되도안는 새끼가 원칙주의자 행세 하고있는게 존나 웃긴거
균더더기 문제가아닌데? 넌 완전히 글을 잘못이해한듯
pc성능이 좋은데 뭐하러 그렇게 함? 대충 pc에 맡기면 되지 어차피 빠른데
가비지컬렉터나 메모리어로케이션 처럼 자동으로 맞춰주는 부분을 수동으로 제어하고 컨트롤 할수있고 그게 c다 라고 말하는거잖아 그건 어셈이고 c 자체도 덤프 올릴때 컴파일러에 의존하는데 그것 자체도 수동으로 컨트롤 해줘야지 완벽한거지 어차피 완벽 추구가 아니고 너도 타협했으면서 헛소리 하는게 웃긴거
? 그래서 내가 본문에다 웹도 c로 해여한다고 씀? 성능이 충분하면 추상화가 장점이라고 써놨는데 대체 뭐읽음?
아니 난 그걸로 까는게 아닌데 기준을 c 로 잡은게 존나 웃긴거라는말인데?
c로도 투명하게 제어가 가능한데 뭐하러 어셈쓰냐. 파이썬 인터프리터는 타입까지 지가 알아서 결정하는데 그런 걸 말하는거지. 내가 안시키는 행동 하는거.
투명은 개뿔 컴파일된 코드 들여다 보지도 않은 수준인데
컴파일러기 만들어넨 어셈 보면 투명하지. 그게 곧 cpu인스트럭션인데
그럼 애초에 어셈으로 짜야지 컴파일러가 대신해 주는걸 어떻게 믿냐?
하 뭔 이야기를 자꾸 엉뚱한데로 끌고가냐.c에서 동적할당된 메모리 회수 안하면 프로그램 끝날때까지 회수 안되잖아. 왜? 내가 안시켰으니까. 그란걸 말하는거지
그니까 가비지컬렉션 해주는게 그런 "실수" 를 자동으로 잡아주는건데 애초에 가비지컬렉션이 자주 발생할 정도면 그걸 짠놈이 잘못이지 뭔 도구적 차이를 말하고 있어
언제 또 자주발생하는게 문제고 뭐 실수 이런얘기를 했냐 내가. 그 의사결정권이 캄파일타임에 프로그래머에게 있느냐, 런타임에 도구에 있는냐를 얘기하는데;
팩트) 인간이 짜는 어셈블리 코드는 컴파일러보다 못하거나 동등하게 나온다
화장실 가서 소변보면 자동으로 물내려 가는데 그거 가지고 의사결정권이 없다는 소리 하는거나 마찬가지임 언제나 내맘대로 물을 내려야 한다는 말이고
심지어 gc는 다른언어서도 수동호출 해줄수 있는 부분인데 뭔 의사결정권이야
메모리가 똥임?
이미 연산 끝나고 반환되지 않은 메모리는 똥이지
gc는 그럼 필요없는 변수 생기면 jit로 gc매번 돌아감?
gc 정책마다 다른거지 이미 호출한 부모 클래스나 생명주기에 따라서 필요없는 부분이 생기면 임계점 체크해서 돌리는수준이지
gc 도 모르면서 뭔 의사결정권 얘기하고 있음 ㅋㅋ
gc 염려해가면서 짤정도로 누수될정도면 그 실력으로 c 짜면 더 많은 누수가 쏟아지겠지 넌 그게 눈으로 보이니까 와~ 역시 이렇게 알려주네 이런거까지 신경쓰게 만드는 언어 정말 감탄스럽다 이러고 있는거고 ㅋㅋ
알고있으니 던진 말이지 ㅋㅋ gc는 똥떵어리도 쌓아놓고 한꺼번에 치우잖으
어 수동으로도 호출할수 있어 걱정마
아직도 이러고 있네 ㅎㅎ 근데 이건 211.36 말이 맞아. 실시간 성능이 요구되는 분야나 경우에 따라선 고사양 게임 같은 경우 gc가 deterministic 하지 않다는 건 용납이 안되는 문제일 수 있어.
아니 그정도 누수 되는 문제는 직접 gc 호출해서 비워주면 되는 문제고 애초에 누수가 될정도로 잘못된 생명주기로 짜는거면 그 실력으로 c를 짜도 똑같은거임 단지 c는 자동으로 똥치워주지 않으니 금방 뻣으니 원임이 금방 들어나는 거겠고
그정도로 실시간으로 접근해야 하는 정도면 c로 안짜고 어셈으로 컨트롤 하는것도 맞고
그런 경우 누수가 문제가 아니라 오버헤드가 문제다. 매니지드 언어 쓰면서 그게 오버헤드 안걸릴 만큼 안쌓이게 일일이 컨트롤 하려면 애초에 쓸 이유도 없지만, 보통 매니지드 언어에서 gc 호출을 하는 건 "할 수 있을 때 실행해라"는 의미지 지금 바로 하라는 의미가 아니야. 못 믿겠으면 자바 API 같은 거라도 찾아보고.
인터넷도 css 따위 다 오버헤드인데 피들러 같은거로 api 만 호출해서 읽어야하지 않겠냐? 인생에서 1분 1초가 얼마나 금쪽같은데 이런 오버헤드를 감내 하고있냐
negligible하다고 그건
그걸 이해하려면 허용 가능한 오버헤드란 개념을 이해해야하는데, 예를들어 웹 브라우저의 경우 그림 표시하는데 0.1초 걸릴 게 0.2초가 된다고 누가 크게 뭐라 그러지 않아. 그런데 예컨대 게임의 메인 루프에서 0.1초 오버헤드 발생하면 그건 엄청난거다.
너는 인생에서도 0.1초 엄청 중요시 안함?
0.1초가 아니라 1ms 정도 차이때문에 쓰는 c인데 메모리 어쩌고 얘기하고 있으면 존나 웃긴거 아니냐? 메모리에 집어넣는 속도 따위도 중요한데 뭔 시발 가비지컬렉션 오버헤드를 논하고 잇어 애초에 메모리에 집어 쳐넣으면 안될 정도지
그럼 메모리에서 로드하지 말고 매번 같은 값 계산해서 쓸까?
난 저수준 안하는 사람이지만, 내가 맞는 말이라고 생각한 건 "C를 쓸 수 있는 분야"가 아니라 "써야만 하는 분야"에 대한 경우거든. 물론 C를 써야만 하는 경우가 그거 하나만은 아닌데, 특히 매니지드 언어를 못쓰는 경우는 저런 경우가 많은 건 사실이지. 그러니까 GC 돌리는 정도에도 임팩트가 민감하고 그게 deterministic 하지 않은 게 문제되는 환경. 그런데는 C 쓸 수 밖에 없고, 그건 본문 이야기대로 좋고 나쁜 문제 보단 분야가 다른 문제니까.