Achievement provides the only real pleasure in life.
有所成就是人生唯一的真正的樂趣。
之前做了幾年的FPGA,期間也開發過STM32程式,僅限于根據需求點亮LED單色屏。可是随着工程的需求,以及越來越多的發現,雖然FPGA在做硬體(資料)加速尤其是算法層面資料預處理或者中間資料的處理有着非常天然的優勢,也得益于FPGA特性---并行性以及一些高速接口,eg:DDR4/serDes/100G Ethernet...。但是在面對一些更加複雜算法時,實作難度也是幾何級數的增加。并且現在xilinx退出了高層次綜合軟體HLS以及相應的核心,之前的microblaze和7series的ZYNQ系列,無疑給算法的implement帶來更加的靈活性,是以決定重新再把大學以及研究所學生學習過的C/C++重新學一下,有點朝花夕拾的味道~~~
目前閱讀的教材是《C++面向對象程式設計》---清華大學譚浩強老師的(還記得當時大一學的就是他綠皮書的C語言,一晃10年過去了)。
--------------------------------以下是自我了解,歡迎讨論---------------------------------------
初步閱讀了第一章和第二章的内容,給我最大的感覺就是 --- 如果做過底層實作,因為FPGA所有打交道的都是二進制,不存在第三種不定态。其實這就是C++或者其他進階語言最終執行的檔案。是以了解裡面的底層實作原理非常清楚,尤其是在深入了解計算機體系結構之後,就對于這個語言的實作細節非常了如指掌。剩下的大部分就是在C++這個語言協定或者規則裡面去開發。這是最基礎的工作,如果涉及到類似于金融行業的高頻交易,又或者無人駕駛裡面,就非常講究實作的效率了。這個時候,對于内部CPU(不管是intel通用CPU還是ARM核心)的工作原理就要非常熟悉了。這個時候更多考慮的是實時性和高效性了,個人是這麼感覺的,因為從FPGA實作來說是這樣的,不同的代碼架構,雖然實作相同的功能,但是其throughput/delay/timing就有很大差别。這個時候就要非常熟悉FPGA内部的架構才能實作性能優化。同理,對于C++也一樣。
C++語言更多的是給我的感覺就是越來越子產品化,也就是“class”。我認為這是整個語言的精髓,也就是OOP。記得之前說“program = algorithm + data”,現在來看應該是“program = class + class + …… + message”。什麼是類呢?類就是一種抽象的概念,把某些具象的東西,抽象成共同具有某些特征的集合。而對象則是類的具體執行個體(instance)。結合高等數學的概念,更容易了解。如果對于函數f(x)的定義域内任意的一個x,都有f(x)=f(-x),那麼函數f(x)就叫做偶函數(Even Function)。其實從C++角度來看,這就是類的概念。而f(x)= |x| (x∈R),這就是對象的概念。當然類可不止這麼簡單。還有很多細節需要去學習,個人覺得可能就是類的設計或者實作會影響到program的實作複雜性和高效性。
類的格式:
class 類名
{
private:
私有的資料和成員函數
public:
私有的資料和成員函數
};
private和public是成員通路限定符(member access specifier)。聲明為private的隻能被本類中的成員函數通路,類外不可以(有元類除外),聲明為public的既可以被本類的成員函數通路,也可以被類的作用域以外的成員函數引用。還有很多細節東西,用得多了再回頭看就好了。最後以第二章最後一個程式結束,基本有點工程的意思了。
#include <string>
using namespace std;
class Student
{
public:
void display();
private:
int num;
string name;
char sex;
};
#include <iostream>
#include "Student.hpp"
void Student::display()
{
cout <<"num = " << num << endl;
cout <<"name = " << name << endl;
cout <<"sex = " << sex << endl;
}
#include <iostream>
#include "Student.hpp"
using namespace std;
int main()
{
Student stud;
stud.display();
return 0;
}
在面向對象開發中,一般做法将類的聲明(包括成員函數聲明)放在指定頭檔案中。同時為了實作資訊的隐蔽性,對成員函數的定義一般也不放在頭檔案中,而放在另外一個檔案中。如上的三個檔案系統。一個是主子產品main.cpp,一個是student.cpp。主子產品中又包含student.h。在預編譯的時候,會将頭檔案student.h的内容取代#include "studen.hpp"。
由于類庫的實作,使用者可以在工作實踐中,積累通用的或者專用的類,這就大大減少了程式設計的工作,有效的提高了效率。
(這就有點xilinx的vivado所做,設計是圍繞IP開發的)