1. 程式人生 > >C++開發EOS基礎指南(入門教程)

C++開發EOS基礎指南(入門教程)

為何選擇C++?整個EOS區塊鏈基礎設施是用C++編寫的。C++是一種低階語言,它使程式設計師可以很好地控制工作方式和管理資源。結果是,在諸如遊戲,計算機圖形之類的效能關鍵應用程式或大多數嵌入式系統等資源較少的硬體上,使用這個非常強大且高效能的語言。然而,將如此多的控制權轉移給開發人員也使其成為最難學的語言之一。

我們需要學習C++,因為你的EOS智慧合約,你的去中心化應用程式的一部分,在區塊鏈上,也必須用C++編寫。然後將C++程式碼編譯為WebAssembly。理論上,其他有“更容易”的語言可以編譯為WebAssembly(最值得注意的是RUST,Python,Solidity),C++是Block One唯一官方支援的語言。

雖然這些其他語言可能看起來更簡單,但它們的效能可能會影響你可以構建的應用程式的規模。我們希望C++將成為開發高效能和安全智慧合約的最佳語言,並計劃在可預見的未來使用C++。這裡是EOS開發人員入口網站

是的,C++是比較難的,當你的程式設計經驗主要是通過像JavaScript這樣的高階解釋語言時,一開始可能看起來令人生畏——但這裡有個好訊息:編寫智慧合約實際上並不需要C ++的大部分功能。這些教程的目的是教您C++基礎知識和智慧合約程式設計實際需要的高階C++功能。

讓我們花一點時間來承認和聽到像JavaScript這樣的高階語言沒有的一些有用的現代C++特性。最為顯著地:

  • 靜態型別(但自帶型別推斷)
  • 預處理
  • 顯式呼叫引用,按值呼叫
  • 記憶體指標
  • 運算子過載
  • 通過模板進行通用程式設計
  • typedef型別定義

如果你還不瞭解這些,請不要擔心,我們將從基礎開始。

基礎

我假設你已經熟悉至少一種程式語言,如JavaScript或Python。然後理解定義變數,for迴圈,如果if或C++中的呼叫函式等基礎知識也不會讓你感到意外。我們來看看語法:

// @url: https://repl.it/@MrToph/CPPBasics-1
// In c++ libraries are imported through the #include macro
// iostream comes with functions handling input and output to the console
#include <iostream>
// includes rand function
#include <cstdlib>
// includes time function
#include <ctime>

// this is how to define functions: <return type> <name>(<arguments>)
int compute(int x)
{
    // unsigned means no negative values which increases the range of numbers the variable can hold
    const unsigned int FIVE = 5;
    // FIVE = 3; // would throw an error as FIVE is declared constant
    return x * x + FIVE;
}

// the return type for no return value is called 'void'
void playGuessingGame()
{
    // initialize random number seed with time in seconds since the epoch
    srand(time(0));
    // get a random integer between 0 and 9 by doing modulus 10
    int random = std::rand() % 10;
    // need to initialize guess, uninitialized variables are indeterminate
    // meaning it could have any value, even the same as our random one!
    int guess = -1;
    std::cout << "Guess my number between 0 and 9";
    while (guess != random)
    {
        std::cin >> guess;
        if (guess > random)
            std::cout << "Lower";
        else if (guess < random)
            std::cout << "Higher";
        else
            std::cout << "Correct";
    }
}

// the entry point of your program is a function called main which returns an integer
int main()
{
    std::cout << "Hello! Type in a number\n";

    int number;
    std::cin >> number;

    int computed = compute(number);
    std::cout << "I computed x^2+5 as " << computed << "!\n";

    playGuessingGame();

    return 0;
}

整數short,int,long,long long有許多基本型別(每個都有一個unsigned替代,僅表示非負整數)。它們的區別在於位元組數,保持整數範圍。這裡提到的這些型別沒有指定的大小,它們的大小與實現有關。可能是如果你在一臺機器上編譯你的程式,int有16位(sizeof(int) == 2),而在另一臺機器上編譯時它將有32位。這些型別給你的唯一保證是最小位元組數。例如,int必須至少有16位,long至少為32位。

使用數字時,瞭解各個型別的確切範圍很有幫助,特別是在安全敏感的應用程式中,例如區塊鏈開發,其中over-/underflows是關鍵。為了解決這個問題,C99添加了新型別,你可以在其中明確要求特定大小的整數,例如int16_tint32_tunsigned uint64_t變數。在編寫智慧合約時,我們將僅使用這些顯式固定大小型別。

請注意,浮點數不存在類似的固定大小型別,因為位數不能很好地告訴你它的精度和範圍。在這些情況下,你需要使用float,double,long double(前者通常是32位和64位IEEE-754浮點型別)。

字串

除了數字型別和布林bool型別之外,string是最常用的資料型別之一。它們通過<string>包含在std名稱空間中。(名稱空間是變數的區域範圍,是解決大型專案中名稱衝突的一種方法。)

// @url: https://repl.it/@MrToph/CPPBasics-Strings
#include <iostream>
// need to import <string> for strings
#include <string>

int main()
{
  // strings are part of the std namespace
  std::string text = "Hello";
  // + is used for concatenation
  text += " World";
  std::cout << text << "\n";
  // length and size are synonyms
  std::cout << text.length() << " " << text.size() << "\n";

  text = text.substr(0, 5);
  for (int i = 0; i < text.length(); i++)
  {
    std::cout << i << ": " << text[i] << "\n";
  }

  // different way to loop over characters
  for (char c : text)
  {
    std::cout << c << "\n";
  }
  return 0;
}

陣列/向量

C++區分靜態和動態陣列。靜態陣列是具有固定大小的陣列,在編譯時是已知的。如果你的陣列需要能夠增長或僅在執行時知道大小,則需要使用向量vectors

// @url: https://repl.it/@MrToph/CPPBasics-Vectors
#include <iostream>
#include <vector>

int main()
{
    // arrays are defined with [] after the variable name
    // and can be immediately initialized providing values in { ... }
    int arr[] = {1, 2, 3};
    // can specify size in brackets
    // initializes elements in the list, rest to 0
    int brr[3] = {1, 3};
    for (int x : brr)
    {
        // outputs 1, 3, 0
        std::cout << x << "\n";
    }

    std::vector<int> numbers;
    for (int i = 0; i < 3; i++)
    {
        // add a number to the back
        numbers.emplace_back(i);
    }
    // size and accessing vectors is the same as with arrays
    std::cout << "numbers: " << numbers[0] << numbers.size() << "\n";

    // this inserts a number at the second (index 1) place
    numbers.emplace(numbers.begin() + 1, 9);
    // numbers.begin returns an iterator. More on these later
    for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); it++)
    {
        // outputs 1, 3, 0
        std::cout << *it << "\n";
    }
}

今天就到這,在下一個教程中,我們將討論將引數傳遞給函式的不同型別。

======================================================================

分享一個互動式的線上程式設計實戰,EOS智慧合約與DApp開發入門

EOS教程

本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。

  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。

匯智網原創翻譯,轉載請標明出處。這裡是原文