루비를 이해하려는 JIT 컴파일러!루비키의 향이 더해져요.

5145 단어 RubyRails

앞말



"루비 느려!"자주 듣던 루비 3.0을 대상으로 지금까지 3배 고속화를 시도Ruby 3x3하고 있다.
지난달 열린 루비카이지 2019도 이런 조처를 발표해 많은 기대의 눈길을 끌었다.
특히 고속화된 간JITコンパイラ은 회화뿐 아니라 키노트에서도 볼 수 있어 큰 관심을 끌었다.
그러나 전자계산기를 독학하는 구조(그리고 기본정보기술자 시험을 위해) 쉽게 공부하는 필자(비정보학과 졸업)에게 어려운 내용이고, 펼칠 때마다 바뀌는 회의장 분위기에 대해서는 "완전히 이해했다"고 말할 수 없다.
그럼에도 불구하고 JITコンパイラ를 비롯한 많은 시도는 루비 엔지니어에게 매우 흥미롭고 흥미로운 일이다
이번에는 루비카이지 2019의 여향을 기대하면서 많은 회의에서 언급된 JIT 컴파일러를 자세히 살펴보려고 한다.
이 글에서 저자는 JIT의 개념을 철저히 이해하기 위해 JIT를 천천히 이해하려 한다.
만약 잘못이나 의심스러운 점이 있다면, 꺼리지 않고 의견을 제시해 주십시오.(>_<)

JIT 컴파일러 is 뭐라고요?

JITコンパイラ는 루비2다.6부터 옵션으로 추가돼 루비 구조를 고속으로 실행할 예정입니다.
JIT(Just-In-Time Compuiler)는 코드가 실제로 실행됐을 때 컴파일된 구조로, 루비뿐만 아니라 Java의 실행 환경에도 적용된 구조다.
JIT 컴파일링이라는 용어는 소프트웨어를 구성하는 모듈, 클래스, 함수 등 특정 단위의 코드가 실제로 실행될 때 컴파일되기 때문에'Just In Time'으로 명명된다
위키백과https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9에서
루비의 JIT는 자주 등장MJIT하지만 구조를 이해하려면 루비의 JIT 설치 주변의 총칭으로 기억할 수 있다.
참조: https://k0kubun.hatenablog.com/entry/ruby26-jit

이전 처리와 다르다


Ruby1.9~Ruby2.5, 기본값 Ruby26의 실행



루비는 해석기형 언어로 컴파일해서 기계어로 직접 변환하는 것이 아니다.어떻게 실행하느냐에 따라 루비의 코드는 자구, 문법 해석을 거쳐 YARVバイトコード로 변환된다.바이트 코드는 프로그램 언어와 기계 언어 사이에 해당하는 코드다.
그러나 YARVバイトコード 도대체 기계 언어가 아닌 바이트 코드이기 때문에 CPU는 이것YARVバイトコード을 직접 해석해서 실행할 수 없다.
따라서 CPU 설명YARVバイトコード 대신 CPU에 명령을 내리는 것은 가상 머신(VM)YARV이다.
따라서 Ruby 코드는 명시적인 기계 언어로 컴파일되지 않고 실행될 수 있습니다.

MJIT를 위한 Rubby 26


(이 이해의 근거는C 컴파일러를 사용하는 Ruby JIT 컴파일러)YARVバイトコード이 생성될 때까지 변화가 없다.
그리고 가상 머신YARV도 예전과 같이 등장해 JITコンパイラー배우가 늘었다.

프로그램을 실행하면 YARV (이하 VM) 는 생성된 YARVバイトコード 을 설명하고 CPU가 이해할 수 있는 명령을 보내서 실행한다.
여기서 어떤 방법을 5회 이상이라고 가정해 보자.그때 VM의 라인은 JIT 대기열에 이 방법을 불러옵니다.
JIT는 VM과 다른 스레드로 이동하여 누적된 방법YARVバイトコード을 C 코드로 변환합니다.
생성된 C의 코드는 머지않아 機械語생성.soファイル으로 변환될 것이다..soファイル의 내용은 이진 코드(=기계어)이다.이것은 VM에서 동적으로 호출되는 링크입니다.
따라서 다음 시점에 VM에서 처리할 경우YARVバイトコード 이전 방식JITコンパイラ과 동일한 방법이 있는 경우
VM은 실행 방법YARVバイトコード을 설명하는 것이 아니라 함수 포인터를 통해 기계 언어로 컴파일된 방법.soファイル을 읽어 더 빨리 실행할 수 있습니다.

현황 속도/기준


JIT 구조에 따라 루비의 고속화는 가능해졌지만 얼마나 많은 데이터를 앞당겼는지는 검증 방법에 따라 편차가 있다.
C코드 생성 시 최적화, C코드에서 기계어로 번역할 때 최적화 등 다양한 요소가 얽혀 단순히 "몇 배 빨랐어!"그게 아니라
또 JIT를 유효Ruby on Rails로 설정하고 제작된 웹 응용 프로그램을 실행하면 오히려 느려지는 데이터도 루비카이치에 나타난다.
하지만 최근 실험에서 JIT가 유효해지더라도 무효화 때와 같은 정도의 점수가 나오는데...지금부터 본격적으로 공연을 시작하겠습니다.(2019/4 rubykaigi)
(이것은 필자의 감각적 이해이다. 단순한 처리가 증가했기 때문에 늦어도 어쩔 수 없다. 프로그램의 실행 시간이 길어지고 이미 기계 언어로 번역된 방법도 증가한다. 이것도 속도가 빠를수록 받아들일 수 있다고 생각한다.)
또한 JIT 이외의 속도 개선에 대해서도'루비로 루비를 쓰는 해설자'라는 내용이 있어 흥미를 끌고 있다.RubyKaigi 2019: Write a Ruby interpreter in Ruby for Ruby 3

끝말


루비케이지를 돌아보면 자신이 어떻게 루비를 몰랐는지 알 수 있을 거야.라일스를 일상적으로 접하게 되면 라일스가 하는 마술이 당연해질 수도 있다.
다른 한편, 주위를 둘러보면 Rails를 사용하면서 루비로 내장 도구를 제작하여 개발 효율을 높이는 예가 많다는 것을 알고 있습니다. 이런 활동이 조직의 기술력을 창조하고 OSS의 활동까지 확대할 수 있다는 것을 실감했습니다.
루비라는 프로그래밍 언어를 통해 기술에 직면해야 하는 루비케이지를 재확인한 지 3일이다.

참고서적/홈페이지


Ruby의 구조. - Ruby Undera Microsoft scope-
Rubby 2.6 JIT 컴파일러 통합
전문가와 해독한 Ruby2.6NEWS 파일 | cookpad 개발자 블로그
C 컴파일러를 사용한 Ruby JIT 컴파일러/Programing Symposium 60
LITALICO는 엔지니어를 적극적으로 채용하고 있다.
응시생, 제2응시생(미경험 포함)/중도채용은 모두 진행되며, 관심 있는 사람은 아래의 URL을 확인하시기 바랍니다.
https://www.wantedly.com/projects/309158

좋은 웹페이지 즐겨찾기