Fortran 서버에서 WebAssembly

18469 단어 FortranWebAssembly

사전 쓰기



fortran66 블로그에 Fortran으로 작성한 웹 서버가 있으므로 Fortran에서 출력 한 WebAssembly 프로그램을 Fortran에서 작성한 웹 서버에서 실행하기로 결정합니다.
【메모장】ZMQ Fortran OO HTTP server

Fortran의 WebAssembly 2018년

이하, 다소 문제가 있습니다만, 일단 어떻게든 움직일 수 있었습니다.

Fortran Web Server 준비



ZMQ 설치



ZMQ라는 네트워크 라이브러리를 준비해야 합니다. 다음 페이지를 참고로 했습니다.

【메모장】WSL Ubuntu18.04 재구축
wget https://github.com/zeromq/libzmq/releases/download/v4.3.1/zeromq-4.3.1.tar.gz

tar zxvf zeromq-4.3.1.tar.gz
cd zeromq-4.3.1
./configure
make -j 8
sudo make install

Fortran http server 수정



ZMQ의 Fortran 바인딩도 필요합니다. f66blog/testZMQ 에서 빌려옵니다.

원래 서버 프로그램은 HTML 파일의 내용을 직접 쓰고 있기 때문에 외부 파일 (HTTP.html)에서 읽을 수 있도록 수정했습니다. 이때 프로그램중에, 읽어들인 HTML 파일의 각 행말에 LF 문자를 덧붙일 필요가 있었습니다. 또한 flang에서는 컴파일 할 수 없었기 때문에 gfortran을 사용했습니다.
sudo apt install gfortran

wget https://raw.githubusercontent.com/f66blog/testZMQ/master/F08_ZMQ.f90

gfortran F08_ZMQ.f90 HTTPserver.f90 -lzmq
program test
    use, intrinsic :: iso_c_binding
    use f08_zmq
    implicit none
    integer :: id_size, iraw_size, ilen
    character(1025), target :: id, raw
    type(context_t), allocatable :: ctx
    type(socket_t) , allocatable :: socket
    character(len = 1024) :: buff
    character(len = :), allocatable :: http_response
    character(*), parameter :: fn = 'HTTP.html'

! READ HTTP file  ; add LF
    http_response = 'HTTP/1.0 200 OK'          // achar(10) // &
                    'Content-Type: text/html'  // achar(10) // achar(10)
    open(10, file = fn)
    do
        read(10, '(a)', end = 99) buff
        http_response = http_response // trim(buff) // achar(10)
    end do
 99 continue

! ZMQ HTTP server
    allocate(ctx, socket)
    call ctx%new()
    call socket%new(ctx, ZMQ_STREAM)
    call socket%bind('tcp://*:8080')
    print *, 'ZMQ http server:: http://localhost:8080'
    do
        call socket%recv(id, len(id), 0, id_size)
        print *, 'Received::', id(:id_size)
        do
            call socket%recv(raw, len(raw),  0, iraw_size)
            if (iraw_size <= 1024) exit
        end do
        call socket%send(id, id_size, ZMQ_SNDMORE, ilen)
        call socket%send(http_response, len(http_response), 0, ilen)
        call socket%send(id, id_size, ZMQ_SNDMORE, ilen)
        call socket%send('', 0, 0, ilen)
    end do
    deallocate(socket)
    deallocate(ctx)
end program test

WebAssembly 용 HTML 파일



잘 이해할 수 없는 이유로, 이전에 만든 HTML 파일에서는 동작하지 않았기 때문에 수정했습니다.

참고 기사:
TypeError: Incorrect response MIME type. Expected 'application/wasm'

richlum commented on 19 Dec 2018
similar issue using 'web server for chrome' on linux. Adapted timmyjose solution while trying to follow along htps : //에서 ゔぇぺぺr. 모잖아. rg / an-u S / cs / uebase mbly / xt_furma t_ 및 _ sm
<!-- public/index.html -->
<!DOCTYPE html>
<html lang="en">
  <body>
    <script>
      fetch('./pai.wasm').then(response => response.arrayBuffer()
      ).then(bytes => {
        return WebAssembly.instantiate(bytes, {})
      }).then( r => {
        const ex = r.instance.exports
        const n = 64
        const result = ex.pai(n + 1)
        const theory = ex.pai2()
        console.log(result)
        console.log(theory)
        document.querySelector("#n_div" ).innerHTML = n
        document.querySelector("#result").innerHTML = result
        document.querySelector("#theory").innerHTML = theory
      })
    </script>

    Division of Interval
    <div id="n_div"> </div>
    Result
    <div id="result"></div>
    Theoretical value
    <div id="theory"></div>

  </body>
</html>

실행



./a.out에서 서버가 시작되고 브라우저에서 localhost:8080을 치면 다른 기사에서 생성한 WebAssembly에서 계산이 수행됩니다.

브라우저 출력





콘솔 출력


pc@VM10:~$ ./a.out
 ZMQ http server:: http://localhost:8080
 Received:: kEg
 Received:: kEh
 Received:: kEi

그러나 때로는 WebAssembly의 해석을 잘 수행하지 못할 수 있습니다. 이 때 Python 서버를 시작하고 페이지를 표시하면 종료 후 문제가 해결됩니다. Fortran 서버 프로그램은 어떠한 초기화나 종료 처리가 되어 있지 않을 가능성이 있습니다. 향후의 과제로 하겠습니다.

Fortran의 WebAssembly 2018년

파이썬 서버
python -m SimpleHTTPServer 8080

좋은 웹페이지 즐겨찾기