프로그래밍 갓 입문한 뉴빈데
코드를 짜면 컴파일이랑 링크를 하잖아
근데 왜 비주얼스튜디오엔 링크 버튼이 없어?
빌드 = 컴파일 + 링크
빌드버튼은 있는데 컴파일 따로 링크 따로는 못 해?
컴파일버튼도 찾으니 있는데
링크는 그냥 빌드 누르는 수 밖에 없음?ㅠ
프로그래밍 갓 입문한 뉴빈데
코드를 짜면 컴파일이랑 링크를 하잖아
근데 왜 비주얼스튜디오엔 링크 버튼이 없어?
빌드 = 컴파일 + 링크
빌드버튼은 있는데 컴파일 따로 링크 따로는 못 해?
컴파일버튼도 찾으니 있는데
링크는 그냥 빌드 누르는 수 밖에 없음?ㅠ
어셈은 어떻게 기계어로 바꿔?
분석하는 입장에서 차이를 말해주려고 꺼낸 이야기야.
어셈블러라고 부르는 어셈블리어용 컴파일러가 따로 있지.
mov ecx, 10; add eax, 1; loop;
어셈블리 코드는 이런식으로 되어 있는데, 이건 컴파일 하면 EAF0 03 FFEA AEDD3 01 FF3FF
헐 그걸 어떻게 알아??
뭐 이런형태의 기계어로 바뀌지. 사실 어셈블리와 기계어는 1:1 상응되기 때문에....치환(?) 정도로 보는게 어쩌면 맞을지도 몰라.
기계어는 PC 가 이해할수 있는 가장 저급한(저질이란 의미가 아님) 언어라는 말 들어 봤을거야.
사실은 'PC 가 이해할 수 있는 언어는 기계어 밖에 없다' 가 맞는 말이지.
PC 라는건, CPU 를 이야기 하는거야. Intel 이니, AMD 니 하는 것들(실제로 하드웨어 쪽에서는 수많은 CPU 모델들이 있음)
그럼 PC는 저 16진수를 또 2진수로 바꿔서 이해하는거야??
그리고 이 CPU 에는 애초에 아키텍터들이 만들때, 자기들끼리 정의를 해 놓았어.
CPU에 저런걸 이해하는 회로가 들어있어?
뒤에 두 수를 더해서 앞에 변수에 값을 할당하는 명령. (어셈에서 mov 키워드)
이것을 AAA0 이라고 하자.
그리고 빼는건.. AAA1 이라고 하자...
이런식으로 수천개 정도 되는 명령들을 정의해 놓았지. 이게 OP 태이블 이라고 해.
이건 intel 사이트에 들어가면. pdf 로 된 문서를 다운 받을 수 있어. 거기 보면 다 나와 있어.
참고로 intel 사이트에서 하드카피 해 달라고 신청하면, 무료로 책으로 제본을 떠서, 해외배송해 준다.(배송비도 무료)
이게 한 10년전 이야긴데, 지금도 서비스 해 주나 모르겠네..
CPU 가 저걸 어떻게 이해 하냐면..
와...그걸 보면 어셈블리를 기계어로 변환할 수 있겠네?
이건 하드웨어쪽도 좀 알아야 하는데.. 먹스(멀티플렉서였나?)니 뭐니 하면서...회로 구성하는 방식이 있어.
응응
전선이 3 가닥이 있어.
1번 2번 3번 선이라고 가정하자.
그리고 이 각 선은 어떤 박스를 통과해.
그리고 그 박스 반대편에는 선 2가닥이 있어.
A와 B 라고 하지.
이때, 2번과 3번 선에 전기신호를 흐르면..
반대편에 A 선에 전류가 들어와. B에는 안들어오고.
이것을,, 1번, 2번, 3번 선을..각각 변수라고 생각해봐.
난 두개의 입력을 넣었지? 2번과 3번에 전기신호 말이야.
그런데 반대편쪽에서는 A 선에 전류가 흘러 나왔어.
A선과 B 선을 2진수의 첫재자리와 둘째자리라고 생각해봐.
결과가 10 이 된거네?
이건 말하자면 일종의 add (더하기) 회로가 된거야.
이런식으로 실제 CPU 에는 수많은 다리(전선가닥)이 있고... 이 선들은 각각에 동시에 어떤 다리에 전기신호가 들어왔을때.
코세 왜 낙타로 활동?
어떤 다리들로 전기신호를 내보내줄지... 회로 설계가 다 되어 있어.
이것을 얼마나 정밀한 공정으로 많은 다리를 넣고, 같은 데이터를 처리하는데 다리수를 얼마나 적게 하고,, 발열이 덜 생기게 하고.. 속도는 얼마나 빠르게 반응 하고...
이런 것들이 CPU 만드는 제조사가 하는 일이지.
와...그럼 기계어들이 그 입력한 전류(?)가 되는거네??
그리고 그들은 다 만든 후에... 어떤 OP 코드들을 넣으면,, 어떤 동작을 한다라고... 아키텍트 문서를 만들어서 배포하는거고.
그거 다 배우려면 얼마정도 걸릴까??
그렇지.
뉴스데스크// 저 코세 아닌데요
저걸 배울 필요는 그닥 없지.. 어셈블리어까지만 알아도 충분해.
오.. 그건 CPU제조사에 들어가면 배울 수 있어? 아님 따로 배울수도 있어??
더 깊게 들어가면.. 어떻게 전기신호가 계속 유지되느냐....이런건 플리플럽이라는 회로구조를 사용하는데.......여기서 설명하긴 너무 길고..
아하
하드웨어 하는 사람들이나 아키텍트 연구하지 소프트웨어 하는 사람은 크게 알 필요 없는 영역이야. 굳이 보고 싶다면... 아까도 말했듯이 intel 이나 ADM 사이트에 들어가서 해당 CPU 문서를 보면 돼. 다 나와 있어.
내가볼땐 소프트웨어 하는 사람으로서 알아야 하는 영역은... 어셈까지인것 같아. 이게 곧 기계어니까.(사실 좀 다르긴 하다)
근데 그럼 형은 왜 알고있어??
아하 그렇구나 댓글이 렉때매 밀려서 자꾸 엉뚱한 타이밍에ㅠㅠ
더 깊이 들어가면... 플리플럽이니 뭐니 하는 애들은 and 와 or 소자를 가지고 회로구성을 하는건데..
이 and 와 or 는 또 어떻게 만드느냐..하면..규소를 가지고....................화학적인 내용이 들어간다;;;;;
난... 성격이 중간부터 하는 체질이 아니라서.... 끝까지 파고 들어가본 경우고.. 보통은 그냥 어셈까지만.
헐ㅋㅋㅋㅋ규소 반도체가 무슨얘긴가 했더니 이런데서 만나네
일단 프로그래밍과 관련된 지식중에서, 로우한 영역은 여기까지고..
이제는 위로 올라가 봐야지.. 지금 설명한것보다 더 많은 것이 존재한다....
C 언어를 기준으로 위쪽(고급화?)된 이야기는 무궁무진하고, 인터넷에 자료도 많으니 직접 찾아보면 돼.
C++ 이니 OOP니 하는 것들.
생각해보니 중간에 빠진게 있네.
컴파일러는 어떻게 컴파일을 하는가?
이건 나중에 관심 생기면 한번 봐봐. 컴파일러는 어떻게 만드는건지.
직접 만들어 봐도 좋고.
나도 만들 수 있어??
C언어 같이.. 자신만의 언어를 만들어 보라는 거지.
와
만들수 있지.. 단....엄청 심플한 언어를 기획해야 해. C 언어 간단해 보여도...이정도 스펙이면..혼자 절대 못 만들어 -_-;
데이터 타입은 int 만 존재하고, 4칙연산만 있고, 화면에 print 하는 함수만 있는 언어.
언어를 만드려면 뭘 알아야하는데? 어셈블리??
이정도가 가장 적당해.... 나머진 굳이 할 필요가 없어. 원리를 알고자 하는거지 실용적인 언어를 만드려는건 아니니까.
어셈블리도 최종적으로 알아야지..
어휘분석/구문분석/의미분석이라는 것들을 통해서..
트리형태로 뽑아내고, 이들을 각각 OP 코드로 변환해 주는 작업이 필요해.
이외에 메모리 할당도 신경써야 하고...좀 일이 많긴 하지.
사실 언어를 만들때 도와주는 프로그램들이 또 있긴 해. 렉서라든지..
시멘틱트리를 뽑아준다거나..아무튼 그런것들이 있어.
옛날에 지피지기면 백전백승이라고 했는데, OS 는 뭐고, 컴파일러는 어떻게 돌아가는지도 모르고, 그냥 무작정 남이 만든걸 쓰는건 좀 아니지.
어떻게 만들고, 내부적으로 어떤 일을 하는지는 이해한 다음에.. 내가 굳이 다시 만들 필요가 없으니까. 가져다 써야 한다고 난 생각해.
맞아 이왕 하는거 내 손으로 만들어보고싶어
만들 수 있단건 이해가 됐다는거니깐
개발자로 살면서 이런것들이 때론 도움이 되기도 해. 1% 미만이겠지만 ㅎ.
그러나..현실은.....이런걸 이해하고 개발하는 개발자들은 거의 없어. 적어도 내 주변엔....
사실....어떻게든 돌아가게.개발이나 해 주고 돈이나 받으면 그만이긴 하지.
죽기전에 Computer A to Z 책이나 써야겠다 ..
아무튼 오늘 심심해서 간만에 들어와봤네.
오.. 이런건 스스로 찾아보기 전엔 알 수 없는 지식이란 소리네
진짜 고마워ㅠㅠ형같은 사람을 만나다니 운이 좋았다
다른 시각에서 보면... 소프트웨어 개발자가 알 필요없는, 하드웨어 이야기란 소리기도 하지..
형은 구글에 쳐가면서 알았어??
학생때 관련과목 수강신청해서 듣기도 하고, 도서관에서 자료도 찾아보고.
아 도서관이 있었지.. 너무 편하게 살다보니 멍청이가 다 됐네
도서관은 대학교 도서관이 짱이지..
필요한 책 신청하면 다 사주고,,전공서적도 엄청 많고...
아무튼 난 이제 퇴근을 해야겠어.
집에 잘들어가!! 진짜 고마워
미친 백플수준
link.exe 콘솔로 하면 됨.
link.exe라는 파일이 있어??
VS 안에 있음. Visual Studio 도 화면은 GUI 로 구성되어 있지만, 빌드같은 작업들은 실제로 독립 프로세스가 처리하고, 결과만 화면에 출력해 주는 방식이야.
다시말해서 VS 안에 컴파일 버튼 누르면, 내부적으로는 xxxx.exe 등을 각각 따로 실행해. 그리고 그 과정에 출력들을 VS 화면에 그냥 뿌려주는거.
아하 그럼 컴파일 버튼 누르면 컴파일 실행파일이랑 링크 실행파일이 같이 실행돼??
컴파일하는 파일 이름이 compile.exe라고 하면 컴파일 버튼 누르면 copile.exe랑 link.exe랑 실행되는거??
ㅇㅇ 컴파일 완료된 후에, 정상적으로 끝났으면, 링크를 다음으로 실행하지. 각각 독립된 실행파일들이고.
본래 컴파일 한 뒤에, 링크 따로 하잖아. 그걸 그냥 자동으로 해 주는 것 뿐야
그냥 단순하게 프로그래밍 입문하려는건지, 아니면 컴파일 절차를 상세히 보고 싶은건지 모르겠지만,
와 많이배워간다ㅠㅠ고마워ㅠㅠ
후자쪽이라면, 조금 멘붕 오는 부분이 있을거야. 왜냐면... VS 에서 프로젝트를 빌드(컴파일+링크)하면,, 내부적으로 메타정보들을 exe 파일에 쑤셔넣어.. -_-;;
프로그래밍 입문하는중인데 궁금했어 책이랑 좀 다르길래.. 근데 같은거였구나
메타정보가 뭐야??
그래서 hello, world 만 출력하는 exe 만들어도,, 사이즈가 졸라 커지지.
파일의 사이즈가??
VS 에서 자기들 필요에 의해서..우리 입장에서 쓰잘대기 없는 정보들을 함께 exe 파일에 저장한다고 생각하면 돼
물론 빌드 옵션에서 이런것들을 제외시키거나 추가시킬 수 있긴 한데. 그래도 완벽하게는 제거가 안돼. 즉, 뭔가 정보가 좀 들어가긴 해.
gcc 나 dev-cpp 같은 다른 컴파일러에 비해서 VS 는 상당히 많은 메타데이터들이 exe 파일 안에 들어가지.
오 그럼 다른 컴파일러를 쓰면 같은 코드로도 더 적은 용량의 프로그램을 만들 수 있는거야??
프로그램 구조도 좀 거지같이(?) 바꾸는데,, 간단한 exe 하나 만들어서,, 트레킹해보면... 쓰잘데기 없는 코드들을 한참 실행한 뒤에, 실제 entry point 로 진입하게 되지.
그 용량이라는게... 큰 차이는 없어.
무슨 말인가면.. hello,world 가 gcc 에서 컴파일하면, 2Kb 라고 했을때, VS 에서 빌드하면 100Kb 정도 되는거지.
그럼 VS는 왜 쓰는거야?
이게 타 컴파일러에 비해서 50배나 용량이 늘어난다고 생각하면 안되고, 98Kb 정도 늘어난다고 봐야해.
다시 말해서 500Mb 결과물을 만드는데 98Kb(약 0.1Mb) 더 늘어난다고 해서 이건 큰 문제가 아니잖아?
아하..근데 프로그래밍 구조도 거지같이 바뀐다며
난 미시적인 관점에서 용량이 늘어난다고 설명한거고, 거시적으로 봤을때는 의미없는 주제이긴 해.
구조가 바뀐다는건... '서울' 에서 '부산' 을 가야하는데, 경부고속도로 타고 가는게 아니라..
일산에 잠깐 들렀다가, 광주에도 들렀다가, 다시 서울로 돌아가서.. 그제서야 부산으로 간다..
이런 의미야. 실행하기 전에 잡다하게 하는 작업들이 좀 있어. 이것들도 미시적인 관점에서 이야기 하는거고. 거시적인 관점에서는 큰 차이가 없긴 해.
프로그램을 실행하기 전에 준비하는 과정들이 좀 많다고 생각하면 돼.
그럼 더 정교한 프로그램??을 만드는 사람들은 다른 컴파일러를 쓰는거야??
더 정교한 프로그램이라고 하긴 무리가 있지. 정교하다고 표현하는것도 좀 웃기고..
다른 잡스런 작업없이. 개발자가 의도한대로 정확히 돌아가야 하는 커널같은 경우는..
그럼 좀 더 빠른 프로그램??
아하
부트로더는 보통 어셈으로 구현하고(NASM 이라든지), 위에 커널은 C++ 로 개발하지.
뭐 VS 도 옵션을 잘 건드리면 웬만큼 tiny 하게 나오지 않을까 싶네.
아무튼 기본 설정으로는..상당히 많은 잡스런게 들어간다는 거야. 이건 개발자 입장에서 말하는건 아니고.