Go 언어의 장점과 단점

마지막 업데이트: 2022년 3월 22일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기

바이너리 코드의 차이점 분석은 보안 패치와 같은 매우 유사한 두 프로그램 사이의 차이점을 구별해 주는 방법이다. 이전의 연구에서는 분석을 위하여 Go 언어의 장점과 단점 프로그램의 구조 또는 명령어의 세부 사항만을 각각 이용하였다. 프로그램의 구조를 이용하는 차이점 분석 방법은 제어 흐름의 변화는 잘 탐지해 낼 수 있지만, 버퍼 크기 변화와 같은 상수 값의 변화는 잘 찾아낼 수 없다. 명령어 기반의 차이점 분석 방법은 세부적인 값의 변화는 발견할 수 있으나 Go 언어의 장점과 단점 Go 언어의 장점과 단점 명령어 재배치와 같은 컴파일러에 의해 생성되는 불필요한 차이점을 결과로 낸다는 단점이 있다. 이 연구에서는 프로그램 구조를 이용한 비교 분석 방법에 상수 값의 변화를 함께 추적할 수 있는 방법을 제안하고 바이너리 차이점 분석 도구를 구현하였다. 구현된 도구는 윈도 보안 업데이트를 이용하여 평가하였다. 실험 결과 제안된 방법은 구조적인 차이점 분석과 같이 빠른 속도로 구조적인 변화를 찾아낼 뿐 아니라 상수 값의 변화까지 추적할 수 있다는 것을 보였다.

Binary diffing is a method to find differences in similar binary executables such as two different versions of security patches. Previous diffing methods using flow information can detect control flow changes, but they cannot track constant value changes. Diffing methods using assembly instructions can detect constant value changes, but they give false positives which are due to compiling methods such as instruction reordering. We present a binary diffing method and its implementation named SCV which utilizes both structure and value information. SCV summarizes structure and constant value information from disassembled code, and matches the summaries to find differences. By analyzing a Microsoft Windows security patches, we showed that SCV found necessary differences caused by constant value changes which the state-of-the-art binary diffing tool BinDiff failed to find.

Go 언어의 장점과 단점

