Code-Server x Dart mit ffi x Go x Clang

Dies ist ein Artikel des Dart Adventskalenders 2019.

Dies ist ein Artikel über Darts Native Interface. Erfahren Sie, wie Sie die Sprachfunktionen Go und C mit Dart verwenden. Wir haben auch ein Docker-Image vorbereitet, damit Sie das Native Interface sofort ausprobieren können.

Native Interface: Eine Funktion, mit der Sie C-Sprachbibliotheken verwenden können

https://dart.dev/guides/libraries/c-interop

Mit dieser Funktion können Sie eine C-Sprachbibliothek verwenden. Die Sprache C ist jedoch nicht für die Bibliothek in der Sprache C geschlossen.

Systemsprachen wie Go und Rust können eine gemeinsam genutzte Bibliothek erstellen.

Über diese gemeinsam genutzte Bibliothek können Sie auch Funktionen wie Go und Rust in Dart verwenden.

Sehr praktisch: Vollständige Nutzung der Betriebssystemfunktionen

Dart gehen immer noch die Bibliotheken aus. Daher ist es erforderlich, eine in C-Sprache entwickelte Bibliothek oder eine in Go entwickelte Bibliothek zu verwenden. Das native Interface macht Dart bequemer.

Entwicklungsumgebung: Wir haben eine Docker-Umgebung vorbereitet.

Wir haben einen Editor namens Code-Server hinzugefügt, der VSCode online ausführt. Daher können Sie die Entwicklung sofort starten, indem Sie Docker starten.

https://github.com/kyorohiro/my-code-server/tree/master/w/dart_and_go_and_c/

https://github.com/kyorohiro/advent-2019-code-server/tree/master/extra/dart_ffi_and_go_and_c

FROM ubuntu:20.04

WORKDIR /works
# install dart
RUN apt-get update
RUN apt-get install -y wget gnupg1
RUN apt-get install apt-transport-https
RUN sh -c 'wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
RUN sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
RUN apt-get update
RUN apt-get -y install dart

# install go
RUN apt-get install software-properties-common -y
#RUN add-apt-repository ppa:longsleep/golang-backports
RUN apt-get update
RUN apt-get install golang-go -y
RUN apt-get install git -y
RUN go get github.com/ramya-rao-a/go-outline
RUN go get github.com/mdempsky/gocode
RUN go get github.com/uudashr/gopkgs/cmd/gopkgs
RUN go get github.com/sqs/goreturns
RUN go get github.com/rogpeppe/godef

# install c
RUN apt-get install musl-dev -y

# code-server
RUN wget https://github.com/cdr/code-server/releases/download/2.1692-vsc1.39.2/code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz
RUN tar -xzf code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz -C ./ --strip-components 1


RUN /works/code-server --install-extension Dart-Code.dart-code
RUN /works/code-server --install-extension ms-vscode.go
RUN /works/code-server --install-extension ms-vscode.cpptools

WORKDIR /app
ENV PATH=${PATH}:/lib/dart/bin
ENV PATH="${PATH}:/root/.pub-cache/bin"
RUN pub global activate webdev
RUN pub global activate stagehand

CMD ["/works/code-server", "--auth","none", "--host","0.0.0.0","--port","8443", "/app"]

docker-compose.yml


version: '3'
services: 
  app:
    build: ./app
    ports:
     - "8080:8080"
     - "8443:8443"
    volumes: 
      - ./app:/app
    # - /var/run/docker.sock:/var/run/docker.sock
    command: /works/code-server --auth none --host 0.0.0.0 --port 8443 /app 

Siehe insbesondere Github.

Starten Sie die Entwicklungsumgebung.

$ git clone https://github.com/kyorohiro/advent-2019-code-server.git
$ cd advent-2019-code-server/extra/dart_fmi_and_go_and_c
$ docker-compose build
$ docker-compose up -d

Öffnen Sie "http: //127.0.0.1: 8443 /" in Ihrem Browser

Screen Shot 2019-12-22 at 20.31.13.png

Erstellen Sie eine gemeinsam genutzte Bibliothek in Go.

Gehen Sie zu VSCode-> Datei (Menü) -> / app / wgo.

hello.go


package main

import "C"
import "fmt"

//export PrintHello
func PrintHello() {
	fmt.Print("Hello,World")
}

func main() {}

Die PrintHello-Funktion von Go wird von Dart aufgerufen.

$ go build -o libhello.so  -buildmode=c-shared  hello.go

Dadurch werden die Dateien "libhello.h" und "libhello.so" erstellt. Laden wir es aus der C-Sprache, bevor wir es mit Dart laden.

main_hello.c


#include <stdio.h>
#include "libhello.h"


int main(int argc, char const *argv[])
{
  PrintHello();
  return 0;
}

Terminal



$ gcc -Wall -o main_hello.exe main_hello.c -L. -lhello
$ LD_LIBRARY_PATH=. ./main_hello.exe -L. -lhello
Hello,World

Ups !! Es hat gut funktioniert.

Versuchen Sie, von Dart zu lesen.

Gehen Sie zu VSCode-> Datei (Menü) -> / app / wdart.

bin/main.dart


import 'dart:ffi' as ffi;

typedef PrintHello_func = ffi.Void Function();
typedef PrintHello = void Function();

void main(List<String> arguments) {
  var path = "/app/wgo/libhello.so";
  ffi.DynamicLibrary dylib = ffi.DynamicLibrary.open(path);
  final PrintHello hello = dylib
      .lookup<ffi.NativeFunction<PrintHello_func>>('PrintHello')
      .asFunction();
  hello();
}


Terminal


$ dart ./bin/main.dart
Hello,World

PS

Wir haben auch eine C-Sprachumgebung vorbereitet. Sie können es früher im Github-Repository sehen.


Mit Dart können Sie die in der Sprache Go entwickelten Funktionen voll ausnutzen. Von Dart aus kann ich also fast alles machen. Mit der Unterstützung von FMI ist es meiner Meinung nach einfacher, Native Interfaces zu schreiben.


Wenn es für die Serverseite ist, denke ich, dass Docker Image usw. für die Entwicklung bequem ist.

Über den Code-Server, der dieses Mal im folgenden Advent verwendet wurde Die Erklärung ist mehr als 20 Mal unterteilt. Wenn Sie interessiert sind, beziehen Sie sich bitte darauf.

https://qiita.com/advent-calendar/2019/code-server

Code

https://github.com/kyorohiro/my-code-server/tree/master/w/dart_and_go_and_c/

https://github.com/kyorohiro/advent-2019-code-server/tree/master/extra/dart_fmi_and_go_and_c

Recommended Posts

Code-Server x Dart mit ffi x Go x Clang
Python mit Go
GRPC beginnend mit Go-Server und Dart-Client
Rufen Sie die C-Funktion mit dart: ffi auf und rufen Sie die Dart-Funktion zurück