💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 1 из 30
Какой механизм Julia определяет поведение строки `return ccall(:hypot, Cdouble, (Cdouble, Cdouble), x, y)`?
f:C_{in}\to C_{out}
Julia Julia · Вызовы C через ccall Копировать
function c_hypot(x::Float64, y::Float64)
return ccall(:hypot, Cdouble, (Cdouble, Cdouble), x, y)
end
@show c_hypot(3.0, 4.0)
Почти каждый Julia-массив передаётся во внешний язык без копии независимо от порядка памяти, типа элементов и времени жизни.
PythonCall и PyCall используют одну систему обёрток, поэтому их объекты можно смешивать без преобразований и владения.
`ccall` требует точной C-сигнатуры, соглашения ABI и времени жизни указателей; неверный тип способен повредить память всего процесса.
Ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
`ccall` проверяет соответствие C-сигнатуры во время выполнения и преобразует несовместимый ABI в обычное исключение Julia.
Вопрос 2 из 30
Что нужно подтвердить отдельным примером для `return ccall(:hypot, Cdouble, (Cdouble, Cdouble), x, y)`?
Julia Julia · Вызовы C через ccall Копировать
function c_hypot(x::Float64, y::Float64)
return ccall(:hypot, Cdouble, (Cdouble, Cdouble), x, y)
end
@show c_hypot(3.0, 4.0)
Проверить на отдельном примере, что почти каждый Julia-массив передаётся во внешний язык без копии независимо от порядка памяти, типа элементов и времени жизни.
Проверить на отдельном примере, что `ccall` проверяет соответствие C-сигнатуры во время выполнения и преобразует несовместимый ABI в обычное исключение Julia.
Проверить на отдельном примере, что ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Проверить на отдельном примере, что pythonCall и PyCall используют одну систему обёрток, поэтому их объекты можно смешивать без преобразований и владения.
Проверить на отдельном примере, что `ccall` требует точной C-сигнатуры, соглашения ABI и времени жизни указателей; неверный тип способен повредить память всего процесса.
Вопрос 3 из 30
Какое требование к `return ccall(:hypot, Cdouble, (Cdouble, Cdouble), x, y)` важнее удобной детали текущей реализации?
Julia Julia · Вызовы C через ccall Копировать
function c_hypot(x::Float64, y::Float64)
return ccall(:hypot, Cdouble, (Cdouble, Cdouble), x, y)
end
@show c_hypot(3.0, 4.0)
Сохранить в реализации правило: `ccall` проверяет соответствие C-сигнатуры во время выполнения и преобразует несовместимый ABI в обычное исключение Julia.
Сохранить в реализации правило: Ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Сохранить в реализации правило: `ccall` требует точной C-сигнатуры, соглашения ABI и времени жизни указателей; неверный тип способен повредить память всего процесса.
Сохранить в реализации правило: Почти каждый Julia-массив передаётся во внешний язык без копии независимо от порядка памяти, типа элементов и времени жизни.
Сохранить в реализации правило: PythonCall и PyCall используют одну систему обёрток, поэтому их объекты можно смешивать без преобразований и владения.
Вопрос 4 из 30
После обновления Julia или пакета поведение участка с `return ccall(:hypot, Cdouble, (Cdouble, Cdouble), x, y)` изменилось. Какой критерий приёмки остаётся корректным?
f:C_{in}\to C_{out}
Приёмка должна подтвердить, что почти каждый Julia-массив передаётся во внешний язык без копии независимо от порядка памяти, типа элементов и времени жизни.
Приёмка должна подтвердить, что pythonCall и PyCall используют одну систему обёрток, поэтому их объекты можно смешивать без преобразований и владения.
Приёмка должна подтвердить, что `ccall` проверяет соответствие C-сигнатуры во время выполнения и преобразует несовместимый ABI в обычное исключение Julia.
Приёмка должна подтвердить, что `ccall` требует точной C-сигнатуры, соглашения ABI и времени жизни указателей; неверный тип способен повредить память всего процесса.
Приёмка должна подтвердить, что ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Вопрос 6 из 30
Как нужно интерпретировать `result = pyconvert(Vector{Float64}, np.sin(a))`, не добавляя к коду лишних гарантий?
J\leftrightarrow P\;\text{через обёртку}
Julia Julia · Связь с Python через PyCall и PythonCall Копировать
using PythonCall
np = pyimport("numpy")
a = np.array([1.0, 2.0, 3.0])
result = pyconvert(Vector{Float64}, np.sin(a))
@show result
Общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
PythonCall и PyCall используют одну систему обёрток, поэтому их объекты можно смешивать без преобразований и владения.
Восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
PythonCall и PyCall управляют преобразованием объектов и собственной интеграцией с Python; смешивание их обёрток без явной границы создаёт лишние копии и разные правила владения.
Вопрос 7 из 30
Какой эксперимент отличит настоящий механизм `result = pyconvert(Vector{Float64}, np.sin(a))` от случайного результата одного запуска?
Julia Julia · Связь с Python через PyCall и PythonCall Копировать
using PythonCall
np = pyimport("numpy")
a = np.array([1.0, 2.0, 3.0])
result = pyconvert(Vector{Float64}, np.sin(a))
@show result
Проверить на отдельном примере, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Проверить на отдельном примере, что pythonCall и PyCall используют одну систему обёрток, поэтому их объекты можно смешивать без преобразований и владения.
Проверить на отдельном примере, что pythonCall и PyCall управляют преобразованием объектов и собственной интеграцией с Python; смешивание их обёрток без явной границы создаёт лишние копии и разные правила владения.
Проверить на отдельном примере, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Проверить на отдельном примере, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Вопрос 8 из 30
Какое решение устраняет риск вокруг `result = pyconvert(Vector{Float64}, np.sin(a))`, не меняя поведение на допустимых данных?
Julia Julia · Связь с Python через PyCall и PythonCall Копировать
using PythonCall
np = pyimport("numpy")
a = np.array([1.0, 2.0, 3.0])
result = pyconvert(Vector{Float64}, np.sin(a))
@show result
Сохранить в реализации правило: Восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Сохранить в реализации правило: Общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Сохранить в реализации правило: PythonCall и PyCall управляют преобразованием объектов и собственной интеграцией с Python; смешивание их обёрток без явной границы создаёт лишние копии и разные правила владения.
Сохранить в реализации правило: PythonCall и PyCall используют одну систему обёрток, поэтому их объекты можно смешивать без преобразований и владения.
Сохранить в реализации правило: Разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Вопрос 9 из 30
Как проверить, что новая реализация `result = pyconvert(Vector{Float64}, np.sin(a))` не изменила обещанное пользователю поведение?
J\leftrightarrow P\;\text{через обёртку}
Приёмка должна подтвердить, что pythonCall и PyCall управляют преобразованием объектов и собственной интеграцией с Python; смешивание их обёрток без явной границы создаёт лишние копии и разные правила владения.
Приёмка должна подтвердить, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Приёмка должна подтвердить, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Приёмка должна подтвердить, что pythonCall и PyCall используют одну систему обёрток, поэтому их объекты можно смешивать без преобразований и владения.
Приёмка должна подтвердить, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Вопрос 12 из 30
Какой тест точнее всего зафиксирует границу поведения `view = pyconvert(PyArray, np.asarray(pyx))`?
Julia Julia · Обмен массивами Копировать
using PythonCall
np = pyimport("numpy")
x = collect(1.0:5.0)
pyx = Py(x)
view = pyconvert(PyArray, np.asarray(pyx))
view[1] = 99.0
@show x view
Проверить на отдельном примере, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Проверить на отдельном примере, что почти каждый Julia-массив передаётся во внешний язык без копии независимо от порядка памяти, типа элементов и времени жизни.
Проверить на отдельном примере, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Проверить на отдельном примере, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Проверить на отдельном примере, что ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Вопрос 14 из 30
Две реализации участка с `view = pyconvert(PyArray, np.asarray(pyx))` совпадают на обычных данных. Что необходимо проверить перед выпуском?
stride_J=stride_F
Приёмка должна подтвердить, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Приёмка должна подтвердить, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Приёмка должна подтвердить, что ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Приёмка должна подтвердить, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Приёмка должна подтвердить, что почти каждый Julia-массив передаётся во внешний язык без копии независимо от порядка памяти, типа элементов и времени жизни.
Вопрос 16 из 30
Какой механизм Julia определяет поведение строки `throw(ForeignCallError(lib, op, err))`?
owner(p)=allocator(p)
Julia Julia · Ошибки границы Копировать
struct ForeignCallError <: Exception
library::String
operation::String
cause::Any
end
function guarded_call(f, lib, op)
try
return f()
catch err
throw(ForeignCallError(lib, op, err))
end
end
Ошибки внешней библиотеки можно безопасно свести к одному общему исключению Julia, не сохраняя исходную причину и сведения о владельце ресурса.
Общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Вопрос 17 из 30
Какой тест точнее всего зафиксирует границу поведения `throw(ForeignCallError(lib, op, err))`?
Julia Julia · Ошибки границы Копировать
struct ForeignCallError <: Exception
library::String
operation::String
cause::Any
end
function guarded_call(f, lib, op)
try
return f()
catch err
throw(ForeignCallError(lib, op, err))
end
end
Проверить на отдельном примере, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Проверить на отдельном примере, что ошибки внешней библиотеки можно безопасно свести к одному общему исключению Julia, не сохраняя исходную причину и сведения о владельце ресурса.
Проверить на отдельном примере, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Проверить на отдельном примере, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Проверить на отдельном примере, что ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Вопрос 18 из 30
Какую гарантию должна сохранить правка участка с `throw(ForeignCallError(lib, op, err))`?
Julia Julia · Ошибки границы Копировать
struct ForeignCallError <: Exception
library::String
operation::String
cause::Any
end
function guarded_call(f, lib, op)
try
return f()
catch err
throw(ForeignCallError(lib, op, err))
end
end
Сохранить в реализации правило: Разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Сохранить в реализации правило: Восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Сохранить в реализации правило: Общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Сохранить в реализации правило: Ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Сохранить в реализации правило: Ошибки внешней библиотеки можно безопасно свести к одному общему исключению Julia, не сохраняя исходную причину и сведения о владельце ресурса.
Вопрос 19 из 30
При переносе кода с `throw(ForeignCallError(lib, op, err))` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
owner(p)=allocator(p)
Приёмка должна подтвердить, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Приёмка должна подтвердить, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Приёмка должна подтвердить, что ошибки внешней библиотеки можно безопасно свести к одному общему исключению Julia, не сохраняя исходную причину и сведения о владельце ресурса.
Приёмка должна подтвердить, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Приёмка должна подтвердить, что ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Вопрос 21 из 30
Какое утверждение точнее всего объясняет участок с `lib = dlopen_e("libdoesnotexist")`?
E=(version,ABI,input)
Julia Julia · Разбор отказов Копировать
using Libdl
lib = dlopen_e("libdoesnotexist")
report = (; julia=VERSION, library_found=lib != C_NULL, word_size=Sys.WORD_SIZE, arch=Sys.ARCH)
@show report
Трассировки Julia обычно хватает для локализации нативной аварии; версии ABI, внешней среды и минимальный воспроизводимый вызов фиксировать необязательно.
Восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Вопрос 22 из 30
Что нужно подтвердить отдельным примером для `lib = dlopen_e("libdoesnotexist")`?
Julia Julia · Разбор отказов Копировать
using Libdl
lib = dlopen_e("libdoesnotexist")
report = (; julia=VERSION, library_found=lib != C_NULL, word_size=Sys.WORD_SIZE, arch=Sys.ARCH)
@show report
Проверить на отдельном примере, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Проверить на отдельном примере, что ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Проверить на отдельном примере, что трассировки Julia обычно хватает для локализации нативной аварии; версии ABI, внешней среды и минимальный воспроизводимый вызов фиксировать необязательно.
Проверить на отдельном примере, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Проверить на отдельном примере, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Вопрос 23 из 30
Что должно остаться истинным после рефакторинга участка с `lib = dlopen_e("libdoesnotexist")`?
Julia Julia · Разбор отказов Копировать
using Libdl
lib = dlopen_e("libdoesnotexist")
report = (; julia=VERSION, library_found=lib != C_NULL, word_size=Sys.WORD_SIZE, arch=Sys.ARCH)
@show report
Сохранить в реализации правило: Восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Сохранить в реализации правило: Ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Сохранить в реализации правило: Разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Сохранить в реализации правило: Общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Сохранить в реализации правило: Трассировки Julia обычно хватает для локализации нативной аварии; версии ABI, внешней среды и минимальный воспроизводимый вызов фиксировать необязательно.
Вопрос 24 из 30
Две реализации участка с `lib = dlopen_e("libdoesnotexist")` совпадают на обычных данных. Что необходимо проверить перед выпуском?
E=(version,ABI,input)
Приёмка должна подтвердить, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Приёмка должна подтвердить, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Приёмка должна подтвердить, что ошибка на границе переводится в типизированное исключение с исходной причиной; освобождать ресурс внешней библиотеки нужно ровно тем механизмом, которым он был выделен.
Приёмка должна подтвердить, что трассировки Julia обычно хватает для локализации нативной аварии; версии ABI, внешней среды и минимальный воспроизводимый вызов фиксировать необязательно.
Приёмка должна подтвердить, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Вопрос 27 из 30
Что нужно подтвердить отдельным примером для `f = @spawnat w begin`?
Julia Julia · Восстановление системы Копировать
using Distributed
addprocs(1)
function isolated_foreign_call(args)
w = first(workers())
f = @spawnat w begin
# Нативный вызов выполняется вне главного процесса.
sum(args)
end
return fetch(f)
end
@show isolated_foreign_call(1:100)
Проверить на отдельном примере, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Проверить на отдельном примере, что pythonCall и PyCall управляют преобразованием объектов и собственной интеграцией с Python; смешивание их обёрток без явной границы создаёт лишние копии и разные правила владения.
Проверить на отдельном примере, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Проверить на отдельном примере, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.
Проверить на отдельном примере, что повреждение памяти нативной библиотекой можно надёжно перехватить обычным `try/catch` в том же процессе.
Вопрос 29 из 30
Как проверить, что новая реализация `f = @spawnat w begin` не изменила обещанное пользователю поведение?
crash(child)\not\Rightarrow crash(parent)
Приёмка должна подтвердить, что восстановление после аварии нативной библиотеки часто требует отдельного процесса; `try/catch` не способен перехватить повреждение памяти или завершение интерпретатора.
Приёмка должна подтвердить, что pythonCall и PyCall управляют преобразованием объектов и собственной интеграцией с Python; смешивание их обёрток без явной границы создаёт лишние копии и разные правила владения.
Приёмка должна подтвердить, что общий буфер между языками возможен только при совместимой памяти, форме, порядке и сроке жизни; нулевое копирование не является автоматическим свойством массива.
Приёмка должна подтвердить, что повреждение памяти нативной библиотекой можно надёжно перехватить обычным `try/catch` в том же процессе.
Приёмка должна подтвердить, что разбор отказа фиксирует версии Julia, внешней среды, ABI, форму данных и минимальный вызов; трассировка Julia может закончиться до нативного места повреждения.