---
# System prepended metadata

title: Task 1
tags: [V8]

---

## **V8 là gì?**
- V8 là một Javascript enginee mã nguồn mở và được viết bằng **C++**, được phát triển bởi *Chromium Project* cho trình duyệt web *Google Chrome* và *Chromium*
- V8 biên dịch Javascript trực tiếp sang mã máy

## Build source V8
- Sau gần 2 ngày setup trên wsl bị lỗi và chưa tìm được nguyên nhân thì chuyển sang setup source V8 trên VM ubuntu
- Cách bước build source v8:
    - Cài đặt **depot tools**, nó là công cụ hỗ trợ cài đặt v8
    ```
    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    ```
    - Thêm biến môi trường **depot tools** vào **PATH**
    ``` export PATH=$PATH:/path/to/depot_tools```
    - Clone mã nguồn của V8 từ kho lưu trữ
    ```
    fetch v8
    ```
    - Đồng bộ tất cả bản dựng
    ```
    cd v8
    gclient sync
    ```
    - Lần lượt chạy 2 lệnh để build
    ```
    ./build/install-build-deps.sh
    tools/dev/gm.py x64.release
    ```
- Sau khi build xong ta có thể sử dụng **d8** trong ***out/x64.release/d8*** để thực thi mã **javascript**
![image](https://hackmd.io/_uploads/H17H0AAy0.png)
- Có thể tạo 1 file Javascript để thực thi bởi **d8**
![image](https://hackmd.io/_uploads/ry0kkkkl0.png)

## Các infrastructure trong source V8
![image](https://hackmd.io/_uploads/HyplNJ1g0.png)

- **src** : là thư mục chứa mã nguồn **C++** chính của V8
- **include** : thư mục này chứa các tệp tiêu đề của c++, dùng để tích hợp v8 với các ứng dụng
- **docs** : thư mục chứa url nguồn tài liệu của V8
- **test** : thư mục để kiểm tra v8 hoạt động đúng
- **third_party** : chứa các thư viện từ bên thứ ba mà V8
- **build_overrides** : Chứa các tùy chỉnh cho quá trình build
- **samples** : Mẫu mã nguồn để minh họa cách sử dụng V8
- **tools** : là công cụ hỗ trợ phát triển
- **infra** : chứa các cơ sở hạ tầng và cấu hình cho việc build và test
- **libplatform** : chứa các lớp trừu tượng cho các hoạt động của nền tảng như quản lý luồng, công việc nền, ...
```...```

## Build V8 bằng Docker
- Tạo một file có tên là *dockerfile*
```dockerfile
FROM ubuntu:22.04                                           


# Cài đặt môi trường không tương tác
ENV DEBIAN_FRONTEND=noninteractive
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

RUN apt update && apt upgrade -y && apt install -y \
        git \
        python3 \
        sudo \
        lsb-core \
        lbzip2 \
        xz-utils \
        wget \
	curl \
	netcat 

WORKDIR /home/docker

RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

ENV PATH="/home/docker/depot_tools:${PATH}"

WORKDIR /home/docker

RUN fetch v8
WORKDIR /home/docker/v8

RUN gclient sync
RUN echo y | /home/docker/v8/build/install-build-deps.sh
RUN tools/dev/gm.py x64.release

CMD ["./out/x64.release/d8"]


``` 
- Để build image dockerfile ta thực hiện lệnh
```
sudo docker build -t dockerfile . 
```
> Option *-t* là *tag* dùng để gán image đang build thành tên tùy chọn
- Sau khi build image xong ta liệt kê các image đã lưu để có thể biết được image vừa build có thành công không
```
sudo docker images
```

