Trong Kotlin, call stack (ngăn xếp cuộc gọi) là một cấu trúc dữ liệu được sử dụng để theo dõi các cuộc gọi hàm trong chương trình. Mỗi khi một hàm được gọi, một frame (khung) mới được thêm vào đỉnh của ngăn xếp, đại diện cho việc thực thi của hàm đó. Khi hàm hoàn thành, frame của nó sẽ được loại bỏ khỏi ngăn xếp.

Dưới đây là một ví dụ minh họa về cách call stack hoạt động trong Kotlin:

fun main() {
    val result = add(3, 4)
    println("Result: $result")
}

fun add(a: Int, b: Int): Int {
    val sum = a + b
    val multiplied = multiply(sum, 2)
    return multiplied
}

fun multiply(x: Int, y: Int): Int {
    return x * y
}

Khi chương trình bắt đầu chạy, hàm main() được gọi đầu tiên. Một frame được tạo cho hàm main() và được đặt ở đỉnh của ngăn xếp. Trong hàm main(), hàm add() được gọi. Một frame mới được tạo cho hàm add() và được đặt lên trên của frame của hàm main() trong ngăn xếp. Tiếp theo, trong hàm add(), hàm multiply() được gọi. Một frame mới cũng được tạo cho hàm multiply() và được đặt lên trên của frame của hàm add() trong ngăn xếp.

Sau khi hàm multiply() hoàn thành việc thực thi và trả về kết quả, frame của nó sẽ được loại bỏ khỏi ngăn xếp. Tiếp theo, hàm add() hoàn thành và frame của nó cũng được loại bỏ. Cuối cùng, hàm main() hoàn thành và frame của nó cũng được loại bỏ.

Khi chương trình kết thúc, ngăn xếp sẽ trống và không còn frame nào.