• בלוג
  • קוד C++ מתחיל להיראות מאוד דומה ל JavaScript, וזה דווקא נחמד

קוד C++ מתחיל להיראות מאוד דומה ל JavaScript, וזה דווקא נחמד

30/01/2017
C++

הסיבות להשתמש ב node.js הולכות ומתמעטות עם הכניסה המאסיבית של C++11, 14 ו 17. קודם דוגמאות ואחרי זה הפרטים.

1. קוד שרת Echo

כך לדוגמא הקוד הבא מייצר שרת echo ב C++, אשר יאזין על פורט 3030 בפרוטוקול TCP ויחזיר לכל לקוח את הטקסט שנשלח אליו:

#include <QtCore>
#include <QtNetwork>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTcpServer server;
    quint16 port = 3030;

    QObject::connect(&server, &QTcpServer::newConnection,
                     [&] {
        while (server.hasPendingConnections())
        {
            QTcpSocket *socket = server.nextPendingConnection();

            QObject::connect(socket, &QTcpSocket::readyRead,
                             [socket] {
                socket->write(socket->readAll());
            });

            QObject::connect(socket, &QTcpSocket::disconnected,
                             [socket] {
                 socket->deleteLater();
            });
        }

    });

    if (!server.listen(QHostAddress::LocalHost, port)) return 2;
    qDebug() << "Listening on port: " << port;

    return a.exec();
}

כתיב ה Lambda Functions שנכנס לתמונה החל מ C++11 והמשיך להתפתח ולהשתפר בגרסאות ההמשך מאפשר לנו היום לכתוב קוד C++ תוך שמוש באותן תבניות של Callbacks שהיו לנו ב JavaScript.

2. איך זה עובד

קחו את פקודת הטיפול במידע חדש המופיעה בפיסקה:

            QObject::connect(socket, &QTcpSocket::readyRead,
                             [socket] {
                socket->write(socket->readAll());
            });

הגדרת הפונקציה כביטוי מתחילה בסוגריים מרובעים בתוכם אנו רושמים את המשתנים מבחוץ שאנו רוצים להתיחס אליהם. במקרה הפעם המשתנה היחיד הוא socket. כתיב המשתנה כפשוטו אומר שנקבל עותק של המשתנה, ומאחר והמשתנה מחזיק מצביע לאוביקט המידע העותק הוא מצביע נוסף לאותו האוביקט.

הפונקציה מועברת כפרמטר ל QObject::connect מה שגורם ל Qt להפעיל אותה בכל פעם שמתרחש האירוע QTcpSocket::readyRead, כלומר בכל פעם שמגיע מידע חדש בתקשורת.

3. מה הרווחנו

את השפה, כמובן. אפילו שלפעמים מרגישים שקל יותר לגייס אנשי JavaScript או שקוד V8 הוא מהיר מספיק ויציב מספיק בשביל צד השרת שלכם, עדיין עבודה ב C++ מאפשרת ביצועים טובים יותר בזכות הקירבה לחומרה ועבודה ללא Garbage Collector.

גירסאות אחרונות של Qt מגיעות עם שרת Web Sockets ומפענח JSON, מה שהופך את החיים ממש פשוטים כשכותבים שרת socket server לתקשורת זמן אמת.