본 글은 특정 언어를 지지하거나 GO를 폄하할 의도로 작성한 글이 아닙니다. 웹 상의 의견과 제가 Go를 사용하면서 느낀점을 첨언하였습니다. GO언어를 선택할까 고민하는, 궁금한 분들에게 도움이 되기를 바랍니다.

  • 09년 구글의 로버트 그리즈머, 홉 파이크, 켄 톰슨이 개발하였습니다.
  • 고루틴이 있습니다.
    • 멀티쓰레드 메커니즘이지만 자체적인 스케줄러에 의해 관리되는 경량 쓰레드이며, OS 에서 관리하는 경량 쓰레드보다 더 경량입니다.
    • 일급객체로 정수와 실수와 같은 데이터 타입과 동급으로 취급
    • channel을 통해 동시성을 지원합니다.
    • 함수형 언어라고 하기에는 함수의 순수성(Purity), 불변성(Immutability)을 보장하지 않습니다.

    GO 언어 장점

    • 매우 간단한 문법으로 배우기 쉬습니다.
      • loop 문법으로 while이 없고 오직 for만 있습니다.
      • class 문법이 없습니다.
      • 컴파일 속도가 빨라서 인터프리터 언어처럼 쓸 수 있습니다.
      • 여러분이 Go로 알고리즘 문제를 해결한다면 다른 언어와 비교할 수 없는 빠른 속도로 해결할 수 있습니다.
      • 고루틴은 쓰레드보다 매우 가볍고 쉽게 이용이 가능합니다.
      • 자체 제공하는 패키지들이 강력해서 별도의 웹 프레임워크를 사용하지 않아도 웹을 개발할 수 있습니다. 파이썬으로 순수 웹 개발이 힘들기에 장고, 플라스크 프레임워크를 사용하는 것에 대조됩니다.
      • 구글이 만들었고 YouTube 개발에 사용하는 언어입니다. 해외에는 우버, 넷플릭스, BBC 가 사용하고 있으며 도커 또한 Go로 개발하였습니다. 국내는 카카오엔터프라이즈, 당근마켓, 왓차, 버즈빌 등 대기업, 스타트업이 사용하는 언어입니다.
      • 컨벤션에 맞추어 코드를 수정해주는 go fmt 기능이 있다.
      • VS Code에서 저장을 누르는 순간 formatter가 포멧을 바로 맞추어줍니다.
      • Go는 대표적인 채널 기반 언어입니다. 스레드라는 것을 명시적으로 주지 않고 고루틴을 생성하면 알아서 스레드를 생성해주고 적절한 스레드에 고루틴을 할당합니다. goroutine 사이의 커뮤니케이션을 전부 채널을 통해서 한다면 동기화 문제를 신경 쓰지 않아도 된됩니.
      • 결과를 배포하는 입장에서 네이티브 바이너리가 나온다는 것은 매우 큰 장점입니다. 요즘은 대부분 서버에 파이썬이나 JVM이 설치되어 있지만, 역시 배포는 네이티브 바이너리로 하는 것이 가장 편합니다.
      • 그러나 바이트 코드를 생성하는 언어가 아니므로 바이너리만 배포하는 경우 (C와 C++처럼) 타겟 머신에 맞추어 각각 컴파일을 해야해야합니다.
      • Go에서 폴리모픽한 코드를 작성하는 유일한 방법은 인터페이스를 인자로 넘기는 것입니다. 이 덕분에 인터페이스 단위의 추상화가 자연스럽게 이루어집니다.

      GO언어 단점

      • 없는게 산더미입니다.
        • 제네릭 문법 없음. 클래스 문법 없음(OOP 안녕~), 예외 처리 문법 없음, Public, Private 키워드 없음, this 문법 없음
        • 메서드를 만들 수 있으며 인터페이스를 이용해서 다형성을 구현할 수 있습니다. Composition으로 상속을 대신할 수 있습니다.
        • 덱과 같은 자료형이 제공되지 않습니다. (알고리즘 풀때 눈물. )
        • 예외 처리 문법이 없기에 if 문이 상당히 많이 사용됩니다. 읽기 힘든 지저분한 코드가 생깁니다.
        • C는 DEV C++, Visual Studio 등등, Java의 이클립스가 있지만 Go는 VS Code, Goland 말고 별다른 선택지가 없습니다.
        • Go는 템플릿도 매크로도 없습니다. 이는 Go의 코드를 단순하게 만들어주는 장점도 있지만, 하지만 템플릿도 매크로도 없어서 단순한 코드가 반복해서 등장합니다.
        • Go에서는 깃헙 등의 원격 저장소에 올라온 패키지를 go get 명령어로 다운로드 및 설치해서 사용합니다.
        • GORM 등 있지만 뭔가 아쉽습니다. 자바 진형의 강력한 JPA가 그립습니다.
        • 파이썬의 Django, Flask와 같이 지배적인 라이브러리가 있는 것이 아니라 고만고만한 Echo, Gin, Beego 프레임워크가 있습니다.
        • 코드를 작성하면 formatter가 코드를 수정하는데 단순히 공백이 추가된 것을 git에서 수정된 라인으로 잡을 때가 있습니다. 커밋의 호읍이 길다면 실제 수정된 로직을 파악하기는 힘들어집니다.
        • 자바 진형이 대세인 우리나라에서는 타 언어에 비해서 인럭풀이 많지 않습니다.
        • 하지만 Go의 빠른성능, 빅쿼리 등등의 이유로 도입하는 회사가 있습니다.

        'Web' 카테고리의 다른 글

        REST란? REST API 디자인 가이드 (18) 2021.05.09
        org.apache.coyote.http11.Go 언어의 장점과 단점 HeadersTooLargeException 에러 해결 (2) 2021.03.19
        Go 언어의 장점과 단점 (15) 2020.09.18
        GO 언어로 JWT 인증서버 만들기 (32) 2020.09.17

        - public, private -> 앞글자 대문자 소문자로 노출여부 결정가능
        - IDE는 저정도면 충분한 것 같습니다.
        - 요즘엔 go get 보단 go module을 사용하죠 엄청 편합니다.

        - 코드량이 길어지면 접근제어자 없이 대소문자로 제어하는걸 보면 헷갈리죠 ㅎㅎ 접근 제어자가 있었다면 하나만 바꾸어주면 되지만 대소문자를 변경해야해서 수정할 범위도 늘어나고고요!
        - 비싸서 Go land를 사용해보지는 않았고 VS Code을 사용했고요 gin과 같은 웹 프레임웤 디버깅, 테스트의 편의성은 확 떨어지죠.
        - go mod를 저도 씁니다! 말씀하신 것처럼 url만 있으면 큰 문제는 없고요! spring boot처럼 Go 언어의 장점과 단점 호환성 있는 버전을 맞추어주지는 않는게 아쉽죠 ㅎㅎ

        저도 한때 go를 썼어서 주저리주저리 남겨보았습니다 :) 읽어주셔서 감사합니다!

        좋은 글 잘 읽었습니다! OOP가 없지는 않고 golang 만의 방식으로 지원을 해주지요~

        Java와 같은 OOP 언어와 다른 Go방식이 웹 개발할때 코드 중복을 줄여주는데 한계가 있더라고요,, 한참 API스팩 변경되어서 중복코드와 싸우다가 잠깐 썼던 기억이 있네요!

        GO의 SOLID에 'SOLID in Go in 8 minutes (5m Friday #5)' https://youtu.be/AKdvlr-RzEA 짧은 영상인데 재밋네요!

        Private, Public 키워드는 없어도 대소문자로 자동으로 처리 됩니다
        예외 처리 됩니다.
        전처리 됩니다.
        코드 깔끔하게 됩니다.(개발자 역량)
        그리고 작성자 님은 GO로 된 오픈소스를 얼마나 보셨는지 모르겠지만
        GO 오픈소스를 보면 코드의 간결함과 잛은 코드로 많은 것들을 할 수 있다는 걸 알게 될 것입니다.

        오픈소스를 많이 보시고 참고 하시기 바랍니다.

        언급하신 항목에 대해 알고있습니다. go 기본문법이죠.
        길진 않지만 go 스택으로 일하였습니다.

        글의 장단점 항목은 https://github.com/ksimka/go-is-not-good를 참고하였으며 제가 직접 개발하면서 공감하는 장단점으로 구성하였습니다.
        - 접근지시자가 없지만 말씀하신대로 외부 접근 여부를 대소문자로 지정할 수 있습니다. 그러나 대소문자로 접근지시를 설정하기에 변수 convention을 Go 언어의 장점과 단점 Go 언어의 장점과 단점 언어적 특성으로 유지하기 힘듭니다. 이는 code generater(특히 object mapper)를 사용하면 더욱 문제가 발생합니다. go에 대해서 배경지식이 있을것이라 생각하기에 이유는 아실것이라 생각합니다.
        - 예외 처리하지않으면 panic이 발생합니다. 예외처리 위임 로직에서 조건 if와 exception 로직이 혼재되어 관심사 분리가 안됩니다. Java처럼 exception 타입이 아니기에 네이밍 충돌을 막고자 err, err1 변수명도 보았습니다.
        - 전처리는 본문에 없는데 어떤 말씀이신지 질문드립니다.
        - go뿐만 아니라 모든 언어가 개발 역량에 따라서 간결해질 수 있겠습니다.

        오픈소스 go 프로젝트 도입 검토 및 연동작업 또한 하였으며
        https://github.com/brave-people/Awesome-Dev-Contents/blob/master/3.%EB%B2%A1%EC%97%94%EB%93%9C/go.md#gin-go
        제가 Go 기반 오픈소스에서 (web 기반) 참조할만한 프로젝트 모아둔 저장소입니다.

        Go 프로젝트인 github CIL 뿐만 아니라 인프라 클라우드 분야 오픈소스로 보았을때는 분명한 장점이 있다고 생각합니다. 또한 go 루틴을 십분 활용할 수 있는 게임 프론트 서버, 채팅서버 등등 Go를 잘 활용할 수 있는 분야는 다양하다고 생각합니다.

        제가 래퍼런스로한 글을 보시면 아시겠지만 서로가 단점이라고 생각하는 항목은 다릅니다.
        저 또한 본문의 글을 절대적 기준으로 작성한 것 아니며 Go 밥벌이 개발자 초년시절 기준으로 작성한 것이기에 느끼는점은 다르다고 생각합니다.

        글의 논지도 제대로 파악 못하는 분이 언어 자격지심에 치닫아서 오픈소스 많이 보면서 참고나 해라 이러는거 보면 헛웃음만 나오네요.
        개발 영역에서 된다 이러면 끝입니까; 고려해야 할 것들은 전부 제쳐두고, 이거 다 되는데요? 고 언어 짱인데; 저보다 오픈소스 코드 덜 뜯어보셨나? 이런 뉘앙스로 지금까지 개발자 하신거면 주변 사람들 겁나 힘들거라 확신합니다.
        소통능력부터 키우고 태클거세요. 보아하니 코드도 잘 못 짜실 것 같긴 한데..

        제가 3년간 서비스 개발 운영하면서 느낀것 그대로네요..
        최근에 다시 자바로 프로젝트중인데
        자바로 하는 OOP 너무 편합니다 ㅎㅎ
        각각의 장단점이 있는거 같습니다

        라이브러리

        라이브러리(library)란 다른 프로그램에 링크되어 특정한 기능을 수행하도록 작성된 하나의 프로그램 코드 파일이다. 모듈(module) 또는 컴포넌트(component)보다 기능이 단순하고, 파일 사이즈가 작다.

        개요 [ 편집 ]

        소스코드를 작성하다보면 자주 사용되는 로직이 있다. 그럼 이 로직을 재사용할 수 있다면 좀 더 효율적인 개발이 가능한데, 재사용이 가능하도록 만든 로직을 라이브러리(library)라고 생각하면 된다. 라이브러리는 자기 자신이 사용하기위해 직접 만들 수 있고, 불특정 다수가 사용할 수 있도록 공개할 수 있다. 라이브러리를 사용하면 필요한 로직을 직접 구현할 필요가 없기 때문에 개발기간을 단축할 수 있을 뿐더러 라이브러리에서 제공하는 API를 호출하는 것을 통해 원하는 기능을 사용할 수 있게된다. [1]

        목적 [ 편집 ]

        라이브러리(library)는 소스코드 재사용을 위해 조직화된 초기 방법 중의 하나이며 많은 다른 프로그램들에서 사용할 수 있도록 운영체계나 소프트웨어 개발 환경 제공자들에 의해 제공되는 경우가 많다. 라이브러리는 사용자의 프로그램과 링크되어 실행이 가능한 완전한 프로그램을 이룬다. 또한 라이브러리 내에 있는 루틴들은 범용적으로 사용 가능하며, 3차원 애니메이션 그래픽과 같은 특별한 용도의 함수로도 설계될 수 있다. [2]

        구분 [ 편집 ]

        정적 라이브러리(static library) [ 편집 ]

        정적 라이브러리(static library)는 프로그램 빌드시에 라이브러리가 제공하는 코드를 실행 파일에 넣는 방식의 라이브러리이다. 컴파일의 링킹 단계에서 실행파일에 결합되는데, 라이브러리(.lib파일)를 실행 바이너리에 포함시킨다는 의미이다. 즉, 라이브러리의 동작 코드가 이를 사용하는 실행 바이너리 속에 포함되기 때문에 별도의 추가 작업없이 독립적으로 라이브러리 함수들을 사용할 수 있다. 정적 라이브러리를 사용하게 되면 컴파일시 링커가 프로그램이 필요한 부분을 라이브러리에서 찾아 실행파일에 바로 복사한다. 실행파일에 모두 포함되기 때문에 실행시에 라이브러리가 필요없다. [3]

        장단점 [ 편집 ]

        정적 라이브러리는 첫째, 동적 라이브러리에 비해 속도가 빠르다. 런타임시에 외부를 참조할 필요가 없기 때문에 속도가 향상되어 성능도 좋아진다. 두번째, 라이브러리 생성이 간단하여 복잡하지않다. 세번째, 필요한 라이브러리를 프로그램 내에 적재하기 때문에 이식성이 좋다. 컴파일시 해당 정적 라이브러리의 내용이 실행 바이너리 안에 포함되어있기 때문에 함께 배포하지 않아도된다. [3] 네번째, 완성된 애플리케이션을 안정적으로 사용할 수 있다. 또한 시스템 환경이 변하더라도 애플리케이션에는 어떠한 영향도 미치지않는다. [4]

        정적 라이브러리의 단점으로는 첫째, 메모리가 낭비될 수 있다. 같은 코드를 가진 여러 프로그램을 실행할 경우에 소스코드가 중복되기 때문에 그만큼의 하드디스크 공간도 차지하고, 메모리도 더 많이 차지하게 되어 메모리를 낭비하게 된다. [4] 두번째, 라이브러리에 변경사항이 생길 경우, 변경된 라이브러리의 내용만 재배포가 되지않는다. 즉, 변경된 내용의 라이브러리가 적용된 프로그램을 다시 재배포해야한다. [3]

        동적 라이브러리(dynamic library) [ 편집 ]

        동적 라이브러리(dynamic library)는 소프트웨어의 일종으로, 동적 링크를 사용한 라이브러리이다. 여러 프로그램이 공통적으로 필요로 하는 기능들을 프로그램과 분리하여 필요할 때에만 불러내어 쓸 수 있게 만들어 놓은 라이브러리를 의미한다. 마이크로소프트 윈도우에서는 동적 링크 라이브러리라고 해서 확장자가 DLL인 파일로 제공되고 있으며, 리눅스에선 /lib 밑의 .so 파일 등으로 구현된다. 개인이 자유 소프트웨어 등을 작성할 때에 만들기 쉽게 하기위해 작성하여 무료로 제공되는 것도 있다. [5]

        장단점 [ 편집 ]

        동적 라이브러리는 첫째, 메모리를 절약할 수 있으며, 스와핑을 줄여준다. 여러 Go 언어의 장점과 단점 프로세스가 메모리에 있는 하나의 DLL 복사본을 공유하여 하나의 DLL을 동시에 사용할 수 있다. 두번째, 디스크 공간도 절약할 수 있다. 여러 응용 프로그램이 디스크에 있는 하나의 DLL 복사본을 공유할 수 있다. 세번째, DLL을 쉽게 업그레이드할 수 있다. DLL의 함수가 변경되어도 함수의 인수 및 반환 Go 언어의 장점과 단점 값이 변경되지않았다면 그 함수를 사용하는 응용 프로그램은 다시 컴파일하거나 링크를 할 필요가 업다. 네번째, 출시 후에 지원이 가능하다. 예를들면, 응용 프로그램을 출시할 때 사용할 수 없었던 디스플레이 기능을 지원하도록 디스플레이 드라이버 DLL을 수정할 수 있다. 다섯번째, 언어 형식이 다른 여러 프로그램을 지원한다. 서로 다른 프로그래밍 언어로 작성된 프로그램인 경우에도 함수의 호출 규칙을 따르기만 한다면 여러 프로그램에서 동일한 DLL 함수를 호출할 수 있다. 이 경우 각 프로그램과 DLL 함수는 여러 부분에서 호환될 수 있어야 한다. [2]

        동적 라이브러리의 단점으로는 첫째, 외부 의존도가 발생하기 때문에 이식성이 어렵다. 둘째, 성능저하로 인해 속도가 느려질수있다. 동적 라이브러리는 정적 라이브러리에 비해 사용이 복잡하기 때문에 공유 라이브러리를 메모리에 올리려면 해당 라이브러리를 찾고 올리는데까지 시간이 걸린다. 이로인해 성능저하가 발생하게 되며 속도가 현저히 느려진다. [2] 세번째, 실행파일을 배포할 경우 라이브러리를 함께 배포해야한다. 컴파일시 해당 동적 라이브러리의 내용이 실행 파일안에 포함되어 있지않거나 메이저 버전이 달라 프로그램이 작동되지않는 경우가 있기 때문이다. [6] [7]

        각주 [ 편집 ]

        1. ↑ 〈라이브러리〉, 《프로그래밍 언어(오픈 튜토리얼)》, 2013-05-27
        2. ↑ 2.02.12.2 〈동적라이브러리란?〉, 《개인사이트》, 2016-07-13
        3. ↑ 3.03.13.2 〈동적 라이브러리와 정적 라이브러리〉, 《개인사이트》, 2018-10-06
        4. ↑ 4.04.1 〈정적 라이브러리와 동적 라이브러리의 비교(lib와 dll의 장단점)〉, 《개인사이트》, 2013-05-08
        5. ↑ 〈동적라이브러리〉, 《위키백과》, 2020-04-02
        6. ↑ 〈Static Link Library와 Dynamic Link Library의 장단점〉, 《개인블로그》, 2011-01-07
        7. ↑ 〈동적(공유) 라이브러리와 정적 라이브러리〉, 《개인블로그》, 2013-08-09

        같이 보기 [ 편집 ]

        이 라이브러리 문서는 프로그래밍에 관한 글로서 Go 언어의 장점과 단점 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.

        바이너리 옵션-자본 관리 방법

        오늘 저는 바이너리 옵션으로 자본을 관리하는 매우 흥미로운 방법을 소개하고자합니다. 제가 보여 드리는 방법은 단 몇 번의 움직임으로 예금을 두 배로 늘릴 수 있습니다. 오늘 글에서는 전략을 보여주지 않고 자본 관리의 방법만을 소개한다는 점을 강조하고 싶습니다. 이 관리 방법을 전략에 적용 할 수 있습니다. 단 하나의 단점이 있습니다. 사용하는 전략이 효과적이어야하고 많은 신호를 생성해야합니다. 왜? 곧 알게 될 것입니다.

        자본 관리의이 방법은 마틴 전략의 반대입니다 안티 - 마틴 전략이라고합니다 (더 2,5 시간을 투자 할 때 항상 잃을). 당신이 이길 경우이 경우, 항상 더 많은 것을 투자한다. 나중에 첫 경기를 이기면 그 결과, 당신은 당신이 그것을 잃을 경우에도이 제로로 이동하기 때문에 손실에 대해 걱정할 필요가 없습니다. 의는 숫자에 가자 :

        1. $ 10
        2. $ 8
        3. $ 14
        4. $ 25
        5. $ 46
        6. $ 83
        7. $ 151
        8. $ 272
        9. $ 489
        10. $ 881
        END. $ 1585

        당신은 열을 볼 수 있듯이 타겟이 분명한 트래픽 연속으로 $ 1585을 순수하게 벌 수 있습니다. 물론 그것은 단지 이론 일 뿐이며 연속으로 10 번을 잃는 것은 어렵습니다. 각 전략에는 장단점이 있습니다. 이 전략의 단점은 잃지 말아야 할 첫 번째 게임에서 이기고 7 번째 예를 들어 잃는다면 아무 것도 얻지 못하지만 잃지는 않는다는 것입니다.

        난 당신이 이미 정기적으로 돈을 벌 알고 효과적인 전략을 개발하는 경우, 투자의 방법을 사용하는 것이 좋습니다. 페이지에서 당신은 발견 할 것이다 내 proste i 유효한 전략은, 그래서 당신이 그들에 익숙해 초대합니다.


0 개 댓글

답장을 남겨주세요